@within-7/minto 0.1.5 → 0.1.6

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 (264) hide show
  1. package/dist/commands/agents/AgentsCommand.js +2342 -0
  2. package/dist/commands/agents/AgentsCommand.js.map +7 -0
  3. package/dist/commands/agents/constants.js +58 -0
  4. package/dist/commands/agents/constants.js.map +7 -0
  5. package/dist/commands/agents/index.js +37 -0
  6. package/dist/commands/agents/index.js.map +7 -0
  7. package/dist/commands/agents/types.js +10 -0
  8. package/dist/commands/agents/types.js.map +7 -0
  9. package/dist/commands/agents/utils/fileOperations.js +185 -0
  10. package/dist/commands/agents/utils/fileOperations.js.map +7 -0
  11. package/dist/commands/agents/utils/index.js +21 -0
  12. package/dist/commands/agents/utils/index.js.map +7 -0
  13. package/dist/commands/bug.js +2 -2
  14. package/dist/commands/bug.js.map +2 -2
  15. package/dist/commands/compact.js +5 -5
  16. package/dist/commands/compact.js.map +2 -2
  17. package/dist/commands/ctx_viz.js +55 -22
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/mcp-interactive.js +11 -11
  20. package/dist/commands/mcp-interactive.js.map +2 -2
  21. package/dist/commands/model.js +94 -32
  22. package/dist/commands/model.js.map +3 -3
  23. package/dist/commands/plugin/AddMarketplaceForm.js +49 -21
  24. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  25. package/dist/commands/plugin/ConfirmDialog.js +38 -26
  26. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  27. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +24 -8
  28. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  29. package/dist/commands/plugin/InstalledPluginsManager.js +3 -1
  30. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  31. package/dist/commands/plugin/MainMenu.js +16 -7
  32. package/dist/commands/plugin/MainMenu.js.map +2 -2
  33. package/dist/commands/plugin/MarketplaceManager.js +84 -39
  34. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  35. package/dist/commands/plugin/MarketplaceSelector.js +7 -3
  36. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  37. package/dist/commands/plugin/PlaceholderScreen.js +16 -2
  38. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  39. package/dist/commands/plugin/PluginBrowser.js +4 -2
  40. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  41. package/dist/commands/plugin/PluginDetailsInstall.js +12 -6
  42. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  43. package/dist/commands/plugin/PluginDetailsManage.js +14 -5
  44. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  45. package/dist/commands/plugin/example-usage.js.map +2 -2
  46. package/dist/commands/plugin/utils.js.map +2 -2
  47. package/dist/commands/plugin.js +226 -46
  48. package/dist/commands/plugin.js.map +2 -2
  49. package/dist/commands/refreshCommands.js +6 -3
  50. package/dist/commands/refreshCommands.js.map +2 -2
  51. package/dist/commands/resume.js +2 -1
  52. package/dist/commands/resume.js.map +2 -2
  53. package/dist/commands/setup.js +19 -5
  54. package/dist/commands/setup.js.map +2 -2
  55. package/dist/commands/terminalSetup.js +2 -2
  56. package/dist/commands/terminalSetup.js.map +1 -1
  57. package/dist/commands.js +14 -30
  58. package/dist/commands.js.map +2 -2
  59. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  60. package/dist/components/AskUserQuestionDialog/QuestionView.js +10 -1
  61. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  62. package/dist/components/BackgroundTasksPanel.js +5 -1
  63. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  64. package/dist/components/Config.js +17 -4
  65. package/dist/components/Config.js.map +2 -2
  66. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  67. package/dist/components/CustomSelect/select-option.js +4 -1
  68. package/dist/components/CustomSelect/select-option.js.map +2 -2
  69. package/dist/components/Help.js +6 -8
  70. package/dist/components/Help.js.map +2 -2
  71. package/dist/components/Logo.js +1 -1
  72. package/dist/components/Logo.js.map +2 -2
  73. package/dist/components/ModelListManager.js.map +2 -2
  74. package/dist/components/ModelSelector/ModelSelector.js +2030 -0
  75. package/dist/components/ModelSelector/ModelSelector.js.map +7 -0
  76. package/dist/components/ModelSelector/ScreenContainer.js +27 -0
  77. package/dist/components/ModelSelector/ScreenContainer.js.map +7 -0
  78. package/dist/components/ModelSelector/constants.js +37 -0
  79. package/dist/components/ModelSelector/constants.js.map +7 -0
  80. package/dist/components/ModelSelector/hooks/index.js +5 -0
  81. package/dist/components/ModelSelector/hooks/index.js.map +7 -0
  82. package/dist/components/ModelSelector/hooks/useEscapeNavigation.js +21 -0
  83. package/dist/components/ModelSelector/hooks/useEscapeNavigation.js.map +7 -0
  84. package/dist/components/ModelSelector/index.js +17 -0
  85. package/dist/components/ModelSelector/index.js.map +7 -0
  86. package/dist/components/ModelSelector/types.js +1 -0
  87. package/dist/components/ModelSelector/types.js.map +7 -0
  88. package/dist/components/PressEnterToContinue.js +1 -1
  89. package/dist/components/PressEnterToContinue.js.map +2 -2
  90. package/dist/components/ProjectOnboarding.js +1 -1
  91. package/dist/components/ProjectOnboarding.js.map +2 -2
  92. package/dist/components/PromptInput.js +88 -37
  93. package/dist/components/PromptInput.js.map +2 -2
  94. package/dist/components/QuitSummary.js +17 -10
  95. package/dist/components/QuitSummary.js.map +2 -2
  96. package/dist/components/SentryErrorBoundary.js.map +2 -2
  97. package/dist/components/StreamingBashOutput.js.map +2 -2
  98. package/dist/components/StructuredDiff.js.map +2 -2
  99. package/dist/components/SubagentProgress.js.map +2 -2
  100. package/dist/components/TaskCard.js.map +2 -2
  101. package/dist/components/TextInput.js.map +1 -1
  102. package/dist/components/TodoItem.js.map +1 -1
  103. package/dist/components/binary-feedback/BinaryFeedbackOption.js +1 -3
  104. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +2 -2
  105. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +1 -1
  106. package/dist/components/messages/AssistantToolUseMessage.js +3 -1
  107. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  108. package/dist/components/messages/TaskProgressMessage.js.map +2 -2
  109. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  110. package/dist/components/messages/UserToolResultMessage/utils.js.map +2 -2
  111. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +2 -2
  112. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +2 -2
  113. package/dist/components/permissions/hooks.js.map +2 -2
  114. package/dist/constants/modelCapabilities.js +1 -1
  115. package/dist/constants/modelCapabilities.js.map +2 -2
  116. package/dist/constants/prompts.js.map +1 -1
  117. package/dist/constants/timing.js +34 -0
  118. package/dist/constants/timing.js.map +7 -0
  119. package/dist/entrypoints/cli.js +128 -33
  120. package/dist/entrypoints/cli.js.map +3 -3
  121. package/dist/entrypoints/mcp.js +13 -18
  122. package/dist/entrypoints/mcp.js.map +2 -2
  123. package/dist/hooks/useCanUseTool.js.map +2 -2
  124. package/dist/hooks/useCancelRequest.js.map +1 -1
  125. package/dist/hooks/useHistorySearch.js.map +2 -2
  126. package/dist/hooks/useLogStartupTime.js.map +2 -2
  127. package/dist/hooks/usePermissionRequestLogging.js.map +2 -2
  128. package/dist/hooks/useTextInput.js.map +1 -1
  129. package/dist/hooks/useUnifiedCompletion.js +493 -394
  130. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  131. package/dist/index.js.map +2 -2
  132. package/dist/permissions.js +4 -7
  133. package/dist/permissions.js.map +2 -2
  134. package/dist/query.js +6 -1
  135. package/dist/query.js.map +2 -2
  136. package/dist/screens/REPL.js +72 -36
  137. package/dist/screens/REPL.js.map +2 -2
  138. package/dist/screens/ResumeConversation.js +2 -1
  139. package/dist/screens/ResumeConversation.js.map +2 -2
  140. package/dist/services/adapters/base.js.map +2 -2
  141. package/dist/services/adapters/chatCompletions.js.map +2 -2
  142. package/dist/services/adapters/responsesAPI.js +3 -1
  143. package/dist/services/adapters/responsesAPI.js.map +2 -2
  144. package/dist/services/claude.js +327 -328
  145. package/dist/services/claude.js.map +2 -2
  146. package/dist/services/customCommands.js +6 -1
  147. package/dist/services/customCommands.js.map +2 -2
  148. package/dist/services/fileFreshness.js.map +2 -2
  149. package/dist/services/gpt5ConnectionTest.js +20 -7
  150. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  151. package/dist/services/hookExecutor.js +6 -12
  152. package/dist/services/hookExecutor.js.map +2 -2
  153. package/dist/services/mcpClient.js +29 -2
  154. package/dist/services/mcpClient.js.map +2 -2
  155. package/dist/services/mentionProcessor.js +23 -10
  156. package/dist/services/mentionProcessor.js.map +2 -2
  157. package/dist/services/modelAdapterFactory.js.map +2 -2
  158. package/dist/services/oauth.js.map +2 -2
  159. package/dist/services/openai.js +109 -72
  160. package/dist/services/openai.js.map +3 -3
  161. package/dist/services/responseStateManager.js.map +2 -2
  162. package/dist/services/systemReminder.js.map +2 -2
  163. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  164. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +14 -8
  165. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  166. package/dist/tools/BashOutputTool/BashOutputTool.js.map +2 -2
  167. package/dist/tools/BashTool/BashTool.js.map +2 -2
  168. package/dist/tools/FileReadTool/FileReadTool.js.map +1 -1
  169. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  170. package/dist/tools/GrepTool/GrepTool.js +1 -4
  171. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  172. package/dist/tools/MultiEditTool/MultiEditTool.js +4 -1
  173. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  174. package/dist/tools/NotebookReadTool/NotebookReadTool.js +3 -1
  175. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  176. package/dist/tools/SkillTool/SkillTool.js +12 -6
  177. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  178. package/dist/tools/TaskTool/TaskTool.js +14 -5
  179. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  180. package/dist/tools/TaskTool/prompt.js.map +2 -2
  181. package/dist/tools/ThinkTool/ThinkTool.js +6 -1
  182. package/dist/tools/ThinkTool/ThinkTool.js.map +2 -2
  183. package/dist/tools/TodoWriteTool/TodoWriteTool.js +23 -3
  184. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  185. package/dist/tools/URLFetcherTool/URLFetcherTool.js +2 -2
  186. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  187. package/dist/tools/URLFetcherTool/cache.js +6 -3
  188. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  189. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +3 -1
  190. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +2 -2
  191. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  192. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  193. package/dist/tools/WebSearchTool/searchProviders.js +15 -6
  194. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  195. package/dist/tools.js +4 -1
  196. package/dist/tools.js.map +2 -2
  197. package/dist/types/core.js +1 -0
  198. package/dist/types/core.js.map +7 -0
  199. package/dist/types/hooks.js +1 -4
  200. package/dist/types/hooks.js.map +2 -2
  201. package/dist/types/marketplace.js +8 -2
  202. package/dist/types/marketplace.js.map +2 -2
  203. package/dist/types/plugin.js +9 -6
  204. package/dist/types/plugin.js.map +2 -2
  205. package/dist/utils/BackgroundShellManager.js +76 -10
  206. package/dist/utils/BackgroundShellManager.js.map +2 -2
  207. package/dist/utils/PersistentShell.js +7 -2
  208. package/dist/utils/PersistentShell.js.map +2 -2
  209. package/dist/utils/advancedFuzzyMatcher.js +4 -1
  210. package/dist/utils/advancedFuzzyMatcher.js.map +2 -2
  211. package/dist/utils/agentLoader.js +69 -35
  212. package/dist/utils/agentLoader.js.map +2 -2
  213. package/dist/utils/agentStorage.js.map +2 -2
  214. package/dist/utils/async.js +163 -0
  215. package/dist/utils/async.js.map +7 -0
  216. package/dist/utils/autoUpdater.js +8 -2
  217. package/dist/utils/autoUpdater.js.map +2 -2
  218. package/dist/utils/commands.js +23 -11
  219. package/dist/utils/commands.js.map +2 -2
  220. package/dist/utils/commonUnixCommands.js +3 -1
  221. package/dist/utils/commonUnixCommands.js.map +2 -2
  222. package/dist/utils/compressionMode.js.map +2 -2
  223. package/dist/utils/config.js +30 -14
  224. package/dist/utils/config.js.map +2 -2
  225. package/dist/utils/debugLogger.js.map +2 -2
  226. package/dist/utils/env.js.map +2 -2
  227. package/dist/utils/envConfig.js +82 -0
  228. package/dist/utils/envConfig.js.map +7 -0
  229. package/dist/utils/errorHandling.js +89 -0
  230. package/dist/utils/errorHandling.js.map +7 -0
  231. package/dist/utils/expertChatStorage.js.map +2 -2
  232. package/dist/utils/fuzzyMatcher.js +13 -7
  233. package/dist/utils/fuzzyMatcher.js.map +2 -2
  234. package/dist/utils/hookManager.js +14 -4
  235. package/dist/utils/hookManager.js.map +2 -2
  236. package/dist/utils/log.js.map +2 -2
  237. package/dist/utils/marketplaceManager.js +44 -9
  238. package/dist/utils/marketplaceManager.js.map +2 -2
  239. package/dist/utils/messageContextManager.js.map +1 -1
  240. package/dist/utils/messages.js +6 -3
  241. package/dist/utils/messages.js.map +2 -2
  242. package/dist/utils/model.js +3 -1
  243. package/dist/utils/model.js.map +2 -2
  244. package/dist/utils/pluginInstaller.js +3 -15
  245. package/dist/utils/pluginInstaller.js.map +2 -2
  246. package/dist/utils/pluginLoader.js +41 -13
  247. package/dist/utils/pluginLoader.js.map +2 -2
  248. package/dist/utils/pluginRegistry.js.map +2 -2
  249. package/dist/utils/pluginValidator.js +71 -49
  250. package/dist/utils/pluginValidator.js.map +2 -2
  251. package/dist/utils/ptyCompat.js.map +2 -2
  252. package/dist/utils/roundConverter.js.map +2 -2
  253. package/dist/utils/secureFile.js +43 -14
  254. package/dist/utils/secureFile.js.map +2 -2
  255. package/dist/utils/sessionState.js.map +2 -2
  256. package/dist/utils/skillLoader.js.map +2 -2
  257. package/dist/utils/teamConfig.js +7 -4
  258. package/dist/utils/teamConfig.js.map +2 -2
  259. package/dist/utils/theme.js.map +2 -2
  260. package/dist/utils/thinking.js.map +2 -2
  261. package/dist/utils/unaryLogging.js.map +2 -2
  262. package/dist/version.js +2 -2
  263. package/dist/version.js.map +1 -1
  264. package/package.json +5 -5
