refactor(ZooMigration): adding publisher id for extension

This commit is contained in:
Elliott de Launay 2026-05-09 01:43:13 +00:00
parent 0f307d8cd7
commit f61782ec4f
No known key found for this signature in database
GPG key ID: 1F579AB92ABAA926
20 changed files with 69 additions and 26 deletions

View file

@ -34,7 +34,7 @@
"cancel": "Cancel·la"
},
"notice": "Roo Code està passant a Zoo Code. Pots preparar un paquet de migració basat en còpia per a Zoo sense eliminar les teves dades de Roo.",
"zooNotPublished": "Zoo Code encara no s'ha publicat amb un id d'extensió confirmat al Marketplace. S'ha obert la vista d'extensions amb una cerca de Zoo Code.",
"installUnavailable": "Zoo Code està disponible com a ZooCodeOrganization.zoo-code. La instal·lació automàtica no s'ha completat, així que s'ha obert la vista Extensions perquè el puguis instal·lar des de la galeria d'extensions configurada.",
"preparePrompt": "Vols preparar un paquet de migració local de Zoo Code? Si inclous les claus d'API, els secrets del proveïdor s'escriuran en un fitxer local perquè Zoo els pugui importar i després eliminar el paquet.",
"handoffPrepared": "Paquet de migració de Zoo Code preparat a {{path}}. Instal·la Zoo Code i importa des d'aquest paquet.",
"handoffFailed": "No s'ha pogut preparar el paquet de migració de Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Abbrechen"
},
"notice": "Roo Code wechselt zu Zoo Code. Du kannst eine kopierbasierte Migrationsübergabe für Zoo vorbereiten, ohne deine Roo-Daten zu löschen.",
"zooNotPublished": "Zoo Code ist noch nicht unter einer bestätigten Marketplace-Erweiterungs-ID veröffentlicht. Die Erweiterungsansicht wurde mit einer Suche nach Zoo Code geöffnet.",
"installUnavailable": "Zoo Code ist als ZooCodeOrganization.zoo-code verfügbar. Die automatische Installation wurde nicht abgeschlossen, deshalb wurde die Erweiterungsansicht geöffnet, damit du es aus deiner konfigurierten Erweiterungsgalerie installieren kannst.",
"preparePrompt": "Lokale Zoo Code-Migrationsübergabe vorbereiten? Wenn du API-Schlüssel einschließt, werden Provider-Secrets in eine lokale Datei geschrieben, damit Zoo sie importieren und die Übergabe danach löschen kann.",
"handoffPrepared": "Zoo Code-Migrationsübergabe unter {{path}} vorbereitet. Installiere Zoo Code und importiere aus dieser Übergabe.",
"handoffFailed": "Zoo Code-Migrationsübergabe konnte nicht vorbereitet werden: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Cancel"
},
"notice": "Roo Code is transitioning to Zoo Code. You can prepare a copy-based migration handoff for Zoo without deleting your Roo data.",
"zooNotPublished": "Zoo Code is not published under a confirmed Marketplace extension id yet. The Extensions view has been opened with a Zoo Code search.",
"installUnavailable": "Zoo Code is available as ZooCodeOrganization.zoo-code. Automatic install did not complete, so the Extensions view has been opened so you can install it from your configured extension gallery.",
"preparePrompt": "Prepare a local Zoo Code migration handoff? Including API keys writes provider secrets to a local file so Zoo can import them, then delete the handoff after import.",
"handoffPrepared": "Zoo Code migration handoff prepared at {{path}}. Install Zoo Code and import from this handoff.",
"handoffFailed": "Failed to prepare Zoo Code migration handoff: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Cancelar"
},
"notice": "Roo Code está pasando a Zoo Code. Puedes preparar una entrega de migración basada en copia para Zoo sin eliminar tus datos de Roo.",
"zooNotPublished": "Zoo Code aún no está publicado con un id de extensión confirmado en Marketplace. Se abrió la vista de Extensiones con una búsqueda de Zoo Code.",
"installUnavailable": "Zoo Code está disponible como ZooCodeOrganization.zoo-code. La instalación automática no se completó, así que se abrió la vista de Extensiones para que puedas instalarlo desde tu galería de extensiones configurada.",
"preparePrompt": "¿Preparar una entrega local de migración a Zoo Code? Si incluyes claves de API, los secrets del proveedor se escribirán en un archivo local para que Zoo pueda importarlos y luego eliminar la entrega.",
"handoffPrepared": "Entrega de migración a Zoo Code preparada en {{path}}. Instala Zoo Code e importa desde esta entrega.",
"handoffFailed": "No se pudo preparar la entrega de migración a Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Annuler"
},
"notice": "Roo Code passe à Zoo Code. Tu peux préparer un transfert de migration par copie pour Zoo sans supprimer tes données Roo.",
"zooNotPublished": "Zoo Code n'est pas encore publié avec un id d'extension Marketplace confirmé. La vue Extensions a été ouverte avec une recherche Zoo Code.",
"installUnavailable": "Zoo Code est disponible sous l'id ZooCodeOrganization.zoo-code. L'installation automatique ne s'est pas terminée, donc la vue Extensions a été ouverte pour que tu puisses l'installer depuis ta galerie d'extensions configurée.",
"preparePrompt": "Préparer un transfert local de migration Zoo Code ? Inclure les clés API écrit les secrets du fournisseur dans un fichier local afin que Zoo puisse les importer, puis supprimer le transfert après import.",
"handoffPrepared": "Transfert de migration Zoo Code préparé dans {{path}}. Installe Zoo Code et importe depuis ce transfert.",
"handoffFailed": "Échec de la préparation du transfert de migration Zoo Code : {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "रद्द करें"
},
"notice": "Roo Code, Zoo Code में बदल रहा है। आप Roo डेटा हटाए बिना Zoo के लिए कॉपी-आधारित माइग्रेशन हैंडऑफ तैयार कर सकते हैं।",
"zooNotPublished": "Zoo Code अभी तक पुष्टि किए गए Marketplace एक्सटेंशन id के तहत प्रकाशित नहीं है। Extensions दृश्य Zoo Code खोज के साथ खोल दिया गया है।",
"installUnavailable": "Zoo Code, ZooCodeOrganization.zoo-code के रूप में उपलब्ध है। स्वचालित इंस्टॉल पूरा नहीं हुआ, इसलिए Extensions दृश्य खोला गया है ताकि आप इसे अपनी कॉन्फ़िगर की गई एक्सटेंशन गैलरी से इंस्टॉल कर सकें।",
"preparePrompt": "स्थानीय Zoo Code माइग्रेशन हैंडऑफ तैयार करें? API कुंजियां शामिल करने से प्रदाता secrets एक स्थानीय फ़ाइल में लिखे जाएंगे ताकि Zoo उन्हें आयात कर सके और फिर आयात के बाद हैंडऑफ हटा सके।",
"handoffPrepared": "Zoo Code माइग्रेशन हैंडऑफ {{path}} पर तैयार है। Zoo Code इंस्टॉल करें और इस हैंडऑफ से आयात करें।",
"handoffFailed": "Zoo Code माइग्रेशन हैंडऑफ तैयार करने में विफल: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Batal"
},
"notice": "Roo Code sedang beralih ke Zoo Code. Kamu bisa menyiapkan handoff migrasi berbasis salinan untuk Zoo tanpa menghapus data Roo-mu.",
"zooNotPublished": "Zoo Code belum diterbitkan dengan id ekstensi Marketplace yang terkonfirmasi. Tampilan Extensions telah dibuka dengan pencarian Zoo Code.",
"installUnavailable": "Zoo Code tersedia sebagai ZooCodeOrganization.zoo-code. Instal otomatis tidak selesai, jadi tampilan Extensions telah dibuka agar kamu bisa menginstalnya dari galeri ekstensi yang dikonfigurasi.",
"preparePrompt": "Siapkan handoff migrasi Zoo Code lokal? Menyertakan kunci API akan menulis secret penyedia ke file lokal agar Zoo bisa mengimpornya, lalu menghapus handoff setelah impor.",
"handoffPrepared": "Handoff migrasi Zoo Code disiapkan di {{path}}. Instal Zoo Code dan impor dari handoff ini.",
"handoffFailed": "Gagal menyiapkan handoff migrasi Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Annulla"
},
"notice": "Roo Code sta passando a Zoo Code. Puoi preparare un handoff di migrazione basato su copia per Zoo senza eliminare i tuoi dati Roo.",
"zooNotPublished": "Zoo Code non è ancora pubblicato con un id estensione Marketplace confermato. La vista Estensioni è stata aperta con una ricerca di Zoo Code.",
"installUnavailable": "Zoo Code è disponibile come ZooCodeOrganization.zoo-code. L'installazione automatica non è stata completata, quindi la vista Estensioni è stata aperta per permetterti di installarlo dalla galleria estensioni configurata.",
"preparePrompt": "Preparare un handoff locale di migrazione Zoo Code? Includere le chiavi API scrive i secret dei provider in un file locale, così Zoo può importarli e poi eliminare l'handoff dopo l'importazione.",
"handoffPrepared": "Handoff di migrazione Zoo Code preparato in {{path}}. Installa Zoo Code e importa da questo handoff.",
"handoffFailed": "Impossibile preparare l'handoff di migrazione Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "キャンセル"
},
"notice": "Roo Code は Zoo Code へ移行しています。Roo のデータを削除せずに、Zoo 用のコピー方式の移行ハンドオフを準備できます。",
"zooNotPublished": "Zoo Code は、確認済みの Marketplace 拡張機能 id ではまだ公開されていません。拡張機能ビューで Zoo Code の検索を開きました。",
"installUnavailable": "Zoo Code は ZooCodeOrganization.zoo-code として利用できます。自動インストールが完了しなかったため、設定済みの拡張機能ギャラリーからインストールできるように Extensions ビューを開きました。",
"preparePrompt": "ローカルの Zoo Code 移行ハンドオフを準備しますかAPI キーを含めると、Zoo がインポートできるようにプロバイダーの secret がローカルファイルに書き込まれ、インポート後にハンドオフを削除できます。",
"handoffPrepared": "Zoo Code 移行ハンドオフを {{path}} に準備しました。Zoo Code をインストールして、このハンドオフからインポートしてください。",
"handoffFailed": "Zoo Code 移行ハンドオフの準備に失敗しました: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "취소"
},
"notice": "Roo Code가 Zoo Code로 전환됩니다. Roo 데이터를 삭제하지 않고 Zoo용 복사 기반 마이그레이션 핸드오프를 준비할 수 있습니다.",
"zooNotPublished": "Zoo Code는 아직 확인된 Marketplace 확장 id로 게시되지 않았습니다. Extensions 보기에서 Zoo Code 검색을 열었습니다.",
"installUnavailable": "Zoo Code는 ZooCodeOrganization.zoo-code로 제공됩니다. 자동 설치가 완료되지 않아, 구성된 확장 갤러리에서 설치할 수 있도록 Extensions 보기를 열었습니다.",
"preparePrompt": "로컬 Zoo Code 마이그레이션 핸드오프를 준비할까요? API 키를 포함하면 Zoo가 가져올 수 있도록 공급자 secrets가 로컬 파일에 기록되고, 가져온 후 핸드오프를 삭제할 수 있습니다.",
"handoffPrepared": "Zoo Code 마이그레이션 핸드오프가 {{path}}에 준비되었습니다. Zoo Code를 설치하고 이 핸드오프에서 가져오세요.",
"handoffFailed": "Zoo Code 마이그레이션 핸드오프 준비 실패: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Annuleren"
},
"notice": "Roo Code stapt over naar Zoo Code. Je kunt een kopie-gebaseerde migratiehandoff voor Zoo voorbereiden zonder je Roo-gegevens te verwijderen.",
"zooNotPublished": "Zoo Code is nog niet gepubliceerd onder een bevestigde Marketplace-extensie-id. De extensieweergave is geopend met een zoekopdracht naar Zoo Code.",
"installUnavailable": "Zoo Code is beschikbaar als ZooCodeOrganization.zoo-code. De automatische installatie is niet voltooid, daarom is de Extensions-weergave geopend zodat je het vanuit je geconfigureerde extensiegalerie kunt installeren.",
"preparePrompt": "Een lokale Zoo Code-migratiehandoff voorbereiden? Als je API-sleutels opneemt, worden provider-secrets naar een lokaal bestand geschreven zodat Zoo ze kan importeren en de handoff daarna kan verwijderen.",
"handoffPrepared": "Zoo Code-migratiehandoff voorbereid op {{path}}. Installeer Zoo Code en importeer vanuit deze handoff.",
"handoffFailed": "Kan Zoo Code-migratiehandoff niet voorbereiden: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Anuluj"
},
"notice": "Roo Code przechodzi na Zoo Code. Możesz przygotować dla Zoo migrację przez kopię bez usuwania danych Roo.",
"zooNotPublished": "Zoo Code nie jest jeszcze opublikowany pod potwierdzonym id rozszerzenia Marketplace. Widok Rozszerzenia został otwarty z wyszukiwaniem Zoo Code.",
"installUnavailable": "Zoo Code jest dostępny jako ZooCodeOrganization.zoo-code. Automatyczna instalacja nie została ukończona, więc otwarto widok Extensions, aby można było zainstalować go ze skonfigurowanej galerii rozszerzeń.",
"preparePrompt": "Przygotować lokalną migrację Zoo Code? Dołączenie kluczy API zapisze secrets dostawców do lokalnego pliku, aby Zoo mogło je zaimportować, a następnie usunąć plik po imporcie.",
"handoffPrepared": "Migracja Zoo Code została przygotowana w {{path}}. Zainstaluj Zoo Code i zaimportuj dane z tego pliku.",
"handoffFailed": "Nie udało się przygotować migracji Zoo Code: {{error}}"

