Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

Commit 0f307d8

Browse files
committed
feat(Announcement): provide information for new extension
1 parent e6ea70f commit 0f307d8

25 files changed

Lines changed: 348 additions & 112 deletions

File tree

.codex

Whitespace-only changes.

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Roo Code Changelog
22

3+
## 3.53.1
4+
5+
### Patch Changes
6+
7+
- Add the Zoo Code migration handoff flow, including a VS Code command, activation notification, and release announcement actions to prepare Roo data for import into Zoo Code.
8+
39
## 3.53.0
410

511
### Minor Changes

packages/types/src/vscode-extension-host.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,8 @@ export interface WebviewMessage {
427427
| "terminalOperation"
428428
| "clearTask"
429429
| "didShowAnnouncement"
430+
| "prepareZooMigration"
431+
| "installZooExtension"
430432
| "selectImages"
431433
| "exportCurrentTask"
432434
| "shareCurrentTask"

src/core/webview/ClineProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ export class ClineProvider
169169

170170
public isViewLaunched = false
171171
public settingsImportedAt?: number
172-
public readonly latestAnnouncementId = "apr-2026-v3.53.0-community-handoff-gpt55-opus47" // v3.53.0 Community handoff, GPT-5.5, Claude Opus 4.7, checkpoint navigation
172+
public readonly latestAnnouncementId = "may-2026-v3.53.1-zoo-migration-handoff" // v3.53.1 Zoo migration handoff
173173
public readonly providerSettingsManager: ProviderSettingsManager
174174
public readonly customModesManager: CustomModesManager
175175

src/core/webview/webviewMessageHandler.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ import { openImage, saveImage } from "../../integrations/misc/image-handler"
5454
import { selectImages } from "../../integrations/misc/process-images"
5555
import { getTheme } from "../../integrations/theme/getTheme"
5656
import { searchWorkspaceFiles } from "../../services/search/file-search"
57+
import {
58+
installOrShowZooExtension,
59+
promptAndCreateZooMigrationHandoff,
60+
} from "../../services/zoo-migration/ZooMigration"
5761
import { fileExistsAtPath } from "../../utils/fs"
5862
import { playTts, setTtsEnabled, setTtsSpeed, stopTts } from "../../utils/tts"
5963
import { searchCommits } from "../../utils/git"
@@ -766,6 +770,22 @@ export const webviewMessageHandler = async (
766770
await updateGlobalState("lastShownAnnouncementId", provider.latestAnnouncementId)
767771
await provider.postStateToWebview()
768772
break
773+
case "prepareZooMigration":
774+
try {
775+
await promptAndCreateZooMigrationHandoff({
776+
context: provider.context,
777+
contextProxy: provider.contextProxy,
778+
providerSettingsManager: provider.providerSettingsManager,
779+
})
780+
} catch (error) {
781+
const message = error instanceof Error ? error.message : String(error)
782+
provider.log(`[Zoo Migration] Failed to prepare migration handoff from announcement: ${message}`)
783+
await vscode.window.showErrorMessage(t("common:zooMigration.handoffFailed", { error: message }))
784+
}
785+
break
786+
case "installZooExtension":
787+
await installOrShowZooExtension()
788+
break
769789
case "selectImages":
770790
const images = await selectImages()
771791
await provider.postMessageToWebview({

webview-ui/src/components/chat/Announcement.tsx

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { memo, type ReactNode, useState } from "react"
22
import { Trans } from "react-i18next"
33
import { SiDiscord, SiReddit, SiX } from "react-icons/si"
4-
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
4+
import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
55

66
import { Package } from "@roo/package"
77
import { useAppTranslation } from "@src/i18n/TranslationContext"
@@ -40,34 +40,47 @@ const Announcement = ({ hideAnnouncement }: AnnouncementProps) => {
4040
<DialogTitle>{t("chat:announcement.title", { version: Package.version })}</DialogTitle>
4141
</DialogHeader>
4242
<div>
43-
{/* Community Handoff Notice */}
43+
{/* Zoo Handoff Notice */}
4444
<div className="mb-4 p-3 rounded border border-vscode-textLink-foreground/40 bg-vscode-textLink-foreground/5">
4545
<p className="font-semibold mb-1.5 text-vscode-textLink-foreground">
4646
{t("chat:announcement.handoff.heading")}
4747
</p>
4848
<p className="text-sm mb-2">
4949
<Trans i18nKey="chat:announcement.handoff.description" components={{ bold: <strong /> }} />
5050
</p>
51-
<VSCodeLink
52-
href="https://x.com/mattrubens/status/2046636598859559114"
53-
onClick={(e) => {
54-
e.preventDefault()
55-
vscode.postMessage({
56-
type: "openExternal",
57-
url: "https://x.com/mattrubens/status/2046636598859559114",
58-
})
59-
}}>
51+
<VSCodeLink href="https://www.reddit.com/r/RooCode/comments/1syufn1/roo_is_back_as_zoo/">
6052
{t("chat:announcement.handoff.readMore")}
6153
</VSCodeLink>
6254
</div>
6355

64-
{/* Regular Release Highlights */}
56+
{/* Zoo Migration */}
57+
<div className="mb-4 p-3 rounded border border-vscode-button-background/40 bg-vscode-button-background/5">
58+
<p className="font-semibold mb-1.5">{t("chat:announcement.zooMigration.heading")}</p>
59+
<p className="text-sm mb-3">{t("chat:announcement.zooMigration.description")}</p>
60+
<div className="flex flex-wrap gap-2">
61+
<VSCodeButton
62+
onClick={() => {
63+
vscode.postMessage({ type: "prepareZooMigration" })
64+
}}>
65+
{t("chat:announcement.zooMigration.prepareButton")}
66+
</VSCodeButton>
67+
<VSCodeButton
68+
appearance="secondary"
69+
onClick={() => {
70+
vscode.postMessage({ type: "installZooExtension" })
71+
}}>
72+
{t("chat:announcement.zooMigration.installButton")}
73+
</VSCodeButton>
74+
</div>
75+
</div>
76+
77+
{/* Migration Details */}
6578
<div className="mb-4">
66-
<p className="mb-3">{t("chat:announcement.release.heading")}</p>
79+
<p className="mb-3">{t("chat:announcement.zooMigration.detailsHeading")}</p>
6780
<ul className="list-disc list-inside text-sm space-y-1.5">
68-
<li>{t("chat:announcement.release.gpt55")}</li>
69-
<li>{t("chat:announcement.release.claudeOpus47")}</li>
70-
<li>{t("chat:announcement.release.checkpointNav")}</li>
81+
<li>{t("chat:announcement.zooMigration.copiesData")}</li>
82+
<li>{t("chat:announcement.zooMigration.keepsOriginals")}</li>
83+
<li>{t("chat:announcement.zooMigration.apiKeysOptIn")}</li>
7184
</ul>
7285
</div>
7386

webview-ui/src/components/chat/__tests__/Announcement.spec.tsx

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import React from "react"
22

33
import { render, screen } from "@/utils/test-utils"
44

5+
import { vscode } from "@src/utils/vscode"
6+
57
import Announcement from "../Announcement"
68

79
vi.mock("@src/utils/vscode", () => ({
@@ -12,11 +14,16 @@ vi.mock("@src/utils/vscode", () => ({
1214

1315
vi.mock("@roo/package", () => ({
1416
Package: {
15-
version: "3.53.0",
17+
version: "3.53.1",
1618
},
1719
}))
1820

1921
vi.mock("@vscode/webview-ui-toolkit/react", () => ({
22+
VSCodeButton: ({ children, onClick, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) => (
23+
<button onClick={onClick} {...props}>
24+
{children}
25+
</button>
26+
),
2027
VSCodeLink: ({ children, href, onClick, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) => (
2128
<a href={href} onClick={onClick} {...props}>
2229
{children}
@@ -32,18 +39,24 @@ vi.mock("@src/i18n/TranslationContext", () => ({
3239
useAppTranslation: () => ({
3340
t: (key: string, options?: { version?: string }) => {
3441
const translations: Record<string, string> = {
35-
"chat:announcement.release.heading": "What's New:",
36-
"chat:announcement.release.gpt55":
37-
"GPT-5.5 via OpenAI Codex: Added GPT-5.5 support in the OpenAI Codex provider so you can use the latest model straight from Roo Code.",
38-
"chat:announcement.release.claudeOpus47":
39-
"Claude Opus 4.7 on Vertex AI: Added Claude Opus 4.7 to the Vertex AI provider for Anthropic's newest flagship reasoning model.",
40-
"chat:announcement.release.checkpointNav":
41-
"Previous Checkpoint Navigation: Added controls in chat to jump back through prior checkpoints, with full i18n support.",
42-
"chat:announcement.handoff.heading": "The Roo Code plugin is not going away.",
42+
"chat:announcement.handoff.heading": "Roo is back as Zoo Code.",
43+
"chat:announcement.handoff.readMore": "Read the Zoo announcement",
44+
"chat:announcement.zooMigration.heading": "Prepare your Zoo migration",
45+
"chat:announcement.zooMigration.description":
46+
"Create a handoff bundle from Roo's local storage. Roo keeps your original data in place and asks before including API keys.",
47+
"chat:announcement.zooMigration.prepareButton": "Prepare Migration",
48+
"chat:announcement.zooMigration.installButton": "Install Zoo",
49+
"chat:announcement.zooMigration.detailsHeading": "What this does:",
50+
"chat:announcement.zooMigration.copiesData":
51+
"Copies your Roo settings and task history into a Zoo migration folder.",
52+
"chat:announcement.zooMigration.keepsOriginals":
53+
"Leaves your existing Roo folders untouched so you can verify the handoff first.",
54+
"chat:announcement.zooMigration.apiKeysOptIn":
55+
"Includes provider profiles and API keys only if you explicitly choose to include them.",
4356
}
4457

4558
if (key === "chat:announcement.title") {
46-
return `Roo Code ${options?.version ?? ""} Released`
59+
return `Roo Code ${options?.version ?? ""}: Move to Zoo Code`
4760
}
4861

4962
return translations[key] ?? key
@@ -52,23 +65,15 @@ vi.mock("@src/i18n/TranslationContext", () => ({
5265
}))
5366

5467
describe("Announcement", () => {
55-
it("renders the v3.53.0 announcement title and highlights", () => {
68+
it("renders the v3.53.1 Zoo migration announcement", () => {
5669
render(<Announcement hideAnnouncement={vi.fn()} />)
5770

58-
expect(screen.getByText("Roo Code 3.53.0 Released")).toBeInTheDocument()
59-
expect(
60-
screen.getByText(
61-
"GPT-5.5 via OpenAI Codex: Added GPT-5.5 support in the OpenAI Codex provider so you can use the latest model straight from Roo Code.",
62-
),
63-
).toBeInTheDocument()
64-
expect(
65-
screen.getByText(
66-
"Claude Opus 4.7 on Vertex AI: Added Claude Opus 4.7 to the Vertex AI provider for Anthropic's newest flagship reasoning model.",
67-
),
68-
).toBeInTheDocument()
71+
expect(screen.getByText("Roo Code 3.53.1: Move to Zoo Code")).toBeInTheDocument()
72+
expect(screen.getByText("Roo is back as Zoo Code.")).toBeInTheDocument()
73+
expect(screen.getByText("Prepare your Zoo migration")).toBeInTheDocument()
6974
expect(
7075
screen.getByText(
71-
"Previous Checkpoint Navigation: Added controls in chat to jump back through prior checkpoints, with full i18n support.",
76+
"Create a handoff bundle from Roo's local storage. Roo keeps your original data in place and asks before including API keys.",
7277
),
7378
).toBeInTheDocument()
7479
})
@@ -78,4 +83,14 @@ describe("Announcement", () => {
7883

7984
expect(screen.getAllByRole("listitem")).toHaveLength(3)
8085
})
86+
87+
it("posts Zoo migration actions from the announcement", () => {
88+
render(<Announcement hideAnnouncement={vi.fn()} />)
89+
90+
screen.getByRole("button", { name: "Prepare Migration" }).click()
91+
expect(vscode.postMessage).toHaveBeenCalledWith({ type: "prepareZooMigration" })
92+
93+
screen.getByRole("button", { name: "Install Zoo" }).click()
94+
expect(vscode.postMessage).toHaveBeenCalledWith({ type: "installZooExtension" })
95+
})
8196
})

webview-ui/src/i18n/locales/ca/chat.json

Lines changed: 14 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webview-ui/src/i18n/locales/de/chat.json

Lines changed: 14 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webview-ui/src/i18n/locales/en/chat.json

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@
357357
"triggerLabelAll": "BRRR"
358358
},
359359
"announcement": {
360-
"title": "Roo Code {{version}} Released",
360+
"title": "Roo Code {{version}}: Move to Zoo Code",
361361
"support": "Please support Roo Code by starring us on <githubLink>GitHub</githubLink>.",
362362
"stealthModel": {
363363
"feature": "<bold>Limited-time FREE stealth model</bold> - Code Supernova: Now upgraded with a <bold>1M token context window</bold>! A versatile agentic coding model that supports image inputs, accessible through Roo Code Cloud.",
@@ -367,9 +367,9 @@
367367
"goToSettingsButton": "Go to Settings"
368368
},
369369
"handoff": {
370-
"heading": "The Roo Code plugin is not going away.",
371-
"description": "You may have seen the recent announcement that Roo Code hit 3 million installs and the original team is going all-in on Roomote. We know that news was hard for a lot of you. This plugin means a lot to us and to you, and we hear you. The good news: <bold>a community team has stepped up to carry Roo Code forward</bold>, and we're working with them on an official handoff so the plugin you rely on keeps getting maintained and improved.",
372-
"readMore": "Read the original announcement from Matt Rubens"
370+
"heading": "Roo is back as Zoo Code.",
371+
"description": "This final Roo Code update helps you move your local setup to the new Zoo Code extension maintained by the community. Roo stays installed long enough to prepare a handoff bundle for Zoo.",
372+
"readMore": "Read the Zoo announcement"
373373
},
374374
"release": {
375375
"heading": "What's New:",
@@ -382,6 +382,16 @@
382382
"specialized": "Introducing <bold>Explainer</bold>, <bold>Planner</bold>, and <bold>Coder</bold> - three specialized cloud agents to enhance your workflows.",
383383
"description": "The agents work together in the cloud and can be triggered from the web or through Slack.",
384384
"tryButton": "Try Cloud Agents"
385+
},
386+
"zooMigration": {
387+
"heading": "Prepare your Zoo migration",
388+
"description": "Create a handoff bundle from Roo's local storage. Roo keeps your original data in place and asks before including API keys.",
389+
"prepareButton": "Prepare Migration",
390+
"installButton": "Install Zoo",
391+
"detailsHeading": "What this does:",
392+
"copiesData": "Copies your Roo settings and task history into a Zoo migration folder.",
393+
"keepsOriginals": "Leaves your existing Roo folders untouched so you can verify the handoff first.",
394+
"apiKeysOptIn": "Includes provider profiles and API keys only if you explicitly choose to include them."
385395
}
386396
},
387397
"reasoning": {

0 commit comments

Comments
 (0)