Skip to content

Commit f55b212

Browse files
mini2smrubensroomotectedaniel-lxs
authored
Roo to main (#917)
* Add support for skills (#10335) * Add support for skills * fix: use type-only import for ClineProvider and relative paths in skills section --------- Co-authored-by: Roo Code <roomote@roocode.com> * Add support for npm packages and .env files to custom tools (#10336) Co-authored-by: Roo Code <roomote@roocode.com> * fix: capture extended thinking signatures for tool use continuations (#10351) * feat: add optional mode field to slash command front matter (#10344) * feat: add optional mode field to slash command front matter - Add mode field to Command interface - Update command parsing to extract mode from frontmatter - Modify RunSlashCommandTool to automatically switch mode when specified - Add comprehensive tests for mode field parsing and switching - Update existing tests to include mode field * Make it work for manual slash commands too --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Remove the mergeToolResultText in the Roo provider for now (#10359) * Revert "fix: capture extended thinking signatures for tool use continuations" (#10360) * Release v3.38.0 (#10361) * Changeset version bump (#10362) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix: enforce maxConcurrentFileReads limit in read_file tool (#10363) Co-authored-by: Roo Code <roomote@roocode.com> * refactor(zgsm): optimize native protocol handling and model ID usage * docs: clarify path to Security Settings in privacy policy (#10367) Co-authored-by: Roo Code <roomote@roocode.com> * Improve error message when read_file is used on directory (#10371) Co-authored-by: Roo Code <roomote@roocode.com> * Handle custom tool use similarly to MCP tools for ipc schema purposes (#10364) * fix: correct GitHub repository URL in marketing page (#10377) Co-authored-by: Roo Code <roomote@roocode.com> * Revert "feat: enable mergeToolResultText for all OpenAI-compatible providers (#10299)" (#10381) * fix: flush pending tool results before condensing context (#10379) * chore: add changeset for v3.38.1 (#10384) * Changeset version bump (#10385) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix: update Cerebras maxTokens to 16384 (#10387) * docs: Replace Todo Lists video with Context Management video (#10375) Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local> * Release: v1.96.0 (#10395) chore: bump version to v1.96.0 * fix(utils): add optional chaining for provider settings * feat(skills): align with Agent Skills spec (#10409) * chore: remove human-relay provider (#10388) Co-authored-by: Roo Code <roomote@roocode.com> * Fix rate limit wait display (#10389) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix: prevent write_to_file from creating files at truncated paths (#10415) Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> Co-authored-by: Roo Code <roomote@roocode.com> * Release v3.38.2 (#10416) * Changeset version bump (#10417) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix(claude-code): stop frequent sign-ins by hardening OAuth refresh (#10410) * fix(claude-code): prevent sign-outs on oauth refresh * test(claude-code): restore fetch after mocking * refactor(claude-code): replace while(true) with bounded for loop for clarity --------- Co-authored-by: Roo Code <roomote@roocode.com> * fix: add type check for lastMessage.text in TTS useEffect (#10431) fix: add type check for lastMessage.text before calling startsWith Fixes #10430 The TTS useEffect was calling .startsWith() on lastMessage.text after only checking if it was truthy. If text was a non-string truthy value (array, object, or number), this would crash with "Q.text.startsWith is not a function". Changed the truthy check to an explicit type check: typeof lastMessage.text === "string" Co-authored-by: Roo Code <roomote@roocode.com> * feat(chat): add collapsible markdown blocks and improve protocol error handling * refactor(task): restructure conversation history handling * feat: recursively load .roo/rules and AGENTS.md from subdirectories (#10446) Co-authored-by: Roo Code <roomote@roocode.com> * Release: v1.99.0 (#10447) * fix: add maxConcurrentFileReads limit to native read_file tool schema (#10449) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * chore: add changeset for v3.38.3 (#10450) * Changeset version bump (#10451) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: add image support documentation to read_file native tool description (#10442) Co-authored-by: Roo Code <roomote@roocode.com> * fix: add explicit deduplication for duplicate tool_result blocks (#10466) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> * VSCode shim + basic cli (#10452) Co-authored-by: Roo Code <roomote@roocode.com> * Add an option to use our cli for evals (#10456) Co-authored-by: Roo Code <roomote@roocode.com> * fix: preserve tool_use blocks for all tool_results in kept messages during condensation (#10471) * fix: add additionalProperties: false to MCP tool schemas for OpenAI Responses API (#10472) * feat(cli): add zgsm provider support * Add a cli installer (#10474) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * feat(zgsm): add debug mode and fix tool name handling * feat(i18n): add debug status to custom config label * refactor: improve terminal encoding handling and UI styling * feat(ui): add automatically focus option for chat input * feat(proxy): add debug-mode proxy routing (#10467) * feat(terminal): enhance compilation markers and output handling * fix: prevent duplicate tool_result blocks causing API errors (#10497) * feat: add Kimi K2 thinking model to Fireworks AI provider (#9202) Co-authored-by: Roo Code <roomote@roocode.com> * fix: add missing description fields for debugProxy configuration (#10505) Co-authored-by: Roo Code <roomote@roocode.com> * Tweak the style of the follow up suggestion modes (#9260) * feat(web-evals): remember last Roo model selection + add evals skill (#10470) * feat(web-evals): remember last Roo model selection * fix(web-evals): reset model selections on provider switch and fix lint warning - Add useEffect to reset model selections when switching between providers This prevents OpenRouter model IDs from persisting when switching to Roo, which was causing Roo's stored selection to be overwritten with wrong IDs - Remove unused 'executionMethod' from onSubmit dependency array to fix react-hooks/exhaustive-deps warning * fix(web-evals): add missing executionMethod to test cases * fix(web-evals): harden localStorage + keep provider selections * feat: rename YOLO to BRRR (#10507) Co-authored-by: Roo Code <roomote@roocode.com> * feat: implement sticky provider profile for task-level API config persistence (#10018) * feat(settings): move CHAT_SEARCH from experimental to UI settings * fix: remove legacy Claude 2 series models from Bedrock provider (#10501) Co-authored-by: Roo Code <roomote@roocode.com> * feat: add support for image file @mentions (#10189) Co-authored-by: Roo Code <roomote@roocode.com> * fix: handle PowerShell ENOENT error in os-name on Windows (#9897) Co-authored-by: Roo Code <roomote@roocode.com> * feat: add xhigh reasoning effort to OpenAI compatible endpoints (#10061) Co-authored-by: Roo Code <roomote@roocode.com> * feat: filter @ mention file search results using .rooignore (#10174) * feat: filter @ mention file search results using .rooignore - Modify searchFiles case in webviewMessageHandler.ts to filter results using RooIgnoreController - Use existing RooIgnoreController from current task if available, otherwise create a temporary one - Respect showRooIgnoredFiles setting to allow users to toggle this behavior - Add comprehensive test coverage for the new filtering behavior Fixes #10169 * fix: dispose temporary RooIgnoreController to prevent resource leak Addresses Rooviewer feedback: the temporary RooIgnoreController created when no task exists was never disposed, causing file watchers to accumulate. Changes: - Track temporary controller separately with tempController variable - Wrap filtering logic in try/finally block - Call dispose() in finally block to ensure cleanup - Add test cases to verify dispose is called for temp controllers - Verify task's controller is NOT disposed (only temp ones) --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> * fix: use task stored API config as fallback for rate limit (#10266) Co-authored-by: Roo Code <roomote@roocode.com> * fix: make command chaining examples shell-aware for Windows compatibility (#10434) * fix: make command chaining examples shell-aware for Windows compatibility Addresses Issue #10352 where Roo Code generates Unix-style command chaining (&&) even on Windows systems using PowerShell or cmd.exe. Changes: - Add getCommandChainOperator() to detect the user shell and return the appropriate command chaining syntax: - Unix shells (bash, zsh, etc.): && - PowerShell: ; - cmd.exe: & - Update getRulesSection() to use shell-specific chaining in examples - Add informative note for non-Unix shells about different syntaxes - Add comprehensive tests for shell detection and command chaining * feat: add Unix utility guidance for Windows shells Addresses feedback from issue #10352 about sed and other Unix-specific utilities being suggested on Windows. The system prompt now includes guidance for PowerShell and cmd.exe users to use native alternatives: PowerShell: - Select-String instead of grep - Get-Content instead of cat - Remove-Item instead of rm - Copy-Item instead of cp - Move-Item instead of mv - -replace operator or [regex] instead of sed cmd.exe: - type instead of cat - del instead of rm - copy instead of cp - move instead of mv - find/findstr instead of grep * Apply suggestion from @roomote[bot] Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: use && for cmd.exe to preserve conditional execution semantics - Update getCommandChainOperator() to return && for cmd.exe (already done) - Update getCommandChainNote() to document && instead of & for cmd.exe - Update JSDoc to reflect cmd.exe uses && for conditional execution - Update tests to expect && for cmd.exe cmd.exe supports && for conditional execution (run next command only if previous succeeds), which provides the same semantics as Unix shells. * fix: update PowerShell note to use && for cmd.exe reference --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * feat(types): add zai-glm-4.7 to Cerebras models (#10500) Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * 🐛 Fix glitchy kangaroo bounce animation on welcome screen (#10035) The kangaroo logo on the welcome screen had a visual glitch where it would instantly jump to the top position when hovering, instead of smoothly starting the bounce from its resting position. Changes: - Added custom smooth-bounce keyframe animation in index.css that explicitly starts from translateY(0) - Updated RooHero component to use hover state tracking with the new animation - Removed Tailwind's animate-bounce class which was causing the glitch The animation now smoothly bounces from the resting position without any jarring visual jumps. * Release v3.39.0 (#10537) * feat: Change "Get Started" button label to "Create Roo Account" (#10543) Co-authored-by: Roo Code <roomote@roocode.com> * fix: add @roo-code/cli to changeset ignore list (#10545) * Changeset version bump (#10546) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Update changelog for version 3.39.0 release * fix: change minItems from 2 to 1 for Anthropic API compatibility (#10551) * fix: disable Gemini thought signature persistence to prevent corrupted signature errors (#10554) * fix: stabilize file paths during native tool call streaming (#10555) * Release v3.39.1 (#10557) * Changeset version bump (#10558) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * chore(cli): change default model to anthropic/claude-opus-4.5 (#10544) * fix: ensure assistant message content is never undefined for Gemini compatibility (#10559) * Update Terms of Service (effective January 9, 2026) (#10568) Co-authored-by: Roo Code <roomote@roocode.com> * fix(vscode-lm): order text parts before tool calls in assistant messages (#10573) * fix: merge approval feedback into tool result instead of pushing duplicate (ROO-410) (#10519) * feat: improve error messaging for stream termination errors from provider (#10548) * fix(openai): remove convertToSimpleMessages to fix tool calling for OpenAI-compatible providers (#10575) * Move more types to @roo-code/types (for the cli) (#10583) * Add some functionality to @roo-code/core for the cli (#10584) * Add some slash commands that are useful for cli development (#10586) * feat: add debug setting to settings page (#10580) * feat: add debug mode toggle to settings * Update About component with debug mode description * i18n: add debug mode strings to settings locales * Update debug mode description in all locales * fix: post state to webview after debugSetting update This addresses the review feedback that the debugSetting handler was not posting updated state back to the webview, which could cause the UI to stay stale until another state refresh occurred. * fix: clarify debug mode description to specify task header location Updated debugMode.description across all 18 locales to clarify that debug buttons appear in the task header, per review feedback. * fix: remove redundant postStateToWebview call after debug setting update * Update src/core/webview/webviewMessageHandler.ts Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> --------- Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: round-trip Gemini thought signatures for tool calls (#10590) * fix: make edit_file matching more resilient (#10585) * chore(gemini): stop overriding tool allow/deny lists (#10592) * fix(cerebras): ensure all tools have consistent strict mode values (#10589) Co-authored-by: Roo Code <roomote@roocode.com> * chore: disable edit_file tool for Gemini/Vertex (#10594) * Release v3.39.2 (#10595) * Changeset version bump (#10596) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Add a TUI (#10480) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> * Allow the cli release script to install locally for testing (#10597) * feat(ipc): add retry mechanism and error handling * More file organization for the cli (#10599) * refactor: rename roo-cli to cos-cli and update related references * Some cleanup in ExtensionHost (#10600) Co-authored-by: Roo Code <roomote@roocode.com> * refactor: optimize response rendering and tool call handling * Rename Roo Code Cloud Provider to Roo Code Router (#10560) Co-authored-by: Roo Code <roomote@roocode.com> * chore: bump version to v1.102.0 (#10604) * Update router name in types (#10605) * Update Roo Code Router service name (#10607) * chore: add changeset for v3.39.3 (#10608) * Update router name in types (#10610) * Changeset version bump (#10609) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: add debug mode configuration and state management * fix(settings): add debug condition for ZgsmAI custom config * Basic settings search (#10619) * Prototype of a simpler searchable settings * Fix tests * UI improvements * Input tweaks * Update webview-ui/src/components/settings/SettingsSearch.tsx Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: remove duplicate Escape key handler dead code * Cleanup * Fix tests --------- Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: Roo Code <roomote@roocode.com> * ux: UI improvements to search settings (#10633) * UI changs * Update webview-ui/src/components/marketplace/MarketplaceView.tsx Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * i18n --------- Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * feat: display edit_file errors in UI after consecutive failures (#10581) * feat(chat): enhance reasoning block with animated thinking indicator and varied messages * perf: optimize message block cloning in presentAssistantMessage (#10616) * feat(chat): add random loading messages with localization * fix: correct Gemini 3 thought signature injection format via OpenRouter (#10640) * fix: encode hyphens in MCP tool names before sanitization (#10644) * fix: sanitize tool_use IDs to match API validation pattern (#10649) * fix(path): return empty string from getReadablePath when path is empty - ROO-437 (#10638) * ux: Standard stop button 🟥 (#10639) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: omit parallel_tool_calls when not explicitly enabled (COM-406) (#10671) * fix: use placeholder for empty tool result content to fix Gemini API validation (#10672) * ux: Further improve error display (#10692) * Ensures error details are shown for all errors (except diff, which has its own case) * More details * litellm is a proxy * ux: improve stop button visibility and streamline error handling (#10696) * Restores the send button in the message edit mode * Makes the stop button more prominent * fix: clear approval buttons when API request starts (ROO-526) (#10702) * chore: add changeset for v3.40.0 (#10705) * Changeset version bump (#10706) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat(gemini): add allowedFunctionNames support to prevent mode switch errors (#10708) Co-authored-by: Roo Code <roomote@roocode.com> * Release v3.40.1 (#10713) * Changeset version bump (#10714) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Release: v1.105.0 (#10722) * feat(providers): add gpt-5.2-codex model to openai-native provider (#10731) * feat(e2e): Enable E2E tests - 39 passing tests (#10720) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * Clear terminal output buffers to prevent memory leaks (#7666) * feat: add OpenAI Codex provider with OAuth subscription authentication (#10736) Co-authored-by: Roo Code <roomote@roocode.com> * fix(litellm): inject dummy thought signatures on ALL tool calls for Gemini (#10743) * fix(e2e): add alwaysAllow config for MCP time server tools (#10733) * Release v3.41.0 (#10746) * Changeset version bump (#10747) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: clarify Slack and Linear are Cloud Team only features (#10748) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Release: v1.106.0 (#10749) * refactor(chat): replace current task display with last user feedback * style(chat): adjust feedback text width calculation * fix: handle missing tool identity in OpenAI Native streams (#10719) * Feat/issue 5376 aggregate subtask costs (#10757) * feat(chat): add streaming state to task header interaction * feat: add settings tab titles to search index (#10761) Co-authored-by: Roo Code <roomote@roocode.com> * fix: filter Ollama models without native tool support (#10735) * fix: filter out empty text blocks from user messages for Gemini compatibility (#10728) * fix: flatten top-level anyOf/oneOf/allOf in MCP tool schemas (#10726) * fix: prevent duplicate tool_use IDs causing API 400 errors (#10760) * fix: truncate call_id to 64 chars for OpenAI Responses API (#10763) * fix: Gemini thought signature validation errors (#10694) Co-authored-by: Roo Code <roomote@roocode.com> * Release v3.41.1 (#10767) * Changeset version bump (#10768) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: add button to open markdown in VSCode preview (#10773) Co-authored-by: Roo Code <roomote@roocode.com> * fix(openai-codex): reset invalid model selection (#10777) * fix: add openai-codex to providers that don't require API key (#10786) Co-authored-by: Roo Code <roomote@roocode.com> * fix(litellm): detect Gemini models with space-separated names for thought signature injection (#10787) * Release v3.41.2 (#10788) * Changeset version bump (#10790) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Roo Code Router fixes for the cli (#10789) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * Revert "feat(e2e): Enable E2E tests - 39 passing tests" (#10794) Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> * Claude-like cli flags, auth fixes (#10797) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: Roo Code <roomote@roocode.com> * Release cli v0.0.47 (#10798) * Use a redirect instead of a fetch for cli auth (#10799) * chore(cli): prepare release v0.0.48 (#10800) --------- Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Chris Estreich <cestreich@gmail.com> Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: John Richmond <5629+jr@users.noreply.github.com> Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> Co-authored-by: Seb Duerr <sebastian.duerr@cerebras.net> Co-authored-by: SannidhyaSah <sah_sannidhya@outlook.com> Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local> Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Danny Ricciotti <dan.ricciotti@gmail.com> Co-authored-by: Bruno Bergher <bruno@roocode.com> Co-authored-by: Archimedes <84040360+ArchimedesCrypto@users.noreply.github.com> Co-authored-by: Patrick Decat <pdecat@gmail.com> Co-authored-by: T <taltas@users.noreply.github.com>
1 parent 24657d2 commit f55b212

44 files changed

Lines changed: 3076 additions & 1322 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.roo/commands/cli-release.md

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,57 @@ mode: code
4444
- Include links to relevant source files where helpful
4545
- Describe changes from the user's perspective
4646

47-
5. Commit the version bump and changelog update:
47+
5. Create a release branch and commit the changes:
4848

4949
```bash
50+
# Ensure you're on main and up to date
51+
git checkout main
52+
git pull origin main
53+
54+
# Create a new branch for the release
55+
git checkout -b cli-release-v<version>
56+
57+
# Commit the version bump and changelog update
5058
git add apps/cli/package.json apps/cli/CHANGELOG.md
5159
git commit -m "chore(cli): prepare release v<version>"
60+
61+
# Push the branch to origin
62+
git push -u origin cli-release-v<version>
63+
```
64+
65+
6. Create a pull request for the release:
66+
67+
```bash
68+
gh pr create --title "chore(cli): prepare release v<version>" \
69+
--body "## CLI Release v<version>
70+
71+
This PR prepares the CLI release v<version>.
72+
73+
### Changes
74+
- Version bump in package.json
75+
- Changelog update
76+
77+
### Checklist
78+
- [ ] Version number is correct
79+
- [ ] Changelog entry is complete and accurate
80+
- [ ] All CI checks pass" \
81+
--base main
5282
```
5383

54-
6. Run the release script from the monorepo root:
84+
7. Wait for PR approval and merge:
85+
- Request review if required by your workflow
86+
- Ensure CI checks pass
87+
- Merge the PR using: `gh pr merge --squash --delete-branch`
88+
- Or merge via the GitHub UI
89+
90+
8. Run the release script from the monorepo root:
5591

5692
```bash
93+
# Ensure you're on the updated main branch after the PR merge
94+
git checkout main
95+
git pull origin main
96+
97+
# Run the release script
5798
./apps/cli/scripts/release.sh
5899
```
59100

@@ -64,7 +105,7 @@ mode: code
64105
- Extract changelog content and include it in the GitHub release notes
65106
- Create the GitHub release with the tarball attached
66107

67-
7. After a successful release, verify:
108+
9. After a successful release, verify:
68109
- Check the release page: https://github.com/RooCodeInc/Roo-Code/releases
69110
- Verify the "What's New" section contains the changelog content
70111
- Test installation: `curl -fsSL https://raw.githubusercontent.com/RooCodeInc/Roo-Code/main/apps/cli/install.sh | sh`

apps/cli/CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,30 @@ All notable changes to the `@roo-code/cli` package will be documented in this fi
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.0.48] - 2026-01-17
9+
10+
### Changed
11+
12+
- Simplified authentication callback flow by using HTTP redirects instead of POST requests with CORS headers for improved browser compatibility
13+
14+
## [0.0.47] - 2026-01-17
15+
16+
### Added
17+
18+
- **Workspace flag**: New `-w, --workspace <path>` option to specify a custom workspace directory instead of using the current working directory
19+
- **Oneshot mode**: New `--oneshot` flag to exit upon task completion, useful for scripting and automation (can also be saved in settings via [`CliSettings.oneshot`](src/types/types.ts))
20+
21+
### Changed
22+
23+
- Skip onboarding flow when a provider is explicitly specified via `--provider` flag or saved in settings
24+
- Unified permission flags: Combined `-y`, `--yes`, and `--dangerously-skip-permissions` into a single option for Claude Code-like CLI compatibility
25+
- Improved Roo Code Router authentication flow and error messaging
26+
27+
### Fixed
28+
29+
- Removed unnecessary timeout that could cause issues with long-running tasks
30+
- Fixed authentication token validation for Roo Code Router provider
31+
832
## [0.0.45] - 2026-01-08
933

1034
### Changed

apps/cli/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@roo-code/cli",
3-
"version": "0.0.45",
3+
"version": "0.0.48",
44
"description": "Roo Code CLI - Run the Roo Code agent from the command line",
55
"private": true,
66
"type": "module",
@@ -14,8 +14,10 @@
1414
"check-types": "tsc --noEmit",
1515
"test": "vitest run",
1616
"build": "tsup",
17+
"build:extension": "pnpm --filter roo-cline bundle",
18+
"build:all": "pnpm --filter roo-cline bundle && tsup",
1719
"dev": "tsup --watch",
18-
"start": "ROO_SDK_BASE_URL=http://localhost:3001 ROO_AUTH_BASE_URL=http://localhost:3000 node dist/index.js",
20+
"start": "ROO_AUTH_BASE_URL=http://localhost:3000 ROO_SDK_BASE_URL=http://localhost:3001 ROO_CODE_PROVIDER_URL=http://localhost:8080/proxy node dist/index.js",
1921
"start:production": "node dist/index.js",
2022
"release": "scripts/release.sh",
2123
"clean": "rimraf dist .turbo"

apps/cli/scripts/release.sh

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ create_tarball() {
274274
'commander': pkg.dependencies.commander,
275275
'fuzzysort': pkg.dependencies.fuzzysort,
276276
'ink': pkg.dependencies.ink,
277+
'p-wait-for': pkg.dependencies['p-wait-for'],
277278
'react': pkg.dependencies.react,
278279
'superjson': pkg.dependencies.superjson,
279280
'zustand': pkg.dependencies.zustand
@@ -420,8 +421,7 @@ verify_local_install() {
420421
mkdir -p "$VERIFY_WORKSPACE"
421422

422423
# Run the CLI with a simple prompt
423-
# Use timeout to prevent hanging if something goes wrong
424-
if timeout 60 "$VERIFY_BIN_DIR/roo" --yes --exit-on-complete --prompt "1+1=?" "$VERIFY_WORKSPACE" > "$VERIFY_DIR/test-output.log" 2>&1; then
424+
if timeout 60 "$VERIFY_BIN_DIR/roo" --yes --oneshot -w "$VERIFY_WORKSPACE" "1+1=?" > "$VERIFY_DIR/test-output.log" 2>&1; then
425425
info "End-to-end test passed"
426426
else
427427
EXIT_CODE=$?
@@ -536,11 +536,8 @@ ROO_VERSION=$VERSION curl -fsSL https://raw.githubusercontent.com/RooCodeInc/Roo
536536
## Usage
537537
538538
\`\`\`bash
539-
# Set your API key
540-
export OPENROUTER_API_KEY=sk-or-v1-...
541-
542539
# Run a task
543-
roo "What is this project?" ~/my-project
540+
roo "What is this project?"
544541
545542
# See all options
546543
roo --help

apps/cli/src/agent/__tests__/extension-host.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ function createTestHost({
3636
model,
3737
workspacePath: "/test/workspace",
3838
extensionPath: "/test/extension",
39+
ephemeral: false,
40+
debug: false,
41+
exitOnComplete: false,
3942
...options,
4043
})
4144
}
@@ -94,6 +97,9 @@ describe("ExtensionHost", () => {
9497
apiKey: "test-key",
9598
provider: "openrouter",
9699
model: "test-model",
100+
ephemeral: false,
101+
debug: false,
102+
exitOnComplete: false,
97103
}
98104

99105
const host = new ExtensionHost(options)

apps/cli/src/agent/extension-host.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,17 @@ export interface ExtensionHostOptions {
5858
workspacePath: string
5959
extensionPath: string
6060
nonInteractive?: boolean
61-
debug?: boolean
61+
/**
62+
* When true, uses a temporary storage directory that is cleaned up on exit.
63+
*/
64+
ephemeral: boolean
65+
debug: boolean
66+
exitOnComplete: boolean
6267
/**
6368
* When true, completely disables all direct stdout/stderr output.
6469
* Use this when running in TUI mode where Ink controls the terminal.
6570
*/
6671
disableOutput?: boolean
67-
/**
68-
* When true, uses a temporary storage directory that is cleaned up on exit.
69-
*/
70-
ephemeral?: boolean
7172
/**
7273
* When true, don't suppress node warnings and console output since we're
7374
* running in an integration test and we want to see the output.
@@ -436,9 +437,6 @@ export class ExtensionHost extends EventEmitter implements ExtensionHostInterfac
436437
this.sendToExtension({ type: "newTask", text: prompt })
437438

438439
return new Promise((resolve, reject) => {
439-
let timeoutId: NodeJS.Timeout | null = null
440-
const timeoutMs: number = 110_000
441-
442440
const completeHandler = () => {
443441
cleanup()
444442
resolve()
@@ -450,23 +448,10 @@ export class ExtensionHost extends EventEmitter implements ExtensionHostInterfac
450448
}
451449

452450
const cleanup = () => {
453-
if (timeoutId) {
454-
clearTimeout(timeoutId)
455-
timeoutId = null
456-
}
457-
458451
this.client.off("taskCompleted", completeHandler)
459452
this.client.off("error", errorHandler)
460453
}
461454

462-
// Set timeout to prevent indefinite hanging.
463-
timeoutId = setTimeout(() => {
464-
cleanup()
465-
reject(
466-
new Error(`Task completion timeout after ${timeoutMs}ms - no completion or error event received`),
467-
)
468-
}, timeoutMs)
469-
470455
this.client.once("taskCompleted", completeHandler)
471456
this.client.once("error", errorHandler)
472457
})

apps/cli/src/commands/auth/login.ts

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ export interface LoginOptions {
1111
verbose?: boolean
1212
}
1313

14-
export interface LoginResult {
15-
success: boolean
16-
error?: string
17-
userId?: string
18-
orgId?: string | null
19-
}
14+
export type LoginResult =
15+
| {
16+
success: true
17+
token: string
18+
}
19+
| {
20+
success: false
21+
error: string
22+
}
2023

2124
const LOCALHOST = "127.0.0.1"
2225

@@ -43,36 +46,29 @@ export async function login({ timeout = 5 * 60 * 1000, verbose = false }: LoginO
4346
const errorUrl = new URL(`${AUTH_BASE_URL}/cli/sign-in?error=error-in-callback`)
4447
errorUrl.searchParams.set("message", error)
4548
res.writeHead(302, { Location: errorUrl.toString() })
46-
res.end()
47-
// Wait for response to be fully sent before closing server and rejecting.
48-
// The 'close' event fires when the underlying connection is terminated,
49-
// ensuring the browser has received the redirect before we shut down.
50-
res.on("close", () => {
49+
res.end(() => {
5150
server.close()
5251
reject(new Error(error))
5352
})
5453
} else if (!token) {
5554
const errorUrl = new URL(`${AUTH_BASE_URL}/cli/sign-in?error=missing-token`)
5655
errorUrl.searchParams.set("message", "Missing token in callback")
5756
res.writeHead(302, { Location: errorUrl.toString() })
58-
res.end()
59-
res.on("close", () => {
57+
res.end(() => {
6058
server.close()
6159
reject(new Error("Missing token in callback"))
6260
})
6361
} else if (receivedState !== state) {
6462
const errorUrl = new URL(`${AUTH_BASE_URL}/cli/sign-in?error=invalid-state-parameter`)
65-
errorUrl.searchParams.set("message", "Invalid state parameter (possible CSRF attack)")
63+
errorUrl.searchParams.set("message", "Invalid state parameter")
6664
res.writeHead(302, { Location: errorUrl.toString() })
67-
res.end()
68-
res.on("close", () => {
65+
res.end(() => {
6966
server.close()
7067
reject(new Error("Invalid state parameter"))
7168
})
7269
} else {
7370
res.writeHead(302, { Location: `${AUTH_BASE_URL}/cli/sign-in?success=true` })
74-
res.end()
75-
res.on("close", () => {
71+
res.end(() => {
7672
server.close()
7773
resolve({ token, state: receivedState })
7874
})
@@ -90,12 +86,7 @@ export async function login({ timeout = 5 * 60 * 1000, verbose = false }: LoginO
9086
reject(new Error("Authentication timed out"))
9187
}, timeout)
9288

93-
server.on("listening", () => {
94-
console.log(`[Auth] Callback server listening on port ${port}`)
95-
})
96-
9789
server.on("close", () => {
98-
console.log("[Auth] Callback server closed")
9990
clearTimeout(timeoutId)
10091
})
10192
})
@@ -121,7 +112,7 @@ export async function login({ timeout = 5 * 60 * 1000, verbose = false }: LoginO
121112
const { token } = await tokenPromise
122113
await saveToken(token)
123114
console.log("✓ Successfully authenticated!")
124-
return { success: true }
115+
return { success: true, token }
125116
} catch (error) {
126117
const message = error instanceof Error ? error.message : String(error)
127118
console.error(`✗ Authentication failed: ${message}`)

0 commit comments

Comments
 (0)