@@ -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'\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 dimColor>\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 && `${plugin.agents.length} agent${plugin.agents.length !== 1 ? 's' : ''}`,\n plugin.commands.length > 0 && `${plugin.commands.length} command${plugin.commands.length !== 1 ? 's' : ''}`,\n plugin.skills.length > 0 && `${plugin.skills.length} skill${plugin.skills.length !== 1 ? 's' : ''}`,\n plugin.hooks.length > 0 && `${plugin.hooks.length} hook${plugin.hooks.length !== 1 ? 's' : ''}`,\n plugin.mcpServers.length > 0 && `${plugin.mcpServers.length} MCP server${plugin.mcpServers.length !== 1 ? 's' : ''}`,\n ].filter(Boolean)\n\n return (\n <Box key={plugin.manifest.name} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={theme.primary} bold>\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n <Text dimColor> v{plugin.manifest.version}</Text>\n {!plugin.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n {plugin.manifest.description && (\n <Text dimColor> {plugin.manifest.description}</Text>\n )}\n {componentCounts.length > 0 && (\n <Text dimColor> Components: {componentCounts.join(', ')}</Text>\n )}\n <Text dimColor> Location: {plugin.source.type === 'local' ? plugin.source.path : plugin.location}</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><Text color={theme.primary}>Name:</Text> {plugin.manifest.name}</Text>\n <Text><Text color={theme.primary}>Version:</Text> {plugin.manifest.version}</Text>\n {plugin.manifest.description && (\n <Text><Text color={theme.primary}>Description:</Text> {plugin.manifest.description}</Text>\n )}\n {plugin.manifest.author && (\n <Text><Text color={theme.primary}>Author:</Text> {plugin.manifest.author}</Text>\n )}\n {plugin.manifest.license && (\n <Text><Text color={theme.primary}>License:</Text> {plugin.manifest.license}</Text>\n )}\n {plugin.manifest.homepage && (\n <Text><Text color={theme.primary}>Homepage:</Text> {plugin.manifest.homepage}</Text>\n )}\n {plugin.manifest.repository && (\n <Text><Text color={theme.primary}>Repository:</Text> {plugin.manifest.repository}</Text>\n )}\n <Text><Text color={theme.primary}>Location:</Text> {plugin.location}</Text>\n <Text><Text color={theme.primary}>Source:</Text> {plugin.source.type}</Text>\n <Text><Text color={theme.primary}>Enabled:</Text> {plugin.enabled ? 'Yes' : 'No'}</Text>\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>Components:</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 dimColor> \u2022 {agent.name}{agent.config.description ? ` - ${agent.config.description}` : ''}</Text>\n ))}\n </Box>\n )}\n\n {plugin.commands.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>Commands ({plugin.commands.length}):</Text>\n {plugin.commands.map((command) => (\n <Text dimColor> \u2022 /{command.name}{command.config.description ? ` - ${command.config.description}` : ''}</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 dimColor> \u2022 {skill.name}{skill.config.description ? ` - ${skill.config.description}` : ''}</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 dimColor> \u2022 {hook.name} ({hook.config.event})</Text>\n ))}\n </Box>\n )}\n\n {plugin.mcpServers.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.success}>MCP Servers ({plugin.mcpServers.length}):</Text>\n {plugin.mcpServers.map((server) => (\n <Text dimColor> \u2022 {server.name} - {server.config.command}</Text>\n ))}\n </Box>\n )}\n\n {plugin.agents.length === 0 && plugin.commands.length === 0 &&\n plugin.skills.length === 0 && plugin.hooks.length === 0 &&\n plugin.mcpServers.length === 0 && (\n <Text dimColor> No components loaded</Text>\n )}\n\n {plugin.manifest.engines && (\n <>\n <Text>{''}</Text>\n <Text bold color={theme.primary}>Requirements:</Text>\n {plugin.manifest.engines.minto && (\n <Text dimColor> Minto: {plugin.manifest.engines.minto}</Text>\n )}\n {plugin.manifest.engines['claude-code'] && (\n <Text dimColor> Claude Code: {plugin.manifest.engines['claude-code']}</Text>\n )}\n {plugin.manifest.engines.node && (\n <Text dimColor> Node: {plugin.manifest.engines.node}</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> = ({ pluginSpec, onDone }) => {\n const [status, setStatus] = useState<'installing' | 'success' | 'error'>('installing')\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(`Installing plugin \"${pluginName}\"${marketplaceName ? ` from marketplace \"${marketplaceName}\"` : ''}...`)\n\n const path = await installPluginFromMarketplace(pluginName, marketplaceName)\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(`Installation failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n installPlugin()\n }, [pluginSpec, onDone])\n\n const color = status === 'success' ? theme.success :\n status === 'error' ? 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 dimColor>Plugin is now available. Use /plugin info {pluginSpec.split('@')[0]} to see details.</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> = ({ pluginName, onDone }) => {\n const [status, setStatus] = useState<'uninstalling' | 'success' | 'error'>('uninstalling')\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(`Uninstallation failed: ${err instanceof Error ? err.message : String(err)}`)\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n uninstallPlugin()\n }, [pluginName, onDone])\n\n const color = status === 'success' ? theme.success :\n status === 'error' ? 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> = ({ pluginName, onDone }) => {\n const [results, setResults] = useState<Array<{ plugin: string; valid: boolean; errors: string[] }>>([])\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) errors.push('Missing required field: name')\n if (!plugin.manifest.version) errors.push('Missing required field: version')\n if (!plugin.manifest.description) errors.push('Missing required field: description')\n\n // Validate version format\n if (plugin.manifest.version && !/^\\d+\\.\\d+\\.\\d+$/.test(plugin.manifest.version)) {\n errors.push('Invalid version format (must be semver: X.Y.Z)')\n }\n\n // Validate name format\n if (plugin.manifest.name && !/^[a-z0-9-]+$/.test(plugin.manifest.name)) {\n errors.push('Invalid name format (must be lowercase alphanumeric with hyphens)')\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 dimColor>\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 dimColor> {marketplace.manifest.metadata.description}</Text>\n )}\n <Text dimColor>\n {` Plugins: ${marketplace.manifest.plugins.length}`}\n {` | Owner: ${marketplace.manifest.owner.name}`}\n </Text>\n <Text dimColor>\n {` Source: ${marketplace.source.type}`}\n {marketplace.source.type === 'github' && ` (${marketplace.source.repo})`}\n {marketplace.source.type === 'url' && ` (${marketplace.source.url})`}\n {marketplace.source.type === 'local' && ` (${marketplace.source.path})`}\n </Text>\n <Text dimColor>\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>(null)\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(`Registration failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n addMarketplaceAsync()\n }, [source, onDone])\n\n const color = status === 'success' ? theme.success :\n status === 'error' ? 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 dimColor>Marketplace contains {marketplace.manifest.plugins.length} plugin(s)</Text>\n <Text dimColor>Use /plugin marketplace list to see all marketplaces</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> = ({ name, onDone }) => {\n const [status, setStatus] = useState<'updating' | 'success' | 'error'>('updating')\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(`Update failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n updateMarketplaceAsync()\n }, [name, onDone])\n\n const color = status === 'success' ? theme.success :\n status === 'error' ? 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> = ({ name, onDone }) => {\n const [status, setStatus] = useState<'removing' | 'success' | 'error'>('removing')\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(`Removal failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n setStatus('error')\n } finally {\n onDone()\n }\n }\n\n removeMarketplaceSync()\n }, [name, onDone])\n\n const color = status === 'success' ? theme.success :\n status === 'error' ? 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 }> = ({ message, onDone }) => {\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}>Marketplace not found: {marketplaceName}</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 dimColor>\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 dimColor>\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 dimColor>\n Press <Text bold>p</Text> to view plugins from this marketplace\n </Text>\n <Text dimColor>\n Press <Text bold>u</Text> to update marketplace\n </Text>\n <Text dimColor>\n Press <Text bold>r</Text> to remove marketplace\n </Text>\n <Text dimColor>\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 }> = ({ onDone }) => {\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 <MainMenu onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'marketplace-selector':\n return <MarketplaceSelector onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'plugin-browser':\n return <PluginBrowser marketplace={currentState.marketplace} onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'plugin-details-install':\n return <PluginDetailsInstall marketplace={currentState.marketplace} plugin={currentState.plugin} onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'installed-plugins-manager':\n return <InstalledPluginsManager key={navigationStack.length} onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'installed-plugins-by-marketplace':\n return <InstalledPluginsByMarketplace marketplace={currentState.marketplace} onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'plugin-details-manage':\n return <PluginDetailsManage plugin={currentState.plugin} onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'add-marketplace':\n return <AddMarketplaceForm onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'marketplace-manager':\n return <MarketplaceManager onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n case 'marketplace-details':\n return <MarketplaceDetails marketplace={currentState.marketplace} onNavigate={handleNavigate} onBack={handleBack} onDone={onDone} />\n\n default:\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Unknown screen state</Text>\n <Text dimColor>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 }> = ({ args, onDone }) => {\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}>Plugin Management Commands</Text>\n <Text>{''}</Text>\n <Text><Text color={theme.success}>/plugin list</Text> - List all installed plugins</Text>\n <Text><Text color={theme.success}>/plugin info &lt;name&gt;</Text> - Show detailed plugin information</Text>\n <Text><Text color={theme.success}>/plugin install &lt;name&gt;[@marketplace]</Text> - Install plugin from marketplace</Text>\n <Text><Text color={theme.success}>/plugin uninstall &lt;name&gt;</Text> - Remove installed plugin</Text>\n <Text><Text color={theme.success}>/plugin validate [name]</Text> - Validate plugin manifest and components</Text>\n <Text>{''}</Text>\n <Text bold color={theme.primary}>Marketplace Commands:</Text>\n <Text><Text color={theme.success}>/plugin marketplace add &lt;source&gt;</Text> - Register new marketplace</Text>\n <Text><Text color={theme.success}>/plugin marketplace list</Text> - List registered marketplaces</Text>\n <Text><Text color={theme.success}>/plugin marketplace update &lt;name&gt;</Text> - Update marketplace manifest</Text>\n <Text><Text color={theme.success}>/plugin marketplace remove &lt;name&gt;</Text> - Unregister marketplace</Text>\n <Text>{''}</Text>\n <Text dimColor>Examples:</Text>\n <Text dimColor> /plugin list</Text>\n <Text dimColor> /plugin info my-plugin</Text>\n <Text dimColor> /plugin install awesome-plugin@official</Text>\n <Text dimColor> /plugin marketplace add owner/repo</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 <ErrorMessage message=\"Plugin name required. Usage: /plugin info <name>\" onDone={onDone} />\n }\n return <PluginInfo pluginName={subArgs[0]} onDone={onDone} />\n\n case 'install':\n if (subArgs.length === 0) {\n return <ErrorMessage message=\"Plugin spec required. Usage: /plugin install <name>[@marketplace]\" onDone={onDone} />\n }\n return <PluginInstall pluginSpec={subArgs[0]} onDone={onDone} />\n\n case 'uninstall':\n if (subArgs.length === 0) {\n return <ErrorMessage message=\"Plugin name required. Usage: /plugin uninstall <name>\" onDone={onDone} />\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 <ErrorMessage message=\"Source required. Usage: /plugin marketplace add <source>\" onDone={onDone} />\n }\n return <MarketplaceAdd source={marketplaceArgs[0]} onDone={onDone} />\n\n case 'update':\n if (marketplaceArgs.length === 0) {\n return <ErrorMessage message=\"Marketplace name required. Usage: /plugin marketplace update <name>\" onDone={onDone} />\n }\n return <MarketplaceUpdate name={marketplaceArgs[0]} onDone={onDone} />\n\n case 'remove':\n if (marketplaceArgs.length === 0) {\n return <ErrorMessage message=\"Marketplace name required. Usage: /plugin marketplace remove <name>\" onDone={onDone} />\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 }> = ({ args, onDone }) => {\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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",
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'\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 dimColor>\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 dimColor> v{plugin.manifest.version}</Text>\n {!plugin.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n {plugin.manifest.description && (\n <Text dimColor> {plugin.manifest.description}</Text>\n )}\n {componentCounts.length > 0 && (\n <Text dimColor> Components: {componentCounts.join(', ')}</Text>\n )}\n <Text dimColor>\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 dimColor>\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 dimColor>\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 dimColor>\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 dimColor>\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 dimColor>\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 dimColor> 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 dimColor> Minto: {plugin.manifest.engines.minto}</Text>\n )}\n {plugin.manifest.engines['claude-code'] && (\n <Text dimColor>\n {' '}\n Claude Code: {plugin.manifest.engines['claude-code']}\n </Text>\n )}\n {plugin.manifest.engines.node && (\n <Text dimColor> Node: {plugin.manifest.engines.node}</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 dimColor>\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 dimColor>\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 dimColor> {marketplace.manifest.metadata.description}</Text>\n )}\n <Text dimColor>\n {` Plugins: ${marketplace.manifest.plugins.length}`}\n {` | Owner: ${marketplace.manifest.owner.name}`}\n </Text>\n <Text dimColor>\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 dimColor>\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 dimColor>\n Marketplace contains {marketplace.manifest.plugins.length} plugin(s)\n </Text>\n <Text dimColor>\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 dimColor>\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 dimColor>\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 dimColor>\n Press <Text bold>p</Text> to view plugins from this marketplace\n </Text>\n <Text dimColor>\n Press <Text bold>u</Text> to update marketplace\n </Text>\n <Text dimColor>\n Press <Text bold>r</Text> to remove marketplace\n </Text>\n <Text dimColor>\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 dimColor>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 dimColor>Examples:</Text>\n <Text dimColor> /plugin list</Text>\n <Text dimColor> /plugin info my-plugin</Text>\n <Text dimColor> /plugin install awesome-plugin@official</Text>\n <Text dimColor> /plugin marketplace add owner/repo</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
6
  "names": ["plugin"]
