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.
Files changed (273) hide show
  1. package/README.md +116 -8
  2. package/bin/autopm.js +2 -0
  3. package/bin/commands/plugin.js +395 -0
  4. package/bin/commands/team.js +184 -10
  5. package/install/install.js +223 -4
  6. package/lib/plugins/PluginManager.js +1328 -0
  7. package/lib/plugins/PluginManager.old.js +400 -0
  8. package/package.json +4 -1
  9. package/scripts/publish-plugins.sh +166 -0
  10. package/autopm/.claude/agents/cloud/README.md +0 -55
  11. package/autopm/.claude/agents/cloud/aws-cloud-architect.md +0 -521
  12. package/autopm/.claude/agents/cloud/azure-cloud-architect.md +0 -436
  13. package/autopm/.claude/agents/cloud/gcp-cloud-architect.md +0 -385
  14. package/autopm/.claude/agents/cloud/gcp-cloud-functions-engineer.md +0 -306
  15. package/autopm/.claude/agents/cloud/gemini-api-expert.md +0 -880
  16. package/autopm/.claude/agents/cloud/kubernetes-orchestrator.md +0 -566
  17. package/autopm/.claude/agents/cloud/openai-python-expert.md +0 -1087
  18. package/autopm/.claude/agents/cloud/terraform-infrastructure-expert.md +0 -454
  19. package/autopm/.claude/agents/core/agent-manager.md +0 -296
  20. package/autopm/.claude/agents/core/code-analyzer.md +0 -131
  21. package/autopm/.claude/agents/core/file-analyzer.md +0 -162
  22. package/autopm/.claude/agents/core/test-runner.md +0 -200
  23. package/autopm/.claude/agents/data/airflow-orchestration-expert.md +0 -52
  24. package/autopm/.claude/agents/data/kedro-pipeline-expert.md +0 -50
  25. package/autopm/.claude/agents/data/langgraph-workflow-expert.md +0 -520
  26. package/autopm/.claude/agents/databases/README.md +0 -50
  27. package/autopm/.claude/agents/databases/bigquery-expert.md +0 -392
  28. package/autopm/.claude/agents/databases/cosmosdb-expert.md +0 -368
  29. package/autopm/.claude/agents/databases/mongodb-expert.md +0 -398
  30. package/autopm/.claude/agents/databases/postgresql-expert.md +0 -321
  31. package/autopm/.claude/agents/databases/redis-expert.md +0 -52
  32. package/autopm/.claude/agents/devops/README.md +0 -52
  33. package/autopm/.claude/agents/devops/azure-devops-specialist.md +0 -308
  34. package/autopm/.claude/agents/devops/docker-containerization-expert.md +0 -298
  35. package/autopm/.claude/agents/devops/github-operations-specialist.md +0 -335
  36. package/autopm/.claude/agents/devops/mcp-context-manager.md +0 -319
  37. package/autopm/.claude/agents/devops/observability-engineer.md +0 -574
  38. package/autopm/.claude/agents/devops/ssh-operations-expert.md +0 -1093
  39. package/autopm/.claude/agents/devops/traefik-proxy-expert.md +0 -444
  40. package/autopm/.claude/agents/frameworks/README.md +0 -64
  41. package/autopm/.claude/agents/frameworks/e2e-test-engineer.md +0 -360
  42. package/autopm/.claude/agents/frameworks/nats-messaging-expert.md +0 -254
  43. package/autopm/.claude/agents/frameworks/react-frontend-engineer.md +0 -217
  44. package/autopm/.claude/agents/frameworks/react-ui-expert.md +0 -226
  45. package/autopm/.claude/agents/frameworks/tailwindcss-expert.md +0 -770
  46. package/autopm/.claude/agents/frameworks/ux-design-expert.md +0 -244
  47. package/autopm/.claude/agents/integration/message-queue-engineer.md +0 -794
  48. package/autopm/.claude/agents/languages/README.md +0 -50
  49. package/autopm/.claude/agents/languages/bash-scripting-expert.md +0 -541
  50. package/autopm/.claude/agents/languages/javascript-frontend-engineer.md +0 -197
  51. package/autopm/.claude/agents/languages/nodejs-backend-engineer.md +0 -226
  52. package/autopm/.claude/agents/languages/python-backend-engineer.md +0 -214
  53. package/autopm/.claude/agents/languages/python-backend-expert.md +0 -289
  54. package/autopm/.claude/agents/testing/frontend-testing-engineer.md +0 -395
  55. package/autopm/.claude/commands/ai/langgraph-workflow.md +0 -65
  56. package/autopm/.claude/commands/ai/openai-chat.md +0 -65
  57. package/autopm/.claude/commands/azure/COMMANDS.md +0 -107
  58. package/autopm/.claude/commands/azure/COMMAND_MAPPING.md +0 -252
  59. package/autopm/.claude/commands/azure/INTEGRATION_FIX.md +0 -103
  60. package/autopm/.claude/commands/azure/README.md +0 -246
  61. package/autopm/.claude/commands/azure/active-work.md +0 -198
  62. package/autopm/.claude/commands/azure/aliases.md +0 -143
  63. package/autopm/.claude/commands/azure/blocked-items.md +0 -287
  64. package/autopm/.claude/commands/azure/clean.md +0 -93
  65. package/autopm/.claude/commands/azure/docs-query.md +0 -48
  66. package/autopm/.claude/commands/azure/feature-decompose.md +0 -380
  67. package/autopm/.claude/commands/azure/feature-list.md +0 -61
  68. package/autopm/.claude/commands/azure/feature-new.md +0 -115
  69. package/autopm/.claude/commands/azure/feature-show.md +0 -205
  70. package/autopm/.claude/commands/azure/feature-start.md +0 -130
  71. package/autopm/.claude/commands/azure/fix-integration-example.md +0 -93
  72. package/autopm/.claude/commands/azure/help.md +0 -150
  73. package/autopm/.claude/commands/azure/import-us.md +0 -269
  74. package/autopm/.claude/commands/azure/init.md +0 -211
  75. package/autopm/.claude/commands/azure/next-task.md +0 -262
  76. package/autopm/.claude/commands/azure/search.md +0 -160
  77. package/autopm/.claude/commands/azure/sprint-status.md +0 -235
  78. package/autopm/.claude/commands/azure/standup.md +0 -260
  79. package/autopm/.claude/commands/azure/sync-all.md +0 -99
  80. package/autopm/.claude/commands/azure/task-analyze.md +0 -186
  81. package/autopm/.claude/commands/azure/task-close.md +0 -329
  82. package/autopm/.claude/commands/azure/task-edit.md +0 -145
  83. package/autopm/.claude/commands/azure/task-list.md +0 -263
  84. package/autopm/.claude/commands/azure/task-new.md +0 -84
  85. package/autopm/.claude/commands/azure/task-reopen.md +0 -79
  86. package/autopm/.claude/commands/azure/task-show.md +0 -126
  87. package/autopm/.claude/commands/azure/task-start.md +0 -301
  88. package/autopm/.claude/commands/azure/task-status.md +0 -65
  89. package/autopm/.claude/commands/azure/task-sync.md +0 -67
  90. package/autopm/.claude/commands/azure/us-edit.md +0 -164
  91. package/autopm/.claude/commands/azure/us-list.md +0 -202
  92. package/autopm/.claude/commands/azure/us-new.md +0 -265
  93. package/autopm/.claude/commands/azure/us-parse.md +0 -253
  94. package/autopm/.claude/commands/azure/us-show.md +0 -188
  95. package/autopm/.claude/commands/azure/us-status.md +0 -320
  96. package/autopm/.claude/commands/azure/validate.md +0 -86
  97. package/autopm/.claude/commands/azure/work-item-sync.md +0 -47
  98. package/autopm/.claude/commands/cloud/infra-deploy.md +0 -38
  99. package/autopm/.claude/commands/github/workflow-create.md +0 -42
  100. package/autopm/.claude/commands/infrastructure/ssh-security.md +0 -65
  101. package/autopm/.claude/commands/infrastructure/traefik-setup.md +0 -65
  102. package/autopm/.claude/commands/kubernetes/deploy.md +0 -37
  103. package/autopm/.claude/commands/playwright/test-scaffold.md +0 -38
  104. package/autopm/.claude/commands/pm/blocked.md +0 -28
  105. package/autopm/.claude/commands/pm/clean.md +0 -119
  106. package/autopm/.claude/commands/pm/context-create.md +0 -136
  107. package/autopm/.claude/commands/pm/context-prime.md +0 -170
  108. package/autopm/.claude/commands/pm/context-update.md +0 -292
  109. package/autopm/.claude/commands/pm/context.md +0 -28
  110. package/autopm/.claude/commands/pm/epic-close.md +0 -86
  111. package/autopm/.claude/commands/pm/epic-decompose.md +0 -370
  112. package/autopm/.claude/commands/pm/epic-edit.md +0 -83
  113. package/autopm/.claude/commands/pm/epic-list.md +0 -30
  114. package/autopm/.claude/commands/pm/epic-merge.md +0 -222
  115. package/autopm/.claude/commands/pm/epic-oneshot.md +0 -119
  116. package/autopm/.claude/commands/pm/epic-refresh.md +0 -119
  117. package/autopm/.claude/commands/pm/epic-show.md +0 -28
  118. package/autopm/.claude/commands/pm/epic-split.md +0 -120
  119. package/autopm/.claude/commands/pm/epic-start.md +0 -195
  120. package/autopm/.claude/commands/pm/epic-status.md +0 -28
  121. package/autopm/.claude/commands/pm/epic-sync-modular.md +0 -338
  122. package/autopm/.claude/commands/pm/epic-sync-original.md +0 -473
  123. package/autopm/.claude/commands/pm/epic-sync.md +0 -486
  124. package/autopm/.claude/commands/pm/help.md +0 -28
  125. package/autopm/.claude/commands/pm/import.md +0 -115
  126. package/autopm/.claude/commands/pm/in-progress.md +0 -28
  127. package/autopm/.claude/commands/pm/init.md +0 -28
  128. package/autopm/.claude/commands/pm/issue-analyze.md +0 -202
  129. package/autopm/.claude/commands/pm/issue-close.md +0 -119
  130. package/autopm/.claude/commands/pm/issue-edit.md +0 -93
  131. package/autopm/.claude/commands/pm/issue-reopen.md +0 -87
  132. package/autopm/.claude/commands/pm/issue-show.md +0 -41
  133. package/autopm/.claude/commands/pm/issue-start.md +0 -234
  134. package/autopm/.claude/commands/pm/issue-status.md +0 -95
  135. package/autopm/.claude/commands/pm/issue-sync.md +0 -411
  136. package/autopm/.claude/commands/pm/next.md +0 -28
  137. package/autopm/.claude/commands/pm/prd-edit.md +0 -82
  138. package/autopm/.claude/commands/pm/prd-list.md +0 -28
  139. package/autopm/.claude/commands/pm/prd-new.md +0 -55
  140. package/autopm/.claude/commands/pm/prd-parse.md +0 -42
  141. package/autopm/.claude/commands/pm/prd-status.md +0 -28
  142. package/autopm/.claude/commands/pm/search.md +0 -28
  143. package/autopm/.claude/commands/pm/standup.md +0 -28
  144. package/autopm/.claude/commands/pm/status.md +0 -28
  145. package/autopm/.claude/commands/pm/sync.md +0 -99
  146. package/autopm/.claude/commands/pm/test-reference-update.md +0 -151
  147. package/autopm/.claude/commands/pm/validate.md +0 -28
  148. package/autopm/.claude/commands/pm/what-next.md +0 -28
  149. package/autopm/.claude/commands/python/api-scaffold.md +0 -50
  150. package/autopm/.claude/commands/python/docs-query.md +0 -48
  151. package/autopm/.claude/commands/react/app-scaffold.md +0 -50
  152. package/autopm/.claude/commands/testing/prime.md +0 -314
  153. package/autopm/.claude/commands/testing/run.md +0 -125
  154. package/autopm/.claude/commands/ui/bootstrap-scaffold.md +0 -65
  155. package/autopm/.claude/commands/ui/tailwind-system.md +0 -64
  156. package/autopm/.claude/rules/ai-integration-patterns.md +0 -219
  157. package/autopm/.claude/rules/ci-cd-kubernetes-strategy.md +0 -25
  158. package/autopm/.claude/rules/database-management-strategy.md +0 -17
  159. package/autopm/.claude/rules/database-pipeline.md +0 -94
  160. package/autopm/.claude/rules/devops-troubleshooting-playbook.md +0 -450
  161. package/autopm/.claude/rules/docker-first-development.md +0 -404
  162. package/autopm/.claude/rules/infrastructure-pipeline.md +0 -128
  163. package/autopm/.claude/rules/performance-guidelines.md +0 -403
  164. package/autopm/.claude/rules/ui-development-standards.md +0 -281
  165. package/autopm/.claude/rules/ui-framework-rules.md +0 -151
  166. package/autopm/.claude/rules/ux-design-rules.md +0 -209
  167. package/autopm/.claude/rules/visual-testing.md +0 -223
  168. package/autopm/.claude/scripts/azure/README.md +0 -192
  169. package/autopm/.claude/scripts/azure/active-work.js +0 -524
  170. package/autopm/.claude/scripts/azure/active-work.sh +0 -20
  171. package/autopm/.claude/scripts/azure/blocked.js +0 -520
  172. package/autopm/.claude/scripts/azure/blocked.sh +0 -20
  173. package/autopm/.claude/scripts/azure/daily.js +0 -533
  174. package/autopm/.claude/scripts/azure/daily.sh +0 -20
  175. package/autopm/.claude/scripts/azure/dashboard.js +0 -970
  176. package/autopm/.claude/scripts/azure/dashboard.sh +0 -20
  177. package/autopm/.claude/scripts/azure/feature-list.js +0 -254
  178. package/autopm/.claude/scripts/azure/feature-list.sh +0 -20
  179. package/autopm/.claude/scripts/azure/feature-show.js +0 -7
  180. package/autopm/.claude/scripts/azure/feature-show.sh +0 -20
  181. package/autopm/.claude/scripts/azure/feature-status.js +0 -604
  182. package/autopm/.claude/scripts/azure/feature-status.sh +0 -20
  183. package/autopm/.claude/scripts/azure/help.js +0 -342
  184. package/autopm/.claude/scripts/azure/help.sh +0 -20
  185. package/autopm/.claude/scripts/azure/next-task.js +0 -508
  186. package/autopm/.claude/scripts/azure/next-task.sh +0 -20
  187. package/autopm/.claude/scripts/azure/search.js +0 -469
  188. package/autopm/.claude/scripts/azure/search.sh +0 -20
  189. package/autopm/.claude/scripts/azure/setup.js +0 -745
  190. package/autopm/.claude/scripts/azure/setup.sh +0 -20
  191. package/autopm/.claude/scripts/azure/sprint-report.js +0 -1012
  192. package/autopm/.claude/scripts/azure/sprint-report.sh +0 -20
  193. package/autopm/.claude/scripts/azure/sync.js +0 -563
  194. package/autopm/.claude/scripts/azure/sync.sh +0 -20
  195. package/autopm/.claude/scripts/azure/us-list.js +0 -210
  196. package/autopm/.claude/scripts/azure/us-list.sh +0 -20
  197. package/autopm/.claude/scripts/azure/us-status.js +0 -238
  198. package/autopm/.claude/scripts/azure/us-status.sh +0 -20
  199. package/autopm/.claude/scripts/azure/validate.js +0 -626
  200. package/autopm/.claude/scripts/azure/validate.sh +0 -20
  201. package/autopm/.claude/scripts/azure/wrapper-template.sh +0 -20
  202. package/autopm/.claude/scripts/github/dependency-tracker.js +0 -554
  203. package/autopm/.claude/scripts/github/dependency-validator.js +0 -545
  204. package/autopm/.claude/scripts/github/dependency-visualizer.js +0 -477
  205. package/autopm/.claude/scripts/pm/analytics.js +0 -425
  206. package/autopm/.claude/scripts/pm/blocked.js +0 -164
  207. package/autopm/.claude/scripts/pm/blocked.sh +0 -78
  208. package/autopm/.claude/scripts/pm/clean.js +0 -464
  209. package/autopm/.claude/scripts/pm/context-create.js +0 -216
  210. package/autopm/.claude/scripts/pm/context-prime.js +0 -335
  211. package/autopm/.claude/scripts/pm/context-update.js +0 -344
  212. package/autopm/.claude/scripts/pm/context.js +0 -338
  213. package/autopm/.claude/scripts/pm/epic-close.js +0 -347
  214. package/autopm/.claude/scripts/pm/epic-edit.js +0 -382
  215. package/autopm/.claude/scripts/pm/epic-list.js +0 -273
  216. package/autopm/.claude/scripts/pm/epic-list.sh +0 -109
  217. package/autopm/.claude/scripts/pm/epic-show.js +0 -291
  218. package/autopm/.claude/scripts/pm/epic-show.sh +0 -105
  219. package/autopm/.claude/scripts/pm/epic-split.js +0 -522
  220. package/autopm/.claude/scripts/pm/epic-start/epic-start.js +0 -183
  221. package/autopm/.claude/scripts/pm/epic-start/epic-start.sh +0 -94
  222. package/autopm/.claude/scripts/pm/epic-status.js +0 -291
  223. package/autopm/.claude/scripts/pm/epic-status.sh +0 -104
  224. package/autopm/.claude/scripts/pm/epic-sync/README.md +0 -208
  225. package/autopm/.claude/scripts/pm/epic-sync/create-epic-issue.sh +0 -77
  226. package/autopm/.claude/scripts/pm/epic-sync/create-task-issues.sh +0 -86
  227. package/autopm/.claude/scripts/pm/epic-sync/update-epic-file.sh +0 -79
  228. package/autopm/.claude/scripts/pm/epic-sync/update-references.sh +0 -89
  229. package/autopm/.claude/scripts/pm/epic-sync.sh +0 -137
  230. package/autopm/.claude/scripts/pm/help.js +0 -92
  231. package/autopm/.claude/scripts/pm/help.sh +0 -90
  232. package/autopm/.claude/scripts/pm/in-progress.js +0 -178
  233. package/autopm/.claude/scripts/pm/in-progress.sh +0 -93
  234. package/autopm/.claude/scripts/pm/init.js +0 -321
  235. package/autopm/.claude/scripts/pm/init.sh +0 -178
  236. package/autopm/.claude/scripts/pm/issue-close.js +0 -232
  237. package/autopm/.claude/scripts/pm/issue-edit.js +0 -310
  238. package/autopm/.claude/scripts/pm/issue-show.js +0 -272
  239. package/autopm/.claude/scripts/pm/issue-start.js +0 -181
  240. package/autopm/.claude/scripts/pm/issue-sync/format-comment.sh +0 -468
  241. package/autopm/.claude/scripts/pm/issue-sync/gather-updates.sh +0 -460
  242. package/autopm/.claude/scripts/pm/issue-sync/post-comment.sh +0 -330
  243. package/autopm/.claude/scripts/pm/issue-sync/preflight-validation.sh +0 -348
  244. package/autopm/.claude/scripts/pm/issue-sync/update-frontmatter.sh +0 -387
  245. package/autopm/.claude/scripts/pm/lib/README.md +0 -85
  246. package/autopm/.claude/scripts/pm/lib/epic-discovery.js +0 -119
  247. package/autopm/.claude/scripts/pm/lib/logger.js +0 -78
  248. package/autopm/.claude/scripts/pm/next.js +0 -189
  249. package/autopm/.claude/scripts/pm/next.sh +0 -72
  250. package/autopm/.claude/scripts/pm/optimize.js +0 -407
  251. package/autopm/.claude/scripts/pm/pr-create.js +0 -337
  252. package/autopm/.claude/scripts/pm/pr-list.js +0 -257
  253. package/autopm/.claude/scripts/pm/prd-list.js +0 -242
  254. package/autopm/.claude/scripts/pm/prd-list.sh +0 -103
  255. package/autopm/.claude/scripts/pm/prd-new.js +0 -684
  256. package/autopm/.claude/scripts/pm/prd-parse.js +0 -547
  257. package/autopm/.claude/scripts/pm/prd-status.js +0 -152
  258. package/autopm/.claude/scripts/pm/prd-status.sh +0 -63
  259. package/autopm/.claude/scripts/pm/release.js +0 -460
  260. package/autopm/.claude/scripts/pm/search.js +0 -192
  261. package/autopm/.claude/scripts/pm/search.sh +0 -89
  262. package/autopm/.claude/scripts/pm/standup.js +0 -362
  263. package/autopm/.claude/scripts/pm/standup.sh +0 -95
  264. package/autopm/.claude/scripts/pm/status.js +0 -148
  265. package/autopm/.claude/scripts/pm/status.sh +0 -59
  266. package/autopm/.claude/scripts/pm/sync-batch.js +0 -337
  267. package/autopm/.claude/scripts/pm/sync.js +0 -343
  268. package/autopm/.claude/scripts/pm/template-list.js +0 -141
  269. package/autopm/.claude/scripts/pm/template-new.js +0 -366
  270. package/autopm/.claude/scripts/pm/validate.js +0 -274
  271. package/autopm/.claude/scripts/pm/validate.sh +0 -106
  272. package/autopm/.claude/scripts/pm/what-next.js +0 -660
  273. package/bin/node/azure-feature-show.js +0 -7
@@ -0,0 +1,400 @@
1
+ /**
2
+ * PluginManager - Manages ClaudeAutoPM plugins
3
+ *
4
+ * Responsibilities:
5
+ * - Discover installed plugins in node_modules
6
+ * - Load and validate plugin metadata
7
+ * - Install/uninstall plugin agents
8
+ * - Maintain plugin registry
9
+ *
10
+ * @module lib/plugins/PluginManager
11
+ */
12
+
13
+ const fs = require('fs-extra');
14
+ const path = require('path');
15
+ const os = require('os');
16
+
17
+ class PluginManager {
18
+ constructor(options = {}) {
19
+ this.projectRoot = options.projectRoot || process.cwd();
20
+ this.pluginsDir = options.pluginsDir || path.join(os.homedir(), '.claudeautopm', 'plugins');
21
+ this.registryPath = path.join(this.pluginsDir, 'registry.json');
22
+
23
+ // Ensure plugins directory exists
24
+ fs.ensureDirSync(this.pluginsDir);
25
+
26
+ // Load or initialize registry
27
+ this.registry = this.loadRegistry();
28
+ }
29
+
30
+ /**
31
+ * Load plugin registry from disk
32
+ * @returns {Object} Plugin registry
33
+ */
34
+ loadRegistry() {
35
+ if (fs.existsSync(this.registryPath)) {
36
+ try {
37
+ return JSON.parse(fs.readFileSync(this.registryPath, 'utf-8'));
38
+ } catch (error) {
39
+ console.warn('Warning: Failed to load plugin registry, creating new one');
40
+ }
41
+ }
42
+
43
+ // Default registry structure
44
+ return {
45
+ version: '1.0.0',
46
+ installed: [],
47
+ enabled: [],
48
+ lastUpdate: new Date().toISOString()
49
+ };
50
+ }
51
+
52
+ /**
53
+ * Save plugin registry to disk
54
+ */
55
+ saveRegistry() {
56
+ this.registry.lastUpdate = new Date().toISOString();
57
+ fs.writeFileSync(
58
+ this.registryPath,
59
+ JSON.stringify(this.registry, null, 2),
60
+ 'utf-8'
61
+ );
62
+ }
63
+
64
+ /**
65
+ * Get plugin installation path in node_modules
66
+ * @param {string} pluginName - Plugin name (e.g., 'plugin-cloud')
67
+ * @returns {string} Full path to plugin directory
68
+ */
69
+ getPluginPath(pluginName) {
70
+ // Check local node_modules first
71
+ const localPath = path.join(this.projectRoot, 'node_modules', '@claudeautopm', pluginName);
72
+ if (fs.existsSync(localPath)) {
73
+ return localPath;
74
+ }
75
+
76
+ // Check global node_modules
77
+ const { execSync } = require('child_process');
78
+ try {
79
+ const globalModules = execSync('npm root -g', { encoding: 'utf-8' }).trim();
80
+ const globalPath = path.join(globalModules, '@claudeautopm', pluginName);
81
+ if (fs.existsSync(globalPath)) {
82
+ return globalPath;
83
+ }
84
+ } catch (error) {
85
+ // Fall through
86
+ }
87
+
88
+ throw new Error(`Plugin not found: ${pluginName}`);
89
+ }
90
+
91
+ /**
92
+ * Discover all installed plugins
93
+ * Scans both local and global node_modules/@claudeautopm/plugin-*
94
+ * @returns {Array<Object>} Array of plugin metadata
95
+ */
96
+ async discoverPlugins() {
97
+ const plugins = [];
98
+ const scannedPaths = new Set();
99
+
100
+ // Scan local node_modules
101
+ const localModules = path.join(this.projectRoot, 'node_modules', '@claudeautopm');
102
+ if (fs.existsSync(localModules)) {
103
+ const dirs = fs.readdirSync(localModules);
104
+ for (const dir of dirs) {
105
+ if (dir.startsWith('plugin-')) {
106
+ const pluginPath = path.join(localModules, dir);
107
+ scannedPaths.add(pluginPath);
108
+ }
109
+ }
110
+ }
111
+
112
+ // Scan global node_modules
113
+ try {
114
+ const { execSync } = require('child_process');
115
+ const globalModules = execSync('npm root -g', { encoding: 'utf-8' }).trim();
116
+ const globalClaudeAutopm = path.join(globalModules, '@claudeautopm');
117
+
118
+ if (fs.existsSync(globalClaudeAutopm)) {
119
+ const dirs = fs.readdirSync(globalClaudeAutopm);
120
+ for (const dir of dirs) {
121
+ if (dir.startsWith('plugin-')) {
122
+ const pluginPath = path.join(globalClaudeAutopm, dir);
123
+ scannedPaths.add(pluginPath);
124
+ }
125
+ }
126
+ }
127
+ } catch (error) {
128
+ // Global modules not accessible, skip
129
+ }
130
+
131
+ // Load metadata for each discovered plugin
132
+ for (const pluginPath of scannedPaths) {
133
+ try {
134
+ const pluginName = path.basename(pluginPath);
135
+ const metadata = await this.loadPluginMetadata(pluginName);
136
+ if (metadata) {
137
+ plugins.push(metadata);
138
+ }
139
+ } catch (error) {
140
+ console.warn(`Warning: Failed to load plugin metadata from ${pluginPath}: ${error.message}`);
141
+ }
142
+ }
143
+
144
+ return plugins;
145
+ }
146
+
147
+ /**
148
+ * Load plugin metadata from plugin.json
149
+ * @param {string} pluginName - Plugin name (e.g., 'plugin-cloud')
150
+ * @returns {Object} Plugin metadata
151
+ */
152
+ async loadPluginMetadata(pluginName) {
153
+ const pluginPath = this.getPluginPath(pluginName);
154
+ const metadataPath = path.join(pluginPath, 'plugin.json');
155
+
156
+ if (!fs.existsSync(metadataPath)) {
157
+ throw new Error(`Plugin metadata not found: ${metadataPath}`);
158
+ }
159
+
160
+ const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
161
+
162
+ // Validate metadata
163
+ this.validateMetadata(metadata);
164
+
165
+ // Add computed properties
166
+ metadata.path = pluginPath;
167
+ metadata.pluginName = pluginName;
168
+
169
+ return metadata;
170
+ }
171
+
172
+ /**
173
+ * Validate plugin metadata schema
174
+ * @param {Object} metadata - Plugin metadata to validate
175
+ * @throws {Error} If metadata is invalid
176
+ */
177
+ validateMetadata(metadata) {
178
+ const required = ['name', 'version', 'displayName', 'description', 'category', 'agents'];
179
+
180
+ for (const field of required) {
181
+ if (!metadata[field]) {
182
+ throw new Error(`Plugin metadata missing required field: ${field}`);
183
+ }
184
+ }
185
+
186
+ if (!Array.isArray(metadata.agents)) {
187
+ throw new Error('Plugin metadata "agents" must be an array');
188
+ }
189
+
190
+ // Validate each agent
191
+ for (const agent of metadata.agents) {
192
+ if (!agent.name || !agent.file || !agent.description) {
193
+ throw new Error('Agent metadata must have name, file, and description');
194
+ }
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Install plugin agents to .claude/agents/
200
+ * @param {string} pluginName - Plugin name (e.g., 'plugin-cloud')
201
+ * @returns {Object} Installation result
202
+ */
203
+ async installPlugin(pluginName) {
204
+ const metadata = await this.loadPluginMetadata(pluginName);
205
+ const pluginPath = this.getPluginPath(pluginName);
206
+ const targetDir = path.join(this.projectRoot, '.claude', 'agents', metadata.category);
207
+
208
+ // Create category directory
209
+ fs.ensureDirSync(targetDir);
210
+
211
+ const installedAgents = [];
212
+
213
+ // Copy agents
214
+ for (const agent of metadata.agents) {
215
+ const sourcePath = path.join(pluginPath, agent.file);
216
+ const targetPath = path.join(targetDir, path.basename(agent.file));
217
+
218
+ if (!fs.existsSync(sourcePath)) {
219
+ console.warn(`Warning: Agent file not found: ${sourcePath}`);
220
+ continue;
221
+ }
222
+
223
+ fs.copyFileSync(sourcePath, targetPath);
224
+ installedAgents.push({
225
+ name: agent.name,
226
+ file: targetPath,
227
+ description: agent.description
228
+ });
229
+ }
230
+
231
+ // Update registry
232
+ if (!this.registry.installed.includes(pluginName)) {
233
+ this.registry.installed.push(pluginName);
234
+ }
235
+ if (!this.registry.enabled.includes(pluginName)) {
236
+ this.registry.enabled.push(pluginName);
237
+ }
238
+ this.saveRegistry();
239
+
240
+ return {
241
+ success: true,
242
+ pluginName,
243
+ displayName: metadata.displayName,
244
+ category: metadata.category,
245
+ agentsInstalled: installedAgents.length,
246
+ agents: installedAgents
247
+ };
248
+ }
249
+
250
+ /**
251
+ * Uninstall plugin - remove agents and update registry
252
+ * @param {string} pluginName - Plugin name (e.g., 'plugin-cloud')
253
+ * @returns {Object} Uninstallation result
254
+ */
255
+ async uninstallPlugin(pluginName) {
256
+ const metadata = await this.loadPluginMetadata(pluginName);
257
+ const targetDir = path.join(this.projectRoot, '.claude', 'agents', metadata.category);
258
+
259
+ const removedAgents = [];
260
+
261
+ // Remove agents
262
+ for (const agent of metadata.agents) {
263
+ const targetPath = path.join(targetDir, path.basename(agent.file));
264
+ if (fs.existsSync(targetPath)) {
265
+ fs.unlinkSync(targetPath);
266
+ removedAgents.push(agent.name);
267
+ }
268
+ }
269
+
270
+ // Remove empty category directory
271
+ if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length === 0) {
272
+ fs.rmdirSync(targetDir);
273
+ }
274
+
275
+ // Update registry
276
+ this.registry.installed = this.registry.installed.filter(p => p !== pluginName);
277
+ this.registry.enabled = this.registry.enabled.filter(p => p !== pluginName);
278
+ this.saveRegistry();
279
+
280
+ return {
281
+ success: true,
282
+ pluginName,
283
+ agentsRemoved: removedAgents.length,
284
+ agents: removedAgents
285
+ };
286
+ }
287
+
288
+ /**
289
+ * Get list of installed plugins
290
+ * @returns {Array<string>} Array of plugin names
291
+ */
292
+ getInstalledPlugins() {
293
+ return this.registry.installed;
294
+ }
295
+
296
+ /**
297
+ * Get list of enabled plugins
298
+ * @returns {Array<string>} Array of plugin names
299
+ */
300
+ getEnabledPlugins() {
301
+ return this.registry.enabled;
302
+ }
303
+
304
+ /**
305
+ * Enable plugin
306
+ * @param {string} pluginName - Plugin name
307
+ */
308
+ enablePlugin(pluginName) {
309
+ if (!this.registry.installed.includes(pluginName)) {
310
+ throw new Error(`Plugin not installed: ${pluginName}`);
311
+ }
312
+ if (!this.registry.enabled.includes(pluginName)) {
313
+ this.registry.enabled.push(pluginName);
314
+ this.saveRegistry();
315
+ }
316
+ }
317
+
318
+ /**
319
+ * Disable plugin
320
+ * @param {string} pluginName - Plugin name
321
+ */
322
+ disablePlugin(pluginName) {
323
+ this.registry.enabled = this.registry.enabled.filter(p => p !== pluginName);
324
+ this.saveRegistry();
325
+ }
326
+
327
+ /**
328
+ * Check if plugin is installed
329
+ * @param {string} pluginName - Plugin name
330
+ * @returns {boolean} True if installed
331
+ */
332
+ isInstalled(pluginName) {
333
+ return this.registry.installed.includes(pluginName);
334
+ }
335
+
336
+ /**
337
+ * Check if plugin is enabled
338
+ * @param {string} pluginName - Plugin name
339
+ * @returns {boolean} True if enabled
340
+ */
341
+ isEnabled(pluginName) {
342
+ return this.registry.enabled.includes(pluginName);
343
+ }
344
+
345
+ /**
346
+ * Search plugins by keyword
347
+ * @param {string} keyword - Search keyword
348
+ * @returns {Array<Object>} Matching plugins
349
+ */
350
+ async searchPlugins(keyword) {
351
+ const allPlugins = await this.discoverPlugins();
352
+ const lowerKeyword = keyword.toLowerCase();
353
+
354
+ return allPlugins.filter(plugin => {
355
+ // Search in name
356
+ if (plugin.name.toLowerCase().includes(lowerKeyword)) {
357
+ return true;
358
+ }
359
+
360
+ // Search in display name
361
+ if (plugin.displayName.toLowerCase().includes(lowerKeyword)) {
362
+ return true;
363
+ }
364
+
365
+ // Search in description
366
+ if (plugin.description.toLowerCase().includes(lowerKeyword)) {
367
+ return true;
368
+ }
369
+
370
+ // Search in keywords
371
+ if (plugin.keywords && plugin.keywords.some(k => k.toLowerCase().includes(lowerKeyword))) {
372
+ return true;
373
+ }
374
+
375
+ // Search in agent names
376
+ if (plugin.agents.some(a => a.name.toLowerCase().includes(lowerKeyword))) {
377
+ return true;
378
+ }
379
+
380
+ return false;
381
+ });
382
+ }
383
+
384
+ /**
385
+ * Get plugin info
386
+ * @param {string} pluginName - Plugin name
387
+ * @returns {Object} Plugin metadata with status
388
+ */
389
+ async getPluginInfo(pluginName) {
390
+ const metadata = await this.loadPluginMetadata(pluginName);
391
+
392
+ return {
393
+ ...metadata,
394
+ installed: this.isInstalled(pluginName),
395
+ enabled: this.isEnabled(pluginName)
396
+ };
397
+ }
398
+ }
399
+
400
+ module.exports = PluginManager;
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "claude-autopm",
3
- "version": "2.8.1",
3
+ "version": "2.8.2",
4
4
  "description": "Autonomous Project Management Framework for Claude Code - Advanced AI-powered development automation",
5
5
  "main": "bin/autopm.js",
6
+ "workspaces": [
7
+ "packages/*"
8
+ ],
6
9
  "bin": {
7
10
  "autopm": "./bin/autopm.js",
8
11
  "autopm-poc": "./bin/autopm-poc.js"
@@ -0,0 +1,166 @@
1
+ #!/bin/bash
2
+ # Publish all ClaudeAutoPM plugins to npm
3
+ # Usage: ./scripts/publish-plugins.sh [--dry-run]
4
+
5
+ set -e # Exit on error
6
+
7
+ DRY_RUN=false
8
+ if [ "$1" = "--dry-run" ]; then
9
+ DRY_RUN=true
10
+ echo "πŸ§ͺ DRY RUN MODE - No actual publishing"
11
+ echo ""
12
+ fi
13
+
14
+ # Colors
15
+ RED='\033[0;31m'
16
+ GREEN='\033[0;32m'
17
+ YELLOW='\033[1;33m'
18
+ BLUE='\033[0;34m'
19
+ NC='\033[0m' # No Color
20
+
21
+ # Check npm login
22
+ echo -e "${BLUE}πŸ“‹ Pre-flight Checks${NC}"
23
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
24
+ echo ""
25
+
26
+ echo -n "Checking npm authentication... "
27
+ if ! npm whoami &>/dev/null; then
28
+ echo -e "${RED}βœ— Not logged in${NC}"
29
+ echo ""
30
+ echo "Please run: npm login"
31
+ exit 1
32
+ fi
33
+ echo -e "${GREEN}βœ“ Logged in as $(npm whoami)${NC}"
34
+
35
+ # Check if we're in the right directory
36
+ if [ ! -d "packages" ]; then
37
+ echo -e "${RED}βœ— packages/ directory not found${NC}"
38
+ echo "Please run this script from the AUTOPM root directory"
39
+ exit 1
40
+ fi
41
+
42
+ # Count plugins
43
+ PLUGIN_COUNT=$(find packages -name "plugin-*" -type d | wc -l | tr -d ' ')
44
+ echo -e "Found ${GREEN}$PLUGIN_COUNT${NC} plugins to publish"
45
+ echo ""
46
+
47
+ # List plugins
48
+ echo -e "${BLUE}πŸ“¦ Plugins to Publish${NC}"
49
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
50
+ echo ""
51
+
52
+ for plugin_dir in packages/plugin-*; do
53
+ plugin_name=$(basename "$plugin_dir")
54
+ package_name=$(grep '"name"' "$plugin_dir/package.json" | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/')
55
+ version=$(grep '"version"' "$plugin_dir/package.json" | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/')
56
+ agent_count=$(find "$plugin_dir/agents" -name "*.md" -not -name "README.md" | wc -l | tr -d ' ')
57
+
58
+ echo " β€’ $package_name@$version ($agent_count agents)"
59
+ done
60
+ echo ""
61
+
62
+ # Confirm before proceeding
63
+ if [ "$DRY_RUN" = false ]; then
64
+ echo -e "${YELLOW}⚠️ This will publish $PLUGIN_COUNT packages to npm${NC}"
65
+ read -p "Continue? (yes/no) " -r
66
+ echo ""
67
+ if [[ ! $REPLY =~ ^[Yy](es)?$ ]]; then
68
+ echo "Cancelled."
69
+ exit 0
70
+ fi
71
+ fi
72
+
73
+ # Publish each plugin
74
+ echo -e "${BLUE}πŸš€ Publishing Plugins${NC}"
75
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
76
+ echo ""
77
+
78
+ SUCCESS_COUNT=0
79
+ FAIL_COUNT=0
80
+ FAILED_PLUGINS=()
81
+
82
+ for plugin_dir in packages/plugin-*; do
83
+ plugin_name=$(basename "$plugin_dir")
84
+ package_name=$(grep '"name"' "$plugin_dir/package.json" | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/')
85
+ version=$(grep '"version"' "$plugin_dir/package.json" | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/')
86
+
87
+ echo -e "${BLUE}Publishing:${NC} $package_name@$version"
88
+
89
+ # Change to plugin directory
90
+ cd "$plugin_dir"
91
+
92
+ # Publish
93
+ if [ "$DRY_RUN" = true ]; then
94
+ # Dry run
95
+ if npm publish --dry-run --access public > /tmp/npm-publish.log 2>&1; then
96
+ echo -e " ${GREEN}βœ“ Dry run successful${NC}"
97
+ ((SUCCESS_COUNT++))
98
+ else
99
+ echo -e " ${RED}βœ— Dry run failed${NC}"
100
+ cat /tmp/npm-publish.log
101
+ ((FAIL_COUNT++))
102
+ FAILED_PLUGINS+=("$package_name")
103
+ fi
104
+ else
105
+ # Actual publish
106
+ if npm publish --access public 2>&1 | tee /tmp/npm-publish.log; then
107
+ echo -e " ${GREEN}βœ“ Published successfully${NC}"
108
+ ((SUCCESS_COUNT++))
109
+
110
+ # Verify
111
+ sleep 2
112
+ if npm view "$package_name@$version" > /dev/null 2>&1; then
113
+ echo -e " ${GREEN}βœ“ Verified on npm registry${NC}"
114
+ else
115
+ echo -e " ${YELLOW}⚠ Published but not yet visible on registry (may take a moment)${NC}"
116
+ fi
117
+ else
118
+ echo -e " ${RED}βœ— Publish failed${NC}"
119
+ cat /tmp/npm-publish.log
120
+ ((FAIL_COUNT++))
121
+ FAILED_PLUGINS+=("$package_name")
122
+ fi
123
+ fi
124
+
125
+ echo ""
126
+
127
+ # Return to root
128
+ cd - > /dev/null
129
+ done
130
+
131
+ # Summary
132
+ echo ""
133
+ echo -e "${BLUE}πŸ“Š Summary${NC}"
134
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
135
+ echo ""
136
+ echo -e "Total plugins: $PLUGIN_COUNT"
137
+ echo -e "${GREEN}Successful: $SUCCESS_COUNT${NC}"
138
+
139
+ if [ $FAIL_COUNT -gt 0 ]; then
140
+ echo -e "${RED}Failed: $FAIL_COUNT${NC}"
141
+ echo ""
142
+ echo -e "${RED}Failed plugins:${NC}"
143
+ for failed in "${FAILED_PLUGINS[@]}"; do
144
+ echo " β€’ $failed"
145
+ done
146
+ echo ""
147
+ exit 1
148
+ else
149
+ echo -e "${RED}Failed: 0${NC}"
150
+ echo ""
151
+
152
+ if [ "$DRY_RUN" = false ]; then
153
+ echo -e "${GREEN}πŸŽ‰ All plugins published successfully!${NC}"
154
+ echo ""
155
+ echo "Next steps:"
156
+ echo " 1. Verify on npm: https://www.npmjs.com/org/claudeautopm"
157
+ echo " 2. Test installation: npm install -g @claudeautopm/plugin-cloud"
158
+ echo " 3. Update CHANGELOG.md"
159
+ echo " 4. Tag release: git tag v2.8.1 && git push origin v2.8.1"
160
+ else
161
+ echo -e "${GREEN}πŸŽ‰ All dry runs successful!${NC}"
162
+ echo ""
163
+ echo "Ready to publish for real:"
164
+ echo " ./scripts/publish-plugins.sh"
165
+ fi
166
+ fi
@@ -1,55 +0,0 @@
1
- # Cloud & Infrastructure Agents
2
-
3
- Specialized agents for cloud platforms and infrastructure management. These agents understand cloud services, IaC patterns, and cost optimization.
4
-
5
- ## Available Agents
6
-
7
- ### ☁️ aws-cloud-architect
8
- - **Services**: EC2, Lambda, EKS, RDS, S3
9
- - **IaC**: CloudFormation, CDK, Terraform
10
- - **Features**: Cost optimization, security best practices
11
-
12
- ### πŸ”· azure-cloud-architect
13
- - **Services**: AKS, App Service, Functions, CosmosDB
14
- - **IaC**: ARM Templates, Bicep, Terraform
15
- - **Features**: Azure AD integration, hybrid cloud
16
-
17
- ### πŸ”΅ gcp-cloud-architect
18
- - **Services**: GKE, Cloud Run, Functions, BigQuery
19
- - **IaC**: Deployment Manager, Terraform
20
- - **Features**: AI/ML services, data analytics
21
-
22
- ### ☸️ kubernetes-orchestrator
23
- - **Expertise**: K8s manifests, Helm charts, operators
24
- - **GitOps**: ArgoCD, Flux, Kustomize
25
- - **Features**: Service mesh, monitoring, scaling
26
-
27
- ### ☁️ gcp-cloud-functions-engineer
28
- - **Expertise**: Serverless functions on GCP, event-driven architecture
29
- - **Runtimes**: Python, Node.js, Go for Cloud Functions
30
- - **Features**: Pub/Sub triggers, Firestore events, HTTP functions
31
- - **Integration**: GCP services, Secret Manager, Cloud Build
32
-
33
- ## Planned Agents
34
-
35
- ### πŸ”§ terraform-infrastructure-engineer
36
- - **Expertise**: Terraform, Terragrunt, modules
37
- - **Providers**: Multi-cloud support
38
- - **Features**: State management, drift detection
39
-
40
- ### πŸ“¦ docker-container-engineer
41
- - **Expertise**: Docker, Compose, multi-stage builds
42
- - **Registries**: DockerHub, ECR, ACR, GCR
43
- - **Security**: Image scanning, best practices
44
-
45
- ### 🌐 cdn-edge-engineer
46
- - **Expertise**: CloudFlare, Fastly, Akamai
47
- - **Features**: Edge functions, caching, WAF
48
-
49
- ## Cloud Best Practices
50
-
51
- All cloud agents follow:
52
- 1. **Security First**: IAM, encryption, network isolation
53
- 2. **Cost Optimization**: Right-sizing, spot instances, reserved capacity
54
- 3. **High Availability**: Multi-AZ, load balancing, auto-scaling
55
- 4. **IaC**: Everything as code, version controlled