@within-7/minto 0.3.6 → 0.3.10

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 (238) hide show
  1. package/{cli.js → cli.cjs} +25 -23
  2. package/dist/commands/agents/AgentsCommand.js +459 -655
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/agents/types.js +1 -0
  5. package/dist/commands/agents/types.js.map +2 -2
  6. package/dist/commands/agents/utils/fileOperations.js +96 -36
  7. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  8. package/dist/commands/agents/utils/index.js +3 -1
  9. package/dist/commands/agents/utils/index.js.map +2 -2
  10. package/dist/commands/context.js +54 -23
  11. package/dist/commands/context.js.map +2 -2
  12. package/dist/commands/export.js +673 -93
  13. package/dist/commands/export.js.map +2 -2
  14. package/dist/commands/language.js +110 -0
  15. package/dist/commands/language.js.map +7 -0
  16. package/dist/commands/mcp-interactive.js +419 -217
  17. package/dist/commands/mcp-interactive.js.map +2 -2
  18. package/dist/commands/model.js +415 -66
  19. package/dist/commands/model.js.map +2 -2
  20. package/dist/commands/new.js +56 -0
  21. package/dist/commands/new.js.map +7 -0
  22. package/dist/commands/permissions.js +75 -49
  23. package/dist/commands/permissions.js.map +2 -2
  24. package/dist/commands/plugin.js +882 -185
  25. package/dist/commands/plugin.js.map +3 -3
  26. package/dist/commands/resume.js +251 -16
  27. package/dist/commands/resume.js.map +2 -2
  28. package/dist/commands/sandbox.js +168 -70
  29. package/dist/commands/sandbox.js.map +2 -2
  30. package/dist/commands/sessions.js +224 -0
  31. package/dist/commands/sessions.js.map +7 -0
  32. package/dist/commands/setup.js +596 -109
  33. package/dist/commands/setup.js.map +2 -2
  34. package/dist/commands/stats.js +292 -0
  35. package/dist/commands/stats.js.map +7 -0
  36. package/dist/commands/status.js +75 -7
  37. package/dist/commands/status.js.map +2 -2
  38. package/dist/commands/undo.js +154 -180
  39. package/dist/commands/undo.js.map +2 -2
  40. package/dist/commands.js +6 -0
  41. package/dist/commands.js.map +2 -2
  42. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  43. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  44. package/dist/components/Config.js +9 -8
  45. package/dist/components/Config.js.map +2 -2
  46. package/dist/components/HeaderBar.js +2 -1
  47. package/dist/components/HeaderBar.js.map +2 -2
  48. package/dist/components/Help.js +166 -32
  49. package/dist/components/Help.js.map +2 -2
  50. package/dist/components/HotkeyHelpPanel.js +46 -44
  51. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  52. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  53. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  54. package/dist/components/InfoPanel/index.js +5 -0
  55. package/dist/components/InfoPanel/index.js.map +7 -0
  56. package/dist/components/InfoPanel/types.js +1 -0
  57. package/dist/components/InfoPanel/types.js.map +7 -0
  58. package/dist/components/Logo.js +5 -2
  59. package/dist/components/Logo.js.map +2 -2
  60. package/dist/components/MCPServerApprovalDialog.js +6 -5
  61. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  62. package/dist/components/MCPServerMultiselectDialog.js +5 -4
  63. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  64. package/dist/components/MessageSelector.js +4 -3
  65. package/dist/components/MessageSelector.js.map +2 -2
  66. package/dist/components/ModelConfig.js +13 -12
  67. package/dist/components/ModelConfig.js.map +2 -2
  68. package/dist/components/ModelListManager.js +4 -3
  69. package/dist/components/ModelListManager.js.map +2 -2
  70. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  71. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  72. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  73. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  74. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  75. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  76. package/dist/components/ModelSelector/index.js +1 -3
  77. package/dist/components/ModelSelector/index.js.map +2 -2
  78. package/dist/components/PromptInput.js +77 -44
  79. package/dist/components/PromptInput.js.map +2 -2
  80. package/dist/components/SensitiveFileWarning.js +12 -8
  81. package/dist/components/SensitiveFileWarning.js.map +2 -2
  82. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  83. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  84. package/dist/components/SimpleSelector/index.js +5 -0
  85. package/dist/components/SimpleSelector/index.js.map +7 -0
  86. package/dist/components/SimpleSelector/types.js +1 -0
  87. package/dist/components/SimpleSelector/types.js.map +7 -0
  88. package/dist/components/StatusOverlayContent.js +21 -0
  89. package/dist/components/StatusOverlayContent.js.map +7 -0
  90. package/dist/components/TabbedListView/ScrollableList.js +117 -0
  91. package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
  92. package/dist/components/TabbedListView/SearchInput.js +23 -0
  93. package/dist/components/TabbedListView/SearchInput.js.map +7 -0
  94. package/dist/components/TabbedListView/TabBar.js +20 -0
  95. package/dist/components/TabbedListView/TabBar.js.map +7 -0
  96. package/dist/components/TabbedListView/TabbedListView.js +246 -0
  97. package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
  98. package/dist/components/TabbedListView/index.js +11 -0
  99. package/dist/components/TabbedListView/index.js.map +7 -0
  100. package/dist/components/TabbedListView/types.js +1 -0
  101. package/dist/components/TabbedListView/types.js.map +7 -0
  102. package/dist/components/TodoChangeBlock.js +6 -5
  103. package/dist/components/TodoChangeBlock.js.map +3 -3
  104. package/dist/components/TodoPanel.js +6 -3
  105. package/dist/components/TodoPanel.js.map +3 -3
  106. package/dist/components/TrustDialog.js +6 -5
  107. package/dist/components/TrustDialog.js.map +2 -2
  108. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
  109. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
  110. package/dist/constants/macros.js +1 -1
  111. package/dist/constants/macros.js.map +1 -1
  112. package/dist/constants/product.js +2 -2
  113. package/dist/constants/product.js.map +1 -1
  114. package/dist/constants/prompts.js +17 -0
  115. package/dist/constants/prompts.js.map +2 -2
  116. package/dist/constants/toolInputExamples.js +5 -1
  117. package/dist/constants/toolInputExamples.js.map +2 -2
  118. package/dist/core/backupHook.js +29 -0
  119. package/dist/core/backupHook.js.map +7 -0
  120. package/dist/core/config/defaults.js +8 -2
  121. package/dist/core/config/defaults.js.map +2 -2
  122. package/dist/core/config/schema.js +14 -2
  123. package/dist/core/config/schema.js.map +2 -2
  124. package/dist/core/costTracker.js +0 -16
  125. package/dist/core/costTracker.js.map +2 -2
  126. package/dist/core/tokenStatsManager.js +5 -0
  127. package/dist/core/tokenStatsManager.js.map +2 -2
  128. package/dist/cost-tracker.js +0 -16
  129. package/dist/cost-tracker.js.map +2 -2
  130. package/dist/entrypoints/bootstrap.js +56 -0
  131. package/dist/entrypoints/bootstrap.js.map +7 -0
  132. package/dist/entrypoints/cli.js +164 -23
  133. package/dist/entrypoints/cli.js.map +3 -3
  134. package/dist/history.js +75 -15
  135. package/dist/history.js.map +2 -2
  136. package/dist/i18n/index.js +2 -2
  137. package/dist/i18n/index.js.map +2 -2
  138. package/dist/i18n/locales/en.js +582 -1
  139. package/dist/i18n/locales/en.js.map +2 -2
  140. package/dist/i18n/locales/zh-CN.js +582 -1
  141. package/dist/i18n/locales/zh-CN.js.map +2 -2
  142. package/dist/i18n/types.js.map +1 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +2 -2
  145. package/dist/messages.js +11 -0
  146. package/dist/messages.js.map +2 -2
  147. package/dist/permissions.js.map +2 -2
  148. package/dist/query.js +9 -0
  149. package/dist/query.js.map +2 -2
  150. package/dist/screens/REPL.js +45 -7
  151. package/dist/screens/REPL.js.map +2 -2
  152. package/dist/services/customCommands.js +44 -16
  153. package/dist/services/customCommands.js.map +2 -2
  154. package/dist/services/plugins/lspServers.js +1 -1
  155. package/dist/services/plugins/lspServers.js.map +2 -2
  156. package/dist/services/plugins/pluginRuntime.js +2 -1
  157. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  158. package/dist/services/plugins/pluginValidation.js +10 -3
  159. package/dist/services/plugins/pluginValidation.js.map +2 -2
  160. package/dist/services/plugins/skillMarketplace.js +16 -8
  161. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  162. package/dist/services/systemReminder.js +17 -6
  163. package/dist/services/systemReminder.js.map +2 -2
  164. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  165. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  166. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  167. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  168. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  169. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  170. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  171. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  172. package/dist/tools/TaskTool/TaskTool.js +179 -1
  173. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  174. package/dist/tools/TodoWriteTool/prompt.js +21 -0
  175. package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
  176. package/dist/tools/URLFetcherTool/prompt.js +14 -9
  177. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  178. package/dist/tools/WebSearchTool/prompt.js +12 -6
  179. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  180. package/dist/types/PermissionMode.js +30 -1
  181. package/dist/types/PermissionMode.js.map +2 -2
  182. package/dist/types/plugin.js +2 -4
  183. package/dist/types/plugin.js.map +2 -2
  184. package/dist/utils/agentHookExecutor.js +103 -0
  185. package/dist/utils/agentHookExecutor.js.map +7 -0
  186. package/dist/utils/agentLoader.js +272 -32
  187. package/dist/utils/agentLoader.js.map +2 -2
  188. package/dist/utils/agentMemory.js +134 -0
  189. package/dist/utils/agentMemory.js.map +7 -0
  190. package/dist/utils/claudeCodeSync.js +439 -0
  191. package/dist/utils/claudeCodeSync.js.map +7 -0
  192. package/dist/utils/config.js +52 -24
  193. package/dist/utils/config.js.map +2 -2
  194. package/dist/utils/configPaths.js +199 -0
  195. package/dist/utils/configPaths.js.map +7 -0
  196. package/dist/utils/execFileNoThrow.js +2 -1
  197. package/dist/utils/execFileNoThrow.js.map +2 -2
  198. package/dist/utils/historyManager.js +234 -0
  199. package/dist/utils/historyManager.js.map +7 -0
  200. package/dist/utils/marketplaceManager.js +80 -43
  201. package/dist/utils/marketplaceManager.js.map +2 -2
  202. package/dist/utils/messages.js +13 -8
  203. package/dist/utils/messages.js.map +2 -2
  204. package/dist/utils/migration/index.js +37 -0
  205. package/dist/utils/migration/index.js.map +7 -0
  206. package/dist/utils/migration/migrateHistory.js +273 -0
  207. package/dist/utils/migration/migrateHistory.js.map +7 -0
  208. package/dist/utils/migration/migrateTodos.js +323 -0
  209. package/dist/utils/migration/migrateTodos.js.map +7 -0
  210. package/dist/utils/pasteCache.js +309 -0
  211. package/dist/utils/pasteCache.js.map +7 -0
  212. package/dist/utils/pluginInstaller.js +34 -24
  213. package/dist/utils/pluginInstaller.js.map +2 -2
  214. package/dist/utils/pluginLoader.js +54 -28
  215. package/dist/utils/pluginLoader.js.map +2 -2
  216. package/dist/utils/repoFetcher.js +110 -0
  217. package/dist/utils/repoFetcher.js.map +7 -0
  218. package/dist/utils/sessionIndex.js +192 -0
  219. package/dist/utils/sessionIndex.js.map +7 -0
  220. package/dist/utils/sessionTracker.js +170 -0
  221. package/dist/utils/sessionTracker.js.map +7 -0
  222. package/dist/utils/skillLoader.js +103 -5
  223. package/dist/utils/skillLoader.js.map +2 -2
  224. package/dist/utils/stats.js +417 -0
  225. package/dist/utils/stats.js.map +7 -0
  226. package/dist/utils/stringSubstitution.js +106 -0
  227. package/dist/utils/stringSubstitution.js.map +7 -0
  228. package/dist/utils/teamConfig.js +156 -14
  229. package/dist/utils/teamConfig.js.map +2 -2
  230. package/dist/utils/terminal.js +1 -1
  231. package/dist/utils/terminal.js.map +2 -2
  232. package/dist/utils/todoStorage.js +51 -19
  233. package/dist/utils/todoStorage.js.map +2 -2
  234. package/dist/utils/tooling/safeRender.js.map +2 -2
  235. package/dist/version.js +2 -2
  236. package/dist/version.js.map +1 -1
  237. package/package.json +71 -28
  238. package/scripts/{postinstall.js → postinstall.cjs} +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/plugin.tsx"],
