Files
brent.edwards f48eb5a05f
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 19s
CI / build (pull_request) Successful in 24s
CI / security (pull_request) Successful in 34s
CI / typecheck (pull_request) Successful in 43s
CI / integration_tests (pull_request) Successful in 2m37s
CI / unit_tests (pull_request) Successful in 6m12s
CI / docker (pull_request) Successful in 1m1s
CI / benchmark-regression (pull_request) Successful in 15m33s
CI / coverage (pull_request) Successful in 21m54s
feat(cli): add interactive repl
Implement `agents repl` command providing an interactive read-eval-print
loop that dispatches to existing CLI commands without the `agents` prefix.

Features:
- Command dispatch via existing Typer app
- readline history with --no-history opt-out (default: ~/.cleveragents/history)
- Tab-completion for all CLI commands and built-in commands
- !! last-command repetition
- Prompt context from CLEVERAGENTS_PROJECT / CLEVERAGENTS_PLAN env vars
- Ctrl+C (continue) and Ctrl+D (exit) signal handling
- Multi-line input with \ continuation
- :help and :exit/:quit built-in commands

Test coverage:
- 15 Behave scenarios (features/repl.feature)
- 10 Robot Framework smoke tests (robot/repl_smoke.robot)
- ASV benchmark suite (benchmarks/repl_bench.py)
- All nox sessions pass: lint, typecheck, unit_tests, integration_tests
- Coverage: 97.2% (threshold: 97%)
2026-02-23 03:11:12 +00:00

86 lines
2.9 KiB
Gherkin

Feature: Interactive REPL
The `agents repl` command provides an interactive session for dispatching
CLI commands without the leading `agents` prefix.
Scenario: REPL dispatches version command
Given the REPL is started
When I send the input "version"
Then the REPL output should contain "CleverAgents"
And the REPL exit code should be 0
Scenario: REPL handles :exit command
Given the REPL is started
When I send the input ":exit"
Then the REPL should exit cleanly
Scenario: REPL handles :quit command
Given the REPL is started
When I send the input ":quit"
Then the REPL should exit cleanly
Scenario: REPL handles :help command
Given the REPL is started
When I send the input ":help"
Then the REPL output should contain "Built-in commands"
And the REPL output should contain ":exit"
Scenario: REPL handles unknown command gracefully
Given the REPL is started
When I send the input "nonexistent-cmd"
Then the REPL output should contain "Error"
Scenario: REPL repeats last command with !!
Given the REPL is started
When I send the input "version"
And I send the input "!!"
Then the REPL output should contain "CleverAgents"
Scenario: REPL reports no previous command for !!
Given the REPL is started
When I send the input "!!"
Then the REPL output should contain "No previous command"
Scenario: REPL supports multi-line input
Given the REPL is started
When I send a multi-line version command
Then the REPL output should contain "CleverAgents"
Scenario: REPL with history disabled
Given the REPL is started with --no-history
When I send the input "version"
Then the REPL output should contain "CleverAgents"
And no history file should be written
Scenario: REPL with history enabled writes history file
Given the REPL is started with a custom history path
When I send the input "version"
And the REPL exits
Then the history file should exist
Scenario: REPL shows prompt context from environment
Given the environment variable "CLEVERAGENTS_PROJECT" is set to "myproj"
And the environment variable "CLEVERAGENTS_PLAN" is set to "myplan"
When I query the REPL prompt context
Then the prompt should contain "myproj"
And the prompt should contain "myplan"
Scenario: REPL handles Ctrl-C gracefully
Given the REPL is started
When I simulate a KeyboardInterrupt during input
Then the REPL should continue running
Scenario: REPL handles Ctrl-D for clean exit
Given the REPL is started
When I simulate an EOFError during input
Then the REPL should exit cleanly
Scenario: REPL handles empty input
Given the REPL is started
When I send an empty input line
Then the REPL should continue without error
Scenario: REPL dispatches config list command
Given the REPL is started
When I send the input "config list --format json"
Then the REPL exit code should be 0