claude-autopm 2.7.0 ā 2.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +307 -56
- package/autopm/.claude/.env +158 -0
- package/autopm/.claude/settings.local.json +9 -0
- package/bin/autopm.js +11 -2
- package/bin/commands/epic.js +23 -3
- package/bin/commands/plugin.js +395 -0
- package/bin/commands/team.js +184 -10
- package/install/install.js +223 -4
- package/lib/cli/commands/issue.js +360 -20
- package/lib/plugins/PluginManager.js +1328 -0
- package/lib/plugins/PluginManager.old.js +400 -0
- package/lib/providers/AzureDevOpsProvider.js +575 -0
- package/lib/providers/GitHubProvider.js +475 -0
- package/lib/services/EpicService.js +1092 -3
- package/lib/services/IssueService.js +991 -0
- package/package.json +9 -1
- package/scripts/publish-plugins.sh +166 -0
- package/autopm/.claude/agents/cloud/README.md +0 -55
- package/autopm/.claude/agents/cloud/aws-cloud-architect.md +0 -521
- package/autopm/.claude/agents/cloud/azure-cloud-architect.md +0 -436
- package/autopm/.claude/agents/cloud/gcp-cloud-architect.md +0 -385
- package/autopm/.claude/agents/cloud/gcp-cloud-functions-engineer.md +0 -306
- package/autopm/.claude/agents/cloud/gemini-api-expert.md +0 -880
- package/autopm/.claude/agents/cloud/kubernetes-orchestrator.md +0 -566
- package/autopm/.claude/agents/cloud/openai-python-expert.md +0 -1087
- package/autopm/.claude/agents/cloud/terraform-infrastructure-expert.md +0 -454
- package/autopm/.claude/agents/core/agent-manager.md +0 -296
- package/autopm/.claude/agents/core/code-analyzer.md +0 -131
- package/autopm/.claude/agents/core/file-analyzer.md +0 -162
- package/autopm/.claude/agents/core/test-runner.md +0 -200
- package/autopm/.claude/agents/data/airflow-orchestration-expert.md +0 -52
- package/autopm/.claude/agents/data/kedro-pipeline-expert.md +0 -50
- package/autopm/.claude/agents/data/langgraph-workflow-expert.md +0 -520
- package/autopm/.claude/agents/databases/README.md +0 -50
- package/autopm/.claude/agents/databases/bigquery-expert.md +0 -392
- package/autopm/.claude/agents/databases/cosmosdb-expert.md +0 -368
- package/autopm/.claude/agents/databases/mongodb-expert.md +0 -398
- package/autopm/.claude/agents/databases/postgresql-expert.md +0 -321
- package/autopm/.claude/agents/databases/redis-expert.md +0 -52
- package/autopm/.claude/agents/devops/README.md +0 -52
- package/autopm/.claude/agents/devops/azure-devops-specialist.md +0 -308
- package/autopm/.claude/agents/devops/docker-containerization-expert.md +0 -298
- package/autopm/.claude/agents/devops/github-operations-specialist.md +0 -335
- package/autopm/.claude/agents/devops/mcp-context-manager.md +0 -319
- package/autopm/.claude/agents/devops/observability-engineer.md +0 -574
- package/autopm/.claude/agents/devops/ssh-operations-expert.md +0 -1093
- package/autopm/.claude/agents/devops/traefik-proxy-expert.md +0 -444
- package/autopm/.claude/agents/frameworks/README.md +0 -64
- package/autopm/.claude/agents/frameworks/e2e-test-engineer.md +0 -360
- package/autopm/.claude/agents/frameworks/nats-messaging-expert.md +0 -254
- package/autopm/.claude/agents/frameworks/react-frontend-engineer.md +0 -217
- package/autopm/.claude/agents/frameworks/react-ui-expert.md +0 -226
- package/autopm/.claude/agents/frameworks/tailwindcss-expert.md +0 -770
- package/autopm/.claude/agents/frameworks/ux-design-expert.md +0 -244
- package/autopm/.claude/agents/integration/message-queue-engineer.md +0 -794
- package/autopm/.claude/agents/languages/README.md +0 -50
- package/autopm/.claude/agents/languages/bash-scripting-expert.md +0 -541
- package/autopm/.claude/agents/languages/javascript-frontend-engineer.md +0 -197
- package/autopm/.claude/agents/languages/nodejs-backend-engineer.md +0 -226
- package/autopm/.claude/agents/languages/python-backend-engineer.md +0 -214
- package/autopm/.claude/agents/languages/python-backend-expert.md +0 -289
- package/autopm/.claude/agents/testing/frontend-testing-engineer.md +0 -395
- package/autopm/.claude/commands/ai/langgraph-workflow.md +0 -65
- package/autopm/.claude/commands/ai/openai-chat.md +0 -65
- package/autopm/.claude/commands/azure/COMMANDS.md +0 -107
- package/autopm/.claude/commands/azure/COMMAND_MAPPING.md +0 -252
- package/autopm/.claude/commands/azure/INTEGRATION_FIX.md +0 -103
- package/autopm/.claude/commands/azure/README.md +0 -246
- package/autopm/.claude/commands/azure/active-work.md +0 -198
- package/autopm/.claude/commands/azure/aliases.md +0 -143
- package/autopm/.claude/commands/azure/blocked-items.md +0 -287
- package/autopm/.claude/commands/azure/clean.md +0 -93
- package/autopm/.claude/commands/azure/docs-query.md +0 -48
- package/autopm/.claude/commands/azure/feature-decompose.md +0 -380
- package/autopm/.claude/commands/azure/feature-list.md +0 -61
- package/autopm/.claude/commands/azure/feature-new.md +0 -115
- package/autopm/.claude/commands/azure/feature-show.md +0 -205
- package/autopm/.claude/commands/azure/feature-start.md +0 -130
- package/autopm/.claude/commands/azure/fix-integration-example.md +0 -93
- package/autopm/.claude/commands/azure/help.md +0 -150
- package/autopm/.claude/commands/azure/import-us.md +0 -269
- package/autopm/.claude/commands/azure/init.md +0 -211
- package/autopm/.claude/commands/azure/next-task.md +0 -262
- package/autopm/.claude/commands/azure/search.md +0 -160
- package/autopm/.claude/commands/azure/sprint-status.md +0 -235
- package/autopm/.claude/commands/azure/standup.md +0 -260
- package/autopm/.claude/commands/azure/sync-all.md +0 -99
- package/autopm/.claude/commands/azure/task-analyze.md +0 -186
- package/autopm/.claude/commands/azure/task-close.md +0 -329
- package/autopm/.claude/commands/azure/task-edit.md +0 -145
- package/autopm/.claude/commands/azure/task-list.md +0 -263
- package/autopm/.claude/commands/azure/task-new.md +0 -84
- package/autopm/.claude/commands/azure/task-reopen.md +0 -79
- package/autopm/.claude/commands/azure/task-show.md +0 -126
- package/autopm/.claude/commands/azure/task-start.md +0 -301
- package/autopm/.claude/commands/azure/task-status.md +0 -65
- package/autopm/.claude/commands/azure/task-sync.md +0 -67
- package/autopm/.claude/commands/azure/us-edit.md +0 -164
- package/autopm/.claude/commands/azure/us-list.md +0 -202
- package/autopm/.claude/commands/azure/us-new.md +0 -265
- package/autopm/.claude/commands/azure/us-parse.md +0 -253
- package/autopm/.claude/commands/azure/us-show.md +0 -188
- package/autopm/.claude/commands/azure/us-status.md +0 -320
- package/autopm/.claude/commands/azure/validate.md +0 -86
- package/autopm/.claude/commands/azure/work-item-sync.md +0 -47
- package/autopm/.claude/commands/cloud/infra-deploy.md +0 -38
- package/autopm/.claude/commands/github/workflow-create.md +0 -42
- package/autopm/.claude/commands/infrastructure/ssh-security.md +0 -65
- package/autopm/.claude/commands/infrastructure/traefik-setup.md +0 -65
- package/autopm/.claude/commands/kubernetes/deploy.md +0 -37
- package/autopm/.claude/commands/playwright/test-scaffold.md +0 -38
- package/autopm/.claude/commands/pm/blocked.md +0 -28
- package/autopm/.claude/commands/pm/clean.md +0 -119
- package/autopm/.claude/commands/pm/context-create.md +0 -136
- package/autopm/.claude/commands/pm/context-prime.md +0 -170
- package/autopm/.claude/commands/pm/context-update.md +0 -292
- package/autopm/.claude/commands/pm/context.md +0 -28
- package/autopm/.claude/commands/pm/epic-close.md +0 -86
- package/autopm/.claude/commands/pm/epic-decompose.md +0 -370
- package/autopm/.claude/commands/pm/epic-edit.md +0 -83
- package/autopm/.claude/commands/pm/epic-list.md +0 -30
- package/autopm/.claude/commands/pm/epic-merge.md +0 -222
- package/autopm/.claude/commands/pm/epic-oneshot.md +0 -119
- package/autopm/.claude/commands/pm/epic-refresh.md +0 -119
- package/autopm/.claude/commands/pm/epic-show.md +0 -28
- package/autopm/.claude/commands/pm/epic-split.md +0 -120
- package/autopm/.claude/commands/pm/epic-start.md +0 -195
- package/autopm/.claude/commands/pm/epic-status.md +0 -28
- package/autopm/.claude/commands/pm/epic-sync-modular.md +0 -338
- package/autopm/.claude/commands/pm/epic-sync-original.md +0 -473
- package/autopm/.claude/commands/pm/epic-sync.md +0 -486
- package/autopm/.claude/commands/pm/help.md +0 -28
- package/autopm/.claude/commands/pm/import.md +0 -115
- package/autopm/.claude/commands/pm/in-progress.md +0 -28
- package/autopm/.claude/commands/pm/init.md +0 -28
- package/autopm/.claude/commands/pm/issue-analyze.md +0 -202
- package/autopm/.claude/commands/pm/issue-close.md +0 -119
- package/autopm/.claude/commands/pm/issue-edit.md +0 -93
- package/autopm/.claude/commands/pm/issue-reopen.md +0 -87
- package/autopm/.claude/commands/pm/issue-show.md +0 -41
- package/autopm/.claude/commands/pm/issue-start.md +0 -234
- package/autopm/.claude/commands/pm/issue-status.md +0 -95
- package/autopm/.claude/commands/pm/issue-sync.md +0 -411
- package/autopm/.claude/commands/pm/next.md +0 -28
- package/autopm/.claude/commands/pm/prd-edit.md +0 -82
- package/autopm/.claude/commands/pm/prd-list.md +0 -28
- package/autopm/.claude/commands/pm/prd-new.md +0 -55
- package/autopm/.claude/commands/pm/prd-parse.md +0 -42
- package/autopm/.claude/commands/pm/prd-status.md +0 -28
- package/autopm/.claude/commands/pm/search.md +0 -28
- package/autopm/.claude/commands/pm/standup.md +0 -28
- package/autopm/.claude/commands/pm/status.md +0 -28
- package/autopm/.claude/commands/pm/sync.md +0 -99
- package/autopm/.claude/commands/pm/test-reference-update.md +0 -151
- package/autopm/.claude/commands/pm/validate.md +0 -28
- package/autopm/.claude/commands/pm/what-next.md +0 -28
- package/autopm/.claude/commands/python/api-scaffold.md +0 -50
- package/autopm/.claude/commands/python/docs-query.md +0 -48
- package/autopm/.claude/commands/react/app-scaffold.md +0 -50
- package/autopm/.claude/commands/testing/prime.md +0 -314
- package/autopm/.claude/commands/testing/run.md +0 -125
- package/autopm/.claude/commands/ui/bootstrap-scaffold.md +0 -65
- package/autopm/.claude/commands/ui/tailwind-system.md +0 -64
- package/autopm/.claude/rules/ai-integration-patterns.md +0 -219
- package/autopm/.claude/rules/ci-cd-kubernetes-strategy.md +0 -25
- package/autopm/.claude/rules/database-management-strategy.md +0 -17
- package/autopm/.claude/rules/database-pipeline.md +0 -94
- package/autopm/.claude/rules/devops-troubleshooting-playbook.md +0 -450
- package/autopm/.claude/rules/docker-first-development.md +0 -404
- package/autopm/.claude/rules/infrastructure-pipeline.md +0 -128
- package/autopm/.claude/rules/performance-guidelines.md +0 -403
- package/autopm/.claude/rules/ui-development-standards.md +0 -281
- package/autopm/.claude/rules/ui-framework-rules.md +0 -151
- package/autopm/.claude/rules/ux-design-rules.md +0 -209
- package/autopm/.claude/rules/visual-testing.md +0 -223
- package/autopm/.claude/scripts/azure/README.md +0 -192
- package/autopm/.claude/scripts/azure/active-work.js +0 -524
- package/autopm/.claude/scripts/azure/active-work.sh +0 -20
- package/autopm/.claude/scripts/azure/blocked.js +0 -520
- package/autopm/.claude/scripts/azure/blocked.sh +0 -20
- package/autopm/.claude/scripts/azure/daily.js +0 -533
- package/autopm/.claude/scripts/azure/daily.sh +0 -20
- package/autopm/.claude/scripts/azure/dashboard.js +0 -970
- package/autopm/.claude/scripts/azure/dashboard.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-list.js +0 -254
- package/autopm/.claude/scripts/azure/feature-list.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-show.js +0 -7
- package/autopm/.claude/scripts/azure/feature-show.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-status.js +0 -604
- package/autopm/.claude/scripts/azure/feature-status.sh +0 -20
- package/autopm/.claude/scripts/azure/help.js +0 -342
- package/autopm/.claude/scripts/azure/help.sh +0 -20
- package/autopm/.claude/scripts/azure/next-task.js +0 -508
- package/autopm/.claude/scripts/azure/next-task.sh +0 -20
- package/autopm/.claude/scripts/azure/search.js +0 -469
- package/autopm/.claude/scripts/azure/search.sh +0 -20
- package/autopm/.claude/scripts/azure/setup.js +0 -745
- package/autopm/.claude/scripts/azure/setup.sh +0 -20
- package/autopm/.claude/scripts/azure/sprint-report.js +0 -1012
- package/autopm/.claude/scripts/azure/sprint-report.sh +0 -20
- package/autopm/.claude/scripts/azure/sync.js +0 -563
- package/autopm/.claude/scripts/azure/sync.sh +0 -20
- package/autopm/.claude/scripts/azure/us-list.js +0 -210
- package/autopm/.claude/scripts/azure/us-list.sh +0 -20
- package/autopm/.claude/scripts/azure/us-status.js +0 -238
- package/autopm/.claude/scripts/azure/us-status.sh +0 -20
- package/autopm/.claude/scripts/azure/validate.js +0 -626
- package/autopm/.claude/scripts/azure/validate.sh +0 -20
- package/autopm/.claude/scripts/azure/wrapper-template.sh +0 -20
- package/autopm/.claude/scripts/github/dependency-tracker.js +0 -554
- package/autopm/.claude/scripts/github/dependency-validator.js +0 -545
- package/autopm/.claude/scripts/github/dependency-visualizer.js +0 -477
- package/autopm/.claude/scripts/pm/analytics.js +0 -425
- package/autopm/.claude/scripts/pm/blocked.js +0 -164
- package/autopm/.claude/scripts/pm/blocked.sh +0 -78
- package/autopm/.claude/scripts/pm/clean.js +0 -464
- package/autopm/.claude/scripts/pm/context-create.js +0 -216
- package/autopm/.claude/scripts/pm/context-prime.js +0 -335
- package/autopm/.claude/scripts/pm/context-update.js +0 -344
- package/autopm/.claude/scripts/pm/context.js +0 -338
- package/autopm/.claude/scripts/pm/epic-close.js +0 -347
- package/autopm/.claude/scripts/pm/epic-edit.js +0 -382
- package/autopm/.claude/scripts/pm/epic-list.js +0 -273
- package/autopm/.claude/scripts/pm/epic-list.sh +0 -109
- package/autopm/.claude/scripts/pm/epic-show.js +0 -291
- package/autopm/.claude/scripts/pm/epic-show.sh +0 -105
- package/autopm/.claude/scripts/pm/epic-split.js +0 -522
- package/autopm/.claude/scripts/pm/epic-start/epic-start.js +0 -183
- package/autopm/.claude/scripts/pm/epic-start/epic-start.sh +0 -94
- package/autopm/.claude/scripts/pm/epic-status.js +0 -291
- package/autopm/.claude/scripts/pm/epic-status.sh +0 -104
- package/autopm/.claude/scripts/pm/epic-sync/README.md +0 -208
- package/autopm/.claude/scripts/pm/epic-sync/create-epic-issue.sh +0 -77
- package/autopm/.claude/scripts/pm/epic-sync/create-task-issues.sh +0 -86
- package/autopm/.claude/scripts/pm/epic-sync/update-epic-file.sh +0 -79
- package/autopm/.claude/scripts/pm/epic-sync/update-references.sh +0 -89
- package/autopm/.claude/scripts/pm/epic-sync.sh +0 -137
- package/autopm/.claude/scripts/pm/help.js +0 -92
- package/autopm/.claude/scripts/pm/help.sh +0 -90
- package/autopm/.claude/scripts/pm/in-progress.js +0 -178
- package/autopm/.claude/scripts/pm/in-progress.sh +0 -93
- package/autopm/.claude/scripts/pm/init.js +0 -321
- package/autopm/.claude/scripts/pm/init.sh +0 -178
- package/autopm/.claude/scripts/pm/issue-close.js +0 -232
- package/autopm/.claude/scripts/pm/issue-edit.js +0 -310
- package/autopm/.claude/scripts/pm/issue-show.js +0 -272
- package/autopm/.claude/scripts/pm/issue-start.js +0 -181
- package/autopm/.claude/scripts/pm/issue-sync/format-comment.sh +0 -468
- package/autopm/.claude/scripts/pm/issue-sync/gather-updates.sh +0 -460
- package/autopm/.claude/scripts/pm/issue-sync/post-comment.sh +0 -330
- package/autopm/.claude/scripts/pm/issue-sync/preflight-validation.sh +0 -348
- package/autopm/.claude/scripts/pm/issue-sync/update-frontmatter.sh +0 -387
- package/autopm/.claude/scripts/pm/lib/README.md +0 -85
- package/autopm/.claude/scripts/pm/lib/epic-discovery.js +0 -119
- package/autopm/.claude/scripts/pm/lib/logger.js +0 -78
- package/autopm/.claude/scripts/pm/next.js +0 -189
- package/autopm/.claude/scripts/pm/next.sh +0 -72
- package/autopm/.claude/scripts/pm/optimize.js +0 -407
- package/autopm/.claude/scripts/pm/pr-create.js +0 -337
- package/autopm/.claude/scripts/pm/pr-list.js +0 -257
- package/autopm/.claude/scripts/pm/prd-list.js +0 -242
- package/autopm/.claude/scripts/pm/prd-list.sh +0 -103
- package/autopm/.claude/scripts/pm/prd-new.js +0 -684
- package/autopm/.claude/scripts/pm/prd-parse.js +0 -547
- package/autopm/.claude/scripts/pm/prd-status.js +0 -152
- package/autopm/.claude/scripts/pm/prd-status.sh +0 -63
- package/autopm/.claude/scripts/pm/release.js +0 -460
- package/autopm/.claude/scripts/pm/search.js +0 -192
- package/autopm/.claude/scripts/pm/search.sh +0 -89
- package/autopm/.claude/scripts/pm/standup.js +0 -362
- package/autopm/.claude/scripts/pm/standup.sh +0 -95
- package/autopm/.claude/scripts/pm/status.js +0 -148
- package/autopm/.claude/scripts/pm/status.sh +0 -59
- package/autopm/.claude/scripts/pm/sync-batch.js +0 -337
- package/autopm/.claude/scripts/pm/sync.js +0 -343
- package/autopm/.claude/scripts/pm/template-list.js +0 -141
- package/autopm/.claude/scripts/pm/template-new.js +0 -366
- package/autopm/.claude/scripts/pm/validate.js +0 -274
- package/autopm/.claude/scripts/pm/validate.sh +0 -106
- package/autopm/.claude/scripts/pm/what-next.js +0 -660
- package/bin/node/azure-feature-show.js +0 -7
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Command for autopm CLI
|
|
3
|
+
* Manages ClaudeAutoPM plugins
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* - list: List installed plugins
|
|
7
|
+
* - search: Search for plugins by keyword
|
|
8
|
+
* - install: Install a plugin
|
|
9
|
+
* - uninstall: Remove a plugin
|
|
10
|
+
* - info: Show plugin details
|
|
11
|
+
* - enable: Enable a plugin
|
|
12
|
+
* - disable: Disable a plugin
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const PluginManager = require('../../lib/plugins/PluginManager');
|
|
16
|
+
const chalk = require('chalk');
|
|
17
|
+
|
|
18
|
+
module.exports = {
|
|
19
|
+
command: 'plugin <action> [name]',
|
|
20
|
+
describe: 'Manage ClaudeAutoPM plugins',
|
|
21
|
+
|
|
22
|
+
builder: (yargs) => {
|
|
23
|
+
return yargs
|
|
24
|
+
.positional('action', {
|
|
25
|
+
describe: 'Plugin action to perform',
|
|
26
|
+
type: 'string',
|
|
27
|
+
choices: ['list', 'search', 'install', 'uninstall', 'info', 'enable', 'disable']
|
|
28
|
+
})
|
|
29
|
+
.positional('name', {
|
|
30
|
+
describe: 'Plugin name (without @claudeautopm/plugin- prefix)',
|
|
31
|
+
type: 'string'
|
|
32
|
+
})
|
|
33
|
+
.option('verbose', {
|
|
34
|
+
alias: 'v',
|
|
35
|
+
describe: 'Show detailed output',
|
|
36
|
+
type: 'boolean',
|
|
37
|
+
default: false
|
|
38
|
+
})
|
|
39
|
+
.example('autopm plugin list', 'List installed plugins')
|
|
40
|
+
.example('autopm plugin search cloud', 'Search for cloud-related plugins')
|
|
41
|
+
.example('autopm plugin install cloud', 'Install cloud plugin')
|
|
42
|
+
.example('autopm plugin uninstall cloud', 'Remove cloud plugin')
|
|
43
|
+
.example('autopm plugin info cloud', 'Show cloud plugin details')
|
|
44
|
+
.epilogue(`
|
|
45
|
+
š¦ Plugin Management
|
|
46
|
+
|
|
47
|
+
Plugins extend ClaudeAutoPM with specialized agents for different technologies.
|
|
48
|
+
|
|
49
|
+
Available Official Plugins:
|
|
50
|
+
⢠cloud - AWS, Azure, GCP cloud architecture (9 agents)
|
|
51
|
+
⢠devops - Docker, K8s, CI/CD, monitoring (8 agents)
|
|
52
|
+
⢠frameworks - React, Next.js, Vue, Django (7 agents)
|
|
53
|
+
⢠databases - PostgreSQL, MongoDB, Redis (6 agents)
|
|
54
|
+
⢠languages - Node.js, Python, TypeScript (6 agents)
|
|
55
|
+
⢠data - Data engineering, ML, ETL (3 agents)
|
|
56
|
+
⢠decisions - Architecture advisors (3 agents)
|
|
57
|
+
|
|
58
|
+
Installation:
|
|
59
|
+
1. Install plugin package: npm install -g @claudeautopm/plugin-<name>
|
|
60
|
+
2. Install plugin agents: autopm plugin install <name>
|
|
61
|
+
|
|
62
|
+
Usage:
|
|
63
|
+
After installation, use 'autopm team load' to include plugin agents
|
|
64
|
+
or manually add @include directives to CLAUDE.md
|
|
65
|
+
`);
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
handler: async (argv) => {
|
|
69
|
+
const manager = new PluginManager();
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
switch (argv.action) {
|
|
73
|
+
case 'list':
|
|
74
|
+
await handleList(manager, argv);
|
|
75
|
+
break;
|
|
76
|
+
case 'search':
|
|
77
|
+
if (!argv.name) {
|
|
78
|
+
console.error(chalk.red('Error: Search keyword required'));
|
|
79
|
+
console.log('Usage: autopm plugin search <keyword>');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
await handleSearch(manager, argv.name, argv);
|
|
83
|
+
break;
|
|
84
|
+
case 'install':
|
|
85
|
+
if (!argv.name) {
|
|
86
|
+
console.error(chalk.red('Error: Plugin name required'));
|
|
87
|
+
console.log('Usage: autopm plugin install <name>');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
await handleInstall(manager, argv.name, argv);
|
|
91
|
+
break;
|
|
92
|
+
case 'uninstall':
|
|
93
|
+
if (!argv.name) {
|
|
94
|
+
console.error(chalk.red('Error: Plugin name required'));
|
|
95
|
+
console.log('Usage: autopm plugin uninstall <name>');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
await handleUninstall(manager, argv.name, argv);
|
|
99
|
+
break;
|
|
100
|
+
case 'info':
|
|
101
|
+
if (!argv.name) {
|
|
102
|
+
console.error(chalk.red('Error: Plugin name required'));
|
|
103
|
+
console.log('Usage: autopm plugin info <name>');
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
await handleInfo(manager, argv.name, argv);
|
|
107
|
+
break;
|
|
108
|
+
case 'enable':
|
|
109
|
+
if (!argv.name) {
|
|
110
|
+
console.error(chalk.red('Error: Plugin name required'));
|
|
111
|
+
console.log('Usage: autopm plugin enable <name>');
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
await handleEnable(manager, argv.name, argv);
|
|
115
|
+
break;
|
|
116
|
+
case 'disable':
|
|
117
|
+
if (!argv.name) {
|
|
118
|
+
console.error(chalk.red('Error: Plugin name required'));
|
|
119
|
+
console.log('Usage: autopm plugin disable <name>');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
await handleDisable(manager, argv.name, argv);
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
console.error(chalk.red(`Unknown action: ${argv.action}`));
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
130
|
+
if (argv.verbose || argv.debug) {
|
|
131
|
+
console.error(error.stack);
|
|
132
|
+
}
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Handle 'list' command
|
|
140
|
+
*/
|
|
141
|
+
async function handleList(manager, argv) {
|
|
142
|
+
const installed = manager.getInstalledPlugins();
|
|
143
|
+
const enabled = manager.getEnabledPlugins();
|
|
144
|
+
|
|
145
|
+
console.log(chalk.bold('\nš¦ Installed Plugins\n'));
|
|
146
|
+
|
|
147
|
+
if (installed.length === 0) {
|
|
148
|
+
console.log('No plugins installed.\n');
|
|
149
|
+
console.log('š” Tip: Run ' + chalk.cyan('autopm plugin search <keyword>') + ' to find plugins');
|
|
150
|
+
console.log(' Or install directly: ' + chalk.cyan('autopm plugin install <name>'));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
for (const pluginName of installed) {
|
|
155
|
+
try {
|
|
156
|
+
const metadata = await manager.loadPluginMetadata(pluginName);
|
|
157
|
+
const isEnabled = enabled.includes(pluginName);
|
|
158
|
+
const statusIcon = isEnabled ? chalk.green('ā') : chalk.gray('ā');
|
|
159
|
+
const statusText = isEnabled ? chalk.green('enabled') : chalk.gray('disabled');
|
|
160
|
+
|
|
161
|
+
console.log(`${statusIcon} ${chalk.bold(metadata.displayName)} ${chalk.gray(`(@claudeautopm/${pluginName})`)}`);
|
|
162
|
+
console.log(` ${metadata.description}`);
|
|
163
|
+
console.log(` ${chalk.gray(`Category: ${metadata.category} | Agents: ${metadata.agents.length} | Status: ${statusText}`)}`);
|
|
164
|
+
|
|
165
|
+
if (argv.verbose) {
|
|
166
|
+
console.log(` ${chalk.gray(`Version: ${metadata.version}`)}`);
|
|
167
|
+
console.log(` ${chalk.gray(`Agents: ${metadata.agents.map(a => a.name).join(', ')}`)}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
console.log('');
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.log(`${chalk.red('ā')} ${chalk.bold(pluginName)} ${chalk.red('(error loading)')}`);
|
|
173
|
+
if (argv.verbose) {
|
|
174
|
+
console.log(` ${chalk.red(error.message)}`);
|
|
175
|
+
}
|
|
176
|
+
console.log('');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
console.log(chalk.gray(`Total: ${installed.length} installed, ${enabled.length} enabled`));
|
|
181
|
+
console.log('');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Handle 'search' command
|
|
186
|
+
*/
|
|
187
|
+
async function handleSearch(manager, keyword, argv) {
|
|
188
|
+
console.log(chalk.bold(`\nš Searching for: "${keyword}"\n`));
|
|
189
|
+
|
|
190
|
+
const results = await manager.searchPlugins(keyword);
|
|
191
|
+
|
|
192
|
+
if (results.length === 0) {
|
|
193
|
+
console.log('No plugins found matching your search.\n');
|
|
194
|
+
console.log('š” Tip: Try different keywords or check available plugins:');
|
|
195
|
+
console.log(' ' + chalk.cyan('autopm plugin list --all'));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
for (const plugin of results) {
|
|
200
|
+
const isInstalled = manager.isInstalled(plugin.pluginName);
|
|
201
|
+
const installIcon = isInstalled ? chalk.green('ā installed') : chalk.gray('not installed');
|
|
202
|
+
|
|
203
|
+
console.log(`${chalk.bold(plugin.displayName)} ${chalk.gray(`(@claudeautopm/${plugin.pluginName})`)}`);
|
|
204
|
+
console.log(` ${plugin.description}`);
|
|
205
|
+
console.log(` ${chalk.gray(`Category: ${plugin.category} | Agents: ${plugin.agents.length} | ${installIcon}`)}`);
|
|
206
|
+
|
|
207
|
+
if (argv.verbose && plugin.agents.length > 0) {
|
|
208
|
+
console.log(` ${chalk.gray(`Agents: ${plugin.agents.map(a => a.name).join(', ')}`)}`);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
console.log('');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
console.log(chalk.gray(`Found ${results.length} plugin(s)`));
|
|
215
|
+
console.log('');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Handle 'install' command
|
|
220
|
+
*/
|
|
221
|
+
async function handleInstall(manager, pluginName, argv) {
|
|
222
|
+
const fullPluginName = pluginName.startsWith('plugin-') ? pluginName : `plugin-${pluginName}`;
|
|
223
|
+
|
|
224
|
+
console.log(chalk.bold(`\nš¦ Installing plugin: ${pluginName}\n`));
|
|
225
|
+
|
|
226
|
+
// Check if already installed
|
|
227
|
+
if (manager.isInstalled(fullPluginName)) {
|
|
228
|
+
console.log(chalk.yellow(`ā Plugin ${pluginName} is already installed`));
|
|
229
|
+
console.log('');
|
|
230
|
+
console.log('To reinstall, first uninstall:');
|
|
231
|
+
console.log(` ${chalk.cyan(`autopm plugin uninstall ${pluginName}`)}`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Check if npm package exists
|
|
236
|
+
const { execSync } = require('child_process');
|
|
237
|
+
let packageInstalled = false;
|
|
238
|
+
|
|
239
|
+
try {
|
|
240
|
+
execSync(`npm list -g @claudeautopm/${fullPluginName}`, { stdio: 'ignore' });
|
|
241
|
+
packageInstalled = true;
|
|
242
|
+
} catch {
|
|
243
|
+
// Package not installed
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Install npm package if needed
|
|
247
|
+
if (!packageInstalled) {
|
|
248
|
+
console.log(chalk.gray('Installing npm package...'));
|
|
249
|
+
try {
|
|
250
|
+
execSync(`npm install -g @claudeautopm/${fullPluginName}`, { stdio: 'inherit' });
|
|
251
|
+
console.log('');
|
|
252
|
+
} catch (error) {
|
|
253
|
+
console.error(chalk.red(`\nā Failed to install npm package: @claudeautopm/${fullPluginName}`));
|
|
254
|
+
console.error(chalk.gray('Make sure the package exists on npm'));
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
console.log(chalk.gray(`npm package already installed: @claudeautopm/${fullPluginName}`));
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Install plugin agents
|
|
262
|
+
console.log(chalk.gray('Installing plugin agents...'));
|
|
263
|
+
const result = await manager.installPlugin(fullPluginName);
|
|
264
|
+
|
|
265
|
+
console.log(chalk.green(`\nā Plugin installed successfully!`));
|
|
266
|
+
console.log('');
|
|
267
|
+
console.log(` ${chalk.bold(result.displayName)}`);
|
|
268
|
+
console.log(` Category: ${result.category}`);
|
|
269
|
+
console.log(` Agents installed: ${result.agentsInstalled}`);
|
|
270
|
+
|
|
271
|
+
if (argv.verbose) {
|
|
272
|
+
console.log('');
|
|
273
|
+
console.log(' Installed agents:');
|
|
274
|
+
for (const agent of result.agents) {
|
|
275
|
+
console.log(` ⢠${agent.name}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
console.log('');
|
|
280
|
+
console.log(chalk.bold('Next steps:'));
|
|
281
|
+
console.log(` 1. Load agents: ${chalk.cyan('autopm team load <team>')}`);
|
|
282
|
+
console.log(` 2. Or manually add to CLAUDE.md:`);
|
|
283
|
+
console.log(` ${chalk.gray(`- @include .claude/agents/${result.category}/<agent>.md`)}`);
|
|
284
|
+
console.log('');
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Handle 'uninstall' command
|
|
289
|
+
*/
|
|
290
|
+
async function handleUninstall(manager, pluginName, argv) {
|
|
291
|
+
const fullPluginName = pluginName.startsWith('plugin-') ? pluginName : `plugin-${pluginName}`;
|
|
292
|
+
|
|
293
|
+
console.log(chalk.bold(`\nš¦ Uninstalling plugin: ${pluginName}\n`));
|
|
294
|
+
|
|
295
|
+
// Check if installed
|
|
296
|
+
if (!manager.isInstalled(fullPluginName)) {
|
|
297
|
+
console.log(chalk.yellow(`ā Plugin ${pluginName} is not installed`));
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Uninstall plugin agents
|
|
302
|
+
const result = await manager.uninstallPlugin(fullPluginName);
|
|
303
|
+
|
|
304
|
+
console.log(chalk.green(`ā Plugin uninstalled successfully!`));
|
|
305
|
+
console.log('');
|
|
306
|
+
console.log(` Agents removed: ${result.agentsRemoved}`);
|
|
307
|
+
|
|
308
|
+
if (argv.verbose && result.agents.length > 0) {
|
|
309
|
+
console.log('');
|
|
310
|
+
console.log(' Removed agents:');
|
|
311
|
+
for (const agentName of result.agents) {
|
|
312
|
+
console.log(` ⢠${agentName}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
console.log('');
|
|
317
|
+
console.log(chalk.gray('Note: npm package not removed. To remove completely:'));
|
|
318
|
+
console.log(` ${chalk.cyan(`npm uninstall -g @claudeautopm/${fullPluginName}`)}`);
|
|
319
|
+
console.log('');
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Handle 'info' command
|
|
324
|
+
*/
|
|
325
|
+
async function handleInfo(manager, pluginName, argv) {
|
|
326
|
+
const fullPluginName = pluginName.startsWith('plugin-') ? pluginName : `plugin-${pluginName}`;
|
|
327
|
+
|
|
328
|
+
try {
|
|
329
|
+
const info = await manager.getPluginInfo(fullPluginName);
|
|
330
|
+
|
|
331
|
+
console.log(chalk.bold(`\nš¦ ${info.displayName}\n`));
|
|
332
|
+
console.log(`${info.description}\n`);
|
|
333
|
+
|
|
334
|
+
console.log(chalk.bold('Details:'));
|
|
335
|
+
console.log(` Package: ${chalk.cyan(`@claudeautopm/${fullPluginName}`)}`);
|
|
336
|
+
console.log(` Version: ${info.version}`);
|
|
337
|
+
console.log(` Category: ${info.category}`);
|
|
338
|
+
console.log(` Status: ${info.installed ? chalk.green('installed') : chalk.gray('not installed')}`);
|
|
339
|
+
if (info.installed) {
|
|
340
|
+
console.log(` Enabled: ${info.enabled ? chalk.green('yes') : chalk.gray('no')}`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
console.log('');
|
|
344
|
+
console.log(chalk.bold(`Agents (${info.agents.length}):`));
|
|
345
|
+
for (const agent of info.agents) {
|
|
346
|
+
console.log(` ⢠${chalk.bold(agent.name)}`);
|
|
347
|
+
console.log(` ${chalk.gray(agent.description)}`);
|
|
348
|
+
if (argv.verbose) {
|
|
349
|
+
console.log(` ${chalk.gray(`File: ${agent.file}`)}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (info.keywords && info.keywords.length > 0) {
|
|
354
|
+
console.log('');
|
|
355
|
+
console.log(`Keywords: ${chalk.gray(info.keywords.join(', '))}`);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
console.log('');
|
|
359
|
+
} catch (error) {
|
|
360
|
+
console.error(chalk.red(`\nā Plugin not found: ${pluginName}`));
|
|
361
|
+
console.error(chalk.gray(`Package @claudeautopm/${fullPluginName} not installed`));
|
|
362
|
+
console.log('');
|
|
363
|
+
console.log('To install:');
|
|
364
|
+
console.log(` ${chalk.cyan(`autopm plugin install ${pluginName}`)}`);
|
|
365
|
+
console.log('');
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Handle 'enable' command
|
|
372
|
+
*/
|
|
373
|
+
async function handleEnable(manager, pluginName, argv) {
|
|
374
|
+
const fullPluginName = pluginName.startsWith('plugin-') ? pluginName : `plugin-${pluginName}`;
|
|
375
|
+
|
|
376
|
+
try {
|
|
377
|
+
manager.enablePlugin(fullPluginName);
|
|
378
|
+
console.log(chalk.green(`\nā Plugin enabled: ${pluginName}\n`));
|
|
379
|
+
} catch (error) {
|
|
380
|
+
console.error(chalk.red(`\nā ${error.message}\n`));
|
|
381
|
+
process.exit(1);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Handle 'disable' command
|
|
387
|
+
*/
|
|
388
|
+
async function handleDisable(manager, pluginName, argv) {
|
|
389
|
+
const fullPluginName = pluginName.startsWith('plugin-') ? pluginName : `plugin-${pluginName}`;
|
|
390
|
+
|
|
391
|
+
manager.disablePlugin(fullPluginName);
|
|
392
|
+
console.log(chalk.yellow(`\nā Plugin disabled: ${pluginName}\n`));
|
|
393
|
+
console.log(chalk.gray('Note: Agents remain in .claude/agents/ but plugin is marked as disabled'));
|
|
394
|
+
console.log('');
|
|
395
|
+
}
|
package/bin/commands/team.js
CHANGED
|
@@ -202,7 +202,7 @@ See: https://github.com/rafeekpro/ClaudeAutoPM
|
|
|
202
202
|
|
|
203
203
|
// Command handlers
|
|
204
204
|
const commands = {
|
|
205
|
-
list: (argv) => {
|
|
205
|
+
list: async (argv) => {
|
|
206
206
|
try {
|
|
207
207
|
if (!fs.existsSync(teamsConfigPath)) {
|
|
208
208
|
console.error('ā Error: teams.json not found');
|
|
@@ -213,17 +213,100 @@ const commands = {
|
|
|
213
213
|
|
|
214
214
|
console.log('\nš Available Teams:\n');
|
|
215
215
|
|
|
216
|
-
|
|
217
|
-
|
|
216
|
+
// Initialize PluginManager if verbose mode
|
|
217
|
+
let pluginManager = null;
|
|
218
|
+
if (argv.verbose) {
|
|
219
|
+
const PluginManager = require('../../lib/plugins/PluginManager');
|
|
220
|
+
pluginManager = new PluginManager();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
for (const [name, config] of Object.entries(teamsConfig)) {
|
|
224
|
+
// Resolve total agents (including inherited)
|
|
225
|
+
let totalAgents = 0;
|
|
226
|
+
let installedAgents = 0;
|
|
227
|
+
let missingAgents = [];
|
|
228
|
+
|
|
229
|
+
try {
|
|
230
|
+
const agents = resolveAgents(name, teamsConfig);
|
|
231
|
+
totalAgents = agents.length;
|
|
232
|
+
|
|
233
|
+
// Check installation status
|
|
234
|
+
const missing = validateAgentFiles(agents, projectRoot);
|
|
235
|
+
installedAgents = totalAgents - missing.length;
|
|
236
|
+
missingAgents = missing;
|
|
237
|
+
} catch (error) {
|
|
238
|
+
// Ignore errors in agent resolution for listing
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Status indicator
|
|
242
|
+
const statusIcon = missingAgents.length === 0 ? 'ā
' : 'ā ļø';
|
|
243
|
+
const statusText = missingAgents.length === 0
|
|
244
|
+
? 'ready'
|
|
245
|
+
: `${missingAgents.length} missing`;
|
|
246
|
+
|
|
247
|
+
console.log(` ${statusIcon} ${name}:`);
|
|
218
248
|
console.log(` ${config.description || 'No description'}`);
|
|
249
|
+
|
|
219
250
|
if (config.inherits && config.inherits.length > 0) {
|
|
220
251
|
console.log(` ā³ Inherits from: ${config.inherits.join(', ')}`);
|
|
221
252
|
}
|
|
222
|
-
|
|
253
|
+
|
|
254
|
+
console.log(` Agents: ${totalAgents} total (${installedAgents} installed, ${missingAgents.length} missing)`);
|
|
255
|
+
|
|
256
|
+
// Verbose mode: show which agents are missing
|
|
257
|
+
if (argv.verbose && missingAgents.length > 0) {
|
|
258
|
+
console.log(` Missing agents:`);
|
|
259
|
+
|
|
260
|
+
if (pluginManager) {
|
|
261
|
+
const pluginMapping = await pluginManager.findPluginsForAgents(missingAgents);
|
|
262
|
+
|
|
263
|
+
// Group by plugin
|
|
264
|
+
const byPlugin = new Map();
|
|
265
|
+
for (const [agentName, pluginInfo] of pluginMapping.found.entries()) {
|
|
266
|
+
if (!pluginInfo.installed) {
|
|
267
|
+
if (!byPlugin.has(pluginInfo.pluginName)) {
|
|
268
|
+
byPlugin.set(pluginInfo.pluginName, []);
|
|
269
|
+
}
|
|
270
|
+
byPlugin.get(pluginInfo.pluginName).push(agentName);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Show plugins needed
|
|
275
|
+
if (byPlugin.size > 0) {
|
|
276
|
+
console.log(` Install plugins:`);
|
|
277
|
+
for (const [pluginName, agents] of byPlugin.entries()) {
|
|
278
|
+
console.log(` ⢠${pluginName} (${agents.length} agents)`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Show truly missing
|
|
283
|
+
if (pluginMapping.missing.length > 0) {
|
|
284
|
+
console.log(` Custom/core agents: ${pluginMapping.missing.length}`);
|
|
285
|
+
}
|
|
286
|
+
} else {
|
|
287
|
+
// Non-verbose: just count
|
|
288
|
+
missingAgents.slice(0, 3).forEach(agent => {
|
|
289
|
+
console.log(` ⢠${agent}`);
|
|
290
|
+
});
|
|
291
|
+
if (missingAgents.length > 3) {
|
|
292
|
+
console.log(` ... and ${missingAgents.length - 3} more`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
223
297
|
console.log();
|
|
224
|
-
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Show usage tip at the end
|
|
301
|
+
console.log('š” Tip: Use "autopm team load <name>" to activate a team');
|
|
302
|
+
console.log('š” Tip: Add --verbose to see missing agent details');
|
|
303
|
+
console.log();
|
|
304
|
+
|
|
225
305
|
} catch (error) {
|
|
226
306
|
console.error(`ā Error listing teams: ${error.message}`);
|
|
307
|
+
if (argv.debug) {
|
|
308
|
+
console.error(error.stack);
|
|
309
|
+
}
|
|
227
310
|
process.exit(1);
|
|
228
311
|
}
|
|
229
312
|
},
|
|
@@ -243,7 +326,7 @@ const commands = {
|
|
|
243
326
|
}
|
|
244
327
|
},
|
|
245
328
|
|
|
246
|
-
load: (argv) => {
|
|
329
|
+
load: async (argv) => {
|
|
247
330
|
try {
|
|
248
331
|
const teamName = argv.name;
|
|
249
332
|
|
|
@@ -273,11 +356,78 @@ const commands = {
|
|
|
273
356
|
|
|
274
357
|
// Validate that agent files exist
|
|
275
358
|
const missingAgents = validateAgentFiles(agents, projectRoot);
|
|
359
|
+
|
|
276
360
|
if (missingAgents.length > 0) {
|
|
277
|
-
console.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
361
|
+
console.log(`\nš Checking for missing agents in plugins...`);
|
|
362
|
+
|
|
363
|
+
// Use PluginManager to find which plugins contain the missing agents
|
|
364
|
+
const PluginManager = require('../../lib/plugins/PluginManager');
|
|
365
|
+
const pluginManager = new PluginManager();
|
|
366
|
+
|
|
367
|
+
const pluginMapping = await pluginManager.findPluginsForAgents(missingAgents);
|
|
368
|
+
|
|
369
|
+
// Separate agents into: can install from plugins vs truly missing
|
|
370
|
+
const installablePlugins = [];
|
|
371
|
+
const trulyMissing = [];
|
|
372
|
+
|
|
373
|
+
for (const [agentName, pluginInfo] of pluginMapping.found.entries()) {
|
|
374
|
+
if (!pluginInfo.installed) {
|
|
375
|
+
installablePlugins.push(pluginInfo);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
trulyMissing.push(...pluginMapping.missing);
|
|
380
|
+
|
|
381
|
+
if (installablePlugins.length > 0) {
|
|
382
|
+
console.log('\nš¦ Missing agents can be installed from plugins:\n');
|
|
383
|
+
|
|
384
|
+
// Group by plugin
|
|
385
|
+
const byPlugin = new Map();
|
|
386
|
+
for (const pluginInfo of installablePlugins) {
|
|
387
|
+
if (!byPlugin.has(pluginInfo.pluginName)) {
|
|
388
|
+
byPlugin.set(pluginInfo.pluginName, {
|
|
389
|
+
displayName: pluginInfo.displayName,
|
|
390
|
+
agents: []
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
byPlugin.get(pluginInfo.pluginName).agents.push(pluginInfo.agent.name);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
for (const [pluginName, info] of byPlugin.entries()) {
|
|
397
|
+
console.log(` ${info.displayName} (@claudeautopm/${pluginName}):`);
|
|
398
|
+
info.agents.forEach(agent => console.log(` ⢠${agent}`));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Offer to install
|
|
402
|
+
if (argv.autoInstall || argv.yes) {
|
|
403
|
+
console.log('\nš Auto-installing required plugins...\n');
|
|
404
|
+
|
|
405
|
+
for (const [pluginName] of byPlugin.entries()) {
|
|
406
|
+
try {
|
|
407
|
+
console.log(`Installing ${pluginName}...`);
|
|
408
|
+
await pluginManager.installPlugin(`${pluginManager.options.scopePrefix}/${pluginName}`);
|
|
409
|
+
console.log(`ā Installed ${pluginName}\n`);
|
|
410
|
+
} catch (error) {
|
|
411
|
+
console.error(`ā Failed to install ${pluginName}: ${error.message}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
} else {
|
|
415
|
+
console.log('\nš” To install these plugins, run:');
|
|
416
|
+
for (const [pluginName] of byPlugin.entries()) {
|
|
417
|
+
console.log(` autopm plugin install ${pluginName}`);
|
|
418
|
+
}
|
|
419
|
+
console.log('\nš” Or run with --auto-install flag:');
|
|
420
|
+
console.log(` autopm team load ${teamName} --auto-install\n`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (trulyMissing.length > 0) {
|
|
425
|
+
console.warn(`\nā ļø Warning: The following agents were not found in any plugin:`);
|
|
426
|
+
trulyMissing.forEach(agent => {
|
|
427
|
+
console.warn(` - ${agent}`);
|
|
428
|
+
});
|
|
429
|
+
console.warn('\nš” These agents may be custom or from core. Check .claude/agents/ directory.\n');
|
|
430
|
+
}
|
|
281
431
|
}
|
|
282
432
|
|
|
283
433
|
// Validate MCP dependencies
|
|
@@ -320,6 +470,9 @@ const commands = {
|
|
|
320
470
|
}
|
|
321
471
|
} catch (error) {
|
|
322
472
|
console.error(`ā Error loading team: ${error.message}`);
|
|
473
|
+
if (argv.debug) {
|
|
474
|
+
console.error(error.stack);
|
|
475
|
+
}
|
|
323
476
|
process.exit(1);
|
|
324
477
|
}
|
|
325
478
|
}
|
|
@@ -340,6 +493,27 @@ module.exports = {
|
|
|
340
493
|
describe: 'Team name (for load action)',
|
|
341
494
|
type: 'string'
|
|
342
495
|
})
|
|
496
|
+
.option('auto-install', {
|
|
497
|
+
describe: 'Automatically install missing plugins when loading team',
|
|
498
|
+
type: 'boolean',
|
|
499
|
+
default: false,
|
|
500
|
+
alias: 'y'
|
|
501
|
+
})
|
|
502
|
+
.option('debug', {
|
|
503
|
+
describe: 'Show debug information',
|
|
504
|
+
type: 'boolean',
|
|
505
|
+
default: false
|
|
506
|
+
})
|
|
507
|
+
.option('verbose', {
|
|
508
|
+
describe: 'Show detailed information (for list command)',
|
|
509
|
+
type: 'boolean',
|
|
510
|
+
default: false
|
|
511
|
+
})
|
|
512
|
+
.example('autopm team list', 'List all available teams')
|
|
513
|
+
.example('autopm team list --verbose', 'List teams with missing agent details')
|
|
514
|
+
.example('autopm team load frontend', 'Load frontend team')
|
|
515
|
+
.example('autopm team load frontend --auto-install', 'Load and auto-install missing plugins')
|
|
516
|
+
.example('autopm team load fullstack -y', 'Load fullstack with auto-install (shorthand)')
|
|
343
517
|
.check((argv) => {
|
|
344
518
|
if (argv.action === 'load' && !argv.name) {
|
|
345
519
|
throw new Error('Team name is required for load action');
|