4
- "sourcesContent": ["import React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Command } from '@commands'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n loadAllPlugins,\n getPlugin,\n listPlugins,\n loadPlugin,\n} from '@utils/pluginLoader'\nimport {\n addMarketplace,\n removeMarketplace,\n updateMarketplace,\n listMarketplaces,\n getMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { LoadedPlugin, PluginManifest, PluginError } from '../types/plugin'\nimport { RegisteredMarketplace, MarketplaceError } from '../types/marketplace'\nimport { rmSync } from 'fs'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\n// Interactive UI components\nimport { MainMenu } from './plugin/MainMenu'\nimport { PlaceholderScreen } from './plugin/PlaceholderScreen'\nimport { MarketplaceSelector } from './plugin/MarketplaceSelector'\nimport { PluginBrowser } from './plugin/PluginBrowser'\nimport { PluginDetailsInstall } from './plugin/PluginDetailsInstall'\nimport { InstalledPluginsManager } from './plugin/InstalledPluginsManager'\nimport { InstalledPluginsByMarketplace } from './plugin/InstalledPluginsByMarketplace'\nimport { PluginDetailsManage } from './plugin/PluginDetailsManage'\nimport { AddMarketplaceForm } from './plugin/AddMarketplaceForm'\nimport { MarketplaceManager } from './plugin/MarketplaceManager'\nimport type { PluginUIState } from './plugin/types'\n\n/**\n * Plugin Command - Comprehensive plugin management for Minto CLI\n *\n * Implements all plugin management commands following Claude Code specification:\n * - /plugin list - List all installed plugins\n * - /plugin info <name> - Show detailed plugin information\n * - /plugin install <name>[@marketplace] - Install plugin from marketplace\n * - /plugin uninstall <name> - Remove installed plugin\n * - /plugin validate [name] - Validate plugin manifest and components\n * - /plugin marketplace add <source> - Register new marketplace\n * - /plugin marketplace list - List registered marketplaces\n * - /plugin marketplace update <name> - Update marketplace manifest\n * - /plugin marketplace remove <name> - Unregister marketplace\n */\n\n// ============================================================================\n// Component: Plugin List View\n// ============================================================================\n\ninterface PluginListProps {\n onDone: () => void\n}\n\nconst PluginList: React.FC<PluginListProps> = ({ onDone }) => {\n const [plugins, setPlugins] = useState<LoadedPlugin[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const theme = getTheme()\n\n useEffect(() => {\n try {\n const loadedPlugins = loadAllPlugins()\n setPlugins(loadedPlugins)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n onDone()\n }\n }, [onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Loading plugins...</Text>\n }\n\n if (error) {\n return <Text color={theme.error}>Error: {error}</Text>\n }\n\n if (plugins.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>No plugins installed.</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Install plugins with: /plugin install &lt;name&gt;[@marketplace]\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.success}>\n Installed Plugins ({plugins.length})\n </Text>\n <Text>{''}</Text>\n {plugins.map(plugin => {\n const componentCounts = [\n plugin.agents.length > 0 &&\n `${plugin.agents.length} agent${plugin.agents.length !== 1 ? 's' : ''}`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command${plugin.commands.length !== 1 ? 's' : ''}`,\n plugin.skills.length > 0 &&\n `${plugin.skills.length} skill${plugin.skills.length !== 1 ? 's' : ''}`,\n plugin.hooks.length > 0 &&\n `${plugin.hooks.length} hook${plugin.hooks.length !== 1 ? 's' : ''}`,\n plugin.mcpServers.length > 0 &&\n `${plugin.mcpServers.length} MCP server${plugin.mcpServers.length !== 1 ? 's' : ''}`,\n ].filter(Boolean)\n\n return (\n <Box\n key={plugin.manifest.name}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Box>\n <Text color={theme.primary} bold>\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n v{plugin.manifest.version}\n </Text>\n {!plugin.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n {plugin.manifest.description && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {plugin.manifest.description}\n </Text>\n )}\n {componentCounts.length > 0 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Components: {componentCounts.join(', ')}\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Location:{' '}\n {plugin.source.type === 'local'\n ? plugin.source.path\n : plugin.location}\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Info View\n// ============================================================================\n\ninterface PluginInfoProps {\n pluginName: string\n onDone: () => void\n}\n\nconst PluginInfo: React.FC<PluginInfoProps> = ({ pluginName, onDone }) => {\n const [plugin, setPlugin] = useState<LoadedPlugin | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const theme = getTheme()\n\n useEffect(() => {\n try {\n const loadedPlugin = getPlugin(pluginName)\n if (!loadedPlugin) {\n setError(`Plugin \"${pluginName}\" not found`)\n } else {\n setPlugin(loadedPlugin)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n onDone()\n }\n }, [pluginName, onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Loading plugin info...</Text>\n }\n\n if (error || !plugin) {\n return <Text color={theme.error}>Error: {error || 'Plugin not found'}</Text>\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.success}>\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n <Text>{''}</Text>\n\n <Box flexDirection=\"column\">\n <Text>\n <Text color={theme.primary}>Name:</Text> {plugin.manifest.name}\n </Text>\n <Text>\n <Text color={theme.primary}>Version:</Text> {plugin.manifest.version}\n </Text>\n {plugin.manifest.description && (\n <Text>\n <Text color={theme.primary}>Description:</Text>{' '}\n {plugin.manifest.description}\n </Text>\n )}\n {plugin.manifest.author && (\n <Text>\n <Text color={theme.primary}>Author:</Text> {plugin.manifest.author}\n </Text>\n )}\n {plugin.manifest.license && (\n <Text>\n <Text color={theme.primary}>License:</Text>{' '}\n {plugin.manifest.license}\n </Text>\n )}\n {plugin.manifest.homepage && (\n <Text>\n <Text color={theme.primary}>Homepage:</Text>{' '}\n {plugin.manifest.homepage}\n </Text>\n )}\n {plugin.manifest.repository && (\n <Text>\n <Text color={theme.primary}>Repository:</Text>{' '}\n {plugin.manifest.repository}\n </Text>\n )}\n <Text>\n <Text color={theme.primary}>Location:</Text> {plugin.location}\n </Text>\n <Text>\n <Text color={theme.primary}>Source:</Text> {plugin.source.type}\n </Text>\n <Text>\n <Text color={theme.primary}>Enabled:</Text>{' '}\n {plugin.enabled ? 'Yes' : 'No'}\n </Text>\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Components:\n </Text>\n\n {plugin.agents.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Agents ({plugin.agents.length}):</Text>\n {plugin.agents.map(agent => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {agent.name}\n {agent.config.description ? ` - ${agent.config.description}` : ''}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.commands.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>\n Commands ({plugin.commands.length}):\n </Text>\n {plugin.commands.map(command => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 /{command.name}\n {command.config.description\n ? ` - ${command.config.description}`\n : ''}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.skills.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Skills ({plugin.skills.length}):</Text>\n {plugin.skills.map(skill => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {skill.name}\n {skill.config.description ? ` - ${skill.config.description}` : ''}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.hooks.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Hooks ({plugin.hooks.length}):</Text>\n {plugin.hooks.map(hook => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {hook.name} ({hook.config.event})\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.mcpServers.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>\n MCP Servers ({plugin.mcpServers.length}):\n </Text>\n {plugin.mcpServers.map(server => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {server.name} - {server.config.command}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.agents.length === 0 &&\n plugin.commands.length === 0 &&\n plugin.skills.length === 0 &&\n plugin.hooks.length === 0 &&\n plugin.mcpServers.length === 0 && (\n <Text color={SEMANTIC_COLORS.dim}> No components loaded</Text>\n )}\n\n {plugin.manifest.engines && (\n <>\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Requirements:\n </Text>\n {plugin.manifest.engines.minto && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Minto: {plugin.manifest.engines.minto}\n </Text>\n )}\n {plugin.manifest.engines['claude-code'] && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Claude Code: {plugin.manifest.engines['claude-code']}\n </Text>\n )}\n {plugin.manifest.engines.node && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Node: {plugin.manifest.engines.node}\n </Text>\n )}\n </>\n )}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Install View\n// ============================================================================\n\ninterface PluginInstallProps {\n pluginSpec: string\n onDone: () => void\n}\n\nconst PluginInstall: React.FC<PluginInstallProps> = ({\n pluginSpec,\n onDone,\n}) => {\n const [status, setStatus] = useState<'installing' | 'success' | 'error'>(\n 'installing',\n )\n const [message, setMessage] = useState('')\n const [installedPath, setInstalledPath] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const installPlugin = async () => {\n try {\n // Parse plugin spec: name[@marketplace]\n const [pluginName, marketplaceName] = pluginSpec.split('@')\n\n if (!pluginName) {\n throw new Error('Plugin name is required')\n }\n\n setMessage(\n `Installing plugin \"${pluginName}\"${marketplaceName ? ` from marketplace \"${marketplaceName}\"` : ''}...`,\n )\n\n const path = await installPluginFromMarketplace(\n pluginName,\n marketplaceName,\n )\n\n setInstalledPath(path)\n setMessage(`Successfully installed \"${pluginName}\" to ${path}`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Installation failed: ${err.message}`)\n } else {\n setMessage(\n `Installation failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n installPlugin()\n }, [pluginSpec, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return (\n <Box flexDirection=\"column\">\n <Text color={color}>{message}</Text>\n {status === 'success' && (\n <>\n <Text>{''}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Plugin is now available. Use /plugin info {pluginSpec.split('@')[0]}{' '}\n to see details.\n </Text>\n </>\n )}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Uninstall View\n// ============================================================================\n\ninterface PluginUninstallProps {\n pluginName: string\n onDone: () => void\n}\n\nconst PluginUninstall: React.FC<PluginUninstallProps> = ({\n pluginName,\n onDone,\n}) => {\n const [status, setStatus] = useState<'uninstalling' | 'success' | 'error'>(\n 'uninstalling',\n )\n const [message, setMessage] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const uninstallPlugin = () => {\n try {\n setMessage(`Uninstalling plugin \"${pluginName}\"...`)\n\n const plugin = getPlugin(pluginName)\n if (!plugin) {\n throw new Error(`Plugin \"${pluginName}\" not found`)\n }\n\n // Remove plugin directory\n rmSync(plugin.location, { recursive: true, force: true })\n\n setMessage(`Successfully uninstalled \"${pluginName}\"`)\n setStatus('success')\n } catch (err) {\n setMessage(\n `Uninstallation failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n uninstallPlugin()\n }, [pluginName, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return <Text color={color}>{message}</Text>\n}\n\n// ============================================================================\n// Component: Plugin Validate View\n// ============================================================================\n\ninterface PluginValidateProps {\n pluginName?: string\n onDone: () => void\n}\n\nconst PluginValidate: React.FC<PluginValidateProps> = ({\n pluginName,\n onDone,\n}) => {\n const [results, setResults] = useState<\n Array<{ plugin: string; valid: boolean; errors: string[] }>\n >([])\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n useEffect(() => {\n const validatePlugins = () => {\n try {\n const pluginsToValidate = pluginName\n ? [{ name: pluginName, path: '', manifest: undefined }]\n : listPlugins()\n\n const validationResults = pluginsToValidate.map(({ name, path }) => {\n const errors: string[] = []\n\n try {\n const plugin = getPlugin(name)\n\n if (!plugin) {\n errors.push('Plugin not found')\n return { plugin: name, valid: false, errors }\n }\n\n // Validate manifest required fields\n if (!plugin.manifest.name)\n errors.push('Missing required field: name')\n if (!plugin.manifest.version)\n errors.push('Missing required field: version')\n if (!plugin.manifest.description)\n errors.push('Missing required field: description')\n\n // Validate version format\n if (\n plugin.manifest.version &&\n !/^\\d+\\.\\d+\\.\\d+$/.test(plugin.manifest.version)\n ) {\n errors.push('Invalid version format (must be semver: X.Y.Z)')\n }\n\n // Validate name format\n if (\n plugin.manifest.name &&\n !/^[a-z0-9-]+$/.test(plugin.manifest.name)\n ) {\n errors.push(\n 'Invalid name format (must be lowercase alphanumeric with hyphens)',\n )\n }\n\n // Validate component paths exist\n const checkComponents = (items: any[], type: string) => {\n items.forEach(item => {\n if (!item.filePath) {\n errors.push(`${type} \"${item.name}\" has no file path`)\n }\n })\n }\n\n checkComponents(plugin.agents, 'Agent')\n checkComponents(plugin.commands, 'Command')\n checkComponents(plugin.skills, 'Skill')\n\n return { plugin: name, valid: errors.length === 0, errors }\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err))\n return { plugin: name, valid: false, errors }\n }\n })\n\n setResults(validationResults)\n } finally {\n setLoading(false)\n onDone()\n }\n }\n\n validatePlugins()\n }, [pluginName, onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Validating plugins...</Text>\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.primary}>\n Plugin Validation Results\n </Text>\n <Text>{''}</Text>\n {results.map(result => (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={result.valid ? theme.success : theme.error}>\n {result.valid ? '\u2713' : '\u2717'}\n </Text>\n <Text> {result.plugin}</Text>\n {result.valid && <Text color={theme.success}> - Valid</Text>}\n </Box>\n {result.errors.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {result.errors.map((error, idx) => (\n <Text color={theme.error}>\u2022 {error}</Text>\n ))}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Marketplace List View\n// ============================================================================\n\ninterface MarketplaceListProps {\n onDone: () => void\n}\n\nconst MarketplaceListView: React.FC<MarketplaceListProps> = ({ onDone }) => {\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n useEffect(() => {\n try {\n const registered = listMarketplaces()\n setMarketplaces(registered)\n } finally {\n setLoading(false)\n onDone()\n }\n }, [onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Loading marketplaces...</Text>\n }\n\n if (marketplaces.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>No marketplaces registered.</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Register a marketplace with: /plugin marketplace add &lt;source&gt;\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.success}>\n Registered Marketplaces ({marketplaces.length})\n </Text>\n <Text>{''}</Text>\n {marketplaces.map(marketplace => (\n <Box key={marketplace.name} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={theme.primary} bold>\n {marketplace.name}\n </Text>\n {!marketplace.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n {marketplace.manifest.metadata?.description && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {marketplace.manifest.metadata.description}\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n {` Plugins: ${marketplace.manifest.plugins.length}`}\n {` | Owner: ${marketplace.manifest.owner.name}`}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {` Source: ${marketplace.source.type}`}\n {marketplace.source.type === 'github' &&\n ` (${marketplace.source.repo})`}\n {marketplace.source.type === 'url' &&\n ` (${marketplace.source.url})`}\n {marketplace.source.type === 'local' &&\n ` (${marketplace.source.path})`}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {` Last updated: ${new Date(marketplace.lastUpdated).toLocaleString()}`}\n </Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Marketplace Add View\n// ============================================================================\n\ninterface MarketplaceAddProps {\n source: string\n onDone: () => void\n}\n\nconst MarketplaceAdd: React.FC<MarketplaceAddProps> = ({ source, onDone }) => {\n const [status, setStatus] = useState<'adding' | 'success' | 'error'>('adding')\n const [message, setMessage] = useState('')\n const [marketplace, setMarketplace] = useState<RegisteredMarketplace | null>(\n null,\n )\n const theme = getTheme()\n\n useEffect(() => {\n const addMarketplaceAsync = async () => {\n try {\n setMessage(`Registering marketplace from \"${source}\"...`)\n const registered = await addMarketplace(source)\n setMarketplace(registered)\n setMessage(`Successfully registered marketplace \"${registered.name}\"`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Registration failed: ${err.message}`)\n } else {\n setMessage(\n `Registration failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n addMarketplaceAsync()\n }, [source, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return (\n <Box flexDirection=\"column\">\n <Text color={color}>{message}</Text>\n {status === 'success' && marketplace && (\n <>\n <Text>{''}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Marketplace contains {marketplace.manifest.plugins.length} plugin(s)\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Use /plugin marketplace list to see all marketplaces\n </Text>\n </>\n )}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Marketplace Update View\n// ============================================================================\n\ninterface MarketplaceUpdateProps {\n name: string\n onDone: () => void\n}\n\nconst MarketplaceUpdate: React.FC<MarketplaceUpdateProps> = ({\n name,\n onDone,\n}) => {\n const [status, setStatus] = useState<'updating' | 'success' | 'error'>(\n 'updating',\n )\n const [message, setMessage] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const updateMarketplaceAsync = async () => {\n try {\n setMessage(`Updating marketplace \"${name}\"...`)\n await updateMarketplace(name)\n setMessage(`Successfully updated marketplace \"${name}\"`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Update failed: ${err.message}`)\n } else {\n setMessage(\n `Update failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n updateMarketplaceAsync()\n }, [name, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return <Text color={color}>{message}</Text>\n}\n\n// ============================================================================\n// Component: Marketplace Remove View\n// ============================================================================\n\ninterface MarketplaceRemoveProps {\n name: string\n onDone: () => void\n}\n\nconst MarketplaceRemove: React.FC<MarketplaceRemoveProps> = ({\n name,\n onDone,\n}) => {\n const [status, setStatus] = useState<'removing' | 'success' | 'error'>(\n 'removing',\n )\n const [message, setMessage] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const removeMarketplaceSync = () => {\n try {\n setMessage(`Removing marketplace \"${name}\"...`)\n removeMarketplace(name)\n setMessage(`Successfully removed marketplace \"${name}\"`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Removal failed: ${err.message}`)\n } else {\n setMessage(\n `Removal failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n removeMarketplaceSync()\n }, [name, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return <Text color={color}>{message}</Text>\n}\n\n// ============================================================================\n// Error Message Component\n// ============================================================================\n\nconst ErrorMessage: React.FC<{ message: string; onDone: () => void }> = ({\n message,\n onDone,\n}) => {\n const theme = getTheme()\n\n React.useEffect(() => {\n onDone()\n }, [onDone])\n\n return <Text color={theme.error}>Error: {message}</Text>\n}\n\n// ============================================================================\n// Component: Marketplace Details View\n// ============================================================================\n\nconst MarketplaceDetails: React.FC<{\n marketplace: string\n onNavigate: (state: PluginUIState) => void\n onBack: () => void\n onDone: () => void\n}> = ({ marketplace: marketplaceName, onNavigate, onBack, onDone }) => {\n const theme = getTheme()\n const [removing, setRemoving] = useState(false)\n const [updating, setUpdating] = useState(false)\n const [error, setError] = useState<string>()\n\n const marketplace = listMarketplaces().find(\n (m: RegisteredMarketplace) => m.name === marketplaceName,\n )\n\n useInput((input, key) => {\n if (key.escape) onBack()\n else if (input === 'r' && !removing && !updating) {\n setRemoving(true)\n removeMarketplaceAction()\n } else if (input === 'u' && !removing && !updating) {\n setUpdating(true)\n updateMarketplaceAction()\n } else if (input === 'p' && !removing && !updating) {\n onNavigate({\n screen: 'installed-plugins-by-marketplace',\n marketplace: marketplaceName,\n })\n }\n })\n\n const removeMarketplaceAction = () => {\n try {\n removeMarketplace(marketplaceName)\n onBack()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n setRemoving(false)\n }\n }\n\n const updateMarketplaceAction = async () => {\n try {\n await updateMarketplace(marketplaceName)\n setUpdating(false)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n setUpdating(false)\n }\n }\n\n if (!marketplace) {\n return (\n <Box padding={1}>\n <Text color={theme.error}>\n Marketplace not found: {marketplaceName}\n </Text>\n </Box>\n )\n }\n\n if (removing) {\n return (\n <Box padding={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Removing marketplace...</Text>\n </Box>\n )\n }\n\n if (updating) {\n return (\n <Box padding={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Updating marketplace...</Text>\n </Box>\n )\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Text bold color={theme.success}>\n {marketplace.name}\n </Text>\n\n {marketplace.manifest.metadata?.description && (\n <Box marginTop={1}>\n <Text>{marketplace.manifest.metadata.description}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text>Plugins: </Text>\n <Text color={theme.primary}>{marketplace.manifest.plugins.length}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>Owner: </Text>\n <Text>{marketplace.manifest.owner.name}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>Source: </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {marketplace.source.type}\n {marketplace.source.type === 'github' &&\n ` (${marketplace.source.repo})`}\n {marketplace.source.type === 'url' && ` (${marketplace.source.url})`}\n {marketplace.source.type === 'local' &&\n ` (${marketplace.source.path})`}\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>Last updated: </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {new Date(marketplace.lastUpdated).toLocaleString()}\n </Text>\n </Box>\n\n {error && (\n <Box marginTop={1}>\n <Text color={theme.error}>Error: {error}</Text>\n </Box>\n )}\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>p</Text> to view plugins from this marketplace\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>u</Text> to update marketplace\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>r</Text> to remove marketplace\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// ============================================================================\n// Interactive Plugin Command (New UI)\n// ============================================================================\n\n/**\n * Interactive Plugin Command\n *\n * New UI that provides an interactive menu-driven interface for plugin management.\n * Matches Claude Code CLI experience with navigation stack and keyboard controls.\n */\nconst InteractivePluginCommand: React.FC<{ onDone: () => void }> = ({\n onDone,\n}) => {\n const [navigationStack, setNavigationStack] = useState<PluginUIState[]>([\n { screen: 'main-menu' },\n ])\n\n const currentState = navigationStack[navigationStack.length - 1]\n\n const handleNavigate = (newState: PluginUIState) => {\n setNavigationStack(prev => [...prev, newState])\n }\n\n const handleBack = () => {\n if (navigationStack.length > 1) {\n setNavigationStack(prev => prev.slice(0, -1))\n } else {\n onDone()\n }\n }\n\n // Route to appropriate screen component based on current state\n switch (currentState.screen) {\n case 'main-menu':\n return (\n <MainMenu\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'marketplace-selector':\n return (\n <MarketplaceSelector\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'plugin-browser':\n return (\n <PluginBrowser\n marketplace={currentState.marketplace}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'plugin-details-install':\n return (\n <PluginDetailsInstall\n marketplace={currentState.marketplace}\n plugin={currentState.plugin}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'installed-plugins-manager':\n return (\n <InstalledPluginsManager\n key={navigationStack.length}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'installed-plugins-by-marketplace':\n return (\n <InstalledPluginsByMarketplace\n marketplace={currentState.marketplace}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'plugin-details-manage':\n return (\n <PluginDetailsManage\n plugin={currentState.plugin}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'add-marketplace':\n return (\n <AddMarketplaceForm\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'marketplace-manager':\n return (\n <MarketplaceManager\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n case 'marketplace-details':\n return (\n <MarketplaceDetails\n marketplace={currentState.marketplace}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={onDone}\n />\n )\n\n default:\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Unknown screen state</Text>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to exit</Text>\n </Box>\n )\n }\n}\n\n// ============================================================================\n// Legacy Plugin Command Router (CLI arguments)\n// ============================================================================\n\nconst LegacyPluginCommand: React.FC<{ args: string; onDone: () => void }> = ({\n args,\n onDone,\n}) => {\n const theme = getTheme()\n const parts = args.trim().split(/\\s+/).filter(Boolean)\n const subcommand = parts[0]\n const subArgs = parts.slice(1)\n\n // Use effect to call onDone after render for help/error cases\n React.useEffect(() => {\n // Only call onDone if we're showing static content (help or errors)\n if (!subcommand || subcommand === 'help' || subcommand === '--help') {\n onDone()\n }\n }, [subcommand, onDone])\n\n // Help text\n if (!subcommand || subcommand === 'help' || subcommand === '--help') {\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.primary}>\n Plugin Management Commands\n </Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>/plugin list</Text> - List all installed\n plugins\n </Text>\n <Text>\n <Text color={theme.success}>/plugin info &lt;name&gt;</Text> - Show\n detailed plugin information\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin install &lt;name&gt;[@marketplace]\n </Text>{' '}\n - Install plugin from marketplace\n </Text>\n <Text>\n <Text color={theme.success}>/plugin uninstall &lt;name&gt;</Text> -\n Remove installed plugin\n </Text>\n <Text>\n <Text color={theme.success}>/plugin validate [name]</Text> - Validate\n plugin manifest and components\n </Text>\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Marketplace Commands:\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin marketplace add &lt;source&gt;\n </Text>{' '}\n - Register new marketplace\n </Text>\n <Text>\n <Text color={theme.success}>/plugin marketplace list</Text> - List\n registered marketplaces\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin marketplace update &lt;name&gt;\n </Text>{' '}\n - Update marketplace manifest\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin marketplace remove &lt;name&gt;\n </Text>{' '}\n - Unregister marketplace\n </Text>\n <Text>{''}</Text>\n <Text color={SEMANTIC_COLORS.dim}>Examples:</Text>\n <Text color={SEMANTIC_COLORS.dim}> /plugin list</Text>\n <Text color={SEMANTIC_COLORS.dim}> /plugin info my-plugin</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n /plugin install awesome-plugin@official\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n /plugin marketplace add owner/repo\n </Text>\n </Box>\n )\n }\n\n // Route subcommands\n switch (subcommand) {\n case 'list':\n return <PluginList onDone={onDone} />\n\n case 'info':\n if (subArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Plugin name required. Usage: /plugin info <name>\"\n onDone={onDone}\n />\n )\n }\n return <PluginInfo pluginName={subArgs[0]} onDone={onDone} />\n\n case 'install':\n if (subArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Plugin spec required. Usage: /plugin install <name>[@marketplace]\"\n onDone={onDone}\n />\n )\n }\n return <PluginInstall pluginSpec={subArgs[0]} onDone={onDone} />\n\n case 'uninstall':\n if (subArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Plugin name required. Usage: /plugin uninstall <name>\"\n onDone={onDone}\n />\n )\n }\n return <PluginUninstall pluginName={subArgs[0]} onDone={onDone} />\n\n case 'validate':\n return <PluginValidate pluginName={subArgs[0]} onDone={onDone} />\n\n case 'marketplace':\n const marketplaceSubcommand = subArgs[0]\n const marketplaceArgs = subArgs.slice(1)\n\n switch (marketplaceSubcommand) {\n case 'list':\n return <MarketplaceListView onDone={onDone} />\n\n case 'add':\n if (marketplaceArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Source required. Usage: /plugin marketplace add <source>\"\n onDone={onDone}\n />\n )\n }\n return <MarketplaceAdd source={marketplaceArgs[0]} onDone={onDone} />\n\n case 'update':\n if (marketplaceArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Marketplace name required. Usage: /plugin marketplace update <name>\"\n onDone={onDone}\n />\n )\n }\n return <MarketplaceUpdate name={marketplaceArgs[0]} onDone={onDone} />\n\n case 'remove':\n if (marketplaceArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Marketplace name required. Usage: /plugin marketplace remove <name>\"\n onDone={onDone}\n />\n )\n }\n return <MarketplaceRemove name={marketplaceArgs[0]} onDone={onDone} />\n\n default:\n return (\n <ErrorMessage\n message={`Unknown marketplace subcommand: ${marketplaceSubcommand}. Use /plugin help for usage.`}\n onDone={onDone}\n />\n )\n }\n\n default:\n return (\n <ErrorMessage\n message={`Unknown subcommand: ${subcommand}. Use /plugin help for usage.`}\n onDone={onDone}\n />\n )\n }\n}\n\n// ============================================================================\n// Main Plugin Command Router\n// ============================================================================\n\n/**\n * Main Plugin Command component that routes between interactive and legacy modes.\n *\n * - If no args provided: Use new interactive menu UI\n * - If args provided: Use legacy command-line interface for backward compatibility\n */\nconst PluginCommand: React.FC<{ args: string; onDone: () => void }> = ({\n args,\n onDone,\n}) => {\n // Check if user provided command-line arguments\n if (args.trim()) {\n // Use legacy CLI mode for backward compatibility\n return <LegacyPluginCommand args={args} onDone={onDone} />\n } else {\n // Use new interactive UI when no args provided\n return <InteractivePluginCommand onDone={onDone} />\n }\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst plugin = {\n type: 'local-jsx',\n name: 'plugin',\n description: 'Manage plugins and plugin marketplaces (interactive)',\n isEnabled: true,\n isHidden: false,\n aliases: ['plugins'],\n async call(onDone, _context) {\n // For commands that need args, we parse from user input\n // Since this is a local-jsx command, args are already parsed\n return <PluginCommand args=\"\" onDone={onDone} />\n },\n userFacingName() {\n return 'plugin'\n },\n} satisfies Command\n\nexport default plugin\n"],
5
- "mappings": "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",
6
- "names": ["plugin"]
4
+ "sourcesContent": ["import React, { useState, useEffect, useMemo, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Command } from '@commands'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n loadAllPlugins,\n getPlugin,\n listPlugins,\n loadPlugin,\n togglePluginEnabled,\n enablePlugin,\n disablePlugin,\n} from '@utils/pluginLoader'\nimport {\n addMarketplace,\n removeMarketplace,\n updateMarketplace,\n listMarketplaces,\n getMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { uninstallPlugin } from '@utils/pluginInstaller'\nimport {\n syncFromClaudeCode,\n hasClaudeCodeInstallation,\n type SyncResult,\n} from '@utils/claudeCodeSync'\nimport { gt as semverGt, valid as semverValid } from 'semver'\nimport { LoadedPlugin, PluginManifest, PluginError } from '../types/plugin'\nimport { RegisteredMarketplace, MarketplaceError } from '../types/marketplace'\nimport { rmSync } from 'fs'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport { t } from '@i18n'\nimport { formatMarketplacePath, formatTimeAgo } from './plugin/utils'\n\n/**\n * Plugin Command - Comprehensive plugin management for Minto CLI\n *\n * Implements all plugin management commands following Claude Code specification:\n * - /plugin list - List all installed plugins\n * - /plugin info <name> - Show detailed plugin information\n * - /plugin install <name>[@marketplace] - Install plugin from marketplace\n * - /plugin uninstall <name> - Remove installed plugin\n * - /plugin validate [name] - Validate plugin manifest and components\n * - /plugin marketplace add <source> - Register new marketplace\n * - /plugin marketplace list - List registered marketplaces\n * - /plugin marketplace update <name> - Update marketplace manifest\n * - /plugin marketplace remove <name> - Unregister marketplace\n */\n\n// ============================================================================\n// Component: Plugin List View\n// ============================================================================\n\ninterface PluginListProps {\n onDone: () => void\n}\n\nconst PluginList: React.FC<PluginListProps> = ({ onDone }) => {\n const [plugins, setPlugins] = useState<LoadedPlugin[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const theme = getTheme()\n\n useEffect(() => {\n try {\n const loadedPlugins = loadAllPlugins()\n setPlugins(loadedPlugins)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n onDone()\n }\n }, [onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Loading plugins...</Text>\n }\n\n if (error) {\n return <Text color={theme.error}>Error: {error}</Text>\n }\n\n if (plugins.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>No plugins installed.</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Install plugins with: /plugin install &lt;name&gt;[@marketplace]\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.success}>\n Installed Plugins ({plugins.length})\n </Text>\n <Text>{''}</Text>\n {plugins.map(plugin => {\n const componentCounts = [\n plugin.agents.length > 0 &&\n `${plugin.agents.length} agent${plugin.agents.length !== 1 ? 's' : ''}`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command${plugin.commands.length !== 1 ? 's' : ''}`,\n plugin.skills.length > 0 &&\n `${plugin.skills.length} skill${plugin.skills.length !== 1 ? 's' : ''}`,\n plugin.hooks.length > 0 &&\n `${plugin.hooks.length} hook${plugin.hooks.length !== 1 ? 's' : ''}`,\n plugin.mcpServers.length > 0 &&\n `${plugin.mcpServers.length} MCP server${plugin.mcpServers.length !== 1 ? 's' : ''}`,\n ].filter(Boolean)\n\n return (\n <Box\n key={plugin.manifest.name}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Box>\n <Text color={theme.primary} bold>\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n v{plugin.manifest.version}\n </Text>\n {plugin.source.type === 'claude-code' && (\n <Text color=\"#5DADE2\"> [CC]</Text>\n )}\n {!plugin.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n {plugin.manifest.description && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {plugin.manifest.description}\n </Text>\n )}\n {componentCounts.length > 0 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Components: {componentCounts.join(', ')}\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Location:{' '}\n {plugin.source.type === 'local'\n ? plugin.source.path\n : plugin.location}\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Info View\n// ============================================================================\n\ninterface PluginInfoProps {\n pluginName: string\n onDone: () => void\n}\n\nconst PluginInfo: React.FC<PluginInfoProps> = ({ pluginName, onDone }) => {\n const [plugin, setPlugin] = useState<LoadedPlugin | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const theme = getTheme()\n\n useEffect(() => {\n try {\n const loadedPlugin = getPlugin(pluginName)\n if (!loadedPlugin) {\n setError(`Plugin \"${pluginName}\" not found`)\n } else {\n setPlugin(loadedPlugin)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n onDone()\n }\n }, [pluginName, onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Loading plugin info...</Text>\n }\n\n if (error || !plugin) {\n return <Text color={theme.error}>Error: {error || 'Plugin not found'}</Text>\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.success}>\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n <Text>{''}</Text>\n\n <Box flexDirection=\"column\">\n <Text>\n <Text color={theme.primary}>Name:</Text> {plugin.manifest.name}\n </Text>\n <Text>\n <Text color={theme.primary}>Version:</Text> {plugin.manifest.version}\n </Text>\n {plugin.manifest.description && (\n <Text>\n <Text color={theme.primary}>Description:</Text>{' '}\n {plugin.manifest.description}\n </Text>\n )}\n {plugin.manifest.author && (\n <Text>\n <Text color={theme.primary}>Author:</Text> {plugin.manifest.author}\n </Text>\n )}\n {plugin.manifest.license && (\n <Text>\n <Text color={theme.primary}>License:</Text>{' '}\n {plugin.manifest.license}\n </Text>\n )}\n {plugin.manifest.homepage && (\n <Text>\n <Text color={theme.primary}>Homepage:</Text>{' '}\n {plugin.manifest.homepage}\n </Text>\n )}\n {plugin.manifest.repository && (\n <Text>\n <Text color={theme.primary}>Repository:</Text>{' '}\n {plugin.manifest.repository}\n </Text>\n )}\n <Text>\n <Text color={theme.primary}>Location:</Text> {plugin.location}\n </Text>\n <Text>\n <Text color={theme.primary}>Source:</Text> {plugin.source.type}\n </Text>\n <Text>\n <Text color={theme.primary}>Enabled:</Text>{' '}\n {plugin.enabled ? 'Yes' : 'No'}\n </Text>\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Components:\n </Text>\n\n {plugin.agents.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Agents ({plugin.agents.length}):</Text>\n {plugin.agents.map(agent => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {agent.name}\n {agent.config.description ? ` - ${agent.config.description}` : ''}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.commands.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>\n Commands ({plugin.commands.length}):\n </Text>\n {plugin.commands.map(command => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 /{command.name}\n {command.config.description\n ? ` - ${command.config.description}`\n : ''}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.skills.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Skills ({plugin.skills.length}):</Text>\n {plugin.skills.map(skill => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {skill.name}\n {skill.config.description ? ` - ${skill.config.description}` : ''}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.hooks.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Hooks ({plugin.hooks.length}):</Text>\n {plugin.hooks.map(hook => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {hook.name} ({hook.config.event})\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.mcpServers.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>\n MCP Servers ({plugin.mcpServers.length}):\n </Text>\n {plugin.mcpServers.map(server => (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 {server.name} - {server.config.command}\n </Text>\n ))}\n </Box>\n )}\n\n {plugin.agents.length === 0 &&\n plugin.commands.length === 0 &&\n plugin.skills.length === 0 &&\n plugin.hooks.length === 0 &&\n plugin.mcpServers.length === 0 && (\n <Text color={SEMANTIC_COLORS.dim}> No components loaded</Text>\n )}\n\n {plugin.manifest.engines && (\n <>\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Requirements:\n </Text>\n {plugin.manifest.engines.minto && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Minto: {plugin.manifest.engines.minto}\n </Text>\n )}\n {plugin.manifest.engines['claude-code'] && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Claude Code: {plugin.manifest.engines['claude-code']}\n </Text>\n )}\n {plugin.manifest.engines.node && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Node: {plugin.manifest.engines.node}\n </Text>\n )}\n </>\n )}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Install View\n// ============================================================================\n\ninterface PluginInstallProps {\n pluginSpec: string\n onDone: () => void\n}\n\nconst PluginInstall: React.FC<PluginInstallProps> = ({\n pluginSpec,\n onDone,\n}) => {\n const [status, setStatus] = useState<'installing' | 'success' | 'error'>(\n 'installing',\n )\n const [message, setMessage] = useState('')\n const [installedPath, setInstalledPath] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const installPlugin = async () => {\n try {\n // Parse plugin spec: name[@marketplace]\n const [pluginName, marketplaceName] = pluginSpec.split('@')\n\n if (!pluginName) {\n throw new Error('Plugin name is required')\n }\n\n setMessage(\n `Installing plugin \"${pluginName}\"${marketplaceName ? ` from marketplace \"${marketplaceName}\"` : ''}...`,\n )\n\n const path = await installPluginFromMarketplace(\n pluginName,\n marketplaceName,\n )\n\n setInstalledPath(path)\n setMessage(`Successfully installed \"${pluginName}\" to ${path}`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Installation failed: ${err.message}`)\n } else {\n setMessage(\n `Installation failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n installPlugin()\n }, [pluginSpec, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return (\n <Box flexDirection=\"column\">\n <Text color={color}>{message}</Text>\n {status === 'success' && (\n <>\n <Text>{''}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Plugin is now available. Use /plugin info {pluginSpec.split('@')[0]}{' '}\n to see details.\n </Text>\n </>\n )}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Uninstall View\n// ============================================================================\n\ninterface PluginUninstallProps {\n pluginName: string\n onDone: () => void\n}\n\nconst PluginUninstall: React.FC<PluginUninstallProps> = ({\n pluginName,\n onDone,\n}) => {\n const [status, setStatus] = useState<'uninstalling' | 'success' | 'error'>(\n 'uninstalling',\n )\n const [message, setMessage] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const uninstallPlugin = () => {\n try {\n setMessage(`Uninstalling plugin \"${pluginName}\"...`)\n\n const plugin = getPlugin(pluginName)\n if (!plugin) {\n throw new Error(`Plugin \"${pluginName}\" not found`)\n }\n\n // Remove plugin directory\n rmSync(plugin.location, { recursive: true, force: true })\n\n setMessage(`Successfully uninstalled \"${pluginName}\"`)\n setStatus('success')\n } catch (err) {\n setMessage(\n `Uninstallation failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n uninstallPlugin()\n }, [pluginName, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return <Text color={color}>{message}</Text>\n}\n\n// ============================================================================\n// Component: Plugin Validate View\n// ============================================================================\n\ninterface PluginValidateProps {\n pluginName?: string\n onDone: () => void\n}\n\nconst PluginValidate: React.FC<PluginValidateProps> = ({\n pluginName,\n onDone,\n}) => {\n const [results, setResults] = useState<\n Array<{ plugin: string; valid: boolean; errors: string[] }>\n >([])\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n useEffect(() => {\n const validatePlugins = () => {\n try {\n const pluginsToValidate = pluginName\n ? [{ name: pluginName, path: '', manifest: undefined }]\n : listPlugins()\n\n const validationResults = pluginsToValidate.map(({ name, path }) => {\n const errors: string[] = []\n\n try {\n const plugin = getPlugin(name)\n\n if (!plugin) {\n errors.push('Plugin not found')\n return { plugin: name, valid: false, errors }\n }\n\n // Validate manifest required fields\n if (!plugin.manifest.name)\n errors.push('Missing required field: name')\n if (!plugin.manifest.version)\n errors.push('Missing required field: version')\n if (!plugin.manifest.description)\n errors.push('Missing required field: description')\n\n // Validate version format\n if (\n plugin.manifest.version &&\n !/^\\d+\\.\\d+\\.\\d+$/.test(plugin.manifest.version)\n ) {\n errors.push('Invalid version format (must be semver: X.Y.Z)')\n }\n\n // Validate name format\n if (\n plugin.manifest.name &&\n !/^[a-z0-9-]+$/.test(plugin.manifest.name)\n ) {\n errors.push(\n 'Invalid name format (must be lowercase alphanumeric with hyphens)',\n )\n }\n\n // Validate component paths exist\n const checkComponents = (items: any[], type: string) => {\n items.forEach(item => {\n if (!item.filePath) {\n errors.push(`${type} \"${item.name}\" has no file path`)\n }\n })\n }\n\n checkComponents(plugin.agents, 'Agent')\n checkComponents(plugin.commands, 'Command')\n checkComponents(plugin.skills, 'Skill')\n\n return { plugin: name, valid: errors.length === 0, errors }\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err))\n return { plugin: name, valid: false, errors }\n }\n })\n\n setResults(validationResults)\n } finally {\n setLoading(false)\n onDone()\n }\n }\n\n validatePlugins()\n }, [pluginName, onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Validating plugins...</Text>\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.primary}>\n Plugin Validation Results\n </Text>\n <Text>{''}</Text>\n {results.map(result => (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={result.valid ? theme.success : theme.error}>\n {result.valid ? '\u2713' : '\u2717'}\n </Text>\n <Text> {result.plugin}</Text>\n {result.valid && <Text color={theme.success}> - Valid</Text>}\n </Box>\n {result.errors.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {result.errors.map((error, idx) => (\n <Text color={theme.error}>\u2022 {error}</Text>\n ))}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Plugin Sync (Claude Code \u2192 Minto)\n// ============================================================================\n\ninterface PluginSyncProps {\n onDone: () => void\n force?: boolean\n clean?: boolean\n dryRun?: boolean\n}\n\nconst PluginSync: React.FC<PluginSyncProps> = ({\n onDone,\n force = false,\n clean = false,\n dryRun = false,\n}) => {\n const [status, setStatus] = useState<'syncing' | 'done' | 'error'>('syncing')\n const [progress, setProgress] = useState(t('commands.plugin.syncStarting'))\n const [result, setResult] = useState<SyncResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n const theme = getTheme()\n\n useEffect(() => {\n const doSync = async () => {\n if (!hasClaudeCodeInstallation()) {\n setError(t('commands.plugin.syncNotFound'))\n setStatus('error')\n onDone()\n return\n }\n\n try {\n const syncResult = await syncFromClaudeCode({\n force,\n clean,\n dryRun,\n onProgress: msg => setProgress(msg),\n })\n setResult(syncResult)\n setStatus('done')\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n doSync()\n }, [force, clean, dryRun, onDone])\n\n if (status === 'error') {\n return <Text color={theme.error}>{error}</Text>\n }\n\n if (status === 'syncing') {\n return (\n <Box>\n <SimpleSpinner />\n <Text color={theme.primary}> {progress}</Text>\n </Box>\n )\n }\n\n if (!result) return null\n\n const hasChanges =\n result.installed.length > 0 ||\n result.updated.length > 0 ||\n result.cleaned.length > 0 ||\n result.marketplaces.registered.length > 0\n\n if (!hasChanges && result.failed.length === 0) {\n return (\n <Text color={theme.success}>{t('commands.plugin.syncNoChanges')}</Text>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {dryRun && (\n <Text color={theme.warning} bold>\n {t('commands.plugin.syncDryRun')}\n </Text>\n )}\n\n {result.installed.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={theme.success}>\n Installed ({result.installed.length}):\n </Text>\n {result.installed.map(name => (\n <Box key={name}>\n <Text color={SEMANTIC_COLORS.dim}> + {name}</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {result.updated.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={theme.primary}>Updated ({result.updated.length}):</Text>\n {result.updated.map(name => (\n <Box key={name}>\n <Text color={SEMANTIC_COLORS.dim}> ~ {name}</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {result.cleaned.length > 0 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {t('commands.plugin.syncCleaned').replace(\n '${count}',\n String(result.cleaned.length),\n )}\n </Text>\n )}\n\n {result.marketplaces.registered.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={theme.success}>\n {t('commands.plugin.syncMarketplacesRegistered').replace(\n '${count}',\n String(result.marketplaces.registered.length),\n )}\n </Text>\n {result.marketplaces.registered.map(name => (\n <Box key={name}>\n <Text color={SEMANTIC_COLORS.dim}> + {name}</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {result.marketplaces.failed.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={theme.error}>\n {t('commands.plugin.syncMarketplacesFailed').replace(\n '${count}',\n String(result.marketplaces.failed.length),\n )}\n </Text>\n {result.marketplaces.failed.map(f => (\n <Box key={f.name}>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ! {f.name}: {f.error}\n </Text>\n </Box>\n ))}\n </Box>\n )}\n\n {result.failed.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={theme.error}>\n {t('commands.plugin.syncFailed').replace(\n '${count}',\n String(result.failed.length),\n )}\n </Text>\n {result.failed.map(f => (\n <Box key={f.name}>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ! {f.name}: {f.error}\n </Text>\n </Box>\n ))}\n </Box>\n )}\n\n <Text color={theme.success}>\n {t('commands.plugin.syncComplete')\n .replace('${installed}', String(result.installed.length))\n .replace('${updated}', String(result.updated.length))\n .replace('${skipped}', String(result.skipped.length))}\n </Text>\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Marketplace List View\n// ============================================================================\n\ninterface MarketplaceListProps {\n onDone: () => void\n}\n\nconst MarketplaceListView: React.FC<MarketplaceListProps> = ({ onDone }) => {\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n useEffect(() => {\n try {\n const registered = listMarketplaces()\n setMarketplaces(registered)\n } finally {\n setLoading(false)\n onDone()\n }\n }, [onDone])\n\n if (loading) {\n return <Text color={theme.primary}>Loading marketplaces...</Text>\n }\n\n if (marketplaces.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>No marketplaces registered.</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Register a marketplace with: /plugin marketplace add &lt;source&gt;\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.success}>\n Registered Marketplaces ({marketplaces.length})\n </Text>\n <Text>{''}</Text>\n {marketplaces.map(marketplace => (\n <Box key={marketplace.name} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={theme.primary} bold>\n {marketplace.name}\n </Text>\n {!marketplace.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n {marketplace.manifest.metadata?.description && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {marketplace.manifest.metadata.description}\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n {` Plugins: ${marketplace.manifest.plugins.length}`}\n {` | Owner: ${marketplace.manifest.owner.name}`}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {` Source: ${marketplace.source.type}`}\n {marketplace.source.type === 'github' &&\n ` (${marketplace.source.repo})`}\n {marketplace.source.type === 'url' &&\n ` (${marketplace.source.url})`}\n {marketplace.source.type === 'local' &&\n ` (${marketplace.source.path})`}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {` Last updated: ${new Date(marketplace.lastUpdated).toLocaleString()}`}\n </Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Marketplace Add View\n// ============================================================================\n\ninterface MarketplaceAddProps {\n source: string\n onDone: () => void\n}\n\nconst MarketplaceAdd: React.FC<MarketplaceAddProps> = ({ source, onDone }) => {\n const [status, setStatus] = useState<'adding' | 'success' | 'error'>('adding')\n const [message, setMessage] = useState('')\n const [marketplace, setMarketplace] = useState<RegisteredMarketplace | null>(\n null,\n )\n const theme = getTheme()\n\n useEffect(() => {\n const addMarketplaceAsync = async () => {\n try {\n setMessage(`Registering marketplace from \"${source}\"...`)\n const registered = await addMarketplace(source)\n setMarketplace(registered)\n setMessage(`Successfully registered marketplace \"${registered.name}\"`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Registration failed: ${err.message}`)\n } else {\n setMessage(\n `Registration failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n addMarketplaceAsync()\n }, [source, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return (\n <Box flexDirection=\"column\">\n <Text color={color}>{message}</Text>\n {status === 'success' && marketplace && (\n <>\n <Text>{''}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Marketplace contains {marketplace.manifest.plugins.length} plugin(s)\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Use /plugin marketplace list to see all marketplaces\n </Text>\n </>\n )}\n </Box>\n )\n}\n\n// ============================================================================\n// Component: Marketplace Update View\n// ============================================================================\n\ninterface MarketplaceUpdateProps {\n name: string\n onDone: () => void\n}\n\nconst MarketplaceUpdate: React.FC<MarketplaceUpdateProps> = ({\n name,\n onDone,\n}) => {\n const [status, setStatus] = useState<'updating' | 'success' | 'error'>(\n 'updating',\n )\n const [message, setMessage] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const updateMarketplaceAsync = async () => {\n try {\n setMessage(`Updating marketplace \"${name}\"...`)\n await updateMarketplace(name)\n setMessage(`Successfully updated marketplace \"${name}\"`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Update failed: ${err.message}`)\n } else {\n setMessage(\n `Update failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n updateMarketplaceAsync()\n }, [name, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return <Text color={color}>{message}</Text>\n}\n\n// ============================================================================\n// Component: Marketplace Remove View\n// ============================================================================\n\ninterface MarketplaceRemoveProps {\n name: string\n onDone: () => void\n}\n\nconst MarketplaceRemove: React.FC<MarketplaceRemoveProps> = ({\n name,\n onDone,\n}) => {\n const [status, setStatus] = useState<'removing' | 'success' | 'error'>(\n 'removing',\n )\n const [message, setMessage] = useState('')\n const theme = getTheme()\n\n useEffect(() => {\n const removeMarketplaceSync = () => {\n try {\n setMessage(`Removing marketplace \"${name}\"...`)\n removeMarketplace(name)\n setMessage(`Successfully removed marketplace \"${name}\"`)\n setStatus('success')\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setMessage(`Removal failed: ${err.message}`)\n } else {\n setMessage(\n `Removal failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n removeMarketplaceSync()\n }, [name, onDone])\n\n const color =\n status === 'success'\n ? theme.success\n : status === 'error'\n ? theme.error\n : theme.primary\n\n return <Text color={color}>{message}</Text>\n}\n\n// ============================================================================\n// Error Message Component\n// ============================================================================\n\nconst ErrorMessage: React.FC<{ message: string; onDone: () => void }> = ({\n message,\n onDone,\n}) => {\n const theme = getTheme()\n\n React.useEffect(() => {\n onDone()\n }, [onDone])\n\n return <Text color={theme.error}>Error: {message}</Text>\n}\n\n// ============================================================================\n// Interactive Plugin Command (TabbedListView-based)\n// ============================================================================\n\ntype PluginPhase =\n | { type: 'main' }\n | {\n type: 'plugin-actions'\n plugin: string\n marketplace?: string\n from: 'browse' | 'installed'\n }\n | { type: 'marketplace-actions'; marketplace: string }\n | { type: 'add-marketplace' }\n | {\n type: 'batch-action-picker'\n selectedItems: ListItem[]\n from: 'browse' | 'installed'\n }\n | {\n type: 'batch-progress'\n action: 'install' | 'update' | 'uninstall'\n plugins: Array<{ name: string; marketplace?: string }>\n }\n\n/**\n * Compare installed plugin version against marketplace version.\n * Returns version info if an update is available, null otherwise.\n */\nfunction compareVersions(\n installedVersion: string | undefined,\n marketplaceVersion: string | undefined,\n): { hasUpdate: boolean; installed: string; available: string } | null {\n if (!installedVersion || !marketplaceVersion) return null\n if (!semverValid(installedVersion) || !semverValid(marketplaceVersion))\n return null\n try {\n return {\n hasUpdate: semverGt(marketplaceVersion, installedVersion),\n installed: installedVersion,\n available: marketplaceVersion,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Interactive Plugin Command\n *\n * Uses a single TabbedListView instance driven by a phase state machine.\n * All navigation is achieved by swapping props \u2014 zero residual rendering artifacts.\n */\nconst InteractivePluginCommand: React.FC<{ onDone: () => void }> = ({\n onDone,\n}) => {\n const [phase, setPhase] = useState<PluginPhase>({ type: 'main' })\n const [activeTab, setActiveTab] = useState('browse')\n const [searchQuery, setSearchQuery] = useState('')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [installedPlugins, setInstalledPlugins] = useState<LoadedPlugin[]>([])\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set())\n\n // Reload data when returning to main phase\n const reload = useCallback(() => {\n try {\n setMarketplaces(listMarketplaces())\n } catch {\n setMarketplaces([])\n }\n try {\n setInstalledPlugins(loadAllPlugins())\n } catch {\n setInstalledPlugins([])\n }\n }, [])\n\n useEffect(() => {\n if (phase.type === 'main') {\n reload()\n setSearchQuery('')\n setSelectedIds(new Set())\n }\n }, [phase, reload])\n\n // Build installed plugin name set for quick lookup\n const installedNames = useMemo(\n () => new Set(installedPlugins.map(p => p.name)),\n [installedPlugins],\n )\n\n // Find which marketplace a plugin belongs to\n const findPluginMarketplace = useCallback(\n (pluginName: string): string | undefined => {\n for (const m of marketplaces) {\n if (m.manifest.plugins.some(p => p.name === pluginName)) {\n return m.name\n }\n }\n return undefined\n },\n [marketplaces],\n )\n\n // Compute multi-select action label based on tab and selection count\n const multiSelectActionLabel = useMemo(() => {\n if (phase.type !== 'main' || selectedIds.size === 0) return undefined\n if (activeTab === 'browse' || activeTab === 'installed') {\n return `${t('commands.plugin.batchAction')} (${selectedIds.size})`\n }\n return undefined\n }, [phase, activeTab, selectedIds.size])\n\n // Whether multi-select is enabled for current view\n const multiSelectEnabled =\n phase.type === 'main' &&\n (activeTab === 'browse' || activeTab === 'installed')\n\n // Determine tabs, items, title based on current phase\n const { tabs, items, title, footerHint, searchEnabled, searchPlaceholder } =\n useMemo(() => {\n switch (phase.type) {\n case 'main': {\n const mainTabs: TabDefinition[] = [\n { id: 'browse', label: t('commands.plugin.tabBrowse') },\n { id: 'installed', label: t('commands.plugin.tabInstalled') },\n { id: 'marketplaces', label: t('commands.plugin.tabMarketplaces') },\n ]\n\n let mainItems: ListItem[] = []\n\n if (activeTab === 'browse') {\n for (const m of marketplaces) {\n for (const p of m.manifest.plugins) {\n const installed = installedPlugins.find(\n ip => ip.name === p.name,\n )\n let metadata: string | undefined\n if (installed) {\n const versionInfo = compareVersions(\n installed.manifest.version,\n p.version,\n )\n if (versionInfo?.hasUpdate) {\n metadata = t('commands.plugin.updateAvailable')\n .replace('{installed}', versionInfo.installed)\n .replace('{available}', versionInfo.available)\n } else {\n metadata = 'installed'\n }\n }\n mainItems.push({\n id: `${m.name}:${p.name}`,\n label: p.name,\n description: p.description || '',\n category: m.name,\n status: installedNames.has(p.name) ? 'enabled' : undefined,\n metadata,\n data: { pluginName: p.name, marketplaceName: m.name },\n })\n }\n }\n } else if (activeTab === 'installed') {\n for (const p of installedPlugins) {\n const mName =\n p.source.type === 'claude-code'\n ? p.source.marketplace\n : p.source.type === 'marketplace'\n ? p.source.marketplace\n : findPluginMarketplace(p.name)\n const sourceTag = p.source.type === 'claude-code' ? ' [CC]' : ''\n mainItems.push({\n id: p.name,\n label: `${p.manifest.displayName || p.name}${sourceTag}`,\n description: p.manifest.description || '',\n status: p.enabled ? 'enabled' : 'disabled',\n category: mName || t('commands.plugin.local'),\n data: { pluginName: p.name, source: p.source },\n })\n }\n } else if (activeTab === 'marketplaces') {\n for (const m of marketplaces) {\n mainItems.push({\n id: m.name,\n label: m.name,\n description: `${m.manifest.plugins.length} plugins \u00B7 ${formatMarketplacePath(m.source)} \u00B7 ${formatTimeAgo(m.lastUpdated)}`,\n status: m.enabled ? 'enabled' : 'disabled',\n data: { marketplaceName: m.name },\n })\n }\n mainItems.push({\n id: 'add-new',\n label: `+ ${t('commands.plugin.addMarketplace')}`,\n description: 'Register a new plugin marketplace',\n })\n }\n\n const isMultiSelectTab =\n activeTab === 'browse' || activeTab === 'installed'\n return {\n tabs: mainTabs,\n items: mainItems,\n title: 'Plugins',\n footerHint: isMultiSelectTab\n ? t('commands.plugin.footerHintMultiSelect')\n : t('commands.plugin.footerHint'),\n searchEnabled: true,\n searchPlaceholder: undefined,\n }\n }\n\n case 'plugin-actions': {\n const actionItems: ListItem[] = []\n\n if (phase.from === 'browse') {\n actionItems.push({\n id: 'install',\n label: t('commands.plugin.install'),\n description: `Install from ${phase.marketplace || 'marketplace'}`,\n })\n } else {\n // installed\n const plugin = installedPlugins.find(p => p.name === phase.plugin)\n const isEnabled = plugin?.enabled ?? true\n\n actionItems.push({\n id: 'toggle',\n label: isEnabled\n ? t('commands.plugin.disable')\n : t('commands.plugin.enable'),\n description: isEnabled\n ? 'Disable this plugin'\n : 'Enable this plugin',\n })\n if (phase.marketplace) {\n actionItems.push({\n id: 'update',\n label: t('commands.plugin.update'),\n description: 'Re-install from marketplace source',\n })\n }\n actionItems.push({\n id: 'uninstall',\n label: t('commands.plugin.uninstall'),\n description: 'Remove this plugin',\n })\n }\n\n actionItems.push({\n id: 'back',\n label: t('commands.plugin.back'),\n })\n\n return {\n tabs: [\n { id: 'actions', label: t('commands.plugin.actions') },\n ] as TabDefinition[],\n items: actionItems,\n title: phase.plugin,\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back',\n searchEnabled: false,\n searchPlaceholder: undefined,\n }\n }\n\n case 'marketplace-actions': {\n const mActionItems: ListItem[] = [\n {\n id: 'update',\n label: t('commands.plugin.marketplaceUpdate'),\n description: 'Re-fetch marketplace manifest',\n },\n {\n id: 'browse',\n label: t('commands.plugin.browsePlugins'),\n description: 'View plugins from this marketplace',\n },\n {\n id: 'remove',\n label: t('commands.plugin.marketplaceRemove'),\n description: 'Unregister this marketplace',\n },\n {\n id: 'back',\n label: t('commands.plugin.back'),\n },\n ]\n\n return {\n tabs: [\n { id: 'actions', label: t('commands.plugin.actions') },\n ] as TabDefinition[],\n items: mActionItems,\n title: phase.marketplace,\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back',\n searchEnabled: false,\n searchPlaceholder: undefined,\n }\n }\n\n case 'batch-action-picker': {\n const pickerItems: ListItem[] = []\n const sel = phase.selectedItems\n\n if (phase.from === 'installed') {\n // Count plugins with marketplace source (updatable)\n const updatableCount = sel.filter(item => {\n const pluginName = (item.data as any)?.pluginName as string\n return findPluginMarketplace(pluginName) !== undefined\n }).length\n if (updatableCount > 0) {\n pickerItems.push({\n id: 'batch-update',\n label: t('commands.plugin.batchUpdateAction').replace(\n '{count}',\n String(updatableCount),\n ),\n })\n }\n pickerItems.push({\n id: 'batch-uninstall',\n label: t('commands.plugin.batchDeleteAction').replace(\n '{count}',\n String(sel.length),\n ),\n })\n // Count disabled plugins (can be enabled)\n const disabledCount = sel.filter(item => {\n const plugin = installedPlugins.find(\n p => p.name === (item.data as any)?.pluginName,\n )\n return plugin && !plugin.enabled\n }).length\n if (disabledCount > 0) {\n pickerItems.push({\n id: 'batch-enable',\n label: t('commands.plugin.batchEnableAction').replace(\n '{count}',\n String(disabledCount),\n ),\n })\n }\n // Count enabled plugins (can be disabled)\n const enabledCount = sel.filter(item => {\n const plugin = installedPlugins.find(\n p => p.name === (item.data as any)?.pluginName,\n )\n return plugin && plugin.enabled\n }).length\n if (enabledCount > 0) {\n pickerItems.push({\n id: 'batch-disable',\n label: t('commands.plugin.batchDisableAction').replace(\n '{count}',\n String(enabledCount),\n ),\n })\n }\n } else {\n // from === 'browse'\n const notInstalledCount = sel.filter(\n item => !installedNames.has((item.data as any)?.pluginName),\n ).length\n if (notInstalledCount > 0) {\n pickerItems.push({\n id: 'batch-install',\n label: t('commands.plugin.batchInstallAction').replace(\n '{count}',\n String(notInstalledCount),\n ),\n })\n }\n const alreadyInstalledCount = sel.filter(item =>\n installedNames.has((item.data as any)?.pluginName),\n ).length\n if (alreadyInstalledCount > 0) {\n pickerItems.push({\n id: 'batch-update',\n label: t('commands.plugin.batchUpdateAction').replace(\n '{count}',\n String(alreadyInstalledCount),\n ),\n })\n }\n }\n\n pickerItems.push({\n id: 'back',\n label: t('commands.plugin.back'),\n })\n\n return {\n tabs: [\n {\n id: 'actions',\n label: t('commands.plugin.batchActionPickerTitle'),\n },\n ] as TabDefinition[],\n items: pickerItems,\n title: t('commands.plugin.batchActionPickerTitle'),\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back',\n searchEnabled: false,\n searchPlaceholder: undefined,\n }\n }\n\n case 'batch-progress': {\n // batch-progress is driven by the effect + statusOverlay;\n // return empty shell so TabbedListView has valid props\n return {\n tabs: [\n { id: 'progress', label: t('common.loading') },\n ] as TabDefinition[],\n items: [] as ListItem[],\n title: 'Plugins',\n footerHint: '',\n searchEnabled: false,\n searchPlaceholder: undefined,\n }\n }\n\n case 'add-marketplace': {\n const helpItems: ListItem[] = [\n {\n id: 'example-github',\n label: 'owner/repo',\n description: 'GitHub shorthand',\n },\n {\n id: 'example-https',\n label: 'https://github.com/owner/repo.git',\n description: 'HTTPS URL',\n },\n {\n id: 'example-local',\n label: './path/to/local',\n description: 'Local path',\n },\n ]\n\n return {\n tabs: [\n {\n id: 'add',\n label: t('commands.plugin.marketplaceAdd'),\n },\n ] as TabDefinition[],\n items: helpItems,\n title: t('commands.plugin.addMarketplace'),\n footerHint: t('commands.plugin.addFooterHint'),\n searchEnabled: true,\n searchPlaceholder: t('commands.plugin.addMarketplacePlaceholder'),\n }\n }\n }\n }, [\n phase,\n activeTab,\n marketplaces,\n installedPlugins,\n installedNames,\n findPluginMarketplace,\n ])\n\n // Handle tab change \u2014 also reset search and selections\n const handleTabChange = useCallback((tabId: string) => {\n setActiveTab(tabId)\n setSearchQuery('')\n setSelectedIds(new Set())\n }, [])\n\n // Handle selection toggle for multi-select\n const handleSelectionChange = useCallback(\n (itemId: string, selected: boolean) => {\n setSelectedIds(prev => {\n const next = new Set(prev)\n if (selected) {\n next.add(itemId)\n } else {\n next.delete(itemId)\n }\n return next\n })\n },\n [],\n )\n\n // Handle multi-select \u2192 route to batch action picker\n const handleMultiSelect = useCallback(\n (selectedItems: ListItem[]) => {\n if (activeTab === 'browse' || activeTab === 'installed') {\n setPhase({\n type: 'batch-action-picker',\n selectedItems,\n from: activeTab as 'browse' | 'installed',\n })\n }\n },\n [activeTab],\n )\n\n // Batch execution effect\n useEffect(() => {\n if (phase.type !== 'batch-progress') return\n\n let cancelled = false\n const { action, plugins } = phase\n\n const executeBatch = async () => {\n let successCount = 0\n let failCount = 0\n const errors: string[] = []\n\n for (let i = 0; i < plugins.length; i++) {\n if (cancelled) return\n\n const plugin = plugins[i]\n const progressKey =\n action === 'install'\n ? 'commands.plugin.batchInstalling'\n : action === 'update'\n ? 'commands.plugin.batchUpdating'\n : 'commands.plugin.batchUninstalling'\n\n setStatusOverlay({\n type: 'loading',\n message: t(progressKey)\n .replace('{current}', String(i + 1))\n .replace('{total}', String(plugins.length))\n .replace('{name}', plugin.name),\n })\n\n try {\n if (action === 'uninstall') {\n await uninstallPlugin(plugin.name)\n } else {\n await installPluginFromMarketplace(plugin.name, plugin.marketplace)\n }\n successCount++\n } catch (err) {\n failCount++\n const msg = err instanceof Error ? err.message : String(err)\n if (errors.length < 3) {\n errors.push(`${plugin.name}: ${msg}`)\n }\n }\n }\n\n if (cancelled) return\n\n // Build summary message\n const parts: string[] = []\n if (successCount > 0) {\n const countKey =\n action === 'install'\n ? 'commands.plugin.batchInstalledCount'\n : action === 'update'\n ? 'commands.plugin.batchUpdatedCount'\n : 'commands.plugin.batchUninstalledCount'\n parts.push(t(countKey).replace('{count}', String(successCount)))\n }\n if (failCount > 0) {\n parts.push(\n t('commands.plugin.batchFailedCount').replace(\n '{count}',\n String(failCount),\n ),\n )\n if (errors.length > 0) {\n parts.push(errors.join('\\n'))\n }\n }\n\n setStatusOverlay({\n type: failCount === 0 ? 'success' : 'error',\n message: parts.join('\\n'),\n })\n setSelectedIds(new Set())\n }\n\n executeBatch()\n\n return () => {\n cancelled = true\n }\n }, [phase])\n\n // Handle status overlay dismiss \u2192 return to main\n const handleStatusDismiss = useCallback(() => {\n setStatusOverlay(null)\n setPhase({ type: 'main' })\n }, [])\n\n // Handle ESC / back navigation\n const handleBack = useCallback(() => {\n if (statusOverlay && statusOverlay.type !== 'loading') {\n handleStatusDismiss()\n return\n }\n if (phase.type === 'main') {\n onDone()\n } else {\n setPhase({ type: 'main' })\n setSearchQuery('')\n }\n }, [phase, statusOverlay, onDone, handleStatusDismiss])\n\n // Handle close (also ESC at top level)\n const handleClose = useCallback(() => {\n if (statusOverlay && statusOverlay.type !== 'loading') {\n handleStatusDismiss()\n return\n }\n if (phase.type === 'main') {\n onDone()\n } else {\n setPhase({ type: 'main' })\n setSearchQuery('')\n }\n }, [phase, statusOverlay, onDone, handleStatusDismiss])\n\n // Handle search submit (for add-marketplace)\n const handleSearchSubmit = useCallback(\n async (query: string) => {\n if (phase.type !== 'add-marketplace' || !query.trim()) return\n\n setStatusOverlay({\n type: 'loading',\n message: t('commands.plugin.marketplaceAdding'),\n })\n\n try {\n await addMarketplace(query.trim())\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.marketplaceAddSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.plugin.marketplaceAddFailed')}: ${msg}`,\n })\n }\n },\n [phase],\n )\n\n // Handle item selection\n const handleSelect = useCallback(\n async (item: ListItem) => {\n switch (phase.type) {\n case 'main': {\n if (activeTab === 'browse') {\n const data = item.data as {\n pluginName: string\n marketplaceName: string\n }\n setPhase({\n type: 'plugin-actions',\n plugin: data.pluginName,\n marketplace: data.marketplaceName,\n from: 'browse',\n })\n } else if (activeTab === 'installed') {\n const data = item.data as { pluginName: string }\n const mName = findPluginMarketplace(data.pluginName)\n setPhase({\n type: 'plugin-actions',\n plugin: data.pluginName,\n marketplace: mName,\n from: 'installed',\n })\n } else if (activeTab === 'marketplaces') {\n if (item.id === 'add-new') {\n setPhase({ type: 'add-marketplace' })\n setSearchQuery('')\n } else {\n const data = item.data as { marketplaceName: string }\n setPhase({\n type: 'marketplace-actions',\n marketplace: data.marketplaceName,\n })\n }\n }\n break\n }\n\n case 'plugin-actions': {\n if (item.id === 'back') {\n setPhase({ type: 'main' })\n return\n }\n\n if (item.id === 'install') {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.plugin.installing'),\n })\n try {\n await installPluginFromMarketplace(\n phase.plugin,\n phase.marketplace,\n )\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.installSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.plugin.installFailed')}: ${msg}`,\n })\n }\n } else if (item.id === 'toggle') {\n try {\n togglePluginEnabled(phase.plugin)\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.toggleSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n } else if (item.id === 'update') {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.plugin.updating'),\n })\n try {\n await installPluginFromMarketplace(\n phase.plugin,\n phase.marketplace,\n )\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.updateSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.plugin.updateFailed')}: ${msg}`,\n })\n }\n } else if (item.id === 'uninstall') {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.plugin.uninstalling'),\n })\n try {\n await uninstallPlugin(phase.plugin)\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.uninstallSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.plugin.uninstallFailed')}: ${msg}`,\n })\n }\n }\n break\n }\n\n case 'marketplace-actions': {\n if (item.id === 'back') {\n setPhase({ type: 'main' })\n return\n }\n\n if (item.id === 'update') {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.plugin.marketplaceUpdating'),\n })\n try {\n await updateMarketplace(phase.marketplace)\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.marketplaceUpdateSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.plugin.marketplaceUpdateFailed')}: ${msg}`,\n })\n }\n } else if (item.id === 'browse') {\n setPhase({ type: 'main' })\n setActiveTab('browse')\n setSearchQuery(phase.marketplace)\n } else if (item.id === 'remove') {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.plugin.marketplaceRemoving'),\n })\n try {\n removeMarketplace(phase.marketplace)\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.marketplaceRemoveSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n }\n break\n }\n\n case 'batch-action-picker': {\n if (item.id === 'back') {\n setPhase({ type: 'main' })\n return\n }\n\n const sel = phase.selectedItems\n\n if (item.id === 'batch-install') {\n const toInstall = sel\n .filter(si => !installedNames.has((si.data as any)?.pluginName))\n .map(si => ({\n name: (si.data as any).pluginName as string,\n marketplace: (si.data as any).marketplaceName as\n | string\n | undefined,\n }))\n if (toInstall.length === 0) {\n setStatusOverlay({\n type: 'error',\n message: t('commands.plugin.batchAllAlreadyInstalled'),\n })\n return\n }\n setPhase({\n type: 'batch-progress',\n action: 'install',\n plugins: toInstall,\n })\n } else if (item.id === 'batch-update') {\n const toUpdate = sel\n .filter(si => {\n const pluginName = (si.data as any)?.pluginName as string\n return findPluginMarketplace(pluginName) !== undefined\n })\n .map(si => {\n const pluginName = (si.data as any).pluginName as string\n return {\n name: pluginName,\n marketplace: findPluginMarketplace(pluginName),\n }\n })\n if (toUpdate.length === 0) {\n setStatusOverlay({\n type: 'error',\n message: t('commands.plugin.batchNoUpdatable'),\n })\n return\n }\n setPhase({\n type: 'batch-progress',\n action: 'update',\n plugins: toUpdate,\n })\n } else if (item.id === 'batch-uninstall') {\n const toUninstall = sel.map(si => ({\n name: (si.data as any).pluginName as string,\n }))\n setPhase({\n type: 'batch-progress',\n action: 'uninstall',\n plugins: toUninstall,\n })\n } else if (item.id === 'batch-enable') {\n // Synchronous operation\n let count = 0\n for (const si of sel) {\n const pluginName = (si.data as any)?.pluginName as string\n const plugin = installedPlugins.find(p => p.name === pluginName)\n if (plugin && !plugin.enabled) {\n try {\n enablePlugin(pluginName)\n count++\n } catch {\n // skip failures silently\n }\n }\n }\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.batchEnabledCount').replace(\n '{count}',\n String(count),\n ),\n })\n setSelectedIds(new Set())\n } else if (item.id === 'batch-disable') {\n // Synchronous operation\n let count = 0\n for (const si of sel) {\n const pluginName = (si.data as any)?.pluginName as string\n const plugin = installedPlugins.find(p => p.name === pluginName)\n if (plugin && plugin.enabled) {\n try {\n disablePlugin(pluginName)\n count++\n } catch {\n // skip failures silently\n }\n }\n }\n setStatusOverlay({\n type: 'success',\n message: t('commands.plugin.batchDisabledCount').replace(\n '{count}',\n String(count),\n ),\n })\n setSelectedIds(new Set())\n }\n break\n }\n\n case 'add-marketplace': {\n // Clicking an example copies label to search\n setSearchQuery(item.label)\n break\n }\n }\n },\n [phase, activeTab, findPluginMarketplace, installedPlugins, installedNames],\n )\n\n // Determine current tab for rendering\n const currentTab =\n phase.type === 'main'\n ? activeTab\n : phase.type === 'plugin-actions' ||\n phase.type === 'marketplace-actions' ||\n phase.type === 'batch-action-picker'\n ? 'actions'\n : phase.type === 'batch-progress'\n ? 'progress'\n : 'add'\n\n return (\n <TabbedListView\n title={title}\n tabs={tabs}\n activeTab={currentTab}\n onTabChange={handleTabChange}\n items={items}\n searchEnabled={searchEnabled}\n searchPlaceholder={searchPlaceholder}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSearchSubmit={\n phase.type === 'add-marketplace' ? handleSearchSubmit : undefined\n }\n onSelect={handleSelect}\n onClose={handleClose}\n onBack={handleBack}\n statusOverlay={statusOverlay}\n footerHint={footerHint}\n groupByCategory={activeTab === 'browse' || activeTab === 'installed'}\n statusDismissHint=\"Enter Continue \u00B7 Esc Back\"\n multiSelect={multiSelectEnabled}\n selectedIds={selectedIds}\n onSelectionChange={handleSelectionChange}\n onMultiSelect={handleMultiSelect}\n multiSelectActionLabel={multiSelectActionLabel}\n />\n )\n}\n\n// ============================================================================\n// Legacy Plugin Command Router (CLI arguments)\n// ============================================================================\n\nconst LegacyPluginCommand: React.FC<{ args: string; onDone: () => void }> = ({\n args,\n onDone,\n}) => {\n const theme = getTheme()\n const parts = args.trim().split(/\\s+/).filter(Boolean)\n const subcommand = parts[0]\n const subArgs = parts.slice(1)\n\n // Use effect to call onDone after render for help/error cases\n React.useEffect(() => {\n // Only call onDone if we're showing static content (help or errors)\n if (!subcommand || subcommand === 'help' || subcommand === '--help') {\n onDone()\n }\n }, [subcommand, onDone])\n\n // Help text\n if (!subcommand || subcommand === 'help' || subcommand === '--help') {\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color={theme.primary}>\n Plugin Management Commands\n </Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>/plugin list</Text> - List all installed\n plugins\n </Text>\n <Text>\n <Text color={theme.success}>/plugin info &lt;name&gt;</Text> - Show\n detailed plugin information\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin install &lt;name&gt;[@marketplace]\n </Text>{' '}\n - Install plugin from marketplace\n </Text>\n <Text>\n <Text color={theme.success}>/plugin uninstall &lt;name&gt;</Text> -\n Remove installed plugin\n </Text>\n <Text>\n <Text color={theme.success}>/plugin validate [name]</Text> - Validate\n plugin manifest and components\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin sync [--force] [--clean] [--dry-run]\n </Text>{' '}\n - {t('commands.plugin.syncDesc')}\n </Text>\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Marketplace Commands:\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin marketplace add &lt;source&gt;\n </Text>{' '}\n - Register new marketplace\n </Text>\n <Text>\n <Text color={theme.success}>/plugin marketplace list</Text> - List\n registered marketplaces\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin marketplace update &lt;name&gt;\n </Text>{' '}\n - Update marketplace manifest\n </Text>\n <Text>\n <Text color={theme.success}>\n /plugin marketplace remove &lt;name&gt;\n </Text>{' '}\n - Unregister marketplace\n </Text>\n <Text>{''}</Text>\n <Text color={SEMANTIC_COLORS.dim}>Examples:</Text>\n <Text color={SEMANTIC_COLORS.dim}> /plugin list</Text>\n <Text color={SEMANTIC_COLORS.dim}> /plugin info my-plugin</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n /plugin install awesome-plugin@official\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n /plugin marketplace add owner/repo\n </Text>\n </Box>\n )\n }\n\n // Route subcommands\n switch (subcommand) {\n case 'list':\n return <PluginList onDone={onDone} />\n\n case 'info':\n if (subArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Plugin name required. Usage: /plugin info <name>\"\n onDone={onDone}\n />\n )\n }\n return <PluginInfo pluginName={subArgs[0]} onDone={onDone} />\n\n case 'install':\n if (subArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Plugin spec required. Usage: /plugin install <name>[@marketplace]\"\n onDone={onDone}\n />\n )\n }\n return <PluginInstall pluginSpec={subArgs[0]} onDone={onDone} />\n\n case 'uninstall':\n if (subArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Plugin name required. Usage: /plugin uninstall <name>\"\n onDone={onDone}\n />\n )\n }\n return <PluginUninstall pluginName={subArgs[0]} onDone={onDone} />\n\n case 'validate':\n return <PluginValidate pluginName={subArgs[0]} onDone={onDone} />\n\n case 'sync':\n return (\n <PluginSync\n onDone={onDone}\n force={subArgs.includes('--force')}\n clean={subArgs.includes('--clean')}\n dryRun={subArgs.includes('--dry-run')}\n />\n )\n\n case 'marketplace':\n const marketplaceSubcommand = subArgs[0]\n const marketplaceArgs = subArgs.slice(1)\n\n switch (marketplaceSubcommand) {\n case 'list':\n return <MarketplaceListView onDone={onDone} />\n\n case 'add':\n if (marketplaceArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Source required. Usage: /plugin marketplace add <source>\"\n onDone={onDone}\n />\n )\n }\n return <MarketplaceAdd source={marketplaceArgs[0]} onDone={onDone} />\n\n case 'update':\n if (marketplaceArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Marketplace name required. Usage: /plugin marketplace update <name>\"\n onDone={onDone}\n />\n )\n }\n return <MarketplaceUpdate name={marketplaceArgs[0]} onDone={onDone} />\n\n case 'remove':\n if (marketplaceArgs.length === 0) {\n return (\n <ErrorMessage\n message=\"Marketplace name required. Usage: /plugin marketplace remove <name>\"\n onDone={onDone}\n />\n )\n }\n return <MarketplaceRemove name={marketplaceArgs[0]} onDone={onDone} />\n\n default:\n return (\n <ErrorMessage\n message={`Unknown marketplace subcommand: ${marketplaceSubcommand}. Use /plugin help for usage.`}\n onDone={onDone}\n />\n )\n }\n\n default:\n return (\n <ErrorMessage\n message={`Unknown subcommand: ${subcommand}. Use /plugin help for usage.`}\n onDone={onDone}\n />\n )\n }\n}\n\n// ============================================================================\n// Main Plugin Command Router\n// ============================================================================\n\n/**\n * Main Plugin Command component that routes between interactive and legacy modes.\n *\n * - If no args provided: Use new interactive menu UI\n * - If args provided: Use legacy command-line interface for backward compatibility\n */\nconst PluginCommand: React.FC<{ args: string; onDone: () => void }> = ({\n args,\n onDone,\n}) => {\n // Check if user provided command-line arguments\n if (args.trim()) {\n // Use legacy CLI mode for backward compatibility\n return <LegacyPluginCommand args={args} onDone={onDone} />\n } else {\n // Use new interactive UI when no args provided\n return <InteractivePluginCommand onDone={onDone} />\n }\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst plugin = {\n type: 'local-jsx',\n name: 'plugin',\n description: 'Manage plugins and plugin marketplaces (interactive)',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n aliases: ['plugins'],\n async call(onDone, _context) {\n // For commands that need args, we parse from user input\n // Since this is a local-jsx command, args are already parsed\n return <PluginCommand args=\"\" onDone={onDone} />\n },\n userFacingName() {\n return 'plugin'\n },\n} satisfies Command\n\nexport default plugin\n"],
5
+ "mappings": "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",
6
+ "names": ["plugin", "uninstallPlugin"]
7
7
  }