Skip to content

Commit 562a007

Browse files
takakoutsoroomotedaniel-lxs
authored
feat: Add automatic configuration import on extension startup (RooCodeInc#4848)
Co-authored-by: Roo Code <[email protected]> Co-authored-by: Daniel Riccio <[email protected]>
1 parent 6427916 commit 562a007

Some content is hidden

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

41 files changed

+173
-94
lines changed

src/core/config/importExport.ts

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { ContextProxy } from "./ContextProxy"
1414
import { CustomModesManager } from "./CustomModesManager"
1515
import { t } from "../../i18n"
1616

17-
type ImportOptions = {
17+
export type ImportOptions = {
1818
providerSettingsManager: ProviderSettingsManager
1919
contextProxy: ContextProxy
2020
customModesManager: CustomModesManager
@@ -24,7 +24,6 @@ type ExportOptions = {
2424
providerSettingsManager: ProviderSettingsManager
2525
contextProxy: ContextProxy
2626
}
27-
2827
type ImportWithProviderOptions = ImportOptions & {
2928
provider: {
3029
settingsImportedAt?: number
@@ -33,33 +32,14 @@ type ImportWithProviderOptions = ImportOptions & {
3332
}
3433

3534
/**
36-
* Import settings from a file using a file dialog
37-
* @param options - Import options containing managers and proxy
38-
* @returns Promise resolving to import result
35+
* Imports configuration from a specific file path
36+
* Shares base functionality for import settings for both the manual
37+
* and automatic settings importing
3938
*/
40-
export const importSettings = async ({ providerSettingsManager, contextProxy, customModesManager }: ImportOptions) => {
41-
const uris = await vscode.window.showOpenDialog({
42-
filters: { JSON: ["json"] },
43-
canSelectMany: false,
44-
})
45-
46-
if (!uris) {
47-
return { success: false, error: "User cancelled file selection" }
48-
}
49-
50-
return await importSettingsFromFile({ providerSettingsManager, contextProxy, customModesManager }, uris[0])
51-
}
52-
53-
/**
54-
* Import settings from a specific file
55-
* @param options - Import options containing managers and proxy
56-
* @param fileUri - URI of the file to import from
57-
* @returns Promise resolving to import result
58-
*/
59-
export const importSettingsFromFile = async (
39+
export async function importSettingsFromPath(
40+
filePath: string,
6041
{ providerSettingsManager, contextProxy, customModesManager }: ImportOptions,
61-
fileUri: vscode.Uri,
62-
) => {
42+
) {
6343
const schema = z.object({
6444
providerProfiles: providerProfilesSchema,
6545
globalSettings: globalSettingsSchema.optional(),
@@ -68,8 +48,9 @@ export const importSettingsFromFile = async (
6848
try {
6949
const previousProviderProfiles = await providerSettingsManager.export()
7050

71-
const data = JSON.parse(await fs.readFile(fileUri.fsPath, "utf-8"))
72-
const { providerProfiles: newProviderProfiles, globalSettings = {} } = schema.parse(data)
51+
const { providerProfiles: newProviderProfiles, globalSettings = {} } = schema.parse(
52+
JSON.parse(await fs.readFile(filePath, "utf-8")),
53+
)
7354

7455
const providerProfiles = {
7556
currentApiConfigName: newProviderProfiles.currentApiConfigName,
@@ -119,6 +100,45 @@ export const importSettingsFromFile = async (
119100
}
120101
}
121102

103+
/**
104+
* Import settings from a file using a file dialog
105+
* @param options - Import options containing managers and proxy
106+
* @returns Promise resolving to import result
107+
*/
108+
export const importSettings = async ({ providerSettingsManager, contextProxy, customModesManager }: ImportOptions) => {
109+
const uris = await vscode.window.showOpenDialog({
110+
filters: { JSON: ["json"] },
111+
canSelectMany: false,
112+
})
113+
114+
if (!uris) {
115+
return { success: false, error: "User cancelled file selection" }
116+
}
117+
118+
return importSettingsFromPath(uris[0].fsPath, {
119+
providerSettingsManager,
120+
contextProxy,
121+
customModesManager,
122+
})
123+
}
124+
125+
/**
126+
* Import settings from a specific file
127+
* @param options - Import options containing managers and proxy
128+
* @param fileUri - URI of the file to import from
129+
* @returns Promise resolving to import result
130+
*/
131+
export const importSettingsFromFile = async (
132+
{ providerSettingsManager, contextProxy, customModesManager }: ImportOptions,
133+
fileUri: vscode.Uri,
134+
) => {
135+
return importSettingsFromPath(fileUri.fsPath, {
136+
providerSettingsManager,
137+
contextProxy,
138+
customModesManager,
139+
})
140+
}
141+
122142
export const exportSettings = async ({ providerSettingsManager, contextProxy }: ExportOptions) => {
123143
const uri = await vscode.window.showSaveDialog({
124144
filters: { JSON: ["json"] },
@@ -162,13 +182,13 @@ export const importSettingsWithFeedback = async (
162182
if (filePath) {
163183
// Validate file path and check if file exists
164184
try {
165-
const fileUri = vscode.Uri.file(filePath)
166185
// Check if file exists and is readable
167-
await fs.access(fileUri.fsPath, fs.constants.F_OK | fs.constants.R_OK)
168-
result = await importSettingsFromFile(
169-
{ providerSettingsManager, contextProxy, customModesManager },
170-
fileUri,
171-
)
186+
await fs.access(filePath, fs.constants.F_OK | fs.constants.R_OK)
187+
result = await importSettingsFromPath(filePath, {
188+
providerSettingsManager,
189+
contextProxy,
190+
customModesManager,
191+
})
172192
} catch (error) {
173193
result = {
174194
success: false,

src/extension.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { McpServerManager } from "./services/mcp/McpServerManager"
2828
import { CodeIndexManager } from "./services/code-index/manager"
2929
import { MdmService } from "./services/mdm/MdmService"
3030
import { migrateSettings } from "./utils/migrateSettings"
31+
import { autoImportSettings } from "./utils/autoImportSettings"
3132
import { API } from "./extension/api"
3233

3334
import {
@@ -120,6 +121,19 @@ export async function activate(context: vscode.ExtensionContext) {
120121
}),
121122
)
122123

124+
// Auto-import configuration if specified in settings
125+
try {
126+
await autoImportSettings(outputChannel, {
127+
providerSettingsManager: provider.providerSettingsManager,
128+
contextProxy: provider.contextProxy,
129+
customModesManager: provider.customModesManager,
130+
})
131+
} catch (error) {
132+
outputChannel.appendLine(
133+
`[AutoImport] Error during auto-import: ${error instanceof Error ? error.message : String(error)}`,
134+
)
135+
}
136+
123137
registerCommands({ context, outputChannel, provider })
124138

125139
/**

src/i18n/locales/ca/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@
8484
},
8585
"warnings": {
8686
"no_terminal_content": "No s'ha seleccionat contingut de terminal",
87-
"missing_task_files": "Els fitxers d'aquesta tasca falten. Vols eliminar-la de la llista de tasques?"
87+
"missing_task_files": "Els fitxers d'aquesta tasca falten. Vols eliminar-la de la llista de tasques?",
88+
"auto_import_failed": "Ha fallat la importació automàtica de la configuració de RooCode: {{error}}"
8889
},
8990
"info": {
9091
"no_changes": "No s'han trobat canvis.",
@@ -93,6 +94,7 @@
9394
"custom_storage_path_set": "Ruta d'emmagatzematge personalitzada establerta: {{path}}",
9495
"default_storage_path": "S'ha reprès l'ús de la ruta d'emmagatzematge predeterminada",
9596
"settings_imported": "Configuració importada correctament.",
97+
"auto_import_success": "Configuració de RooCode importada automàticament des de {{filename}}",
9698
"share_link_copied": "Enllaç de compartició copiat al portapapers",
9799
"image_copied_to_clipboard": "URI de dades de la imatge copiada al portapapers",
98100
"image_saved": "Imatge desada a {{path}}",

src/i18n/locales/de/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "Kein Terminal-Inhalt ausgewählt",
83-
"missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchtest du sie aus der Aufgabenliste entfernen?"
83+
"missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchtest du sie aus der Aufgabenliste entfernen?",
84+
"auto_import_failed": "Fehler beim automatischen Import der RooCode-Einstellungen: {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "Keine Änderungen gefunden.",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "Benutzerdefinierter Speicherpfad festgelegt: {{path}}",
9091
"default_storage_path": "Auf Standardspeicherpfad zurückgesetzt",
9192
"settings_imported": "Einstellungen erfolgreich importiert.",
93+
"auto_import_success": "RooCode-Einstellungen automatisch importiert aus {{filename}}",
9294
"share_link_copied": "Share-Link in die Zwischenablage kopiert",
9395
"image_copied_to_clipboard": "Bild-Daten-URI in die Zwischenablage kopiert",
9496
"image_saved": "Bild gespeichert unter {{path}}",

src/i18n/locales/en/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "No terminal content selected",
83-
"missing_task_files": "This task's files are missing. Would you like to remove it from the task list?"
83+
"missing_task_files": "This task's files are missing. Would you like to remove it from the task list?",
84+
"auto_import_failed": "Failed to auto-import RooCode settings: {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "No changes found.",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "Custom storage path set: {{path}}",
9091
"default_storage_path": "Reverted to using default storage path",
9192
"settings_imported": "Settings imported successfully.",
93+
"auto_import_success": "RooCode settings automatically imported from {{filename}}",
9294
"share_link_copied": "Share link copied to clipboard",
9395
"organization_share_link_copied": "Organization share link copied to clipboard!",
9496
"public_share_link_copied": "Public share link copied to clipboard!",

src/i18n/locales/es/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "No hay contenido de terminal seleccionado",
83-
"missing_task_files": "Los archivos de esta tarea faltan. ¿Deseas eliminarla de la lista de tareas?"
83+
"missing_task_files": "Los archivos de esta tarea faltan. ¿Deseas eliminarla de la lista de tareas?",
84+
"auto_import_failed": "Error al importar automáticamente la configuración de RooCode: {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "No se encontraron cambios.",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "Ruta de almacenamiento personalizada establecida: {{path}}",
9091
"default_storage_path": "Se ha vuelto a usar la ruta de almacenamiento predeterminada",
9192
"settings_imported": "Configuración importada correctamente.",
93+
"auto_import_success": "Configuración de RooCode importada automáticamente desde {{filename}}",
9294
"share_link_copied": "Enlace de compartir copiado al portapapeles",
9395
"image_copied_to_clipboard": "URI de datos de imagen copiada al portapapeles",
9496
"image_saved": "Imagen guardada en {{path}}",

src/i18n/locales/fr/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "Aucun contenu de terminal sélectionné",
83-
"missing_task_files": "Les fichiers de cette tâche sont introuvables. Souhaitez-vous la supprimer de la liste des tâches ?"
83+
"missing_task_files": "Les fichiers de cette tâche sont introuvables. Souhaitez-vous la supprimer de la liste des tâches ?",
84+
"auto_import_failed": "Échec de l'importation automatique des paramètres RooCode : {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "Aucun changement trouvé.",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "Chemin de stockage personnalisé défini : {{path}}",
9091
"default_storage_path": "Retour au chemin de stockage par défaut",
9192
"settings_imported": "Paramètres importés avec succès.",
93+
"auto_import_success": "Paramètres RooCode importés automatiquement depuis {{filename}}",
9294
"share_link_copied": "Lien de partage copié dans le presse-papiers",
9395
"image_copied_to_clipboard": "URI de données d'image copiée dans le presse-papiers",
9496
"image_saved": "Image enregistrée dans {{path}}",

src/i18n/locales/hi/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं",
83-
"missing_task_files": "इस टास्क की फाइलें गायब हैं। क्या आप इसे टास्क सूची से हटाना चाहते हैं?"
83+
"missing_task_files": "इस टास्क की फाइलें गायब हैं। क्या आप इसे टास्क सूची से हटाना चाहते हैं?",
84+
"auto_import_failed": "RooCode सेटिंग्स का स्वचालित आयात विफल: {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "कोई परिवर्तन नहीं मिला।",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "कस्टम स्टोरेज पाथ सेट किया गया: {{path}}",
9091
"default_storage_path": "डिफ़ॉल्ट स्टोरेज पाथ का उपयोग पुनः शुरू किया गया",
9192
"settings_imported": "सेटिंग्स सफलतापूर्वक इम्पोर्ट की गईं।",
93+
"auto_import_success": "RooCode सेटिंग्स {{filename}} से स्वचालित रूप से आयात की गईं",
9294
"share_link_copied": "साझा लिंक क्लिपबोर्ड पर कॉपी किया गया",
9395
"image_copied_to_clipboard": "छवि डेटा URI क्लिपबोर्ड में कॉपी की गई",
9496
"image_saved": "छवि {{path}} में सहेजी गई",

src/i18n/locales/id/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "Tidak ada konten terminal yang dipilih",
83-
"missing_task_files": "File tugas ini hilang. Apakah kamu ingin menghapusnya dari daftar tugas?"
83+
"missing_task_files": "File tugas ini hilang. Apakah kamu ingin menghapusnya dari daftar tugas?",
84+
"auto_import_failed": "Gagal mengimpor pengaturan RooCode secara otomatis: {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "Tidak ada perubahan ditemukan.",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "Path penyimpanan kustom diatur: {{path}}",
9091
"default_storage_path": "Kembali menggunakan path penyimpanan default",
9192
"settings_imported": "Pengaturan berhasil diimpor.",
93+
"auto_import_success": "Pengaturan RooCode berhasil diimpor secara otomatis dari {{filename}}",
9294
"share_link_copied": "Link bagikan disalin ke clipboard",
9395
"image_copied_to_clipboard": "Data URI gambar disalin ke clipboard",
9496
"image_saved": "Gambar disimpan ke {{path}}",

src/i18n/locales/it/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@
8080
},
8181
"warnings": {
8282
"no_terminal_content": "Nessun contenuto del terminale selezionato",
83-
"missing_task_files": "I file di questa attività sono mancanti. Vuoi rimuoverla dall'elenco delle attività?"
83+
"missing_task_files": "I file di questa attività sono mancanti. Vuoi rimuoverla dall'elenco delle attività?",
84+
"auto_import_failed": "Importazione automatica delle impostazioni RooCode fallita: {{error}}"
8485
},
8586
"info": {
8687
"no_changes": "Nessuna modifica trovata.",
@@ -89,6 +90,7 @@
8990
"custom_storage_path_set": "Percorso di archiviazione personalizzato impostato: {{path}}",
9091
"default_storage_path": "Tornato al percorso di archiviazione predefinito",
9192
"settings_imported": "Impostazioni importate con successo.",
93+
"auto_import_success": "Impostazioni RooCode importate automaticamente da {{filename}}",
9294
"share_link_copied": "Link di condivisione copiato negli appunti",
9395
"image_copied_to_clipboard": "URI dati dell'immagine copiato negli appunti",
9496
"image_saved": "Immagine salvata in {{path}}",

0 commit comments

Comments
 (0)