resolveSkillAvailability function

SkillAvailabilityResolution resolveSkillAvailability({
  1. required List<Skill> skills,
  2. required List<(SkillToggleScope, SkillsConfig)> scopes,
})

Resolves the scope stack (shallow→deep: global, project) against the discovered skills. Default on; the deepest scope mentioning a name wins, matching the tools rule.

Implementation

SkillAvailabilityResolution resolveSkillAvailability({
  required List<Skill> skills,
  required List<(SkillToggleScope, SkillsConfig)> scopes,
}) {
  final intent = <String, bool>{};
  final intentScope = <String, SkillToggleScope>{};
  final known = <String>{for (final skill in skills) skill.name.toLowerCase()};
  final unknown = <String>{};
  for (final (scope, config) in scopes) {
    for (final entry in config.skills.entries) {
      final name = entry.key.toLowerCase();
      if (!known.contains(name)) {
        unknown.add(entry.key);
        continue;
      }
      intent[name] = entry.value;
      intentScope[name] = scope;
    }
  }
  return SkillAvailabilityResolution(
    byName: {
      for (final skill in skills)
        skill.name: ResolvedSkillAvailability(
          enabled: intent[skill.name.toLowerCase()] ?? true,
          scope: intentScope[skill.name.toLowerCase()],
        ),
    },
    unknownIds: unknown,
  );
}