docs: def install(self, param, author=None, constraints=None, origin=''):
          """Install by url or name"""
          if isinstance(param, SkillEntry):
              skill = param
          else:
              skill = self.find_skill(param, author)
          entry = build_skill_entry(skill.name, origin, skill.is_beta)
          try:
              skill.install(constraints)
              entry['installed'] = time.time()
              entry['installation'] = 'installed'
              entry['status'] = 'active'
              entry['beta'] = skill.is_beta
          except AlreadyInstalled:
              entry = None
              raise
          except MsmException as e:
              entry['installation'] = 'failed'
              entry['status'] = 'error'
              entry['failure_message'] = repr(e)
              raise
          finally:
              # Store the entry in the list
              if entry:
                  self.skills_data['skills'].append(entry)