diff --git a/src/cli.ts b/src/cli.ts index bd416b4..02fd26d 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -335,7 +335,7 @@ async function main() { break; case 'skills': { - const { showStatus, runSkillsSync, enableSkill } = await import('./skills/index.js'); + const { showStatus, runSkillsSync, enableSkill, disableSkill } = await import('./skills/index.js'); switch (subCommand) { case 'status': await showStatus(); @@ -347,6 +347,13 @@ async function main() { } enableSkill(args[2]); break; + case 'disable': + if (!args[2]) { + console.error('Usage: lettabot skills disable '); + process.exit(1); + } + disableSkill(args[2]); + break; default: await runSkillsSync(); } diff --git a/src/skills/sync.ts b/src/skills/sync.ts index 41d9443..de3880c 100644 --- a/src/skills/sync.ts +++ b/src/skills/sync.ts @@ -149,11 +149,12 @@ export async function runSkillsSync(): Promise { } } - // Start with no skills selected (user must explicitly enable) + // Pre-check currently installed skills so the user edits from current state + const currentlyInstalled = skills.filter(s => s.installed).map(s => s.name); const selected = await p.multiselect({ message: 'Enable skills (space=toggle, enter=confirm):', options, - initialValues: [], // Disabled by default + initialValues: currentlyInstalled, required: false, }); @@ -220,6 +221,24 @@ export async function runSkillsSync(): Promise { p.outro(`✨ Added ${toAdd.length}, removed ${toRemove.length} skill(s)`); } +/** + * Non-interactively disable a single skill by name. + */ +export function disableSkill(name: string): void { + const dest = join(TARGET_DIR, name); + if (!existsSync(dest)) { + console.log(`Skill '${name}' is not enabled.`); + return; + } + try { + rmSync(dest, { recursive: true, force: true }); + console.log(`Disabled skill '${name}'.`); + } catch (e) { + console.error(`Failed to disable '${name}': ${e}`); + process.exit(1); + } +} + /** * Non-interactively enable a single skill by name. * Searches BUNDLED_SKILLS_DIR, then GLOBAL_SKILLS_DIR, then SKILLS_SH_DIR. diff --git a/src/skills/wizard.ts b/src/skills/wizard.ts index ac05340..f34c1cf 100644 --- a/src/skills/wizard.ts +++ b/src/skills/wizard.ts @@ -293,6 +293,7 @@ export async function showStatus(): Promise { } log.info(''); - log.info(` To enable: lettabot skills enable (or run: lettabot skills)`); + log.info(` To enable: lettabot skills enable (or run: lettabot skills)`); + log.info(` To disable: lettabot skills disable `); log.info(` Skills dir: ${WORKING_SKILLS_DIR}`); } diff --git a/vitest.config.ts b/vitest.config.ts index 7ce3cec..b86ebbd 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { - exclude: ['dist/**', 'node_modules/**'], + exclude: ['dist/**', 'node_modules/**', '.git/**'], }, });