936864418f
CI / benchmark-publish (pull_request) Has been skipped
CI / push-validation (pull_request) Successful in 53s
CI / lint (pull_request) Failing after 59s
CI / build (pull_request) Failing after 58s
CI / typecheck (pull_request) Failing after 58s
CI / e2e_tests (pull_request) Failing after 58s
CI / unit_tests (pull_request) Failing after 58s
CI / integration_tests (pull_request) Failing after 59s
CI / quality (pull_request) Failing after 58s
CI / helm (pull_request) Successful in 56s
CI / security (pull_request) Failing after 58s
CI / coverage (pull_request) Has been skipped
CI / docker (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Failing after 1m57s
CI / status-check (pull_request) Failing after 4s
Restores several regressions introduced in earlier commits on this branch: 1. Restored check_same_thread=False for SQLite in migration_runner.py get_current_revision() — prevents threading errors when called from non-main threads (regression from master). 2. Restored RLock release-before-transport-call pattern in mcp/adapter.py discover_tools() and invoke() — prevents deadlocks when concurrent operations are blocked by slow network I/O (bug #10512 fix). 3. Restored tdd_mcp_adapter_rlock_concurrency.feature and step definitions that verify the RLock fix — these were incorrectly deleted. 4. Restored consolidated_misc.feature scenario for check_same_thread=False and migration_runner_steps.py step definition — incorrectly deleted. 5. Restored session_cli.feature scenarios for full ULID display and session_cli_steps.py step definitions — incorrectly deleted. 6. Restored session.py to use full session IDs (not truncated [:8]). 7. Restored llm_trace_repository.py UnitOfWork mode with explicit session parameter support — incorrectly simplified. Closes #8623
219 lines
9.4 KiB
Gherkin
219 lines
9.4 KiB
Gherkin
Feature: Session CLI commands
|
|
As a developer
|
|
I want to manage sessions via CLI commands
|
|
So that I can create and use persistent conversation threads
|
|
|
|
Background:
|
|
Given a session CLI runner with mocked service
|
|
|
|
# Create command tests
|
|
Scenario: Create session with defaults
|
|
When I run session CLI create with no arguments
|
|
Then the session CLI create should succeed
|
|
And the session CLI output should contain "Session created"
|
|
|
|
Scenario: Create session with custom actor
|
|
When I run session CLI create with --actor "openai/gpt-4"
|
|
Then the session CLI create should succeed
|
|
And the session CLI output should contain "openai/gpt-4"
|
|
|
|
Scenario: Create session with JSON format
|
|
When I run session CLI create with --format json
|
|
Then the session CLI create should succeed
|
|
And the session CLI output should be valid JSON
|
|
|
|
# List command tests
|
|
Scenario: List sessions when empty
|
|
Given there are no mocked sessions
|
|
When I run session CLI list
|
|
Then the session CLI output should contain "No sessions found"
|
|
|
|
Scenario: List sessions with populated data
|
|
Given there are mocked existing sessions
|
|
When I run session CLI list
|
|
Then the session CLI should show all sessions in a table
|
|
|
|
Scenario: List sessions with JSON format
|
|
Given there are mocked existing sessions
|
|
When I run session CLI list with --format json
|
|
Then the session CLI output should be valid JSON
|
|
And the session CLI JSON should contain "sessions"
|
|
|
|
Scenario: List sessions JSON matches the documented contract
|
|
Given there are mocked existing sessions
|
|
When I run session CLI list with --format json
|
|
Then the session CLI JSON list entries should match the documented contract
|
|
|
|
Scenario: List sessions displays full 26-character ULIDs in Rich table
|
|
Given there are mocked existing sessions
|
|
When I run session CLI list
|
|
Then the session CLI rich table should display full session ULIDs
|
|
|
|
Scenario: List sessions summary panel shows full ULIDs for unnamed sessions
|
|
Given there are mocked existing sessions
|
|
When I run session CLI list
|
|
Then the session CLI summary panel should contain full session ULIDs
|
|
|
|
Scenario: List sessions summary panel shows session names for named sessions
|
|
Given there are mocked existing named sessions
|
|
When I run session CLI list
|
|
Then the session CLI summary panel should show session names
|
|
|
|
Scenario: Full session ID from list output works with session tell
|
|
Given there are mocked existing sessions
|
|
When I run session CLI list
|
|
And I capture the first session full ULID from the output
|
|
And I run session CLI tell with the full session ID and prompt "Hello from list"
|
|
Then the session CLI tell should succeed
|
|
|
|
# Show command tests
|
|
Scenario: Show session with valid ID
|
|
Given there is a mocked session with messages
|
|
When I run session CLI show with a valid session ID
|
|
Then the session CLI show should succeed
|
|
And the session CLI output should contain "Session Summary"
|
|
And the session CLI output should contain "ID:"
|
|
And the session CLI output should contain "Actor:"
|
|
And the session CLI output should contain "Messages:"
|
|
And the session CLI output should contain "Created:"
|
|
And the session CLI output should contain "Updated:"
|
|
And the session CLI output should contain "Automation:"
|
|
And the session CLI output should not contain "Session ID:"
|
|
And the session CLI output should not contain "Namespace:"
|
|
|
|
Scenario: Show session with JSON format
|
|
Given there is a mocked session with messages
|
|
When I run session CLI show with --format json
|
|
Then the session CLI output should be valid JSON
|
|
|
|
Scenario: Show session JSON includes token usage counts
|
|
Given there is a mocked session with messages
|
|
When I run session CLI show with --format json
|
|
Then the session CLI JSON token usage should include counts
|
|
|
|
Scenario: Show session with invalid ID
|
|
When I run session CLI show with an invalid session ID
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "Session not found"
|
|
|
|
# Delete command tests
|
|
Scenario: Delete session with --yes flag
|
|
Given there is a mocked session to delete
|
|
When I run session CLI delete with --yes
|
|
Then the session CLI delete should succeed
|
|
And the session CLI output should contain "deleted"
|
|
|
|
Scenario: Delete non-existent session
|
|
When I run session CLI delete with a non-existent ID
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "Session not found"
|
|
|
|
# Export command tests
|
|
Scenario: Export session to stdout renders Rich panels
|
|
Given there is a mocked session for export
|
|
When I run session CLI export with no output file
|
|
Then the session CLI export should succeed
|
|
And the session CLI output should contain "Session Export"
|
|
And the session CLI output should contain "Contents"
|
|
And the session CLI output should contain "Integrity"
|
|
And the session CLI output should contain "Export completed"
|
|
|
|
Scenario: Export session to file renders Rich panels
|
|
Given there is a mocked session for export
|
|
When I run session CLI export with --output to a temp file
|
|
Then the session CLI export should succeed
|
|
And the exported file should exist
|
|
And the session CLI output should contain "Session Export"
|
|
And the session CLI output should contain "Contents"
|
|
And the session CLI output should contain "Integrity"
|
|
And the session CLI output should contain "Export completed"
|
|
|
|
Scenario: Export session to file shows correct output path in panel
|
|
Given there is a mocked session for export
|
|
When I run session CLI export with --output to a temp file
|
|
Then the session CLI export should succeed
|
|
And the session CLI output should contain "Output:"
|
|
|
|
Scenario: Export session to stdout shows stdout indicator in panel
|
|
Given there is a mocked session for export
|
|
When I run session CLI export with no output file
|
|
Then the session CLI export should succeed
|
|
And the session CLI output should contain "(stdout)"
|
|
|
|
Scenario: Export refuses overwrite without --force
|
|
Given there is a mocked session for export
|
|
And there is an existing export file
|
|
When I run session CLI export to an existing file without --force
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "File already exists"
|
|
|
|
Scenario: Export with --force overwrites file
|
|
Given there is a mocked session for export
|
|
And there is an existing export file
|
|
When I run session CLI export to an existing file with --force
|
|
Then the session CLI export should succeed
|
|
And the session CLI output should contain "Export completed"
|
|
|
|
Scenario: Export non-existent session
|
|
When I run session CLI export with a non-existent session ID
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "Session not found"
|
|
|
|
# Import command tests
|
|
Scenario: Import session from valid file
|
|
Given there is a valid session export file
|
|
When I run session CLI import with the export file
|
|
Then the session CLI import should succeed
|
|
And the session CLI output should contain "Session Import"
|
|
And the session CLI output should contain "Validation"
|
|
And the session CLI output should contain "Merge"
|
|
And the session CLI output should contain "Import completed"
|
|
|
|
Scenario: Import session shows correct panel fields
|
|
Given there is a valid session export file
|
|
When I run session CLI import with the export file
|
|
Then the session CLI import should succeed
|
|
And the session CLI output should contain "Input:"
|
|
And the session CLI output should contain "Session ID:"
|
|
And the session CLI output should contain "Messages:"
|
|
And the session CLI output should contain "Schema:"
|
|
And the session CLI output should contain "Checksum:"
|
|
And the session CLI output should contain "Actor Ref:"
|
|
And the session CLI output should contain "Existing:"
|
|
And the session CLI output should contain "Strategy:"
|
|
|
|
Scenario: Import from non-existent file
|
|
When I run session CLI import with a non-existent file
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "File not found"
|
|
|
|
Scenario: Import from corrupt file
|
|
Given there is a corrupt session export file
|
|
When I run session CLI import with the corrupt file
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "Import error"
|
|
|
|
Scenario: Import from invalid JSON file
|
|
Given there is an invalid JSON file
|
|
When I run session CLI import with the invalid JSON file
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "Invalid JSON"
|
|
|
|
# Tell command tests
|
|
Scenario: Tell appends message to session
|
|
Given there is a mocked session for tell
|
|
When I run session CLI tell with a prompt "Hello, world"
|
|
Then the session CLI tell should succeed
|
|
And the session CLI output should contain "Acknowledged"
|
|
|
|
Scenario: Tell with custom actor
|
|
Given there is a mocked session for tell
|
|
When I run session CLI tell with --actor "openai/gpt-4" and prompt "Plan a feature"
|
|
Then the session CLI tell should succeed
|
|
And the session CLI output should contain "openai/gpt-4"
|
|
|
|
Scenario: Tell to non-existent session
|
|
When I run session CLI tell to a non-existent session
|
|
Then the session CLI should exit with error
|
|
And the session CLI output should contain "Session not found"
|