View file

@ -34,7 +34,7 @@
"cancel": "Cancelar"
},
"notice": "Roo Code está migrando para Zoo Code. Você pode preparar uma entrega de migração baseada em cópia para o Zoo sem excluir seus dados do Roo.",
"zooNotPublished": "Zoo Code ainda não foi publicado com um id de extensão confirmado no Marketplace. A visualização de Extensões foi aberta com uma busca por Zoo Code.",
"installUnavailable": "Zoo Code está disponível como ZooCodeOrganization.zoo-code. A instalação automática não foi concluída, então a visualização Extensões foi aberta para que você possa instalá-lo pela galeria de extensões configurada.",
"preparePrompt": "Preparar uma entrega local de migração para o Zoo Code? Incluir chaves de API grava os secrets dos provedores em um arquivo local para que o Zoo possa importá-los e depois excluir a entrega após a importação.",
"handoffPrepared": "Entrega de migração do Zoo Code preparada em {{path}}. Instale o Zoo Code e importe a partir desta entrega.",
"handoffFailed": "Falha ao preparar a entrega de migração do Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Отмена"
},
"notice": "Roo Code переходит на Zoo Code. Вы можете подготовить копируемый пакет миграции для Zoo, не удаляя данные Roo.",
"zooNotPublished": "Zoo Code еще не опубликован с подтвержденным id расширения Marketplace. Открыт раздел расширений с поиском Zoo Code.",
"installUnavailable": "Zoo Code доступен как ZooCodeOrganization.zoo-code. Автоматическая установка не завершилась, поэтому открыт раздел Extensions, чтобы вы могли установить его из настроенной галереи расширений.",
"preparePrompt": "Подготовить локальный пакет миграции Zoo Code? Если включить API-ключи, secrets провайдеров будут записаны в локальный файл, чтобы Zoo мог импортировать их, а затем удалить пакет после импорта.",
"handoffPrepared": "Пакет миграции Zoo Code подготовлен в {{path}}. Установите Zoo Code и импортируйте данные из этого пакета.",
"handoffFailed": "Не удалось подготовить пакет миграции Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "İptal"
},
"notice": "Roo Code, Zoo Code'a geçiyor. Roo verilerini silmeden Zoo için kopya tabanlı bir geçiş handoff'u hazırlayabilirsin.",
"zooNotPublished": "Zoo Code henüz doğrulanmış bir Marketplace eklenti id'siyle yayınlanmadı. Eklentiler görünümü Zoo Code aramasıylaıldı.",
"installUnavailable": "Zoo Code, ZooCodeOrganization.zoo-code olarak mevcut. Otomatik yükleme tamamlanmadı, bu yüzden yapılandırılmış eklenti galerinden yükleyebilmen için Extensions görünümüıldı.",
"preparePrompt": "Yerel bir Zoo Code geçiş handoff'u hazırlansın mı? API anahtarlarını dahil etmek, sağlayıcı secrets değerlerini Zoo'nun içe aktarabilmesi ve içe aktarma sonrası handoff'u silebilmesi için yerel bir dosyaya yazar.",
"handoffPrepared": "Zoo Code geçiş handoff'u {{path}} konumunda hazırlandı. Zoo Code'u yükle ve bu handoff'tan içe aktar.",
"handoffFailed": "Zoo Code geçiş handoff'u hazırlanamadı: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "Hủy"
},
"notice": "Roo Code đang chuyển sang Zoo Code. Bạn có thể chuẩn bị handoff di chuyển dạng sao chép cho Zoo mà không xóa dữ liệu Roo của mình.",
"zooNotPublished": "Zoo Code chưa được phát hành với id tiện ích Marketplace đã xác nhận. Khung Extensions đã được mở với tìm kiếm Zoo Code.",
"installUnavailable": "Zoo Code có sẵn dưới tên ZooCodeOrganization.zoo-code. Quá trình cài đặt tự động chưa hoàn tất, nên khung Extensions đã được mở để bạn có thể cài đặt từ thư viện tiện ích đã cấu hình.",
"preparePrompt": "Chuẩn bị handoff di chuyển Zoo Code cục bộ? Bao gồm khóa API sẽ ghi secrets của nhà cung cấp vào một tệp cục bộ để Zoo có thể nhập chúng, rồi xóa handoff sau khi nhập.",
"handoffPrepared": "Handoff di chuyển Zoo Code đã được chuẩn bị tại {{path}}. Cài đặt Zoo Code và nhập từ handoff này.",
"handoffFailed": "Không thể chuẩn bị handoff di chuyển Zoo Code: {{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "取消"
},
"notice": "Roo Code 正在迁移到 Zoo Code。你可以为 Zoo 准备基于复制的迁移交接包,而不会删除你的 Roo 数据。",
"zooNotPublished": "Zoo Code 尚未以确认的 Marketplace 扩展 id 发布。已打开扩展视图并搜索 Zoo Code。",
"installUnavailable": "Zoo Code 已以 ZooCodeOrganization.zoo-code 提供。自动安装未完成,因此已打开 Extensions 视图,你可以从已配置的扩展图库中安装它。",
"preparePrompt": "要准备本地 Zoo Code 迁移交接包吗?包含 API 密钥会将提供商 secrets 写入本地文件,以便 Zoo 导入,并在导入后删除该交接包。",
"handoffPrepared": "Zoo Code 迁移交接包已准备在 {{path}}。请安装 Zoo Code 并从此交接包导入。",
"handoffFailed": "无法准备 Zoo Code 迁移交接包:{{error}}"

