mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-16 04:20:44 +00:00
Skills: normalize emoji presentation across outputs
This commit is contained in:
@@ -38,8 +38,12 @@ function formatSkillStatus(skill: SkillStatusEntry): string {
|
||||
return theme.error("✗ missing");
|
||||
}
|
||||
|
||||
function normalizeSkillEmoji(emoji?: string): string {
|
||||
return (emoji ?? "📦").replaceAll("\uFE0E", "\uFE0F");
|
||||
}
|
||||
|
||||
function formatSkillName(skill: SkillStatusEntry): string {
|
||||
const emoji = (skill.emoji ?? "📦").replaceAll("\uFE0E", "\uFE0F");
|
||||
const emoji = normalizeSkillEmoji(skill.emoji);
|
||||
return `${emoji} ${theme.command(skill.name)}`;
|
||||
}
|
||||
|
||||
@@ -154,7 +158,7 @@ export function formatSkillInfo(
|
||||
}
|
||||
|
||||
const lines: string[] = [];
|
||||
const emoji = skill.emoji ?? "📦";
|
||||
const emoji = normalizeSkillEmoji(skill.emoji);
|
||||
const status = skill.eligible
|
||||
? theme.success("✓ Ready")
|
||||
: skill.disabled
|
||||
@@ -282,7 +286,7 @@ export function formatSkillsCheck(report: SkillStatusReport, opts: SkillsCheckOp
|
||||
lines.push("");
|
||||
lines.push(theme.heading("Ready to use:"));
|
||||
for (const skill of eligible) {
|
||||
const emoji = skill.emoji ?? "📦";
|
||||
const emoji = normalizeSkillEmoji(skill.emoji);
|
||||
lines.push(` ${emoji} ${skill.name}`);
|
||||
}
|
||||
}
|
||||
@@ -291,7 +295,7 @@ export function formatSkillsCheck(report: SkillStatusReport, opts: SkillsCheckOp
|
||||
lines.push("");
|
||||
lines.push(theme.heading("Missing requirements:"));
|
||||
for (const skill of missingReqs) {
|
||||
const emoji = skill.emoji ?? "📦";
|
||||
const emoji = normalizeSkillEmoji(skill.emoji);
|
||||
const missing = formatSkillMissingSummary(skill);
|
||||
lines.push(` ${emoji} ${skill.name} ${theme.muted(`(${missing})`)}`);
|
||||
}
|
||||
|
||||
@@ -148,6 +148,18 @@ describe("skills-cli", () => {
|
||||
expect(output).toContain("Any binaries");
|
||||
expect(output).toContain("API_KEY");
|
||||
});
|
||||
|
||||
it("normalizes text-presentation emoji selectors in info output", () => {
|
||||
const report = createMockReport([
|
||||
createMockSkill({
|
||||
name: "info-emoji",
|
||||
emoji: "🎛\uFE0E",
|
||||
}),
|
||||
]);
|
||||
|
||||
const output = formatSkillInfo(report, "info-emoji", {});
|
||||
expect(output).toContain("🎛️");
|
||||
});
|
||||
});
|
||||
|
||||
describe("formatSkillsCheck", () => {
|
||||
@@ -170,6 +182,22 @@ describe("skills-cli", () => {
|
||||
expect(output).toContain("go"); // missing binary
|
||||
expect(output).toContain("npx clawhub");
|
||||
});
|
||||
|
||||
it("normalizes text-presentation emoji selectors in check output", () => {
|
||||
const report = createMockReport([
|
||||
createMockSkill({ name: "ready-emoji", emoji: "🎛\uFE0E", eligible: true }),
|
||||
createMockSkill({
|
||||
name: "missing-emoji",
|
||||
emoji: "🎙\uFE0E",
|
||||
eligible: false,
|
||||
missing: { bins: ["ffmpeg"], anyBins: [], env: [], config: [], os: [] },
|
||||
}),
|
||||
]);
|
||||
|
||||
const output = formatSkillsCheck(report, {});
|
||||
expect(output).toContain("🎛️ ready-emoji");
|
||||
expect(output).toContain("🎙️ missing-emoji");
|
||||
});
|
||||
});
|
||||
|
||||
describe("JSON output", () => {
|
||||
|
||||
Reference in New Issue
Block a user