7
7
  }
@@ -1,11 +1,14 @@
1
- import { reloadCustomCommands, reloadPluginCommands } from "../services/customCommands.js";
1
+ import {
2
+ reloadCustomCommands,
3
+ reloadPluginCommands
4
+ } from "../services/customCommands.js";
2
5
  import { getCommands } from "../commands.js";
3
6
  const refreshCommands = {
4
7
  type: "local",
5
8
  name: "refresh-commands",
6
- description: "Reload custom and plugin commands from filesystem",
9
+ description: "[Developer] Reload custom and plugin commands from filesystem",
7
10
  isEnabled: true,
8
- isHidden: false,
11
+ isHidden: true,
9
12
  async call(_, context) {
10
13
  try {
11
14
  reloadCustomCommands();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/refreshCommands.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { reloadCustomCommands, reloadPluginCommands } from '@services/customCommands'\nimport { getCommands } from '@commands'\n\n/**\n * Refresh Commands - Reload custom and plugin commands from filesystem\n *\n * This command provides a runtime mechanism to refresh the custom commands\n * and plugin commands cache without restarting the application. It's particularly\n * useful during development or when users are actively creating/modifying\n * custom commands or installing/updating plugins.\n *\n * The command follows the standard local command pattern used throughout\n * the project and provides detailed feedback about the refresh operation.\n */\nconst refreshCommands = {\n type: 'local',\n name: 'refresh-commands',\n description: 'Reload custom and plugin commands from filesystem',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n try {\n // Clear custom commands cache to force filesystem rescan\n reloadCustomCommands()\n\n // Clear plugin commands cache to force plugin rescan\n reloadPluginCommands()\n\n // Clear the main commands cache to ensure full reload\n // This ensures that changes to custom and plugin commands are reflected in the main command list\n getCommands.cache.clear?.()\n\n // Reload commands to get updated count and validate the refresh\n const commands = await getCommands()\n const customCommands = commands.filter(\n cmd => cmd.name.startsWith('project:') || cmd.name.startsWith('user:'),\n )\n const pluginCommands = commands.filter(\n cmd => cmd.name.startsWith('plugin:'),\n )\n\n // Provide detailed feedback about the refresh operation\n return `\u2705 Commands refreshed successfully!\n\nCustom commands reloaded: ${customCommands.length}\n- Project commands: ${customCommands.filter(cmd => cmd.name.startsWith('project:')).length}\n- User commands: ${customCommands.filter(cmd => cmd.name.startsWith('user:')).length}\n\nPlugin commands reloaded: ${pluginCommands.length}\n\nUse /help to see updated command list.`\n } catch (error) {\n console.error('Failed to refresh commands:', error)\n return '\u274C Failed to refresh commands. Check console for details.'\n }\n },\n userFacingName() {\n return 'refresh-commands'\n },\n} satisfies Command\n\nexport default refreshCommands\n"],
5
- "mappings": "AACA,SAAS,sBAAsB,4BAA4B;AAC3D,SAAS,mBAAmB;AAa5B,MAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,QAAI;AAEF,2BAAqB;AAGrB,2BAAqB;AAIrB,kBAAY,MAAM,QAAQ;AAG1B,YAAM,WAAW,MAAM,YAAY;AACnC,YAAM,iBAAiB,SAAS;AAAA,QAC9B,SAAO,IAAI,KAAK,WAAW,UAAU,KAAK,IAAI,KAAK,WAAW,OAAO;AAAA,MACvE;AACA,YAAM,iBAAiB,SAAS;AAAA,QAC9B,SAAO,IAAI,KAAK,WAAW,SAAS;AAAA,MACtC;AAGA,aAAO;AAAA;AAAA,4BAEe,eAAe,MAAM;AAAA,sBAC3B,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,UAAU,CAAC,EAAE,MAAM;AAAA,mBACvE,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,OAAO,CAAC,EAAE,MAAM;AAAA;AAAA,4BAExD,eAAe,MAAM;AAAA;AAAA;AAAA,IAG7C,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;",
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport {\n reloadCustomCommands,\n reloadPluginCommands,\n} from '@services/customCommands'\nimport { getCommands } from '@commands'\n\n/**\n * Refresh Commands - Reload custom and plugin commands from filesystem\n *\n * This command provides a runtime mechanism to refresh the custom commands\n * and plugin commands cache without restarting the application. It's particularly\n * useful during development or when users are actively creating/modifying\n * custom commands or installing/updating plugins.\n *\n * The command follows the standard local command pattern used throughout\n * the project and provides detailed feedback about the refresh operation.\n */\nconst refreshCommands = {\n type: 'local',\n name: 'refresh-commands',\n description: '[Developer] Reload custom and plugin commands from filesystem',\n isEnabled: true,\n isHidden: true,\n async call(_, context) {\n try {\n // Clear custom commands cache to force filesystem rescan\n reloadCustomCommands()\n\n // Clear plugin commands cache to force plugin rescan\n reloadPluginCommands()\n\n // Clear the main commands cache to ensure full reload\n // This ensures that changes to custom and plugin commands are reflected in the main command list\n getCommands.cache.clear?.()\n\n // Reload commands to get updated count and validate the refresh\n const commands = await getCommands()\n const customCommands = commands.filter(\n cmd => cmd.name.startsWith('project:') || cmd.name.startsWith('user:'),\n )\n const pluginCommands = commands.filter(cmd =>\n cmd.name.startsWith('plugin:'),\n )\n\n // Provide detailed feedback about the refresh operation\n return `\u2705 Commands refreshed successfully!\n\nCustom commands reloaded: ${customCommands.length}\n- Project commands: ${customCommands.filter(cmd => cmd.name.startsWith('project:')).length}\n- User commands: ${customCommands.filter(cmd => cmd.name.startsWith('user:')).length}\n\nPlugin commands reloaded: ${pluginCommands.length}\n\nUse /help to see updated command list.`\n } catch (error) {\n console.error('Failed to refresh commands:', error)\n return '\u274C Failed to refresh commands. Check console for details.'\n }\n },\n userFacingName() {\n return 'refresh-commands'\n },\n} satisfies Command\n\nexport default refreshCommands\n"],
5
+ "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAa5B,MAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,QAAI;AAEF,2BAAqB;AAGrB,2BAAqB;AAIrB,kBAAY,MAAM,QAAQ;AAG1B,YAAM,WAAW,MAAM,YAAY;AACnC,YAAM,iBAAiB,SAAS;AAAA,QAC9B,SAAO,IAAI,KAAK,WAAW,UAAU,KAAK,IAAI,KAAK,WAAW,OAAO;AAAA,MACvE;AACA,YAAM,iBAAiB,SAAS;AAAA,QAAO,SACrC,IAAI,KAAK,WAAW,SAAS;AAAA,MAC/B;AAGA,aAAO;AAAA;AAAA,4BAEe,eAAe,MAAM;AAAA,sBAC3B,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,UAAU,CAAC,EAAE,MAAM;AAAA,mBACvE,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,OAAO,CAAC,EAAE,MAAM;AAAA;AAAA,4BAExD,eAAe,MAAM;AAAA;AAAA;AAAA,IAG7C,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;",
6
6
  "names": []
7
7
  }
@@ -5,9 +5,10 @@ import { CACHE_PATHS, loadLogList } from "../utils/log.js";
5
5
  var resume_default = {
6
6
  type: "local-jsx",
7
7
  name: "resume",
8
- description: "Resume a previous conversation",
8
+ description: "Resume a previous conversation from this project",
9
9
  isEnabled: true,
10
10
  isHidden: false,
11
+ aliases: ["r"],
11
12
  userFacingName() {
12
13
  return "resume";
13
14
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/resume.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport type { Command } from '@commands'\nimport { ResumeConversation } from '@screens/ResumeConversation'\nimport { render } from 'ink'\nimport { CACHE_PATHS, loadLogList } from '@utils/log'\n\nexport default {\n type: 'local-jsx',\n name: 'resume',\n description: 'Resume a previous conversation',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'resume'\n },\n async call(onDone, context) {\n const { commands = [], tools = [], verbose = false } = context.options || {}\n const logs = await loadLogList(CACHE_PATHS.messages())\n render(\n <ResumeConversation\n commands={commands}\n context={{ unmount: onDone }}\n logs={logs}\n tools={tools}\n verbose={verbose}\n />,\n )\n // This return is here for type only\n return null\n },\n} satisfies Command\n"],
5
- "mappings": "AAAA,YAAY,WAAW;AAEvB,SAAS,0BAA0B;AACnC,SAAS,cAAc;AACvB,SAAS,aAAa,mBAAmB;AAEzC,IAAO,iBAAQ;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ,SAAS;AAC1B,UAAM,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,MAAM,IAAI,QAAQ,WAAW,CAAC;AAC3E,UAAM,OAAO,MAAM,YAAY,YAAY,SAAS,CAAC;AACrD;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,SAAS,EAAE,SAAS,OAAO;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["import * as React from 'react'\nimport type { Command } from '@commands'\nimport { ResumeConversation } from '@screens/ResumeConversation'\nimport { render } from 'ink'\nimport { CACHE_PATHS, loadLogList } from '@utils/log'\n\nexport default {\n type: 'local-jsx',\n name: 'resume',\n description: 'Resume a previous conversation from this project',\n isEnabled: true,\n isHidden: false,\n aliases: ['r'],\n userFacingName() {\n return 'resume'\n },\n async call(onDone, context) {\n const { commands = [], tools = [], verbose = false } = context.options || {}\n const logs = await loadLogList(CACHE_PATHS.messages())\n render(\n <ResumeConversation\n commands={commands}\n context={{ unmount: onDone }}\n logs={logs}\n tools={tools}\n verbose={verbose}\n />,\n )\n // This return is here for type only\n return null\n },\n} satisfies Command\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;AAEvB,SAAS,0BAA0B;AACnC,SAAS,cAAc;AACvB,SAAS,aAAa,mBAAmB;AAEzC,IAAO,iBAAQ;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS,CAAC,GAAG;AAAA,EACb,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ,SAAS;AAC1B,UAAM,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,MAAM,IAAI,QAAQ,WAAW,CAAC;AAC3E,UAAM,OAAO,MAAM,YAAY,YAAY,SAAS,CAAC;AACrD;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,SAAS,EAAE,SAAS,OAAO;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
@@ -8,7 +8,12 @@ import {
8
8
  addMarketplaces,
9
9
  installPlugins
10
10
  } from "../utils/teamConfig.js";
11
- function SetupComponent({ source, strategy = "merge", installPlugins: shouldInstallPlugins = true, onDone }) {
11
+ function SetupComponent({
12
+ source,
13
+ strategy = "merge",
14
+ installPlugins: shouldInstallPlugins = true,
15
+ onDone
16
+ }) {
12
17
  const [state, setState] = React.useState({ stage: "loading" });
13
18
  React.useEffect(() => {
14
19
  async function init() {
@@ -30,9 +35,7 @@ function SetupComponent({ source, strategy = "merge", installPlugins: shouldInst
30
35
  if (shouldInstallPlugins && teamConfig.plugins?.install) {
31
36
  const pluginCount = teamConfig.plugins.install.length;
32
37
  setState({ stage: "installing-plugins", total: pluginCount });
33
- const pluginResult = await installPlugins(
34
- teamConfig.plugins.install
35
- );
38
+ const pluginResult = await installPlugins(teamConfig.plugins.install);
36
39
  pluginsInstalled = pluginResult.installed;
37
40
  }
38
41
  setState({
@@ -71,7 +74,18 @@ function SetupComponent({ source, strategy = "merge", installPlugins: shouldInst
71
74
  if (state.stage === "error") {
72
75
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u2717 Initialization failed"), /* @__PURE__ */ React.createElement(Text, { color: "red" }, state.message));
73
76
  }
74
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "green", bold: true }, "\u2713 Configuration applied successfully!"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingTop: 1 }, state.modelsAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.modelsAdded), " model profile", state.modelsAdded !== 1 ? "s" : ""), state.mcpServersAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.mcpServersAdded), " MCP server", state.mcpServersAdded !== 1 ? "s" : ""), state.settingsUpdated.length > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Updated ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.settingsUpdated.length), " setting", state.settingsUpdated.length !== 1 ? "s" : "", ":", " ", state.settingsUpdated.join(", ")), state.marketplacesAdded !== void 0 && state.marketplacesAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.marketplacesAdded), " marketplace", state.marketplacesAdded !== 1 ? "s" : ""), state.pluginsInstalled !== void 0 && state.pluginsInstalled > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Installed ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.pluginsInstalled), " plugin", state.pluginsInstalled !== 1 ? "s" : "")), state.instructions && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingTop: 1, borderStyle: "round", borderColor: "yellow", paddingX: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "yellow", bold: true }, "\u{1F4CB} Next Steps:"), /* @__PURE__ */ React.createElement(Text, null, state.instructions)), /* @__PURE__ */ React.createElement(Box, { paddingTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Run ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, "minto"), " to start using your configured setup.")));
77
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "green", bold: true }, "\u2713 Configuration applied successfully!"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingTop: 1 }, state.modelsAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.modelsAdded), " model profile", state.modelsAdded !== 1 ? "s" : ""), state.mcpServersAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.mcpServersAdded), " MCP server", state.mcpServersAdded !== 1 ? "s" : ""), state.settingsUpdated.length > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Updated ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.settingsUpdated.length), " ", "setting", state.settingsUpdated.length !== 1 ? "s" : "", ":", " ", state.settingsUpdated.join(", ")), state.marketplacesAdded !== void 0 && state.marketplacesAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.marketplacesAdded), " ", "marketplace", state.marketplacesAdded !== 1 ? "s" : ""), state.pluginsInstalled !== void 0 && state.pluginsInstalled > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Installed ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.pluginsInstalled), " ", "plugin", state.pluginsInstalled !== 1 ? "s" : "")), state.instructions && /* @__PURE__ */ React.createElement(
78
+ Box,
79
+ {
80
+ flexDirection: "column",
81
+ paddingTop: 1,
82
+ borderStyle: "round",
83
+ borderColor: "yellow",
84
+ paddingX: 1
85
+ },
86
+ /* @__PURE__ */ React.createElement(Text, { color: "yellow", bold: true }, "\u{1F4CB} Next Steps:"),
87
+ /* @__PURE__ */ React.createElement(Text, null, state.instructions)
88
+ ), /* @__PURE__ */ React.createElement(Box, { paddingTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Run ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, "minto"), " to start using your configured setup.")));
75
89
  }
