executeImpl method
Implement the actual tool logic
params are the validated parameters (never null here)
Returns the result data to send in the response
Implementation
@override
Future<dynamic> executeImpl(Map<String, dynamic> params) async {
final categoryFilter = params['category'] as String?;
final searchTerm = params['search'] as String?;
final sourceFilter = params['source'] as String? ?? 'all';
// Load built-in skills from serverpod_boost package
final builtInSkillsPath = await _findBoostSkillsPath();
final builtInSkills = builtInSkillsPath != null
? await _loadBuiltInSkills(Directory(builtInSkillsPath), categoryFilter, searchTerm)
: <SkillInfo>[];
// Load user's custom skills from .ai/skills directory
final userSkillsDir = _findUserSkillsDirectory();
final userSkills = userSkillsDir != null
? await _loadUserSkills(userSkillsDir, categoryFilter, searchTerm)
: <SkillInfo>[];
// Apply source filter
List<SkillInfo> allSkills;
switch (sourceFilter) {
case 'built-in':
allSkills = builtInSkills;
break;
case 'custom':
allSkills = userSkills;
break;
default: // 'all'
// Merge built-in and custom, built-in first
allSkills = [...builtInSkills, ...userSkills];
}
// Group by category
final categories = <String, int>{};
for (final skill in allSkills) {
categories[skill.category] = (categories[skill.category] ?? 0) + 1;
}
return {
'skills': allSkills.map((s) => s.toJson()).toList(),
'count': allSkills.length,
'builtInCount': builtInSkills.length,
'userCount': userSkills.length,
'categories': categories,
if (builtInSkillsPath != null) 'builtInSkillsPath': builtInSkillsPath,
if (userSkillsDir != null) 'userSkillsPath': userSkillsDir.path,
};
}