forked from HAL9000/cleveragents-core
8d49a3b242
Add plain text (txt) export format to the TUI /session:export command. - Add Session.as_export_plain_text() domain method that produces a human-readable plain text transcript without Markdown formatting - Update TuiCommandRouter._session_export() to accept 'txt' as a valid format, building the plain text content via as_export_plain_text() - Update the invalid-format error message to include 'txt' as a valid option alongside 'json' and 'md' - Add BDD scenarios covering plain text export via TUI command and domain model, including with-messages and no-messages cases - Add corresponding step definitions for the new BDD scenarios The plain text format uses a simple separator-based layout: Session: <id> Actor: <actor> ... ---------------------------------------- [0] USER (timestamp): message content ---------------------------------------- ISSUES CLOSED: #3036
145 lines
7.5 KiB
Gherkin
145 lines
7.5 KiB
Gherkin
Feature: TUI session export/import (JSON + Markdown)
|
|
As a TUI user
|
|
I want to export sessions to JSON and Markdown formats
|
|
And import sessions from JSON files via slash commands
|
|
So that I can share, archive, and restore conversation history
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Session domain model: as_export_markdown()
|
|
# ---------------------------------------------------------------------------
|
|
|
|
Scenario: Session with messages exports to Markdown
|
|
Given a session with two messages for markdown export
|
|
When I call as_export_markdown on the session
|
|
Then the markdown output should start with "# Session:"
|
|
And the markdown output should contain "## Messages"
|
|
And the markdown output should contain "USER"
|
|
And the markdown output should contain "ASSISTANT"
|
|
And the markdown output should contain "Hello from user"
|
|
And the markdown output should contain "Hello from assistant"
|
|
|
|
Scenario: Session with no messages exports to Markdown with placeholder
|
|
Given a session with no messages for markdown export
|
|
When I call as_export_markdown on the session
|
|
Then the markdown output should start with "# Session:"
|
|
And the markdown output should contain "*(no messages)*"
|
|
|
|
Scenario: Markdown export includes actor and namespace
|
|
Given a session with actor "openai/gpt-4" for markdown export
|
|
When I call as_export_markdown on the session
|
|
Then the markdown output should contain "**Actor:** openai/gpt-4"
|
|
And the markdown output should contain "**Namespace:** local"
|
|
|
|
Scenario: Markdown export includes linked plan IDs
|
|
Given a session with linked plans for markdown export
|
|
When I call as_export_markdown on the session
|
|
Then the markdown output should contain "**Linked Plans:**"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# CLI export command: --format md flag
|
|
# ---------------------------------------------------------------------------
|
|
|
|
Scenario: Export session as Markdown to stdout
|
|
Given there is a mocked session for markdown export
|
|
When I run session CLI export with --format md and no output file
|
|
Then the md export CLI result code should be zero
|
|
And the md export CLI output should include "# Session:"
|
|
|
|
Scenario: Export session as Markdown to file
|
|
Given there is a mocked session for markdown export
|
|
When I run session CLI export with --format md to a temp file
|
|
Then the md export CLI result code should be zero
|
|
And the exported markdown file should exist
|
|
And the exported markdown file should contain "# Session:"
|
|
|
|
Scenario: Export session as JSON (default format)
|
|
Given there is a mocked session for markdown export
|
|
When I run session CLI export with no format flag
|
|
Then the md export CLI result code should be zero
|
|
And the md export CLI output should be parseable as JSON
|
|
|
|
Scenario: Export with invalid format flag returns error
|
|
Given there is a mocked session for markdown export
|
|
When I run session CLI export with --format xml
|
|
Then the md export CLI result code should be nonzero
|
|
And the md export CLI output should include "Invalid format"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# TUI command router: /session export and /session import
|
|
# ---------------------------------------------------------------------------
|
|
|
|
Scenario: TUI session export command returns success message
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export" for the current session
|
|
Then the TUI handle result should contain "Session exported"
|
|
|
|
Scenario: TUI session export with path writes file
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export /tmp/tui_test_export.json" for the current session
|
|
Then the TUI handle result should contain "Session exported to"
|
|
And the tui exported file "/tmp/tui_test_export.json" should exist
|
|
|
|
Scenario: TUI session export with --format md returns success
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export --format md" for the current session
|
|
Then the TUI handle result should contain "Session exported (MD)"
|
|
|
|
Scenario: TUI session export with invalid format returns error
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export --format xml" for the current session
|
|
Then the TUI handle result should contain "Invalid format"
|
|
|
|
Scenario: TUI session import with valid file returns success
|
|
Given a TUI command router with mocked session service for import
|
|
And there is a valid JSON export file for TUI import
|
|
When I call TUI handle with "session import <path>" for the import file
|
|
Then the TUI handle result should contain "Session imported:"
|
|
|
|
Scenario: TUI session import with no path returns usage
|
|
Given a TUI command router with mocked session service for import
|
|
When I call TUI handle with "session import" for the current session
|
|
Then the TUI handle result should be "Usage: /session:import <path>"
|
|
|
|
Scenario: TUI session import with non-existent file returns error
|
|
Given a TUI command router with mocked session service for import
|
|
When I call TUI handle with "session import /tmp/nonexistent_tui_file.json" for the current session
|
|
Then the TUI handle result should contain "File not found"
|
|
|
|
Scenario: TUI session import with invalid JSON returns error
|
|
Given a TUI command router with mocked session service for import
|
|
And there is an invalid JSON file for TUI import
|
|
When I call TUI handle with "session import <invalid_path>" for the import file
|
|
Then the TUI handle result should contain "Invalid JSON"
|
|
|
|
Scenario: TUI session export with --format txt returns success
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export --format txt" for the current session
|
|
Then the TUI handle result should contain "Session exported (TXT)"
|
|
|
|
Scenario: TUI session export with --format txt to file writes plain text
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export --format txt /tmp/tui_test_export.txt" for the current session
|
|
Then the TUI handle result should contain "Session exported to"
|
|
And the tui exported file "/tmp/tui_test_export.txt" should exist
|
|
|
|
Scenario: Plain text export contains session header and messages
|
|
Given a session with two messages for plain text export
|
|
When I call as_export_plain_text on the session
|
|
Then the plain text output should start with "Session:"
|
|
And the plain text output should contain "USER"
|
|
And the plain text output should contain "ASSISTANT"
|
|
And the plain text output should contain "Hello from user"
|
|
And the plain text output should contain "Hello from assistant"
|
|
|
|
Scenario: Plain text export with no messages contains placeholder
|
|
Given a session with no messages for plain text export
|
|
When I call as_export_plain_text on the session
|
|
Then the plain text output should start with "Session:"
|
|
And the plain text output should contain "(no messages)"
|
|
|
|
Scenario: TUI session export error message includes txt format
|
|
Given a TUI command router with mocked session service for export
|
|
When I call TUI handle with "session export --format xml" for the current session
|
|
Then the TUI handle result should contain "Invalid format"
|
|
And the TUI handle result should contain "txt"
|