76
90
  const command = {
77
91
  type: "local-jsx",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/setup.tsx"],
4
- "sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file\n */\n\nimport React from 'react'\nimport { Text, Box } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\ntype SetupProps = {\n source: string // URL or file path\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\ntype SetupState =\n | { stage: 'loading' }\n | { stage: 'applying' }\n | { stage: 'adding-marketplaces'; total: number }\n | { stage: 'installing-plugins'; total: number }\n | {\n stage: 'success'\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n marketplacesAdded?: number\n pluginsInstalled?: number\n instructions?: string\n }\n | { stage: 'error'; message: string }\n\nexport function SetupComponent({ source, strategy = 'merge', installPlugins: shouldInstallPlugins = true, onDone }: SetupProps) {\n const [state, setState] = React.useState<SetupState>({ stage: 'loading' })\n\n React.useEffect(() => {\n async function init() {\n try {\n // Step 1: Load configuration\n setState({ stage: 'loading' })\n\n const teamConfig = source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n // Step 2: Apply configuration\n setState({ stage: 'applying' })\n\n const result = applyTeamConfig(teamConfig, strategy)\n\n // Step 3: Add marketplaces (if configured)\n let marketplacesAdded = 0\n if (shouldInstallPlugins && teamConfig.plugins?.marketplaces) {\n const marketplaceCount = teamConfig.plugins.marketplaces.length\n setState({ stage: 'adding-marketplaces', total: marketplaceCount })\n\n const marketplaceResult = await addMarketplaces(\n teamConfig.plugins.marketplaces,\n )\n\n marketplacesAdded = marketplaceResult.added\n }\n\n // Step 4: Install plugins (if configured)\n let pluginsInstalled = 0\n if (shouldInstallPlugins && teamConfig.plugins?.install) {\n const pluginCount = teamConfig.plugins.install.length\n setState({ stage: 'installing-plugins', total: pluginCount })\n\n const pluginResult = await installPlugins(\n teamConfig.plugins.install,\n )\n\n pluginsInstalled = pluginResult.installed\n }\n\n // Success\n setState({\n stage: 'success',\n modelsAdded: result.modelsAdded,\n mcpServersAdded: result.mcpServersAdded,\n settingsUpdated: result.settingsUpdated,\n marketplacesAdded: marketplacesAdded > 0 ? marketplacesAdded : undefined,\n pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : undefined,\n instructions: teamConfig.postInstallInstructions,\n })\n\n // Notify parent component\n setTimeout(() => onDone('Configuration applied successfully'), 2000)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n setState({\n stage: 'error',\n message: errorMessage,\n })\n\n // Notify parent component of error\n setTimeout(() => onDone(), 2000)\n }\n }\n\n init()\n }, [source, strategy, shouldInstallPlugins, onDone])\n\n if (state.stage === 'loading') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Loading configuration from {source}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'applying') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Applying configuration...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'adding-marketplaces') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Adding {state.total} marketplace\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-plugins') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} plugin\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\u2717 Initialization failed</Text>\n <Text color=\"red\">{state.message}</Text>\n </Box>\n )\n }\n\n // Success state\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text color=\"green\" bold>\n \u2713 Configuration applied successfully!\n </Text>\n\n <Box flexDirection=\"column\" paddingTop={1}>\n {state.modelsAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.modelsAdded}</Text> model profile\n {state.modelsAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.mcpServersAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.mcpServersAdded}</Text> MCP server\n {state.mcpServersAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.settingsUpdated.length > 0 && (\n <Text>\n \u2022 Updated <Text color=\"cyan\">{state.settingsUpdated.length}</Text> setting\n {state.settingsUpdated.length !== 1 ? 's' : ''}:{' '}\n {state.settingsUpdated.join(', ')}\n </Text>\n )}\n\n {state.marketplacesAdded !== undefined && state.marketplacesAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.marketplacesAdded}</Text> marketplace\n {state.marketplacesAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.pluginsInstalled !== undefined && state.pluginsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.pluginsInstalled}</Text> plugin\n {state.pluginsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n </Box>\n\n {state.instructions && (\n <Box flexDirection=\"column\" paddingTop={1} borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n <Text color=\"yellow\" bold>\n \uD83D\uDCCB Next Steps:\n </Text>\n <Text>{state.instructions}</Text>\n </Box>\n )}\n\n <Box paddingTop={1}>\n <Text dimColor>\n Run <Text color=\"cyan\">minto</Text> to start using your configured setup.\n </Text>\n </Box>\n </Box>\n )\n}\n\n// Command definition\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: 'Initialize Minto with team configuration from a URL or file',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context) {\n // Parse arguments\n const args = process.argv.slice(2)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone()\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Error: --from parameter is required</Text>\n <Text>\n Usage: minto setup --from &lt;url|path&gt; [--strategy &lt;merge|replace|skip-existing&gt;] [--no-plugins]\n </Text>\n </Box>\n )\n }\n\n const source = args[fromIndex + 1]\n const strategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={strategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file\n */\n\nimport React from 'react'\nimport { Text, Box } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\ntype SetupProps = {\n source: string // URL or file path\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\ntype SetupState =\n | { stage: 'loading' }\n | { stage: 'applying' }\n | { stage: 'adding-marketplaces'; total: number }\n | { stage: 'installing-plugins'; total: number }\n | {\n stage: 'success'\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n marketplacesAdded?: number\n pluginsInstalled?: number\n instructions?: string\n }\n | { stage: 'error'; message: string }\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [state, setState] = React.useState<SetupState>({ stage: 'loading' })\n\n React.useEffect(() => {\n async function init() {\n try {\n // Step 1: Load configuration\n setState({ stage: 'loading' })\n\n const teamConfig =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n // Step 2: Apply configuration\n setState({ stage: 'applying' })\n\n const result = applyTeamConfig(teamConfig, strategy)\n\n // Step 3: Add marketplaces (if configured)\n let marketplacesAdded = 0\n if (shouldInstallPlugins && teamConfig.plugins?.marketplaces) {\n const marketplaceCount = teamConfig.plugins.marketplaces.length\n setState({ stage: 'adding-marketplaces', total: marketplaceCount })\n\n const marketplaceResult = await addMarketplaces(\n teamConfig.plugins.marketplaces,\n )\n\n marketplacesAdded = marketplaceResult.added\n }\n\n // Step 4: Install plugins (if configured)\n let pluginsInstalled = 0\n if (shouldInstallPlugins && teamConfig.plugins?.install) {\n const pluginCount = teamConfig.plugins.install.length\n setState({ stage: 'installing-plugins', total: pluginCount })\n\n const pluginResult = await installPlugins(teamConfig.plugins.install)\n\n pluginsInstalled = pluginResult.installed\n }\n\n // Success\n setState({\n stage: 'success',\n modelsAdded: result.modelsAdded,\n mcpServersAdded: result.mcpServersAdded,\n settingsUpdated: result.settingsUpdated,\n marketplacesAdded:\n marketplacesAdded > 0 ? marketplacesAdded : undefined,\n pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : undefined,\n instructions: teamConfig.postInstallInstructions,\n })\n\n // Notify parent component\n setTimeout(() => onDone('Configuration applied successfully'), 2000)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n setState({\n stage: 'error',\n message: errorMessage,\n })\n\n // Notify parent component of error\n setTimeout(() => onDone(), 2000)\n }\n }\n\n init()\n }, [source, strategy, shouldInstallPlugins, onDone])\n\n if (state.stage === 'loading') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Loading configuration from {source}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'applying') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Applying configuration...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'adding-marketplaces') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Adding {state.total} marketplace\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-plugins') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} plugin\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\u2717 Initialization failed</Text>\n <Text color=\"red\">{state.message}</Text>\n </Box>\n )\n }\n\n // Success state\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text color=\"green\" bold>\n \u2713 Configuration applied successfully!\n </Text>\n\n <Box flexDirection=\"column\" paddingTop={1}>\n {state.modelsAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.modelsAdded}</Text> model profile\n {state.modelsAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.mcpServersAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.mcpServersAdded}</Text> MCP server\n {state.mcpServersAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.settingsUpdated.length > 0 && (\n <Text>\n \u2022 Updated <Text color=\"cyan\">{state.settingsUpdated.length}</Text>{' '}\n setting\n {state.settingsUpdated.length !== 1 ? 's' : ''}:{' '}\n {state.settingsUpdated.join(', ')}\n </Text>\n )}\n\n {state.marketplacesAdded !== undefined &&\n state.marketplacesAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.marketplacesAdded}</Text>{' '}\n marketplace\n {state.marketplacesAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.pluginsInstalled !== undefined && state.pluginsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.pluginsInstalled}</Text>{' '}\n plugin\n {state.pluginsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n </Box>\n\n {state.instructions && (\n <Box\n flexDirection=\"column\"\n paddingTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text color=\"yellow\" bold>\n \uD83D\uDCCB Next Steps:\n </Text>\n <Text>{state.instructions}</Text>\n </Box>\n )}\n\n <Box paddingTop={1}>\n <Text dimColor>\n Run <Text color=\"cyan\">minto</Text> to start using your configured\n setup.\n </Text>\n </Box>\n </Box>\n )\n}\n\n// Command definition\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: 'Initialize Minto with team configuration from a URL or file',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context) {\n // Parse arguments\n const args = process.argv.slice(2)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone()\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Error: --from parameter is required</Text>\n <Text>\n Usage: minto setup --from &lt;url|path&gt; [--strategy\n &lt;merge|replace|skip-existing&gt;] [--no-plugins]\n </Text>\n </Box>\n )\n }\n\n const source = args[fromIndex + 1]\n const strategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={strategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -16,9 +16,9 @@ const terminalSetup = {
16
16
  userFacingName() {
17
17
  return "terminal-setup";
18
18
  },
19
- description: "Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)",
19
+ description: "[Developer] Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)",
20
20
  isEnabled: platform() === "darwin" && env.terminal === "iTerm.app" || env.terminal === "vscode",
21
- isHidden: false,
21
+ isHidden: true,
22
22
  async call() {
23
23
  let result = "";
24
24
  switch (env.terminal) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/terminalSetup.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { EOL, platform, homedir } from 'os'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport chalk from 'chalk'\nimport { getTheme } from '@utils/theme'\nimport { env } from '@utils/env'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { markProjectOnboardingComplete } from '@components/ProjectOnboarding'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { safeParseJSON } from '@utils/json'\nimport { logError } from '@utils/log'\nimport { PROJECT_FILE } from '@constants/product'\n\nconst terminalSetup: Command = {\n type: 'local',\n name: 'terminal-setup',\n userFacingName() {\n return 'terminal-setup'\n },\n description:\n 'Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)',\n isEnabled:\n (platform() === 'darwin' && env.terminal === 'iTerm.app') ||\n env.terminal === 'vscode',\n isHidden: false,\n async call() {\n let result = ''\n\n switch (env.terminal) {\n case 'iTerm.app':\n result = await installBindingsForITerm2()\n break\n case 'vscode':\n result = installBindingsForVSCodeTerminal()\n break\n }\n\n // Update global config to indicate Shift+Enter key binding is installed\n const config = getGlobalConfig()\n config.shiftEnterKeyBindingInstalled = true\n saveGlobalConfig(config)\n\n // Mark onboarding as complete\n markProjectOnboardingComplete()\n\n return result\n },\n}\n\nexport function isShiftEnterKeyBindingInstalled(): boolean {\n return getGlobalConfig().shiftEnterKeyBindingInstalled === true\n}\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to both MINTO.md and CLAUDE.md (if exists)\n try {\n const cwd = process.cwd()\n const codeContextPath = join(cwd, PROJECT_FILE)\n const claudePath = join(cwd, 'CLAUDE.md')\n\n // Check which files exist and update them\n const filesToUpdate = []\n\n // Always try to update MINTO.md (create if not exists)\n filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE })\n\n // Update CLAUDE.md only if it exists\n try {\n readFileSync(claudePath, 'utf-8')\n filesToUpdate.push({ path: claudePath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles = []\n\n for (const file of filesToUpdate) {\n try {\n // Check if file exists, if not create it\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n\n // Add a separator if the file already has content\n const separator = existingContent ? '\\n\\n' : ''\n\n // Combine everything and write to file\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n console.error(\n chalk.hex(getTheme().error)(\n `Failed to update ${file.name}: ${error.message}`,\n ),\n )\n }\n }\n\n if (updatedFiles.length > 0) {\n console.log(\n chalk.hex(getTheme().success)(\n `Added note to ${updatedFiles.join(' and ')}`,\n ),\n )\n }\n } catch (e) {\n logError(e)\n console.error(\n chalk.hex(getTheme().error)(`Failed to add note: ${e.message}`),\n )\n }\n}\n\nexport default terminalSetup\n\nasync function installBindingsForITerm2(): Promise<string> {\n const { code } = await execFileNoThrow('defaults', [\n 'write',\n 'com.googlecode.iterm2',\n 'GlobalKeyMap',\n '-dict-add',\n '0xd-0x20000-0x24',\n `<dict>\n <key>Text</key>\n <string>\\\\n</string>\n <key>Action</key>\n <integer>12</integer>\n <key>Version</key>\n <integer>1</integer>\n <key>Keycode</key>\n <integer>13</integer>\n <key>Modifiers</key>\n <integer>131072</integer>\n </dict>`,\n ])\n\n if (code !== 0) {\n throw new Error('Failed to install iTerm2 Shift+Enter key binding')\n }\n\n return `${chalk.hex(getTheme().success)(\n 'Installed iTerm2 Shift+Enter key binding',\n )}${EOL}${chalk.dim('See iTerm2 \u2192 Preferences \u2192 Keys')}${EOL}`\n}\n\ntype VSCodeKeybinding = {\n key: string\n command: string\n args: { text: string }\n when: string\n}\n\nfunction installBindingsForVSCodeTerminal(): string {\n const vscodeKeybindingsPath = join(\n homedir(),\n platform() === 'win32'\n ? join('AppData', 'Roaming', 'Code', 'User')\n : platform() === 'darwin'\n ? join('Library', 'Application Support', 'Code', 'User')\n : join('.config', 'Code', 'User'),\n 'keybindings.json',\n )\n\n try {\n const content = readFileSync(vscodeKeybindingsPath, 'utf-8')\n const keybindings: VSCodeKeybinding[] =\n (safeParseJSON(content) as VSCodeKeybinding[]) ?? []\n\n // Check if keybinding already exists\n const existingBinding = keybindings.find(\n binding =>\n binding.key === 'shift+enter' &&\n binding.command === 'workbench.action.terminal.sendSequence' &&\n binding.when === 'terminalFocus',\n )\n if (existingBinding) {\n return `${chalk.hex(getTheme().warning)(\n 'Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n }\n\n // Add the keybinding\n keybindings.push({\n key: 'shift+enter',\n command: 'workbench.action.terminal.sendSequence',\n args: { text: '\\\\\\r\\n' },\n when: 'terminalFocus',\n })\n\n writeFileSync(\n vscodeKeybindingsPath,\n JSON.stringify(keybindings, null, 4),\n 'utf-8',\n )\n\n return `${chalk.hex(getTheme().success)(\n 'Installed VSCode terminal Shift+Enter key binding',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n } catch (e) {\n logError(e)\n throw new Error('Failed to install VSCode terminal Shift+Enter key binding')\n }\n}\n"],
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport { EOL, platform, homedir } from 'os'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport chalk from 'chalk'\nimport { getTheme } from '@utils/theme'\nimport { env } from '@utils/env'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { markProjectOnboardingComplete } from '@components/ProjectOnboarding'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { safeParseJSON } from '@utils/json'\nimport { logError } from '@utils/log'\nimport { PROJECT_FILE } from '@constants/product'\n\nconst terminalSetup: Command = {\n type: 'local',\n name: 'terminal-setup',\n userFacingName() {\n return 'terminal-setup'\n },\n description:\n '[Developer] Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)',\n isEnabled:\n (platform() === 'darwin' && env.terminal === 'iTerm.app') ||\n env.terminal === 'vscode',\n isHidden: true,\n async call() {\n let result = ''\n\n switch (env.terminal) {\n case 'iTerm.app':\n result = await installBindingsForITerm2()\n break\n case 'vscode':\n result = installBindingsForVSCodeTerminal()\n break\n }\n\n // Update global config to indicate Shift+Enter key binding is installed\n const config = getGlobalConfig()\n config.shiftEnterKeyBindingInstalled = true\n saveGlobalConfig(config)\n\n // Mark onboarding as complete\n markProjectOnboardingComplete()\n\n return result\n },\n}\n\nexport function isShiftEnterKeyBindingInstalled(): boolean {\n return getGlobalConfig().shiftEnterKeyBindingInstalled === true\n}\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to both MINTO.md and CLAUDE.md (if exists)\n try {\n const cwd = process.cwd()\n const codeContextPath = join(cwd, PROJECT_FILE)\n const claudePath = join(cwd, 'CLAUDE.md')\n\n // Check which files exist and update them\n const filesToUpdate = []\n\n // Always try to update MINTO.md (create if not exists)\n filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE })\n\n // Update CLAUDE.md only if it exists\n try {\n readFileSync(claudePath, 'utf-8')\n filesToUpdate.push({ path: claudePath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles = []\n\n for (const file of filesToUpdate) {\n try {\n // Check if file exists, if not create it\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n\n // Add a separator if the file already has content\n const separator = existingContent ? '\\n\\n' : ''\n\n // Combine everything and write to file\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n console.error(\n chalk.hex(getTheme().error)(\n `Failed to update ${file.name}: ${error.message}`,\n ),\n )\n }\n }\n\n if (updatedFiles.length > 0) {\n console.log(\n chalk.hex(getTheme().success)(\n `Added note to ${updatedFiles.join(' and ')}`,\n ),\n )\n }\n } catch (e) {\n logError(e)\n console.error(\n chalk.hex(getTheme().error)(`Failed to add note: ${e.message}`),\n )\n }\n}\n\nexport default terminalSetup\n\nasync function installBindingsForITerm2(): Promise<string> {\n const { code } = await execFileNoThrow('defaults', [\n 'write',\n 'com.googlecode.iterm2',\n 'GlobalKeyMap',\n '-dict-add',\n '0xd-0x20000-0x24',\n `<dict>\n <key>Text</key>\n <string>\\\\n</string>\n <key>Action</key>\n <integer>12</integer>\n <key>Version</key>\n <integer>1</integer>\n <key>Keycode</key>\n <integer>13</integer>\n <key>Modifiers</key>\n <integer>131072</integer>\n </dict>`,\n ])\n\n if (code !== 0) {\n throw new Error('Failed to install iTerm2 Shift+Enter key binding')\n }\n\n return `${chalk.hex(getTheme().success)(\n 'Installed iTerm2 Shift+Enter key binding',\n )}${EOL}${chalk.dim('See iTerm2 \u2192 Preferences \u2192 Keys')}${EOL}`\n}\n\ntype VSCodeKeybinding = {\n key: string\n command: string\n args: { text: string }\n when: string\n}\n\nfunction installBindingsForVSCodeTerminal(): string {\n const vscodeKeybindingsPath = join(\n homedir(),\n platform() === 'win32'\n ? join('AppData', 'Roaming', 'Code', 'User')\n : platform() === 'darwin'\n ? join('Library', 'Application Support', 'Code', 'User')\n : join('.config', 'Code', 'User'),\n 'keybindings.json',\n )\n\n try {\n const content = readFileSync(vscodeKeybindingsPath, 'utf-8')\n const keybindings: VSCodeKeybinding[] =\n (safeParseJSON(content) as VSCodeKeybinding[]) ?? []\n\n // Check if keybinding already exists\n const existingBinding = keybindings.find(\n binding =>\n binding.key === 'shift+enter' &&\n binding.command === 'workbench.action.terminal.sendSequence' &&\n binding.when === 'terminalFocus',\n )\n if (existingBinding) {\n return `${chalk.hex(getTheme().warning)(\n 'Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n }\n\n // Add the keybinding\n keybindings.push({\n key: 'shift+enter',\n command: 'workbench.action.terminal.sendSequence',\n args: { text: '\\\\\\r\\n' },\n when: 'terminalFocus',\n })\n\n writeFileSync(\n vscodeKeybindingsPath,\n JSON.stringify(keybindings, null, 4),\n 'utf-8',\n )\n\n return `${chalk.hex(getTheme().success)(\n 'Installed VSCode terminal Shift+Enter key binding',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n } catch (e) {\n logError(e)\n throw new Error('Failed to install VSCode terminal Shift+Enter key binding')\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }