From 298cb4ab8adc07da054a0347fde68b88b585b930 Mon Sep 17 00:00:00 2001 From: Dotta Date: Mon, 16 Mar 2026 08:59:43 -0500 Subject: [PATCH] fix: auto-expand conflicting files and warn on agent overwrites during import When importing into an existing company, files with "update" action (conflicts) now have their parent directories auto-expanded so users immediately see what will be overwritten. Additionally, server-side warnings are generated for any agent or project that will be overwritten by the import. Co-Authored-By: Paperclip Co-Authored-By: Claude Opus 4.6 --- server/src/services/company-portability.ts | 14 ++++++++++++++ ui/src/pages/CompanyImport.tsx | 22 +++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/server/src/services/company-portability.ts b/server/src/services/company-portability.ts index c974776e..0ecb9ccb 100644 --- a/server/src/services/company-portability.ts +++ b/server/src/services/company-portability.ts @@ -2042,6 +2042,20 @@ export function companyPortabilityService(db: Db) { } } + // Warn about agents that will be overwritten/updated + for (const ap of agentPlans) { + if (ap.action === "update") { + warnings.push(`Existing agent "${ap.plannedName}" (${ap.slug}) will be overwritten by import.`); + } + } + + // Warn about projects that will be overwritten/updated + for (const pp of projectPlans) { + if (pp.action === "update") { + warnings.push(`Existing project "${pp.plannedName}" (${pp.slug}) will be overwritten by import.`); + } + } + if (include.issues) { for (const manifestIssue of manifest.issues) { issuePlans.push({ diff --git a/ui/src/pages/CompanyImport.tsx b/ui/src/pages/CompanyImport.tsx index f2ef822c..c4f0ff4f 100644 --- a/ui/src/pages/CompanyImport.tsx +++ b/ui/src/pages/CompanyImport.tsx @@ -566,13 +566,25 @@ export function CompanyImport() { // Check all files by default const allFiles = new Set(Object.keys(result.files)); setCheckedFiles(allFiles); - // Expand top-level dirs - const tree = buildFileTree(result.files, buildActionMap(result)); - const topDirs = new Set(); + // Expand top-level dirs + all ancestor dirs of files with conflicts (update action) + const am = buildActionMap(result); + const tree = buildFileTree(result.files, am); + const dirsToExpand = new Set(); for (const node of tree) { - if (node.kind === "dir") topDirs.add(node.path); + if (node.kind === "dir") dirsToExpand.add(node.path); } - setExpandedDirs(topDirs); + // Auto-expand directories containing conflicting files so they're visible + for (const [filePath, action] of am) { + if (action === "update") { + const segments = filePath.split("/").filter(Boolean); + let current = ""; + for (let i = 0; i < segments.length - 1; i++) { + current = current ? `${current}/${segments[i]}` : segments[i]; + dirsToExpand.add(current); + } + } + } + setExpandedDirs(dirsToExpand); // Select first file const firstFile = Object.keys(result.files)[0]; if (firstFile) setSelectedFile(firstFile);