feat: add skills install command
This commit is contained in:
parent
735aea9efa
commit
49127ac78d
@ -5,6 +5,7 @@ import {
|
|||||||
type SkillStatusEntry,
|
type SkillStatusEntry,
|
||||||
type SkillStatusReport,
|
type SkillStatusReport,
|
||||||
} from "../agents/skills-status.js";
|
} from "../agents/skills-status.js";
|
||||||
|
import { installSkill } from "../agents/skills-install.js";
|
||||||
import { loadConfig } from "../config/config.js";
|
import { loadConfig } from "../config/config.js";
|
||||||
import { defaultRuntime } from "../runtime.js";
|
import { defaultRuntime } from "../runtime.js";
|
||||||
import { formatDocsLink } from "../terminal/links.js";
|
import { formatDocsLink } from "../terminal/links.js";
|
||||||
@ -391,6 +392,56 @@ export function registerSkillsCli(program: Command) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
skills
|
||||||
|
.command("install")
|
||||||
|
.description("Install skill dependencies")
|
||||||
|
.argument("<name>", "Skill name")
|
||||||
|
.action(async (name) => {
|
||||||
|
try {
|
||||||
|
const config = loadConfig();
|
||||||
|
const workspaceDir = resolveAgentWorkspaceDir(config, resolveDefaultAgentId(config));
|
||||||
|
const report = buildWorkspaceSkillStatus(workspaceDir, { config });
|
||||||
|
|
||||||
|
const skill = report.skills.find(
|
||||||
|
(s) => s.name === name || s.skillKey === name,
|
||||||
|
);
|
||||||
|
if (!skill) {
|
||||||
|
defaultRuntime.error(`Skill not found: ${name}`);
|
||||||
|
defaultRuntime.exit(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skill.install.length === 0) {
|
||||||
|
defaultRuntime.log(`No installers available for ${name}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the first (preferred) installer
|
||||||
|
const installId = skill.install[0].id;
|
||||||
|
const kind = skill.install[0].kind;
|
||||||
|
|
||||||
|
defaultRuntime.log(`Installing ${name} (${kind})...`);
|
||||||
|
|
||||||
|
const result = await installSkill({
|
||||||
|
workspaceDir,
|
||||||
|
skillName: skill.name,
|
||||||
|
installId,
|
||||||
|
config,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.ok) {
|
||||||
|
defaultRuntime.log(theme.success(`Successfully installed ${name}`));
|
||||||
|
} else {
|
||||||
|
defaultRuntime.error(`Installation failed: ${result.message}`);
|
||||||
|
if (result.stderr) defaultRuntime.error(result.stderr);
|
||||||
|
defaultRuntime.exit(1);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
defaultRuntime.error(String(err));
|
||||||
|
defaultRuntime.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Default action (no subcommand) - show list
|
// Default action (no subcommand) - show list
|
||||||
skills.action(async () => {
|
skills.action(async () => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user