claude-autopm 2.8.1 → 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 +116 -8
- package/bin/autopm.js +2 -0
- package/bin/commands/plugin.js +395 -0
- package/bin/commands/team.js +184 -10
- package/install/install.js +223 -4
- package/lib/plugins/PluginManager.js +1328 -0
- package/lib/plugins/PluginManager.old.js +400 -0
- package/package.json +4 -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
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');
|
package/install/install.js
CHANGED
|
@@ -459,6 +459,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
459
459
|
• Native tooling: npm, pip, local installs
|
|
460
460
|
• Best for: Simple projects, learning, debugging
|
|
461
461
|
• No containers or orchestration
|
|
462
|
+
${this.colors.DIM}• Plugins: core, languages, pm (3 plugins)${this.colors.NC}
|
|
462
463
|
`);
|
|
463
464
|
|
|
464
465
|
// Option 2: Docker-only (requires Docker)
|
|
@@ -468,6 +469,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
468
469
|
• Docker containers for development environment
|
|
469
470
|
• Best for: Microservices, consistent environments
|
|
470
471
|
• Local Docker only, no Kubernetes
|
|
472
|
+
${this.colors.DIM}• Plugins: core, languages, frameworks, testing, devops, pm (6 plugins)${this.colors.NC}
|
|
471
473
|
`);
|
|
472
474
|
} else {
|
|
473
475
|
console.log(`${this.colors.DIM}2. Docker-only${this.colors.NC} ${this.colors.RED}(Docker not installed)${this.colors.NC}
|
|
@@ -481,6 +483,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
481
483
|
• Kubernetes manifests and cloud deployment ready
|
|
482
484
|
• GitHub Actions with KIND clusters and Kaniko builds
|
|
483
485
|
• Best for: Production applications, enterprise projects
|
|
486
|
+
${this.colors.DIM}• Plugins: core, languages, frameworks, testing, devops, cloud, databases, pm, ai (9 plugins)${this.colors.NC}
|
|
484
487
|
`);
|
|
485
488
|
} else if (availableTools.docker) {
|
|
486
489
|
console.log(`${this.colors.DIM}3. Full DevOps${this.colors.NC} ${this.colors.RED}(kubectl not installed)${this.colors.NC}
|
|
@@ -497,6 +500,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
497
500
|
• Advanced context isolation and security
|
|
498
501
|
• Full DevOps capabilities with speed optimization
|
|
499
502
|
• Best for: Large projects, massive refactoring, power users
|
|
503
|
+
${this.colors.DIM}• Plugins: ALL - core, languages, frameworks, testing, devops, cloud, databases, data, pm, ai, ml (11 plugins)${this.colors.NC}
|
|
500
504
|
`);
|
|
501
505
|
} else if (availableTools.docker) {
|
|
502
506
|
console.log(`${this.colors.DIM}4. Performance${this.colors.NC} ${this.colors.RED}(kubectl not installed)${this.colors.NC}
|
|
@@ -592,7 +596,8 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
592
596
|
tools: {
|
|
593
597
|
docker: { enabled: false },
|
|
594
598
|
kubernetes: { enabled: false }
|
|
595
|
-
}
|
|
599
|
+
},
|
|
600
|
+
plugins: ['plugin-core', 'plugin-languages', 'plugin-pm']
|
|
596
601
|
},
|
|
597
602
|
docker: {
|
|
598
603
|
version: version,
|
|
@@ -601,7 +606,8 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
601
606
|
tools: {
|
|
602
607
|
docker: { enabled: true, first: false },
|
|
603
608
|
kubernetes: { enabled: false }
|
|
604
|
-
}
|
|
609
|
+
},
|
|
610
|
+
plugins: ['plugin-core', 'plugin-languages', 'plugin-frameworks', 'plugin-testing', 'plugin-devops', 'plugin-pm']
|
|
605
611
|
},
|
|
606
612
|
full: {
|
|
607
613
|
version: version,
|
|
@@ -610,7 +616,8 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
610
616
|
tools: {
|
|
611
617
|
docker: { enabled: true, first: true },
|
|
612
618
|
kubernetes: { enabled: true }
|
|
613
|
-
}
|
|
619
|
+
},
|
|
620
|
+
plugins: ['plugin-core', 'plugin-languages', 'plugin-frameworks', 'plugin-testing', 'plugin-devops', 'plugin-cloud', 'plugin-databases', 'plugin-pm', 'plugin-ai']
|
|
614
621
|
},
|
|
615
622
|
performance: {
|
|
616
623
|
version: version,
|
|
@@ -620,7 +627,8 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
620
627
|
tools: {
|
|
621
628
|
docker: { enabled: true, first: false },
|
|
622
629
|
kubernetes: { enabled: true }
|
|
623
|
-
}
|
|
630
|
+
},
|
|
631
|
+
plugins: ['plugin-core', 'plugin-languages', 'plugin-frameworks', 'plugin-testing', 'plugin-devops', 'plugin-cloud', 'plugin-databases', 'plugin-data', 'plugin-pm', 'plugin-ai', 'plugin-ml']
|
|
624
632
|
}
|
|
625
633
|
};
|
|
626
634
|
|
|
@@ -835,6 +843,214 @@ See: https://github.com/rafeekpro/ClaudeAutoPM
|
|
|
835
843
|
return processedContent;
|
|
836
844
|
}
|
|
837
845
|
|
|
846
|
+
async installPlugins() {
|
|
847
|
+
if (!this.currentConfig || !this.currentConfig.plugins) {
|
|
848
|
+
this.printStep('No plugins configured for this scenario');
|
|
849
|
+
return;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
const pluginsToInstall = this.currentConfig.plugins;
|
|
853
|
+
|
|
854
|
+
console.log('');
|
|
855
|
+
this.printStep('Installing plugins for selected scenario...');
|
|
856
|
+
console.log('');
|
|
857
|
+
this.printMsg('CYAN', `📦 Plugins to install (${pluginsToInstall.length}):`);
|
|
858
|
+
|
|
859
|
+
for (const plugin of pluginsToInstall) {
|
|
860
|
+
console.log(` • ${plugin}`);
|
|
861
|
+
}
|
|
862
|
+
console.log('');
|
|
863
|
+
|
|
864
|
+
const packagesDir = path.join(this.baseDir, 'packages');
|
|
865
|
+
const installedPlugins = [];
|
|
866
|
+
const failedPlugins = [];
|
|
867
|
+
|
|
868
|
+
// Install each plugin directly
|
|
869
|
+
for (const pluginName of pluginsToInstall) {
|
|
870
|
+
try {
|
|
871
|
+
this.printStep(`Installing ${pluginName}...`);
|
|
872
|
+
|
|
873
|
+
const pluginPath = path.join(packagesDir, pluginName);
|
|
874
|
+
const pluginJsonPath = path.join(pluginPath, 'plugin.json');
|
|
875
|
+
|
|
876
|
+
if (!fs.existsSync(pluginJsonPath)) {
|
|
877
|
+
throw new Error(`Plugin metadata not found: ${pluginJsonPath}`);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
const metadata = JSON.parse(fs.readFileSync(pluginJsonPath, 'utf-8'));
|
|
881
|
+
let agentsInstalled = 0;
|
|
882
|
+
let commandsInstalled = 0;
|
|
883
|
+
let rulesInstalled = 0;
|
|
884
|
+
|
|
885
|
+
// Install agents
|
|
886
|
+
if (metadata.agents && metadata.agents.length > 0) {
|
|
887
|
+
const targetDir = path.join(this.targetDir, '.claude', 'agents', metadata.category);
|
|
888
|
+
if (!fs.existsSync(targetDir)) {
|
|
889
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
for (const agent of metadata.agents) {
|
|
893
|
+
const sourcePath = path.join(pluginPath, agent.file);
|
|
894
|
+
const targetPath = path.join(targetDir, path.basename(agent.file));
|
|
895
|
+
|
|
896
|
+
if (fs.existsSync(sourcePath) && !fs.existsSync(targetPath)) {
|
|
897
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
898
|
+
agentsInstalled++;
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
// Install commands
|
|
904
|
+
if (metadata.commands && metadata.commands.length > 0) {
|
|
905
|
+
const targetDir = path.join(this.targetDir, '.claude', 'commands');
|
|
906
|
+
if (!fs.existsSync(targetDir)) {
|
|
907
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
for (const command of metadata.commands) {
|
|
911
|
+
if (!command.file) continue;
|
|
912
|
+
const sourcePath = path.join(pluginPath, command.file);
|
|
913
|
+
const targetPath = path.join(targetDir, path.basename(command.file));
|
|
914
|
+
|
|
915
|
+
if (fs.existsSync(sourcePath) && !fs.existsSync(targetPath)) {
|
|
916
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
917
|
+
commandsInstalled++;
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
// Install hooks
|
|
923
|
+
if (metadata.hooks && metadata.hooks.length > 0) {
|
|
924
|
+
const targetDir = path.join(this.targetDir, '.claude', 'hooks');
|
|
925
|
+
if (!fs.existsSync(targetDir)) {
|
|
926
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
for (const hook of metadata.hooks) {
|
|
930
|
+
const files = hook.files || (hook.file ? [hook.file] : []);
|
|
931
|
+
for (const file of files) {
|
|
932
|
+
const sourcePath = path.join(pluginPath, file);
|
|
933
|
+
const targetPath = path.join(targetDir, path.basename(file));
|
|
934
|
+
|
|
935
|
+
if (fs.existsSync(sourcePath) && !fs.existsSync(targetPath)) {
|
|
936
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
937
|
+
// Make executable if shell script
|
|
938
|
+
if (file.endsWith('.sh')) {
|
|
939
|
+
fs.chmodSync(targetPath, 0o755);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
// Install scripts
|
|
947
|
+
if (metadata.scripts && metadata.scripts.length > 0) {
|
|
948
|
+
const targetDir = path.join(this.targetDir, 'scripts');
|
|
949
|
+
if (!fs.existsSync(targetDir)) {
|
|
950
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
for (const script of metadata.scripts) {
|
|
954
|
+
if (script.subdirectory && script.files) {
|
|
955
|
+
// Handle subdirectory with multiple files
|
|
956
|
+
const cleanSubdir = script.subdirectory.replace(/^scripts\//, '');
|
|
957
|
+
const subdirTarget = path.join(targetDir, cleanSubdir);
|
|
958
|
+
if (!fs.existsSync(subdirTarget)) {
|
|
959
|
+
fs.mkdirSync(subdirTarget, { recursive: true });
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
for (const file of script.files) {
|
|
963
|
+
const sourcePath = path.join(pluginPath, script.subdirectory, file);
|
|
964
|
+
const targetPath = path.join(subdirTarget, file);
|
|
965
|
+
|
|
966
|
+
if (fs.existsSync(sourcePath) && !fs.existsSync(targetPath)) {
|
|
967
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
968
|
+
if (file.endsWith('.sh')) {
|
|
969
|
+
fs.chmodSync(targetPath, 0o755);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
} else if (script.file) {
|
|
974
|
+
// Handle single script file
|
|
975
|
+
const cleanFile = script.file.replace(/^scripts\//, '');
|
|
976
|
+
const sourcePath = path.join(pluginPath, script.file);
|
|
977
|
+
const targetPath = path.join(targetDir, cleanFile);
|
|
978
|
+
|
|
979
|
+
// Create subdirectories if needed (e.g., lib/)
|
|
980
|
+
const scriptTargetDir = path.dirname(targetPath);
|
|
981
|
+
if (!fs.existsSync(scriptTargetDir)) {
|
|
982
|
+
fs.mkdirSync(scriptTargetDir, { recursive: true });
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
if (fs.existsSync(sourcePath) && !fs.existsSync(targetPath)) {
|
|
986
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
987
|
+
if (script.file.endsWith('.sh')) {
|
|
988
|
+
fs.chmodSync(targetPath, 0o755);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
// Install rules
|
|
996
|
+
if (metadata.rules && metadata.rules.length > 0) {
|
|
997
|
+
const targetDir = path.join(this.targetDir, '.claude', 'rules');
|
|
998
|
+
if (!fs.existsSync(targetDir)) {
|
|
999
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
for (const rule of metadata.rules) {
|
|
1003
|
+
const sourcePath = path.join(pluginPath, rule.file);
|
|
1004
|
+
const targetPath = path.join(targetDir, path.basename(rule.file));
|
|
1005
|
+
|
|
1006
|
+
if (fs.existsSync(sourcePath) && !fs.existsSync(targetPath)) {
|
|
1007
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
1008
|
+
rulesInstalled++;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
installedPlugins.push({
|
|
1014
|
+
name: pluginName,
|
|
1015
|
+
displayName: metadata.displayName,
|
|
1016
|
+
agents: agentsInstalled,
|
|
1017
|
+
commands: commandsInstalled,
|
|
1018
|
+
rules: rulesInstalled
|
|
1019
|
+
});
|
|
1020
|
+
|
|
1021
|
+
const summary = [];
|
|
1022
|
+
if (agentsInstalled > 0) summary.push(`${agentsInstalled} agents`);
|
|
1023
|
+
if (commandsInstalled > 0) summary.push(`${commandsInstalled} commands`);
|
|
1024
|
+
if (rulesInstalled > 0) summary.push(`${rulesInstalled} rules`);
|
|
1025
|
+
|
|
1026
|
+
this.printSuccess(`${metadata.displayName} installed (${summary.join(', ') || 'no resources'})`);
|
|
1027
|
+
} catch (error) {
|
|
1028
|
+
failedPlugins.push({ name: pluginName, error: error.message });
|
|
1029
|
+
this.printWarning(`Failed to install ${pluginName}: ${error.message}`);
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
// Store installation results in config
|
|
1034
|
+
this.currentConfig.installedPlugins = installedPlugins;
|
|
1035
|
+
this.currentConfig.failedPlugins = failedPlugins;
|
|
1036
|
+
|
|
1037
|
+
// Update config file with installation results
|
|
1038
|
+
const configPath = path.join(this.targetDir, '.claude', 'config.json');
|
|
1039
|
+
if (fs.existsSync(configPath)) {
|
|
1040
|
+
fs.writeFileSync(configPath, JSON.stringify(this.currentConfig, null, 2));
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
console.log('');
|
|
1044
|
+
if (installedPlugins.length > 0) {
|
|
1045
|
+
this.printMsg('GREEN', `✓ Successfully installed ${installedPlugins.length} plugin(s)`);
|
|
1046
|
+
}
|
|
1047
|
+
if (failedPlugins.length > 0) {
|
|
1048
|
+
this.printMsg('YELLOW', `⚠ Failed to install ${failedPlugins.length} plugin(s)`);
|
|
1049
|
+
this.printMsg('CYAN', '💡 Tip: Install missing plugins with: autopm plugin install <name>');
|
|
1050
|
+
}
|
|
1051
|
+
console.log('');
|
|
1052
|
+
}
|
|
1053
|
+
|
|
838
1054
|
setupMCPIntegration() {
|
|
839
1055
|
const mcpServersPath = path.join(this.targetDir, '.claude', 'mcp-servers.json');
|
|
840
1056
|
const configPath = path.join(this.targetDir, '.claude', 'config.json');
|
|
@@ -952,6 +1168,9 @@ See: https://github.com/rafeekpro/ClaudeAutoPM
|
|
|
952
1168
|
// Install configuration
|
|
953
1169
|
this.installConfig(scenario);
|
|
954
1170
|
|
|
1171
|
+
// Install plugins based on scenario
|
|
1172
|
+
await this.installPlugins();
|
|
1173
|
+
|
|
955
1174
|
// Install CLAUDE.md
|
|
956
1175
|
this.installClaudeMd();
|
|
957
1176
|
|