validatePluginContents function

Future<List<ValidationResult>> validatePluginContents(
  1. String pluginDir
)

Validate the content files inside a plugin directory.

Implementation

Future<List<ValidationResult>> validatePluginContents(String pluginDir) async {
  final results = <ValidationResult>[];

  final dirs = <PluginFileType, String>{
    PluginFileType.skill: path.join(pluginDir, 'skills'),
    PluginFileType.agent: path.join(pluginDir, 'agents'),
    PluginFileType.command: path.join(pluginDir, 'commands'),
  };

  for (final entry in dirs.entries) {
    final fileType = entry.key;
    final dir = entry.value;
    final files = await _collectMarkdown(dir, fileType == PluginFileType.skill);
    for (final filePath in files) {
      String content;
      try {
        content = await File(filePath).readAsString();
      } on FileSystemException catch (e) {
        if (e.osError?.errorCode == 2) continue; // ENOENT expected for skills
        results.add(
          ValidationResult(
            success: false,
            errors: [
              ValidationError(
                path: 'file',
                message: 'Failed to read: ${e.message}',
              ),
            ],
            warnings: const [],
            filePath: filePath,
            fileType: fileType,
          ),
        );
        continue;
      }
      final r = validateComponentFile(filePath, content, fileType);
      if (r.errors.isNotEmpty || r.warnings.isNotEmpty) {
        results.add(r);
      }
    }
  }

  final hooksResult = await validateHooksJson(
    path.join(pluginDir, 'hooks', 'hooks.json'),
  );
  if (hooksResult.errors.isNotEmpty || hooksResult.warnings.isNotEmpty) {
    results.add(hooksResult);
  }

  return results;
}