View file

@ -30,7 +30,7 @@
"cancel": "取消"
},
"notice": "Roo Code 正在遷移到 Zoo Code。你可以為 Zoo 準備以複製為基礎的遷移交接包,而不會刪除你的 Roo 資料。",
"zooNotPublished": "Zoo Code 尚未以確認的 Marketplace 擴充功能 id 發布。已開啟擴充功能檢視並搜尋 Zoo Code。",
"installUnavailable": "Zoo Code 已以 ZooCodeOrganization.zoo-code 提供。自動安裝未完成,因此已開啟 Extensions 檢視,你可以從已設定的擴充功能圖庫安裝它。",
"preparePrompt": "要準備本機 Zoo Code 遷移交接包嗎?包含 API 金鑰會將供應商 secrets 寫入本機檔案,讓 Zoo 匯入,然後在匯入後刪除交接包。",
"handoffPrepared": "Zoo Code 遷移交接包已準備在 {{path}}。請安裝 Zoo Code 並從此交接包匯入。",
"handoffFailed": "無法準備 Zoo Code 遷移交接包:{{error}}"

View file

@ -17,7 +17,7 @@ const HANDOFF_FILE_NAME = "handoff-v1.json"
const ZOO_REPOSITORY_URL = "https://github.com/Zoo-Code-Org/Zoo-Code"
const ZOO_ANNOUNCEMENT_URL = "https://www.reddit.com/r/RooCode/comments/1syufn1/roo_is_back_as_zoo/"
const ZOO_EXTENSION_ID = process.env.ZOO_CODE_EXTENSION_ID
const ZOO_EXTENSION_ID = "ZooCodeOrganization.zoo-code"
const CONFIGURATION_KEYS = [
"allowedCommands",
@ -66,7 +66,7 @@ export type ZooMigrationHandoff = {
zoo: {
repositoryUrl: string
announcementUrl: string
extensionId?: string
extensionId: string
}
containsSecrets: boolean
globalSettings?: GlobalSettings
@ -200,13 +200,12 @@ export async function showZooMigrationNotice(
}
export async function installOrShowZooExtension(): Promise<void> {
if (ZOO_EXTENSION_ID) {
try {
await vscode.commands.executeCommand("workbench.extensions.installExtension", ZOO_EXTENSION_ID)
return
} catch {
await vscode.commands.executeCommand("workbench.extensions.search", ZOO_EXTENSION_ID)
await vscode.window.showInformationMessage(t("common:zooMigration.installUnavailable"))
}
await vscode.commands.executeCommand("workbench.extensions.search", "Zoo Code")
await vscode.window.showInformationMessage(t("common:zooMigration.zooNotPublished"))
}
export async function promptAndCreateZooMigrationHandoff(options: {

View file

@ -3,7 +3,8 @@ import * as os from "os"
import * as path from "path"
import * as vscode from "vscode"
import { createZooMigrationHandoff, showZooMigrationNotice } from "../ZooMigration"
import packageJson from "../../../package.json"
import { createZooMigrationHandoff, installOrShowZooExtension, showZooMigrationNotice } from "../ZooMigration"
describe("createZooMigrationHandoff", () => {
let tmpDir: string
@ -48,6 +49,8 @@ describe("createZooMigrationHandoff", () => {
expect(handoffJson.containsSecrets).toBe(false)
expect(handoffJson.providerProfiles).toBeUndefined()
expect(handoffJson.globalSettings).toEqual({ mode: "code" })
expect(handoffJson.zoo.extensionId).toBe("ZooCodeOrganization.zoo-code")
expect(Object.keys(handoffJson.vscodeConfiguration).sort()).toEqual(getContributedRooConfigurationKeys())
expect(handoffJson.copiedData).toEqual({
settings: "data/settings",
tasks: "data/tasks",
@ -197,6 +200,41 @@ describe("showZooMigrationNotice", () => {
})
})
describe("installOrShowZooExtension", () => {
afterEach(() => {
vi.restoreAllMocks()
})
it("installs the published Zoo Code marketplace extension", async () => {
const executeCommand = vi.spyOn(vscode.commands, "executeCommand").mockResolvedValue(undefined)
await installOrShowZooExtension()
expect(executeCommand).toHaveBeenCalledWith(
"workbench.extensions.installExtension",
"ZooCodeOrganization.zoo-code",
)
})
it("falls back to extension search when the configured gallery cannot install Zoo Code yet", async () => {
const executeCommand = vi
.spyOn(vscode.commands, "executeCommand")
.mockRejectedValueOnce(new Error("Extension not found"))
.mockResolvedValueOnce(undefined)
const showInformationMessage = vi.spyOn(vscode.window, "showInformationMessage").mockResolvedValue(undefined)
await installOrShowZooExtension()
expect(executeCommand).toHaveBeenNthCalledWith(
1,
"workbench.extensions.installExtension",
"ZooCodeOrganization.zoo-code",
)
expect(executeCommand).toHaveBeenNthCalledWith(2, "workbench.extensions.search", "ZooCodeOrganization.zoo-code")
expect(showInformationMessage).toHaveBeenCalled()
})
})
function makeContext(globalStoragePath: string): vscode.ExtensionContext {
return {
globalStorageUri: vscode.Uri.file(globalStoragePath),
@ -206,3 +244,9 @@ function makeContext(globalStoragePath: string): vscode.ExtensionContext {
},
} as any
}
function getContributedRooConfigurationKeys(): string[] {
return Object.keys((packageJson as any).contributes.configuration.properties)
.map((key) => key.replace(/^roo-cline\./, ""))
.sort()
}