From 72848fcb007b0976b032e2547c488d4ea7b810d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Fri, 27 Mar 2026 22:49:44 -0400 Subject: [PATCH] feat(11): scan ~/.agents/skills/ and ~/.claude/skills/ for auto-import Skills from user home directories are now auto-imported when listing company skills. Deduplication handled by canonical key uniqueness. Scans: ~/.agents/skills/, ~/.claude/skills/, and workspace .agents/skills/. Cross-platform: uses HOME or USERPROFILE env var. --- src/main/skill-service.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/skill-service.ts b/src/main/skill-service.ts index 59fe57ff..7e227295 100644 --- a/src/main/skill-service.ts +++ b/src/main/skill-service.ts @@ -712,9 +712,32 @@ export function createSkillService({ db, profileDir, logger }: SkillServiceDepen async function scanWorkspaceSkills( companyId: string, ): Promise { - const workspacePaths = db.listWorkspaceLocalPaths(companyId); const allResults: SkillImportResult[] = []; + // 1. Scan user home directories: ~/.agents/skills/ and ~/.claude/skills/ + const homeDir = process.env.HOME || process.env.USERPROFILE || ""; + if (homeDir) { + const homeScanDirs = [ + join(homeDir, ".agents", "skills"), + join(homeDir, ".claude", "skills"), + ]; + for (const scanDir of homeScanDirs) { + if (!existsSync(scanDir)) continue; + try { + const stat = statSync(scanDir); + if (!stat.isDirectory()) continue; + const results = await importFromLocal(companyId, scanDir); + allResults.push(...results); + logger.info(`Scanned home skills: ${scanDir} — imported ${results.length} skill(s)`); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + logger.warn(`Failed to scan home skills at ${scanDir}: ${message}`); + } + } + } + + // 2. Scan workspace .agents/skills/ directories + const workspacePaths = db.listWorkspaceLocalPaths(companyId); for (const wsPath of workspacePaths) { const agentsSkillsDir = join(wsPath, ".agents", "skills"); if (!existsSync(agentsSkillsDir)) continue;