Files
Jeffrey Phillips Freeman 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
feat(cli): add project commands (core)
2026-02-16 23:56:55 -05:00

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"