blob: fbb7700ea9e6721cbe61978b90233b4f65ab0651 [file] [edit]
import 'package:args/command_runner.dart';
import 'package:skills/src/commands/get_skills.dart';
import 'package:skills/src/core/dialog_support.dart';
import 'package:skills/src/core/git_repos.dart';
import '../core/git_runner.dart';
import 'options.dart';
import 'skills_command.dart';
/// Installs skills from package dependencies.
class GetCommand extends SkillsCommand {
@override
final String name = 'get';
@override
final String description = 'Install skills from package dependencies.';
final DialogSupport? _dialogSupport;
final GitRunner? _gitRunner;
GetCommand({DialogSupport? dialogSupport, GitRunner? gitRunner})
: _dialogSupport = dialogSupport,
_gitRunner = gitRunner {
addAgentOption(argParser);
argParser
..addMultiOption(
'package',
abbr: 'p',
help: 'Install/update skills from these packages only.',
)
..addMultiOption('git', help: 'Update skills from these git repos only.')
..addMultiOption(
'skill',
abbr: 's',
help: 'Only install these specific skills.',
)
..addFlag(
'all',
abbr: 'a',
help: 'Install/update all skills from all sources.',
negatable: false,
);
}
GitRunner get _effectiveGitRunner => _gitRunner ?? const GitRunner();
@override
Future<void> run() async {
final argResults = this.argResults!;
final workspace = await resolveWorkspace();
final rootPath = workspace.rootPath;
if (workspace.isWorkspace) {
logger.info(
'Detected workspace with ${workspace.packages.length} packages.',
);
}
final agents = await resolveAgents(
argResults: argResults,
projectPath: rootPath,
dialogSupport: _dialogSupport,
);
final packageUris = argResults
.multiOption('package')
.map((p) => 'package:$p');
final gitUris = argResults
.multiOption('git')
.map((arg) => parseGitRepoArg(arg, usage).cloneUrl);
final sourceUris = {...packageUris, ...gitUris};
final skillNames = argResults.multiOption('skill').toSet();
final allFlag = argResults.flag('all');
if (skillNames.isNotEmpty && allFlag) {
throw UsageException(
'--all and --skill are mutually exclusive arguments, please provide '
'only one',
usage,
);
}
await getSkills(
agents: agents,
logger: logger,
workspace: workspace,
dialogSupport: _dialogSupport,
gitRunner: _effectiveGitRunner,
usage: usage,
sourceUris: sourceUris,
skillNames: skillNames,
allFlag: allFlag,
);
}
}