What's Changed
- Set up OpenHands CLI package structure with UV and Poetry by @malhotra5 in #1
- Setup pre-commit for Python files by @malhotra5 in #3
- Add PyInstaller packaging support for CLI binary by @malhotra5 in #5
- Simplify lint commands in Makefile by @malhotra5 in #7
- Create repo.md microagent with linting and documentation guidelines by @malhotra5 in #9
- Update repo.md with project details and references by @malhotra5 in #11
- Add GitHub workflow to test binary executable build by @malhotra5 in #13
- Add simple agent interaction functionality by @malhotra5 in #10
- Add macro style commands with dropdown window by @malhotra5 in #17
- Make comment more truthful by @malhotra5 in #18
- Clean README and add Development.md for build/developer guidance by @malhotra5 in #20
- Add modern typing requirement to repo.md by @malhotra5 in #24
- Update agent-sdk version and import paths by @malhotra5 in #26
- Add repo.md with instructions for updating agent-sdk SHA by @malhotra5 in #29
- Add confirmation mode to CLI by @malhotra5 in #30
- Update agent-sdk SHA and remove openhands/code path manipulation by @malhotra5 in #35
- feat(cli): add threaded Ctrl-P pause listener for synchronous SDK by @malhotra5 in #34
- Clean up files by @malhotra5 in #36
- Use dropdown for confirmation by @malhotra5 in #37
- Add "No (with reason)" option to confirmation dialog by @malhotra5 in #39
- Fix pause resume pause in confirmation mode by @malhotra5 in #38
- re arrange tests by @malhotra5 in #42
- Update agent-sdk SHA and remove openhands/code from Python path by @malhotra5 in #44
- Add 'Always proceed (don't ask again)' option to confirmation mode by @malhotra5 in #43
- Update sha by @malhotra5 in #46
- Test conversation runner with fewer mocks by @raymyers in #48
- Update README to reflect project relocation by @malhotra5 in #49
- Chore: copy over V1 CLI from OpenHands/OpenHands repo by @malhotra5 in #50
- Align OpenHands-CLI project configurations with agent-sdk by @malhotra5 in #51
- Only set litellm_extra_body for litellm_proxy models by @xingyaoww in #56
- Add code coverage collection and PR reporting to CI by @malhotra5 in #55
- feat: implement support for skills and legacy microagents in CLI by @malhotra5 in #53
- Fix: Check for openhands/ prefix instead of litellm_proxy in model name by @xingyaoww in #57
- Update CLI visualizer to use horizontal rules instead of panels by @xingyaoww in #64
- Fix model list display to show up to 10 models per provider by @xingyaoww in #74
- Release 1.2.0 + 1.2.1 by @malhotra5 in #75
- Fix binary artifact upload by @malhotra5 in #76
- Fix: Set prompt_continuation to empty string for cleaner multiline input by @Chesars in #65
- feat: Add --version/-v flag support to print CLI version by @xingyaoww in #113
- ci: Add binary --version test to CI workflow by @xingyaoww in #116
- feat(cli): add task & file params by @jwerner08 in #131
- Restrict Python version to <3.14 to avoid tiktoken build issues by @xingyaoww in #133
- Initial ACP Implementation by @xingyaoww in #69
- Tweak SDK name by @enyst in #63
- Add automatic version check and update prompt by @xingyaoww in #109
- test: add coverage for verify_agent_exists_or_setup_agent by @tosincarik in #121
- Remove -cli suffix requirement from release workflows by @malhotra5 in #137
- Display version number in grey color for consistency by @xingyaoww in #139
- Release 1.3.0 by @malhotra5 in #138
- Add CI workflow to update PR descriptions with uvx launch instructions by @malhotra5 in #140
- feat: Add --always-approve and --llm-approve CLI arguments for confirmation mode by @xingyaoww in #110
- Load public skills in CLI by @xingyaoww in #149
- Load .env at CLI startup to avoid python-dotenv stack-walk failures by @enyst in #162
- Fix ACP session/new returning null session ID by @xingyaoww in #164
- Release 1.4.0 by @malhotra5 in #165
- fix: hardcode base_url for OpenHands provider in CLI by @xingyaoww in #168
- Release 1.4.1 by @malhotra5 in #171
- Fix malformed mcp.json error handling in ACP by @neubig in #153
- Fix missing import and incorrect parameter names in ACP agent tests by @neubig in #172
- Fix URL display by adding newlines to prevent truncation by @xingyaoww in #173
- Refactor CLI UI by @malhotra5 in #141
- Add metrics to ACP meta field by @xingyaoww in #175
- Fix multi-line paste issue in single-line input mode by @malhotra5 in #177
- Fix API key preservation in settings screen by @malhotra5 in #178
- Add --exit-without-confirmation CLI parameter for refactor UI by @malhotra5 in #182
- Add end-to-end test for experimental UI with --exp flag by @malhotra5 in #183
- Refactor E2E tests into separate files with structured results by @malhotra5 in #184
- Add status_line metric to ACP event metadata by @xingyaoww in #181
- Chore: bump agent sdk by @malhotra5 in #187
- Fix error display crash when error message contains XML special characters by @jpshackelford in #188
- feat: implement headless mode with auto-exit functionality by @malhotra5 in #186
- Implement slash commands and confirmation mode for ACP by @xingyaoww in #176
- Feat:
/condensecommand to force compact conversation history by @malhotra5 in #191 - bump sdk by @malhotra5 in #197
- Fix false positive on e2e test + binary executable packaging by @malhotra5 in #198
- Release 1.5.0 by @malhotra5 in #195
- CLI helper args to add/remove MPC servers by @malhotra5 in #185
- feat: show conversation list and ability to resume latest conversation by @malhotra5 in #193
- Fix MCP stdio server argument parsing with -- separator by @malhotra5 in #201
- Add macOS Intel support to CI workflow by @malhotra5 in #190
- Add Ubuntu ARM64 support to CI binary builds by @malhotra5 in #213
- Add ConversationErrorEvent handling to conversation visualizer by @malhotra5 in #216
- refactor: replace direct color usage with OPENHANDS_THEME colors by @malhotra5 in #219
- Use public SDK imports instead of internal module imports by @malhotra5 in #217
- Add OAuth 2.0 Device Flow CLI authentication by @malhotra5 in #192
- Release 1.6.0 by @malhotra5 in #229
- Update ACP help to list Toad CLI before Zed IDE by @malhotra5 in #233
- feat: Delegate conversation to cloud by @malhotra5 in #230
- Add workflow to update install-openhands-website on release by @malhotra5 in #237
- test(cli): ensure help text mentions key subcommands and flags by @antznette1 in #156
- feat: Add tabbed interface to settings modal by @malhotra5 in #231
- Make experimental UI the default UI by @malhotra5 in #235
- feat(mcp): Add enable/disable functionality for MCP servers by @jpshackelford in #242
- Chore: reorganize files by @malhotra5 in #248
- Feat: launch CLI as a browser app by @malhotra5 in #247
- Add
--json flagfor json streaming in headless mode by @malhotra5 in #249 - Fix none type error in cloud connection by @malhotra5 in #250
- Use load_project_skills from SDK instead of custom implementation & upgrade to sdk 1.7.1 by @xingyaoww in #225
- Add os description to AgentContext by @mathew1046 in #256
- Bump SDK packages to v1.7.2 by @all-hands-bot in #266
- Add --resume and --last flags support to openhands acp command by @xingyaoww in #265
- Always create fresh condenser with current defaults on load by @xingyaoww in #263
- Release 1.7.0 by @malhotra5 in #262
- feat: implement streaming LLM outputs for ACP implementation by @malhotra5 in #254
- Bump SDK packages to v1.7.3 by @all-hands-bot in #272
- fix(cli): add terminal compatibility detection by @tosincarik in #205
- fix: clipboard copy when copy button is pressed by @malhotra5 in #273
- fix: Skip PR description update if uvx section already exists by @malhotra5 in #279
- Chore: rename files and directories by @malhotra5 in #278
- fix: use model_id without provider prefix when loading settings by @neubig in #280
- Release 1.7.1 by @malhotra5 in #281
- Skip PR description update for forked repos by @malhotra5 in #285
- fix(tui): disable markup parsing for user messages to prevent crashes by @softpudding in #286
- Fix confirmation panel scrolling when content is too long by @malhotra5 in #297
- Move confirmation panel inline underneath action events by @malhotra5 in #299
- feat: Add toggle for default cell expand/collapse state by @jpshackelford in #295
- Add view command to display conversation trajectory by @xingyaoww in #290
- Add /feedback command for users to send anonymous feedback about CLI by @malhotra5 in #293
- Add pytest-textual-snapshot and integration tests by @xingyaoww in #259
- Add stale issues workflow by @malhotra5 in #310
- Release 1.8.1 by @malhotra5 in #306
- feat: Add drag-to-select auto-copy feature for conversation events by @malhotra5 in #312
- Add notification to restart CLI after settings change by @malhotra5 in #311
- Print raw JSON when event validation fails by @xingyaoww in #313
- Bump SDK packages to v1.8.1 by @all-hands-bot in #323
- Use LLM-generated action summary instead of string truncation heuristic + UI Clean up by @xingyaoww in #303
- Implement /new command to start a new conversation by @malhotra5 in #325
- Release 1.8.2 by @malhotra5 in #326
- fix: Correctly format LLM model names for litellm providers by @pashkash in #322
- Truncate long terminal commands in collapsed view by @jpshackelford in #335
- auth: prefer verification_uri_complete for OAuth device flow by @enyst in #319
- Add AGENTS.md and link OpenHands repo guidance by @enyst in #340
- feat: Show context window and cost metrics in status bar by @xingyaoww in #331
- Make ACP token streaming the default behavior by @malhotra5 in #336
- feat: Add dedicated plan window for agent task tracking by @malhotra5 in #315
- chore: Remove unused 'Display Cost Per Action' setting by @xingyaoww in #347
- Rewrite README by @malhotra5 in #337
- Remove .openhands/skills/repo.md symlink by @enyst in #348
- Chore: remove --exp feature flag by @malhotra5 in #350
- Add external editor support with CTRL+X shortcut by @juanmichelini in #328
- Bump SDK packages to v1.8.2 by @all-hands-bot in #354
- Ignore whitespace-only reasoning_content in streaming by @xingyaoww in #351
- Add test for Mistral XML function call syntax handling in visualizer by @malhotra5 in #210
- fix(input): implement auto-growing input with soft wrapping by @malhotra5 in #276
- feat(acp): Send LLM-generated summary to tool call title by @xingyaoww in #332
- Release 1.9.0 by @malhotra5 in #359
- Fix cloud login to respect llm_base_url from settings by @enyst in #361
- (Hotfix): CLI crashes when opening MCP panel by @malhotra5 in #363
- Patch release 1.9.1 by @malhotra5 in #364
- feat: support agent setup via environment variables by @malhotra5 in #366
- [Refactor]: Auto-login when cloud credentials are invalid by @malhotra5 in #368
- Fix capitalization in command palette for Plan and Settings by @xingyaoww in #375
- feat: send metadata for models using llm-proxy base URLs by @xingyaoww in #377
- docs(CONTRIBUTING): Correct install pre-commit hooks command by @utkarsh-in in #374
- fix: Issue with memory condensation not being editable by @BalasubramanyamEvani in #372
- feat: Add details about recommended models and use cases in CLI settings (#246) by @BalasubramanyamEvani in #357
- fix: require --override-with-envs flag to apply LLM env vars by @xingyaoww in #379
- Clean-up dead-code in
openhands-cli/argparsersby @VascoSch92 in #371 - feat(tui): conversation history side panel by @pashkash in #333
- Add workflow to bump agent-sdk versions by @malhotra5 in #380
- Add workflow to bump version and create draft PR by @malhotra5 in #381
- Bump openhands-sdk and openhands-tools to 1.9.0 by @all-hands-bot in #382
- Add Critic Result Display in TUI by @xingyaoww in #360
- Bump version to 1.10.0 by @all-hands-bot in #383
- Add weekly type checking report workflow by @malhotra5 in #385
- Feat: delegate tool for spawning sub-agents by @malhotra5 in #341
- Exp: remote acp conversations by @malhotra5 in #277
- Fix critic feedback text to include 'success' prediction by @xingyaoww in #391
- feat: support auth for local ACP agent by @malhotra5 in #394
- fix: pin rich<14.3.0 to fix autocomplete shutdown crash by @jpshackelford in #402
- fix: display agent MessageEvents in TUI when critic is enabled by @jpshackelford in #400
- (Hotfix): fix headless mode to work with env overrides + disable critic in headless mode by @malhotra5 in #388
- Bump openhands-sdk and openhands-tools to 1.10.0 by @all-hands-bot in #417
- Bump version to 1.11.0 by @all-hands-bot in #418
- Remove spinner in headless mode, output status messages once by @malhotra5 in #420
- Preserve condenser settings from agent_settings.json by @enyst in #390
- feat: Load hooks from ~/.openhands/hooks.json in CLI by @neubig in #428
- docs: clarify uv usage in AGENTS by @enyst in #425
- cli: add --yolo as alias for --always-approve by @enyst in #424
- feat(e2e): add mock LLM server and full UI e2e tests by @malhotra5 in #427
- Add e2e snapshot test for creating agent plan trajectory + fix test flakiness by @malhotra5 in #432
- Add e2e snapshot tests for initial setup flow by @malhotra5 in #433
- Add E2E snapshot tests for history panel and conversation switching by @malhotra5 in #435
- tui: hide slash commands from vertical scroll by @malhotra5 in #438
- fix(tui): reset token metrics when creating new conversation by @malhotra5 in #439
- Add E2E snapshot test for multi-line mode submission by @malhotra5 in #437
- update critic feature description by @xingyaoww in #422
- fix: critic - no module named posthog by @brettstewart in #448
- fix(widgets): remove unnecessary type: ignore in collapsible.py by @github-actions[bot] in #458
- docs: clarify lint before commits by @enyst in #467
- ci: add daily good first issue labeler workflow by @enyst in #464
- Add automated PR review workflow using OpenHands by @jamiechicago312 in #442
- Add LMNR_PROJECT_API_KEY and all-hands-bot reviewer support by @neubig in #470
- refactor: add reactive state management + decouple main app from conversation management by @malhotra5 in #421
- Add e2e snapshot tests for confirmation mode by @malhotra5 in #479
- docs: minor documentation tweaks by @enyst in #471
- fix(tests): stabilize input cursor snapshots by @enyst in #476
- Bump openhands-sdk and openhands-tools to 1.11.0 by @all-hands-bot in #461
- add close button and Escape to dismiss history panel by @rstar327 in #454
- Bump version to 1.12.0 by @all-hands-bot in #480
- docs: clarify lint-before-commit guidance by @enyst in #460
- refactor: use consolidated pr-review action from SDK by @xingyaoww in #477
- fix: pass Laminar API key as action input in PR review workflow by @xingyaoww in #484
- feat: Show loaded resources (skills, hooks, MCPs) and add /skills command by @xingyaoww in #474
- ci: enhance type checking workflow with code quality analysis and auto-fix PRs by @malhotra5 in #455
- feat: add OpenHands stop hooks for pre-commit validation by @xingyaoww in #487
- chore: update skills path references by @enyst in #478
- Bump SDK packages to v1.11.4 by @all-hands-bot in #495
- Bump version to 1.12.1 by @all-hands-bot in #496
- tui: remove grey vertical border from Collapsible widgets by @xingyaoww in #490
- fix: default collapsibles to collapsed state by @xingyaoww in #504
- test: update comment reference to OpenHands/extensions by @neubig in #505
- tui: only show agent name prefix for non-default agents by @xingyaoww in #497
- Settings: enable memory condensation by default in basic and advanced modes by @malhotra5 in #510
- fix(tui): add ComposeResult return type hints to compose() methods by @github-actions[bot] in #509
- fix: Clear values of settings modal using .clear() instead of setting as blank by @csmith49 in #514
- Bump version to 1.12.2 by @all-hands-bot in #515
- feat(tui): bind ctrl+a to select all text in input area by @malhotra5 in #511
- test(snapshots): update select_all e2e snapshots for v1.12.2 by @malhotra5 in #522
- ci: disable uv cache in untrusted agent workflows by @enyst in #521
- fix(tests): make creating_agent_plan snapshot test deterministic by @malhotra5 in #524
- Migrate PR review workflow to use extensions action by @neubig in #516
- feat: add iterative refinement mode using critic model by @xingyaoww in #447
- ci: disable pull_request_target for PR review by @enyst in #523
- fix(Makefile): help and pre-commit by @VascoSch92 in #528
- fix(types): add missing type hints to handle_resume_logic and _meta by @github-actions[bot] in #532
- Bump SDK packages to v1.11.5 by @all-hands-bot in #527
- fix(acp): send session/update after session/new response by @jpshackelford in #543
- feat: add /settings slash command to open settings modal by @malhotra5 in #542
- tui: implement conditional autoscrolling by @juanmichelini in #546
- fix(acp): lazy-init ACP_CACHE_DIR to avoid import side effects by @github-actions[bot] in #531
- Rename auth console helper and tighten request kwargs typing by @enyst in #482
- feat: dropdown menu by @VascoSch92 in #550
- ci: Update bump-version workflow to regenerate snapshot tests by @malhotra5 in #552
- Bump version to 1.13.0 by @all-hands-bot in #553
- docs: Add release procedure documentation by @malhotra5 in #554
- Add timeout, max_tokens and max_size to the LLM settings configuration card by @joseluisll in #445
- refactor(shared): extract parse_slash_command to shared module by @github-actions[bot] in #560
- fix(types): add missing type hints to function parameters and init methods by @github-actions[bot] in #558
- fix: remove unused runtime image pull and env var from gui_launcher by @neubig in #534
- feat: round border by @VascoSch92 in #564
- fix(web): derive URLs from request headers for reverse-proxy support by @xingyaoww in #570
- refactoring(cli): print_console by @VascoSch92 in #578
- fix(types): add missing return type annotations by @github-actions[bot] in #584
- fix: bump agent-client-protocol to >=0.8.1 by @simonrosenberg in #587
- refactoring(cli/tui): richlog visualizer by @VascoSch92 in #577
- Bump version to 1.13.1 by @all-hands-bot in #589
- feat(tui): colored status icon by @VascoSch92 in #590
- fix(tui): consolidate duplicate get_conversation_summary logic by @github-actions[bot] in #595
- Add GitHub issue templates for bug reports and feature requests by @jamiechicago312 in #441
- fix(tui): add missing return type hints to TUI methods by @github-actions[bot] in #610
- feat:
make run-watch- Fast TUI Development by @VascoSch92 in #606 - Add trusted-by logos to top of README by @jamiechicago312 in #617
- Bump SDK packages to v1.15.0 by @all-hands-bot in #616
- fix(types): add -> None return type to init methods by @github-actions[bot] in #620
- Bump SDK packages to v1.16.0 by @all-hands-bot in #622
- tui: refactor richlog visualizer rendering paths (#618) by @enyst in #621
- fix(tui): add type alias for collapsible content parameter by @github-actions[bot] in #619
- docs: update README trusted-by logos for dark mode by @jamiechicago312 in #625
- tui: add tab navigation hint to footers (#512) by @ixchio in #581
- build: add 7-day uv freshness guardrail by @enyst in #630
- Bump SDK packages to v1.16.1 by @all-hands-bot in #637
- Bump version to 1.14.0 by @all-hands-bot in #638
- docs: add contributors section to README by @jamiechicago312 in #631
- fix(tui): correct typo 'converastion' in notification message by @github-actions[bot] in #645
- skills: add cli-release skill for guided release workflow by @xingyaoww in #628
- feat(cloud): Migrate openhands cloud to V1 API endpoints by @sjathin in #643
- ci: retire Blacksmith from all GitHub Actions workflows by @raymyers in #654
- fix(setup): make Console injectable for better testability by @github-actions[bot] in #657
- fix(acp): replace global _ACP_CACHE_DIR with @lru_cache by @github-actions[bot] in #559
- feat: ensure backward compatibility for persisted conversations with DelegateTool by @VascoSch92 in #636
- Bump SDK packages to v1.17.0 by @all-hands-bot in #662
- fix(settings): reset max_input_tokens on model change by @cbagwell in #658
- tests: prevent unawaited coroutine warnings in async tests by @llamantino in #665
- cli: replace prompt_toolkit with rich for styled output by @llamantino in #666
- build: enforce minimum uv version by @enyst in #667
- makefile: avoid local .openhands writes during make test by @llamantino in #663
- chore: rename ALLHANDS_BOT_GITHUB_PAT to PAT_TOKEN by @simonrosenberg in #684
- chore: use OPENHANDS_BOT_GITHUB_PAT_PUBLIC by @simonrosenberg in #685
- chore: add TODO for PAT rename in update-install-website.yml by @simonrosenberg in #690
- tui: Add ESC/Ctrl+C/Ctrl-Q key bindings to modals by @cbagwell in #686
- tui: make history panel keyboard navigable by @cbagwell in #688
- fix(settings): preserve native modal Tab navigation in Settings by @cbagwell in #687
- chore: use OPENHANDS_BOT_GITHUB_PAT_INSTALL_WEBSITE for install-openhands-website by @simonrosenberg in #691
- Bump version to 1.15.0 by @all-hands-bot in #693
- ci: run PR review on fork PRs by @enyst in #692
- fix(tui): resolve 'no running event loop' in RichLogVisualizer (fixes #696) by @gwerneckp in #695
- Bump SDK packages to v1.19.0 by @xingyaoww in #704
- settings: clear stale max tokens on model identity change by @cbagwell in #697
- feat: Register built-in subagents before conversation start by @VascoSch92 in #648
- Bump openhands-sdk and openhands-tools to 1.19.1 by @all-hands-bot in #709
- Bump version to 1.15.1 by @all-hands-bot in #710
- fix: migrate login to V1 settings/users endpoints by @hieptl in #711
- Bump SDK packages to v1.20.1 by @xingyaoww in #719
- Bump SDK packages to v1.21.0 by @all-hands-bot in #724
- fix: emit valid JSONL from --json mode by @si-stip-tessl in #717
- docs(acp): add docstring to _ACPContext Protocol by @github-actions[bot] in #703
- Bump version to 1.16.0 by @all-hands-bot in #728
New Contributors
- @malhotra5 made their first contribution in #1
- @raymyers made their first contribution in #48
- @Chesars made their first contribution in #65
- @jwerner08 made their first contribution in #131
- @tosincarik made their first contribution in #121
- @neubig made their first contribution in #153
- @jpshackelford made their first contribution in #188
- @antznette1 made their first contribution in #156
- @mathew1046 made their first contribution in #256
- @all-hands-bot made their first contribution in #266
- @softpudding made their first contribution in #286
- @pashkash made their first contribution in #322
- @juanmichelini made their first contribution in #328
- @utkarsh-in made their first contribution in #374
- @BalasubramanyamEvani made their first contribution in #372
- @VascoSch92 made their first contribution in #371
- @brettstewart made their first contribution in #448
- @github-actions[bot] made their first contribution in #458
- @jamiechicago312 made their first contribution in #442
- @rstar327 made their first contribution in #454
- @csmith49 made their first contribution in #514
- @joseluisll made their first contribution in #445
- @simonrosenberg made their first contribution in #587
- @ixchio made their first contribution in #581
- @sjathin made their first contribution in #643
- @cbagwell made their first contribution in #658
- @llamantino made their first contribution in #665
- @gwerneckp made their first contribution in #695
- @hieptl made their first contribution in #711
- @si-stip-tessl made their first contribution in #717
Full Changelog: https://github.com/OpenHands/OpenHands-CLI/commits/1.16.0