/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { Box, Text } from 'ink'; import { theme } from '../../semantic-colors.js'; import { type SkillDefinition } from '../../types.js'; interface SkillsListProps { skills: readonly SkillDefinition[]; showDescriptions: boolean; } export const SkillsList: React.FC = ({ skills, showDescriptions, }) => { const enabledSkills = skills .filter((s) => s.disabled !== true) .sort((a, b) => a.name.localeCompare(b.name)); const disabledSkills = skills .filter((s) => s.disabled === true) .sort((a, b) => a.name.localeCompare(b.name)); const renderSkill = (skill: SkillDefinition) => { let sourceLabel = ''; if (skill.source === 'builtin') { sourceLabel = ' [Built-in]'; } else if (skill.source === 'extension') { sourceLabel = ' [Extension]'; } return ( {' '}- {skill.name} {sourceLabel !== '' && ( {sourceLabel} )} {showDescriptions === true && skill.description !== '' && ( {skill.description} )} ); }; return ( {enabledSkills.length > 0 && ( Available Skills: {enabledSkills.map(renderSkill)} )} {enabledSkills.length > 0 && disabledSkills.length > 0 && ( {'-'.repeat(20)} )} {disabledSkills.length > 0 && ( Disabled Skills: {disabledSkills.map(renderSkill)} )} {skills.length === 0 && ( No skills available )} ); };