Developer-Dashboard
view release on metacpan or search on metacpan
lib/Developer/Dashboard/SkillManager.pm view on Meta::CPAN
return {
success => 1,
base_dir => $home_root,
ddfile => $ddfile,
operations => \@operations,
message => 'Installed registered skills from the home root ddfile successfully',
};
}
# registered_skill_sources()
# Reads the home root ddfile and returns the installable skill sources it lists.
# Input: none.
# Output: list of non-comment source strings, or an empty list when absent.
sub registered_skill_sources {
my ($self) = @_;
my $ddfile = File::Spec->catfile( $self->{paths}->home_runtime_root, 'ddfile' );
return () if !-f $ddfile;
return $self->_dependency_file_lines($ddfile);
}
# uninstall($repo_name)
# Removes the effective layered skill instance completely from its active skills
# root.
# Input: skill repo name.
# Output: hash ref with success status.
sub uninstall {
my ( $self, $repo_name ) = @_;
return { error => 'Missing repo name' } if !$repo_name;
my $skill_path = $self->get_skill_path( $repo_name, include_disabled => 1 );
return { error => "Skill '$repo_name' not found" } if !defined $skill_path || !-d $skill_path;
my $real_path = realpath($skill_path) || $skill_path;
my $inside_layer = 0;
for my $skills_root ( $self->{paths}->skills_roots ) {
my $real_root = realpath($skills_root) || $skills_root;
if ( index( $real_path, $real_root . '/' ) == 0 ) {
$inside_layer = 1;
last;
}
}
return { error => "Refusing to uninstall path outside skills root: $skill_path" } if !$inside_layer;
my $error;
remove_tree( $skill_path, { error => \$error } );
if ( @$error ) {
return { error => "Failed to uninstall skill: " . join( ', ', @$error ) };
}
return {
success => 1,
repo_name => $repo_name,
message => "Skill '$repo_name' uninstalled successfully",
};
}
# update($repo_name)
# Pulls latest changes from the skill's Git repository.
# Input: skill repo name.
# Output: hash ref with success status.
sub update {
my ( $self, $repo_name ) = @_;
return { error => 'Missing repo name' } if !$repo_name;
my $skill_path = $self->get_skill_path( $repo_name, include_disabled => 1 );
return { error => "Skill '$repo_name' not found" } if !defined $skill_path || !-d $skill_path;
my ( $stdout, $stderr, $exit ) = capture {
system( 'git', '-C', $skill_path, 'pull', '--ff-only' );
};
if ( $exit != 0 ) {
return { error => "Failed to update skill: $stderr" };
}
$self->_prepare_skill_layout($skill_path);
my $dependency = $self->_install_skill_dependencies($skill_path);
return $dependency if $dependency->{error};
return {
success => 1,
repo_name => $repo_name,
message => "Skill '$repo_name' updated successfully",
metadata => $self->_skill_metadata( $repo_name, $skill_path ),
};
}
# enable($repo_name)
# Re-enables an installed skill by removing its disabled marker.
# Input: skill repo name.
# Output: hash ref with success status, enabled flag, and metadata.
sub enable {
my ( $self, $repo_name ) = @_;
return { error => 'Missing repo name' } if !$repo_name;
my $skill_path = $self->get_skill_path( $repo_name, include_disabled => 1 );
return { error => "Skill '$repo_name' not found" } if !$skill_path;
my $marker = $self->_disabled_marker_path($skill_path);
if ( -f $marker ) {
unlink $marker or return { error => "Unable to remove disabled marker for skill '$repo_name': $!" };
}
return {
success => 1,
repo_name => $repo_name,
enabled => JSON::XS::true(),
message => "Skill '$repo_name' enabled successfully",
metadata => $self->_skill_metadata( $repo_name, $skill_path ),
};
}
# disable($repo_name)
# Disables an installed skill without uninstalling it.
# Input: skill repo name.
# Output: hash ref with success status, enabled flag, and metadata.
sub disable {
my ( $self, $repo_name ) = @_;
return { error => 'Missing repo name' } if !$repo_name;
my $skill_path = $self->get_skill_path( $repo_name, include_disabled => 1 );
( run in 1.419 second using v1.01-cache-2.11-cpan-39bf76dae61 )