4dc05051dd
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / security (push) Waiting to run
CI / quality (push) Waiting to run
CI / unit_tests (push) Waiting to run
CI / integration_tests (push) Waiting to run
CI / coverage (push) Blocked by required conditions
CI / build (push) Waiting to run
CI / docker (push) Blocked by required conditions
CI / lint (pull_request) Failing after 13s
CI / typecheck (pull_request) Successful in 28s
CI / coverage (pull_request) Has been skipped
CI / security (pull_request) Successful in 25s
CI / quality (pull_request) Successful in 16s
CI / integration_tests (pull_request) Successful in 5m16s
CI / build (pull_request) Successful in 17s
CI / unit_tests (pull_request) Successful in 15m34s
CI / docker (pull_request) Has been skipped
184 lines
8.5 KiB
Gherkin
184 lines
8.5 KiB
Gherkin
Feature: Project CLI commands (B0.cli.projects)
|
|
As a CleverAgents user
|
|
I want to manage projects via CLI commands
|
|
So that I can create, list, show, link, unlink, and delete projects
|
|
|
|
Background:
|
|
Given a project CLI in-memory database is initialized
|
|
|
|
# ── Create ────────────────────────────────────────────────────
|
|
|
|
Scenario: Create a project with bare name defaults to local namespace
|
|
When I run project create with name "my-app"
|
|
Then the project "local/my-app" should exist
|
|
And the project namespace should be "local"
|
|
|
|
Scenario: Create a project with explicit namespace
|
|
When I run project create with name "team/my-app"
|
|
Then the project "team/my-app" should exist
|
|
And the project namespace should be "team"
|
|
|
|
Scenario: Create a project with description
|
|
When I run project create named "my-app" described as "My test project"
|
|
Then the project "local/my-app" should exist
|
|
And the project description should be "My test project"
|
|
|
|
Scenario: Create a project with invalid name fails
|
|
When I run project create with invalid name "123bad"
|
|
Then the create command should fail with exit code 1
|
|
|
|
Scenario: Create a duplicate project fails
|
|
Given a project "local/dup-test" already exists
|
|
When I run project create with name "dup-test"
|
|
Then the create command should fail with exit code 1
|
|
|
|
Scenario: Create a project with reserved namespace fails
|
|
When I run project create with invalid name "system/bad"
|
|
Then the create command should fail with exit code 1
|
|
|
|
Scenario: Create a project with invariants
|
|
When I run project create named "inv-proj" with invariants "do not modify tests" plus "keep API stable"
|
|
Then the project "local/inv-proj" should exist
|
|
|
|
# ── List ─────────────────────────────────────────────────────
|
|
|
|
Scenario: List projects shows created projects
|
|
Given a project "local/proj-a" already exists
|
|
And a project "local/proj-b" already exists
|
|
When I list projects
|
|
Then the project list should contain "local/proj-a"
|
|
And the project list should contain "local/proj-b"
|
|
|
|
Scenario: List projects with namespace filter
|
|
Given a project "local/proj-x" already exists
|
|
And a project "team/proj-y" already exists
|
|
When I list projects with namespace "team"
|
|
Then the project list should contain "team/proj-y"
|
|
And the project list should not contain "local/proj-x"
|
|
|
|
Scenario: List projects with regex filter
|
|
Given a project "local/api-service" already exists
|
|
And a project "local/web-app" already exists
|
|
When I list projects with regex "api"
|
|
Then the project list should contain "local/api-service"
|
|
And the project list should not contain "local/web-app"
|
|
|
|
Scenario: List projects with invalid regex fails
|
|
When I list projects with invalid regex "[invalid"
|
|
Then the list command should fail with exit code 1
|
|
|
|
Scenario: List projects when empty shows message
|
|
When I list projects
|
|
Then the project CLI output should contain "No projects found"
|
|
|
|
# ── Show ─────────────────────────────────────────────────────
|
|
|
|
Scenario: Show project displays details
|
|
Given a project "local/show-test" already exists with description "A test project"
|
|
When I show project "local/show-test"
|
|
Then the show output should contain "local/show-test"
|
|
And the show output should contain "A test project"
|
|
|
|
Scenario: Show nonexistent project fails
|
|
When I show project "local/nonexistent"
|
|
Then the show command should fail with exit code 1
|
|
|
|
Scenario: Show project with linked resources
|
|
Given a project "local/linked-proj" already exists
|
|
And a resource is linked to project "local/linked-proj"
|
|
When I show project "local/linked-proj"
|
|
Then the show output should contain "linked_resources"
|
|
|
|
# ── Link Resource ────────────────────────────────────────────
|
|
|
|
Scenario: Link resource to project
|
|
Given a project "local/link-test" already exists
|
|
And a registered resource "my-resource" exists
|
|
When I link resource "my-resource" to project "local/link-test"
|
|
Then the link should succeed
|
|
|
|
Scenario: Link resource read-only to project
|
|
Given a project "local/ro-test" already exists
|
|
And a registered resource "ro-resource" exists
|
|
When I link resource "ro-resource" to project "local/ro-test" with read-only
|
|
Then the link should succeed
|
|
|
|
Scenario: Link resource to nonexistent project fails
|
|
When I attempt to link to nonexistent project "local/no-such-project"
|
|
Then the link command should fail with exit code 1
|
|
|
|
Scenario: Link nonexistent resource to project fails
|
|
Given a project "local/link-fail" already exists
|
|
When I link nonexistent resource "no-such-resource" to project "local/link-fail"
|
|
Then the link command should fail with exit code 1
|
|
|
|
# ── Unlink Resource ──────────────────────────────────────────
|
|
|
|
Scenario: Unlink resource from project
|
|
Given a project "local/unlink-test" already exists
|
|
And a resource is linked to project "local/unlink-test"
|
|
When I unlink the resource from project "local/unlink-test" with yes
|
|
Then the unlink should succeed
|
|
|
|
Scenario: Unlink nonexistent resource from project fails
|
|
Given a project "local/unlink-fail" already exists
|
|
When I unlink nonexistent resource from project "local/unlink-fail" with yes
|
|
Then the unlink command should fail with exit code 1
|
|
|
|
# ── Delete ───────────────────────────────────────────────────
|
|
|
|
Scenario: Delete project with confirmation
|
|
Given a project "local/del-test" already exists
|
|
When I delete project "local/del-test" with yes
|
|
Then the project "local/del-test" should not exist
|
|
|
|
Scenario: Delete nonexistent project fails
|
|
When I delete project "local/never-existed" with yes
|
|
Then the delete command should fail with exit code 1
|
|
|
|
Scenario: Delete project with linked resources without force fails
|
|
Given a project "local/del-linked" already exists
|
|
And a resource is linked to project "local/del-linked"
|
|
When I delete project "local/del-linked" with yes but no force
|
|
Then the delete command should fail with exit code 1
|
|
|
|
Scenario: Delete project with linked resources with force
|
|
Given a project "local/del-force" already exists
|
|
And a resource is linked to project "local/del-force"
|
|
When I delete project "local/del-force" with yes and force
|
|
Then the project "local/del-force" should not exist
|
|
|
|
# ── Format output ────────────────────────────────────────────
|
|
|
|
Scenario: List projects with JSON format
|
|
Given a project "local/json-test" already exists
|
|
When I list projects with format "json"
|
|
Then the project CLI output should contain "namespaced_name"
|
|
|
|
Scenario: Show project with YAML format
|
|
Given a project "local/yaml-test" already exists
|
|
When I show project details for "local/yaml-test" as "yaml"
|
|
Then the project CLI output should contain "namespaced_name"
|
|
|
|
Scenario: Show project with plain format
|
|
Given a project "local/plain-test" already exists
|
|
When I show project details for "local/plain-test" as "plain"
|
|
Then the project CLI output should contain "namespaced_name"
|
|
|
|
Scenario: Create project with JSON format
|
|
When I run project create named "fmt-proj" formatted as "json"
|
|
Then the project CLI output should contain "namespaced_name"
|
|
|
|
# ── Project spec dict helper ─────────────────────────────────
|
|
|
|
Scenario: Project spec dict contains expected keys
|
|
Given a project "local/spec-dict" already exists
|
|
When I generate the project spec dict for "local/spec-dict"
|
|
Then the spec dict should have key "namespaced_name"
|
|
And the spec dict should have key "namespace"
|
|
And the spec dict should have key "name"
|
|
And the spec dict should have key "description"
|
|
And the spec dict should have key "linked_resources"
|
|
And the spec dict should have key "created_at"
|
|
And the spec dict should have key "updated_at"
|