## Summary Fixes the flaky `style-check-agnoctl` job on `main`: ``` FAILED tests/test_create_lifecycle.py::test_create_arrow_selector_transitions_to_name_prompt_in_narrow_pty - Failed: create did not exit after selecting a template and aborting the name prompt ``` Seen on main runs 35972742169, 35977886215, 35830028266 and 35590617928, with passing runs on the same runner image, Python 3.10.21 and identical package versions in between, so it is a race, not an environment change. **Root cause.** The test sent `SIGINT` to the `agno create` child the instant `Project name` appeared on the pty. CPython's `input()` writes the prompt and then blocks in `read()` with no signal check in between. A `SIGINT` that lands in that window only sets the pending flag; the `read()` blocks anyway and the process never exits, so the test times out. The child's prompt write wakes the test process, which can preempt the child and send the signal before the read starts. This is common on the two-vCPU CI runners and reproduces locally under CPU contention (1 hang in 300 runs of a minimal `input()` child). **Fix.** Write Ctrl-D through the pty instead of sending a signal. The tty queues it until the prompt actually reads, so there is no lost-wakeup window, and click turns the resulting `EOFError` into the same `Abort` exit (`Aborted`, exit code 1, no files created). Ctrl-D is only treated as EOF in cooked mode, so the test now also fails if prompt_toolkit does not restore the terminal after the selector, which is the transition the test exists to cover. The raw-mode Ctrl-C path is still covered by `test_template_selector_converts_keyboard_interrupt_to_clean_abort`. The timeout failure now includes the captured pty output so the next flake is diagnosable from CI logs. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Breaking change - [ ] Improvement - [ ] Model update - [ ] Other: --- ## Checklist - [x] Code complies with style guidelines - [x] Ran format/validation scripts (`./scripts/format.sh` and `./scripts/validate.sh`) - [x] Self-review completed - [x] Documentation updated (comments, docstrings) - [ ] Examples and guides: Relevant cookbook examples have been included or updated (if applicable) - [x] Tested in clean environment - [x] Tests added/updated (if applicable) ### Duplicate and AI-Generated PR Check - [x] I have searched existing [open pull requests](https://github.com/agno-agi/agno/pulls) and confirmed that no other PR already addresses this issue - [ ] If a similar PR exists, I have explained below why this PR is a better approach - [x] Check if this PR was entirely AI-generated (by Copilot, Claude Code, Cursor, etc.) --- ## Additional Notes Verification: the fixed test passed 15/15 runs locally, 10/10 under 12 competing CPU hogs, and the full agnoctl suite passes (345 tests). Ruff format and check pass on the file. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
agnoctl
The CLI for AgentOS, built for humans and coding agents.
Create a new AgentOS interactively:
uvx agno create
Choose from nine maintained starters—Docker, AWS, Azure, Fly, GCP, Helm, Modal,
Railway, and Render—using the arrow keys or 1–9, then name your project.
Press Enter to use agentos-docker and agent-platform. The CLI clones the
template and copies example.env to .env.
Then enter the project and choose a setup path:
cd agent-platform
Recommended: open the project in your coding agent and ask it to run the
setup-platform skill in .agents/skills/. The skill configures the project,
starts it, verifies it, connects the AgentOS UI, and helps build your first agent.
Or set it up manually: add your secrets to .env, then run:
uvx agno up
For automation, pass the project name and optional template explicitly:
uvx agno create my-agentos --template agentos-railway --json