2026-01-08 07:23:05 +01:00
|
|
|
import type { Command } from "commander";
|
2026-01-14 14:31:43 +00:00
|
|
|
import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
|
2026-01-08 07:23:05 +01:00
|
|
|
import { loadConfig } from "../config/config.js";
|
|
|
|
|
import { defaultRuntime } from "../runtime.js";
|
2026-01-10 20:50:17 +01:00
|
|
|
import { formatDocsLink } from "../terminal/links.js";
|
|
|
|
|
import { theme } from "../terminal/theme.js";
|
2026-02-14 16:20:12 +00:00
|
|
|
import { formatSkillInfo, formatSkillsCheck, formatSkillsList } from "./skills-cli.format.js";
|
2026-01-08 07:23:05 +01:00
|
|
|
|
2026-02-14 16:20:12 +00:00
|
|
|
export type {
|
|
|
|
|
SkillInfoOptions,
|
|
|
|
|
SkillsCheckOptions,
|
|
|
|
|
SkillsListOptions,
|
|
|
|
|
} from "./skills-cli.format.js";
|
|
|
|
|
export { formatSkillInfo, formatSkillsCheck, formatSkillsList } from "./skills-cli.format.js";
|
2026-01-08 07:23:05 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Register the skills CLI commands
|
|
|
|
|
*/
|
|
|
|
|
export function registerSkillsCli(program: Command) {
|
|
|
|
|
const skills = program
|
|
|
|
|
.command("skills")
|
2026-01-10 20:50:17 +01:00
|
|
|
.description("List and inspect available skills")
|
|
|
|
|
.addHelpText(
|
|
|
|
|
"after",
|
2026-01-15 06:12:54 +00:00
|
|
|
() =>
|
2026-01-30 03:15:10 +01:00
|
|
|
`\n${theme.muted("Docs:")} ${formatDocsLink("/cli/skills", "docs.openclaw.ai/cli/skills")}\n`,
|
2026-01-10 20:50:17 +01:00
|
|
|
);
|
2026-01-08 07:23:05 +01:00
|
|
|
|
|
|
|
|
skills
|
|
|
|
|
.command("list")
|
|
|
|
|
.description("List all available skills")
|
|
|
|
|
.option("--json", "Output as JSON", false)
|
|
|
|
|
.option("--eligible", "Show only eligible (ready to use) skills", false)
|
2026-01-14 14:31:43 +00:00
|
|
|
.option("-v, --verbose", "Show more details including missing requirements", false)
|
2026-01-08 07:23:05 +01:00
|
|
|
.action(async (opts) => {
|
|
|
|
|
try {
|
|
|
|
|
const config = loadConfig();
|
2026-01-14 14:31:43 +00:00
|
|
|
const workspaceDir = resolveAgentWorkspaceDir(config, resolveDefaultAgentId(config));
|
2026-02-14 16:20:12 +00:00
|
|
|
const { buildWorkspaceSkillStatus } = await import("../agents/skills-status.js");
|
2026-01-08 07:23:05 +01:00
|
|
|
const report = buildWorkspaceSkillStatus(workspaceDir, { config });
|
2026-01-21 04:47:35 +00:00
|
|
|
defaultRuntime.log(formatSkillsList(report, opts));
|
2026-01-08 07:23:05 +01:00
|
|
|
} catch (err) {
|
|
|
|
|
defaultRuntime.error(String(err));
|
|
|
|
|
defaultRuntime.exit(1);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
skills
|
|
|
|
|
.command("info")
|
|
|
|
|
.description("Show detailed information about a skill")
|
|
|
|
|
.argument("<name>", "Skill name")
|
|
|
|
|
.option("--json", "Output as JSON", false)
|
|
|
|
|
.action(async (name, opts) => {
|
|
|
|
|
try {
|
|
|
|
|
const config = loadConfig();
|
2026-01-14 14:31:43 +00:00
|
|
|
const workspaceDir = resolveAgentWorkspaceDir(config, resolveDefaultAgentId(config));
|
2026-02-14 16:20:12 +00:00
|
|
|
const { buildWorkspaceSkillStatus } = await import("../agents/skills-status.js");
|
2026-01-08 07:23:05 +01:00
|
|
|
const report = buildWorkspaceSkillStatus(workspaceDir, { config });
|
2026-01-21 04:47:35 +00:00
|
|
|
defaultRuntime.log(formatSkillInfo(report, name, opts));
|
2026-01-08 07:23:05 +01:00
|
|
|
} catch (err) {
|
|
|
|
|
defaultRuntime.error(String(err));
|
|
|
|
|
defaultRuntime.exit(1);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
skills
|
|
|
|
|
.command("check")
|
|
|
|
|
.description("Check which skills are ready vs missing requirements")
|
|
|
|
|
.option("--json", "Output as JSON", false)
|
|
|
|
|
.action(async (opts) => {
|
|
|
|
|
try {
|
|
|
|
|
const config = loadConfig();
|
2026-01-14 14:31:43 +00:00
|
|
|
const workspaceDir = resolveAgentWorkspaceDir(config, resolveDefaultAgentId(config));
|
2026-02-14 16:20:12 +00:00
|
|
|
const { buildWorkspaceSkillStatus } = await import("../agents/skills-status.js");
|
2026-01-08 07:23:05 +01:00
|
|
|
const report = buildWorkspaceSkillStatus(workspaceDir, { config });
|
2026-01-21 04:47:35 +00:00
|
|
|
defaultRuntime.log(formatSkillsCheck(report, opts));
|
2026-01-08 07:23:05 +01:00
|
|
|
} catch (err) {
|
|
|
|
|
defaultRuntime.error(String(err));
|
|
|
|
|
defaultRuntime.exit(1);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Default action (no subcommand) - show list
|
|
|
|
|
skills.action(async () => {
|
|
|
|
|
try {
|
|
|
|
|
const config = loadConfig();
|
2026-01-14 14:31:43 +00:00
|
|
|
const workspaceDir = resolveAgentWorkspaceDir(config, resolveDefaultAgentId(config));
|
2026-02-14 16:20:12 +00:00
|
|
|
const { buildWorkspaceSkillStatus } = await import("../agents/skills-status.js");
|
2026-01-08 07:23:05 +01:00
|
|
|
const report = buildWorkspaceSkillStatus(workspaceDir, { config });
|
2026-01-21 04:47:35 +00:00
|
|
|
defaultRuntime.log(formatSkillsList(report, {}));
|
2026-01-08 07:23:05 +01:00
|
|
|
} catch (err) {
|
|
|
|
|
defaultRuntime.error(String(err));
|
|
|
|
|
defaultRuntime.exit(1);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|