docs: def find_skill(self, param, author=None, skills=None):
          # type: (str, str, List[SkillEntry]) -> SkillEntry
          """Find skill by name or url"""
          if param.startswith('https://') or param.startswith('http://'):
              repo_id = SkillEntry.extract_repo_id(param)
              for skill in self.list():
                  if skill.id == repo_id:
                      return skill
              name = SkillEntry.extract_repo_name(param)
              path = SkillEntry.create_path(self.skills_dir, param)
              return SkillEntry(name, path, param, msm=self)
          else:
              skill_confs = {
                  skill: skill.match(param, author)
                  for skill in skills or self.list()
              }
              best_skill, score = max(skill_confs.items(), key=lambda x: x[1])
              LOG.info('Best match ({}): {} by {}'.format(
                  round(score, 2), best_skill.name, best_skill.author)
              )
              if score < 0.3:
                  raise SkillNotFound(param)
              low_bound = (score * 0.7) if score != 1.0 else 1.0
  
              close_skills = [
                  skill for skill, conf in skill_confs.items()
                  if conf >= low_bound and skill != best_skill
              ]
              if close_skills:
                  raise MultipleSkillMatches([best_skill] + close_skills)
              return best_skill