From 8b8420151626b773f33987eb9f092281da396ec5 Mon Sep 17 00:00:00 2001 From: betterlmy Date: Fri, 17 Jul 2026 11:26:20 +0800 Subject: [PATCH] feat: add generic user-level agent install target Signed-off-by: betterlmy --- cli/src/agents/resolver.ts | 12 +++++++++++ .../unit/agents/resolver-interactive.test.ts | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/cli/src/agents/resolver.ts b/cli/src/agents/resolver.ts index 2290ee09..04ed5c63 100644 --- a/cli/src/agents/resolver.ts +++ b/cli/src/agents/resolver.ts @@ -68,6 +68,18 @@ async function resolveScopedTargets( } candidates = dedupeByRoot(candidates) + if (scope === 'user' && agentList.length === 0 && options.interactive && !options.json) { + candidates = dedupeByRoot([ + ...candidates, + { + agent: 'generic', + rootDir: `${scopedHome}/.agents/skills`, + scope: 'user', + source: 'fallback' + } + ]) + } + if (candidates.length === 0) { const fallbackRoot = scope === 'user' ? `${scopedHome}/.agents/skills` diff --git a/cli/test/unit/agents/resolver-interactive.test.ts b/cli/test/unit/agents/resolver-interactive.test.ts index 55bc99ac..8de156da 100644 --- a/cli/test/unit/agents/resolver-interactive.test.ts +++ b/cli/test/unit/agents/resolver-interactive.test.ts @@ -33,4 +33,25 @@ describe('resolveInstallTargets interactive prompt', () => { expect(targets).toEqual([highlighted]) }) + + test('offers the generic user target alongside detected agent targets', async () => { + const targets = await resolveInstallTargets({ + cwd: '/repo', + home: '/home/u', + agents: [], + scope: 'user', + json: false, + interactive: true, + detected: [ + { agent: 'codex', rootDir: '/home/u/.codex/skills', scope: 'user', source: 'detected' } + ] + }) + + expect(targets).toEqual([{ + agent: 'generic', + rootDir: '/home/u/.agents/skills', + scope: 'user', + source: 'fallback' + }]) + }) })