@within-7/minto 0.2.0 → 0.3.0

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 (254) hide show
  1. package/dist/commands/agents/AgentsCommand.js +22 -24
  2. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  3. package/dist/commands/context.js +2 -1
  4. package/dist/commands/context.js.map +2 -2
  5. package/dist/commands/export.js +2 -1
  6. package/dist/commands/export.js.map +2 -2
  7. package/dist/commands/mcp-interactive.js +7 -6
  8. package/dist/commands/mcp-interactive.js.map +2 -2
  9. package/dist/commands/model.js +3 -2
  10. package/dist/commands/model.js.map +2 -2
  11. package/dist/commands/permissions.js +4 -3
  12. package/dist/commands/permissions.js.map +2 -2
  13. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  14. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  15. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  16. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  17. package/dist/commands/plugin/ErrorView.js +2 -1
  18. package/dist/commands/plugin/ErrorView.js.map +2 -2
  19. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  20. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  21. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  22. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  23. package/dist/commands/plugin/MainMenu.js +2 -1
  24. package/dist/commands/plugin/MainMenu.js.map +2 -2
  25. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  26. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  27. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  28. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  29. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  30. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  31. package/dist/commands/plugin/PluginBrowser.js +6 -5
  32. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  33. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  34. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  35. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  36. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  37. package/dist/commands/plugin.js +16 -15
  38. package/dist/commands/plugin.js.map +2 -2
  39. package/dist/commands/sandbox.js +4 -3
  40. package/dist/commands/sandbox.js.map +2 -2
  41. package/dist/commands/setup.js +2 -1
  42. package/dist/commands/setup.js.map +2 -2
  43. package/dist/commands/status.js +2 -1
  44. package/dist/commands/status.js.map +2 -2
  45. package/dist/commands/undo.js +245 -0
  46. package/dist/commands/undo.js.map +7 -0
  47. package/dist/commands.js +2 -0
  48. package/dist/commands.js.map +2 -2
  49. package/dist/components/AgentThinkingBlock.js +1 -1
  50. package/dist/components/AgentThinkingBlock.js.map +2 -2
  51. package/dist/components/AsciiLogo.js +7 -8
  52. package/dist/components/AsciiLogo.js.map +2 -2
  53. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  54. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  55. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  56. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  57. package/dist/components/CollapsibleHint.js +2 -1
  58. package/dist/components/CollapsibleHint.js.map +2 -2
  59. package/dist/components/Config.js +3 -2
  60. package/dist/components/Config.js.map +2 -2
  61. package/dist/components/ConsoleOAuthFlow.js +2 -1
  62. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  63. package/dist/components/Cost.js +2 -1
  64. package/dist/components/Cost.js.map +2 -2
  65. package/dist/components/HeaderBar.js +13 -8
  66. package/dist/components/HeaderBar.js.map +2 -2
  67. package/dist/components/HistorySearchOverlay.js +4 -3
  68. package/dist/components/HistorySearchOverlay.js.map +2 -2
  69. package/dist/components/HotkeyHelpPanel.js +8 -11
  70. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  71. package/dist/components/InvalidConfigDialog.js +2 -1
  72. package/dist/components/InvalidConfigDialog.js.map +2 -2
  73. package/dist/components/Logo.js +23 -67
  74. package/dist/components/Logo.js.map +2 -2
  75. package/dist/components/MCPServerApprovalDialog.js +2 -1
  76. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  77. package/dist/components/MCPServerDialogCopy.js +2 -1
  78. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  79. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  80. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  81. package/dist/components/MessageSelector.js +4 -3
  82. package/dist/components/MessageSelector.js.map +2 -2
  83. package/dist/components/ModeIndicator.js +2 -1
  84. package/dist/components/ModeIndicator.js.map +2 -2
  85. package/dist/components/ModelConfig.js +4 -3
  86. package/dist/components/ModelConfig.js.map +2 -2
  87. package/dist/components/ModelListManager.js +4 -3
  88. package/dist/components/ModelListManager.js.map +2 -2
  89. package/dist/components/ModelSelector/ModelSelector.js +26 -13
  90. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  91. package/dist/components/Onboarding.js +3 -2
  92. package/dist/components/Onboarding.js.map +2 -2
  93. package/dist/components/OperationSummary.js +130 -0
  94. package/dist/components/OperationSummary.js.map +7 -0
  95. package/dist/components/PromptInput.js +88 -75
  96. package/dist/components/PromptInput.js.map +2 -2
  97. package/dist/components/SensitiveFileWarning.js +31 -0
  98. package/dist/components/SensitiveFileWarning.js.map +7 -0
  99. package/dist/components/Spinner.js +71 -22
  100. package/dist/components/Spinner.js.map +2 -2
  101. package/dist/components/StructuredDiff.js +6 -8
  102. package/dist/components/StructuredDiff.js.map +2 -2
  103. package/dist/components/SubagentBlock.js +4 -2
  104. package/dist/components/SubagentBlock.js.map +2 -2
  105. package/dist/components/SubagentProgress.js +7 -4
  106. package/dist/components/SubagentProgress.js.map +2 -2
  107. package/dist/components/TaskCard.js +14 -11
  108. package/dist/components/TaskCard.js.map +2 -2
  109. package/dist/components/TextInput.js +9 -1
  110. package/dist/components/TextInput.js.map +2 -2
  111. package/dist/components/TodoPanel.js +44 -26
  112. package/dist/components/TodoPanel.js.map +2 -2
  113. package/dist/components/ToolUseLoader.js +2 -2
  114. package/dist/components/ToolUseLoader.js.map +2 -2
  115. package/dist/components/TreeConnector.js +4 -3
  116. package/dist/components/TreeConnector.js.map +2 -2
  117. package/dist/components/TrustDialog.js +2 -1
  118. package/dist/components/TrustDialog.js.map +2 -2
  119. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  120. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  121. package/dist/components/messages/AssistantTextMessage.js +17 -9
  122. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  123. package/dist/components/messages/AssistantToolUseMessage.js +8 -4
  124. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  125. package/dist/components/messages/GroupRenderer.js +2 -1
  126. package/dist/components/messages/GroupRenderer.js.map +2 -2
  127. package/dist/components/messages/NestedTasksPreview.js +13 -1
  128. package/dist/components/messages/NestedTasksPreview.js.map +2 -2
  129. package/dist/components/messages/ParallelTasksGroupView.js +4 -3
  130. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  131. package/dist/components/messages/TaskInModuleView.js +35 -15
  132. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  133. package/dist/components/messages/TaskOutputContent.js +9 -6
  134. package/dist/components/messages/TaskOutputContent.js.map +2 -2
  135. package/dist/components/messages/UserPromptMessage.js +2 -2
  136. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  137. package/dist/constants/colors.js +90 -72
  138. package/dist/constants/colors.js.map +2 -2
  139. package/dist/constants/toolInputExamples.js +84 -0
  140. package/dist/constants/toolInputExamples.js.map +7 -0
  141. package/dist/core/backupManager.js +321 -0
  142. package/dist/core/backupManager.js.map +7 -0
  143. package/dist/core/costTracker.js +9 -18
  144. package/dist/core/costTracker.js.map +2 -2
  145. package/dist/core/gitAutoCommit.js +287 -0
  146. package/dist/core/gitAutoCommit.js.map +7 -0
  147. package/dist/core/index.js +3 -0
  148. package/dist/core/index.js.map +2 -2
  149. package/dist/core/operationTracker.js +212 -0
  150. package/dist/core/operationTracker.js.map +7 -0
  151. package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
  152. package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
  153. package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
  154. package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
  155. package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
  156. package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
  157. package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
  158. package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
  159. package/dist/core/tokenStats.js +9 -0
  160. package/dist/core/tokenStats.js.map +7 -0
  161. package/dist/core/tokenStatsManager.js +331 -0
  162. package/dist/core/tokenStatsManager.js.map +7 -0
  163. package/dist/entrypoints/cli.js +115 -87
  164. package/dist/entrypoints/cli.js.map +2 -2
  165. package/dist/hooks/useAgentTokenStats.js +72 -0
  166. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  167. package/dist/hooks/useAgentTranscripts.js +30 -6
  168. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  169. package/dist/hooks/useLogMessages.js +12 -1
  170. package/dist/hooks/useLogMessages.js.map +2 -2
  171. package/dist/i18n/locales/en.js +6 -5
  172. package/dist/i18n/locales/en.js.map +2 -2
  173. package/dist/i18n/locales/zh-CN.js +6 -5
  174. package/dist/i18n/locales/zh-CN.js.map +2 -2
  175. package/dist/i18n/types.js.map +1 -1
  176. package/dist/permissions.js +28 -1
  177. package/dist/permissions.js.map +2 -2
  178. package/dist/query.js +78 -4
  179. package/dist/query.js.map +3 -3
  180. package/dist/screens/REPL.js +23 -3
  181. package/dist/screens/REPL.js.map +2 -2
  182. package/dist/services/claude.js +54 -3
  183. package/dist/services/claude.js.map +2 -2
  184. package/dist/services/intelligentCompactor.js +1 -1
  185. package/dist/services/intelligentCompactor.js.map +2 -2
  186. package/dist/services/mcpClient.js +81 -25
  187. package/dist/services/mcpClient.js.map +2 -2
  188. package/dist/services/sandbox/filesystemBoundary.js +58 -17
  189. package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
  190. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
  191. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  192. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  193. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  194. package/dist/tools/BashTool/BashTool.js +22 -3
  195. package/dist/tools/BashTool/BashTool.js.map +2 -2
  196. package/dist/tools/BashTool/prompt.js +178 -34
  197. package/dist/tools/BashTool/prompt.js.map +2 -2
  198. package/dist/tools/FileEditTool/prompt.js +6 -3
  199. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  200. package/dist/tools/FileWriteTool/prompt.js +4 -2
  201. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  202. package/dist/tools/MultiEditTool/prompt.js +5 -3
  203. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  204. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -1
  205. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  206. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
  207. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  208. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
  209. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  210. package/dist/tools/PlanModeTool/prompt.js +1 -1
  211. package/dist/tools/PlanModeTool/prompt.js.map +1 -1
  212. package/dist/tools/SkillTool/SkillTool.js +4 -3
  213. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  214. package/dist/tools/SkillTool/prompt.js +1 -1
  215. package/dist/tools/SkillTool/prompt.js.map +1 -1
  216. package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
  217. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
  218. package/dist/tools/TaskTool/TaskTool.js +8 -0
  219. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  220. package/dist/utils/CircuitBreaker.js +242 -0
  221. package/dist/utils/CircuitBreaker.js.map +7 -0
  222. package/dist/utils/ask.js +2 -0
  223. package/dist/utils/ask.js.map +2 -2
  224. package/dist/utils/config.js +47 -5
  225. package/dist/utils/config.js.map +2 -2
  226. package/dist/utils/credentials/CredentialStore.js +1 -0
  227. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  228. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  229. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  230. package/dist/utils/credentials/index.js +37 -0
  231. package/dist/utils/credentials/index.js.map +7 -0
  232. package/dist/utils/credentials/migration.js +82 -0
  233. package/dist/utils/credentials/migration.js.map +7 -0
  234. package/dist/utils/markdown.js +13 -1
  235. package/dist/utils/markdown.js.map +2 -2
  236. package/dist/utils/permissions/filesystem.js +5 -1
  237. package/dist/utils/permissions/filesystem.js.map +2 -2
  238. package/dist/utils/safePath.js +132 -0
  239. package/dist/utils/safePath.js.map +7 -0
  240. package/dist/utils/sensitiveFiles.js +125 -0
  241. package/dist/utils/sensitiveFiles.js.map +7 -0
  242. package/dist/utils/taskDisplayUtils.js +9 -9
  243. package/dist/utils/taskDisplayUtils.js.map +2 -2
  244. package/dist/utils/theme.js +6 -6
  245. package/dist/utils/theme.js.map +1 -1
  246. package/dist/utils/toolRiskClassification.js +207 -0
  247. package/dist/utils/toolRiskClassification.js.map +7 -0
  248. package/dist/utils/tooling/safeRender.js +5 -4
  249. package/dist/utils/tooling/safeRender.js.map +2 -2
  250. package/dist/version.js +2 -2
  251. package/dist/version.js.map +1 -1
  252. package/package.json +9 -7
  253. package/dist/hooks/useCancelRequest.js +0 -31
  254. package/dist/hooks/useCancelRequest.js.map +0 -7
@@ -3,6 +3,7 @@ import { Box, Text, useInput } from "ink";
3
3
  import { getTheme } from "../../utils/theme.js";
4
4
  import { getMarketplace } from "../../utils/marketplaceManager.js";
5
5
  import { loadAllPlugins } from "../../utils/pluginLoader.js";
6
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
6
7
  const PluginBrowser = ({
7
8
  marketplace,
8
9
  onNavigate,
@@ -104,7 +105,7 @@ const PluginBrowser = ({
104
105
  },
105
106
  /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error"),
106
107
  /* @__PURE__ */ React.createElement(Text, null, error),
107
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
108
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
108
109
  );
109
110
  }
110
111
  if (plugins.length === 0) {
@@ -118,8 +119,8 @@ const PluginBrowser = ({
118
119
  paddingY: 1
119
120
  },
120
121
  /* @__PURE__ */ React.createElement(Text, { bold: true }, marketplace, " \u203A Install plugins"),
121
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "No plugins available in this marketplace")),
122
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
122
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "No plugins available in this marketplace")),
123
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
123
124
  );
124
125
  }
125
126
  const truncate = (text, maxLength) => {
@@ -153,7 +154,7 @@ const PluginBrowser = ({
153
154
  }
154
155
  );
155
156
  })),
156
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, selectedPlugins.size > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.success }, selectedPlugins.size, " plugin", selectedPlugins.size > 1 ? "s" : "", " ", "selected"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Space: (de)select \xB7 Enter: details \xB7 \u2191\u2193: navigate \xB7 Esc: back"))
157
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, selectedPlugins.size > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.success }, selectedPlugins.size, " plugin", selectedPlugins.size > 1 ? "s" : "", " ", "selected"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Space: (de)select \xB7 Enter: details \xB7 \u2191\u2193: navigate \xB7 Esc: back"))
157
158
  );
158
159
  };
159
160
  const PluginListItem = ({
@@ -174,7 +175,7 @@ const PluginListItem = ({
174
175
  if (isInstalled) {
175
176
  infoItems.push("(installed)");
176
177
  }
177
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 0 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isSelected ? "\u25C9" : "\u25EF", " "), /* @__PURE__ */ React.createElement(Text, { bold: isFocused, color: isInstalled ? theme.dimColor : void 0 }, plugin.name), infoItems.length > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", infoItems.join(" "))), plugin.description && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, truncate(plugin.description, 70))));
178
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 0 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isSelected ? "\u25C9" : "\u25EF", " "), /* @__PURE__ */ React.createElement(Text, { bold: isFocused, color: isInstalled ? theme.dimColor : void 0 }, plugin.name), infoItems.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", infoItems.join(" "))), plugin.description && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, truncate(plugin.description, 70))));
178
179
  };
179
180
  export {
180
181
  PluginBrowser
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/PluginBrowser.tsx"],
4
- "sourcesContent": ["/**\n * Plugin Browser Component\n *\n * Browse and select plugins from a marketplace with multi-select support\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\n\ninterface PluginBrowserProps extends NavigationProps {\n marketplace: string\n}\n\nexport const PluginBrowser: React.FC<PluginBrowserProps> = ({\n marketplace,\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [plugins, setPlugins] = useState<MarketplacePlugin[]>([])\n const [installedPlugins, setInstalledPlugins] = useState<Set<string>>(\n new Set(),\n )\n const [selectedPlugins, setSelectedPlugins] = useState<Set<string>>(new Set())\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadPluginData()\n }, [marketplace])\n\n const loadPluginData = () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setError(`Marketplace \"${marketplace}\" not found`)\n setLoading(false)\n return\n }\n\n // Load plugins from marketplace\n const marketplacePlugins = marketplaceData.manifest.plugins\n setPlugins(marketplacePlugins)\n\n // Load installed plugins to show which are already installed\n const installed = loadAllPlugins()\n const installedNames = new Set(\n installed\n .filter(\n p =>\n p.source.type === 'marketplace' &&\n 'marketplace' in p.source &&\n p.source.marketplace === marketplace,\n )\n .map(p => p.manifest.name),\n )\n setInstalledPlugins(installedNames)\n\n // Focus first plugin if available\n if (marketplacePlugins.length > 0) {\n setFocusedIndex(0)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const focusedPlugin = plugins[focusedIndex]\n\n // Keyboard input handling\n useInput(\n (input, key) => {\n if (loading || plugins.length === 0) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setFocusedIndex(prev => (prev > 0 ? prev - 1 : plugins.length - 1))\n } else if (key.downArrow) {\n setFocusedIndex(prev => (prev < plugins.length - 1 ? prev + 1 : 0))\n } else if (input === ' ') {\n // Toggle selection with Space\n const pluginName = focusedPlugin.name\n setSelectedPlugins(prev => {\n const newSet = new Set(prev)\n if (newSet.has(pluginName)) {\n newSet.delete(pluginName)\n } else {\n newSet.add(pluginName)\n }\n return newSet\n })\n } else if (key.return) {\n // View details on Enter\n onNavigate({\n screen: 'plugin-details-install',\n marketplace,\n plugin: focusedPlugin.name,\n })\n }\n },\n { isActive: !loading && plugins.length > 0 },\n )\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugins from {marketplace}...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n if (plugins.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>{marketplace} \u203A Install plugins</Text>\n <Box marginTop={1}>\n <Text dimColor>No plugins available in this marketplace</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Helper to truncate text\n const truncate = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n {marketplace} \u203A Install plugins\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {plugins.map((plugin, index) => {\n const isFocused = index === focusedIndex\n const isSelected = selectedPlugins.has(plugin.name)\n const isInstalled = installedPlugins.has(plugin.name)\n\n return (\n <PluginListItem\n key={plugin.name}\n plugin={plugin}\n isFocused={isFocused}\n isSelected={isSelected}\n isInstalled={isInstalled}\n theme={theme}\n truncate={truncate}\n />\n )\n })}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {selectedPlugins.size > 0 && (\n <Text color={theme.success}>\n {selectedPlugins.size} plugin{selectedPlugins.size > 1 ? 's' : ''}{' '}\n selected\n </Text>\n )}\n <Text dimColor>\n Space: (de)select \u00B7 Enter: details \u00B7 \u2191\u2193: navigate \u00B7 Esc: back\n </Text>\n </Box>\n </Box>\n )\n}\n\ninterface PluginListItemProps {\n plugin: MarketplacePlugin\n isFocused: boolean\n isSelected: boolean\n isInstalled: boolean\n theme: any\n truncate: (text: string, maxLength: number) => string\n}\n\nconst PluginListItem: React.FC<PluginListItemProps> = ({\n plugin,\n isFocused,\n isSelected,\n isInstalled,\n theme,\n truncate,\n}) => {\n // Build plugin info line\n const infoItems: string[] = []\n if (plugin.version) {\n infoItems.push(`v${plugin.version}`)\n }\n if (plugin.category) {\n infoItems.push(`[${plugin.category}]`)\n }\n if (isInstalled) {\n infoItems.push('(installed)')\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box>\n <Text color={isFocused ? theme.success : undefined}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text color={isFocused ? theme.success : undefined}>\n {isSelected ? '\u25C9' : '\u25EF'}{' '}\n </Text>\n <Text bold={isFocused} color={isInstalled ? theme.dimColor : undefined}>\n {plugin.name}\n </Text>\n {infoItems.length > 0 && <Text dimColor> {infoItems.join(' ')}</Text>}\n </Box>\n {plugin.description && (\n <Box marginLeft={4}>\n <Text dimColor>{truncate(plugin.description, 70)}</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Plugin Browser Component\n *\n * Browse and select plugins from a marketplace with multi-select support\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface PluginBrowserProps extends NavigationProps {\n marketplace: string\n}\n\nexport const PluginBrowser: React.FC<PluginBrowserProps> = ({\n marketplace,\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [plugins, setPlugins] = useState<MarketplacePlugin[]>([])\n const [installedPlugins, setInstalledPlugins] = useState<Set<string>>(\n new Set(),\n )\n const [selectedPlugins, setSelectedPlugins] = useState<Set<string>>(new Set())\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadPluginData()\n }, [marketplace])\n\n const loadPluginData = () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setError(`Marketplace \"${marketplace}\" not found`)\n setLoading(false)\n return\n }\n\n // Load plugins from marketplace\n const marketplacePlugins = marketplaceData.manifest.plugins\n setPlugins(marketplacePlugins)\n\n // Load installed plugins to show which are already installed\n const installed = loadAllPlugins()\n const installedNames = new Set(\n installed\n .filter(\n p =>\n p.source.type === 'marketplace' &&\n 'marketplace' in p.source &&\n p.source.marketplace === marketplace,\n )\n .map(p => p.manifest.name),\n )\n setInstalledPlugins(installedNames)\n\n // Focus first plugin if available\n if (marketplacePlugins.length > 0) {\n setFocusedIndex(0)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const focusedPlugin = plugins[focusedIndex]\n\n // Keyboard input handling\n useInput(\n (input, key) => {\n if (loading || plugins.length === 0) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setFocusedIndex(prev => (prev > 0 ? prev - 1 : plugins.length - 1))\n } else if (key.downArrow) {\n setFocusedIndex(prev => (prev < plugins.length - 1 ? prev + 1 : 0))\n } else if (input === ' ') {\n // Toggle selection with Space\n const pluginName = focusedPlugin.name\n setSelectedPlugins(prev => {\n const newSet = new Set(prev)\n if (newSet.has(pluginName)) {\n newSet.delete(pluginName)\n } else {\n newSet.add(pluginName)\n }\n return newSet\n })\n } else if (key.return) {\n // View details on Enter\n onNavigate({\n screen: 'plugin-details-install',\n marketplace,\n plugin: focusedPlugin.name,\n })\n }\n },\n { isActive: !loading && plugins.length > 0 },\n )\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugins from {marketplace}...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n if (plugins.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>{marketplace} \u203A Install plugins</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n No plugins available in this marketplace\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Helper to truncate text\n const truncate = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n {marketplace} \u203A Install plugins\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {plugins.map((plugin, index) => {\n const isFocused = index === focusedIndex\n const isSelected = selectedPlugins.has(plugin.name)\n const isInstalled = installedPlugins.has(plugin.name)\n\n return (\n <PluginListItem\n key={plugin.name}\n plugin={plugin}\n isFocused={isFocused}\n isSelected={isSelected}\n isInstalled={isInstalled}\n theme={theme}\n truncate={truncate}\n />\n )\n })}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {selectedPlugins.size > 0 && (\n <Text color={theme.success}>\n {selectedPlugins.size} plugin{selectedPlugins.size > 1 ? 's' : ''}{' '}\n selected\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n Space: (de)select \u00B7 Enter: details \u00B7 \u2191\u2193: navigate \u00B7 Esc: back\n </Text>\n </Box>\n </Box>\n )\n}\n\ninterface PluginListItemProps {\n plugin: MarketplacePlugin\n isFocused: boolean\n isSelected: boolean\n isInstalled: boolean\n theme: any\n truncate: (text: string, maxLength: number) => string\n}\n\nconst PluginListItem: React.FC<PluginListItemProps> = ({\n plugin,\n isFocused,\n isSelected,\n isInstalled,\n theme,\n truncate,\n}) => {\n // Build plugin info line\n const infoItems: string[] = []\n if (plugin.version) {\n infoItems.push(`v${plugin.version}`)\n }\n if (plugin.category) {\n infoItems.push(`[${plugin.category}]`)\n }\n if (isInstalled) {\n infoItems.push('(installed)')\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box>\n <Text color={isFocused ? theme.success : undefined}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text color={isFocused ? theme.success : undefined}>\n {isSelected ? '\u25C9' : '\u25EF'}{' '}\n </Text>\n <Text bold={isFocused} color={isInstalled ? theme.dimColor : undefined}>\n {plugin.name}\n </Text>\n {infoItems.length > 0 && (\n <Text color={SEMANTIC_COLORS.dim}> {infoItems.join(' ')}</Text>\n )}\n </Box>\n {plugin.description && (\n <Box marginLeft={4}>\n <Text color={SEMANTIC_COLORS.dim}>\n {truncate(plugin.description, 70)}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,7 @@ import {
6
6
  getMarketplace,
7
7
  installPluginFromMarketplace
8
8
  } from "../../utils/marketplaceManager.js";
9
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
9
10
  import { formatAuthor } from "./utils.js";
10
11
  import { spawn } from "child_process";
11
12
  const PluginDetailsInstall = ({
@@ -103,8 +104,8 @@ const PluginDetailsInstall = ({
103
104
  paddingY: 1
104
105
  },
105
106
  /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Plugin not found"),
106
- /* @__PURE__ */ React.createElement(Text, { dimColor: true }, 'Plugin "', plugin, '" not found in marketplace "', marketplace, '"'),
107
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
107
+ /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, 'Plugin "', plugin, '" not found in marketplace "', marketplace, '"'),
108
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
108
109
  );
109
110
  }
110
111
  const actions = [{ label: "Install now", value: "install" }];
@@ -137,7 +138,7 @@ const PluginDetailsInstall = ({
137
138
  paddingY: 1
138
139
  },
139
140
  /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugin Details"),
140
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", gap: 0 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, pluginData.name), pluginData.version && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " v", pluginData.version), pluginData.category && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " [", pluginData.category, "]")), pluginData.description && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.description)), pluginData.author && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "By: ", formatAuthor(pluginData.author))), pluginData.license && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "License: ", pluginData.license)), pluginData.homepage && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Homepage: ", pluginData.homepage)), pluginData.repository && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Repository: ", pluginData.repository)), /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Source: ", formatSource(pluginData.source))), pluginData.keywords && pluginData.keywords.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Keywords: ", pluginData.keywords.join(", "))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Will install:"), pluginData.agents && pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Agents: ", pluginData.agents.join(", "))), pluginData.commands && pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Commands: ", pluginData.commands.join(", "))), pluginData.skills && pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Skills: ", pluginData.skills.join(", "))), pluginData.hooks && pluginData.hooks.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Hooks: ", pluginData.hooks.join(", "))), pluginData.mcpServers && pluginData.mcpServers.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 MCP Servers: ", pluginData.mcpServers.join(", "))), !pluginData.agents?.length && !pluginData.commands?.length && !pluginData.skills?.length && !pluginData.hooks?.length && !pluginData.mcpServers?.length && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Components will be auto-discovered from plugin directory")))),
141
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", gap: 0 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, pluginData.name), pluginData.version && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " v", pluginData.version), pluginData.category && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " [", pluginData.category, "]")), pluginData.description && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.description)), pluginData.author && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "By: ", formatAuthor(pluginData.author))), pluginData.license && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "License: ", pluginData.license)), pluginData.homepage && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Homepage: ", pluginData.homepage)), pluginData.repository && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Repository: ", pluginData.repository)), /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Source: ", formatSource(pluginData.source))), pluginData.keywords && pluginData.keywords.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Keywords: ", pluginData.keywords.join(", "))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Will install:"), pluginData.agents && pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Agents: ", pluginData.agents.join(", "))), pluginData.commands && pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Commands: ", pluginData.commands.join(", "))), pluginData.skills && pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Skills: ", pluginData.skills.join(", "))), pluginData.hooks && pluginData.hooks.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Hooks: ", pluginData.hooks.join(", "))), pluginData.mcpServers && pluginData.mcpServers.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 MCP Servers: ", pluginData.mcpServers.join(", "))), !pluginData.agents?.length && !pluginData.commands?.length && !pluginData.skills?.length && !pluginData.hooks?.length && !pluginData.mcpServers?.length && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Components will be auto-discovered from plugin directory")))),
141
142
  installing && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Installing ", pluginData.name, "...")),
142
143
  installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "\u2713 Successfully installed ", pluginData.name)),
143
144
  installError && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 Installation failed"), /* @__PURE__ */ React.createElement(Text, { color: theme.error }, installError)),
@@ -149,7 +150,7 @@ const PluginDetailsInstall = ({
149
150
  visibleOptionCount: Math.min(actions.length, 5)
150
151
  }
151
152
  )),
152
- !installing && !installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
153
+ !installing && !installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
153
154
  );
154
155
  };
155
156
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/PluginDetailsInstall.tsx"],
4
- "sourcesContent": ["/**\n * Plugin Details & Install Component\n *\n * Shows complete plugin information and installation actions\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport {\n getMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { spawn } from 'child_process'\n\ninterface PluginDetailsInstallProps extends NavigationProps {\n marketplace: string\n plugin: string\n}\n\nexport const PluginDetailsInstall: React.FC<PluginDetailsInstallProps> = ({\n marketplace,\n plugin,\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n const [pluginData, setPluginData] = useState<MarketplacePlugin | null>(null)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n const [installSuccess, setInstallSuccess] = useState(false)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n loadPluginDetails()\n }, [marketplace, plugin])\n\n const loadPluginDetails = () => {\n try {\n setLoading(true)\n\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setPluginData(null)\n setLoading(false)\n return\n }\n\n const pluginInfo = marketplaceData.manifest.plugins.find(\n p => p.name === plugin,\n )\n setPluginData(pluginInfo || null)\n } catch (err) {\n console.error('Error loading plugin details:', err)\n setPluginData(null)\n } finally {\n setLoading(false)\n }\n }\n\n const handleInstall = async () => {\n if (!pluginData) return\n\n setInstalling(true)\n setInstallError(null)\n setInstallSuccess(false)\n\n try {\n // Install the plugin\n const installPath = await installPluginFromMarketplace(\n plugin,\n marketplace,\n )\n\n setInstallSuccess(true)\n setInstalling(false)\n\n // Auto-navigate back after short delay to show success message\n setTimeout(() => {\n onBack()\n }, 1500)\n } catch (error) {\n setInstalling(false)\n setInstallError(error instanceof Error ? error.message : String(error))\n }\n }\n\n const handleOpenHomepage = () => {\n if (!pluginData?.homepage) return\n\n // Open URL in default browser\n const url = pluginData.homepage\n const command =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open'\n\n spawn(command, [url], { detached: true, stdio: 'ignore' }).unref()\n }\n\n const handleAction = (value: string) => {\n if (value === 'install') {\n handleInstall()\n } else if (value === 'homepage') {\n handleOpenHomepage()\n } else if (value === 'back') {\n onBack()\n }\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugin details...</Text>\n </Box>\n )\n }\n\n if (!pluginData) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Plugin not found</Text>\n <Text dimColor>\n Plugin \"{plugin}\" not found in marketplace \"{marketplace}\"\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build action menu\n const actions: Option[] = [{ label: 'Install now', value: 'install' }]\n\n if (pluginData.homepage) {\n actions.push({ label: 'Open homepage', value: 'homepage' })\n }\n\n actions.push({ label: 'Back to plugin list', value: 'back' })\n\n // Helper to format source\n const formatSource = (source: any): string => {\n if (typeof source === 'string') {\n return `Relative: ${source}`\n }\n if (source.source === 'github') {\n return `GitHub: ${source.repo}${source.ref ? `@${source.ref}` : ''}`\n }\n if (source.source === 'url') {\n return `URL: ${source.url}`\n }\n if (source.source === 'local') {\n return `Local: ${source.path}`\n }\n return 'Unknown'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n Plugin Details\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n {/* Plugin name and version */}\n <Text>\n <Text bold color={theme.success}>\n {pluginData.name}\n </Text>\n {pluginData.version && <Text dimColor> v{pluginData.version}</Text>}\n {pluginData.category && (\n <Text dimColor> [{pluginData.category}]</Text>\n )}\n </Text>\n\n {/* Description */}\n {pluginData.description && (\n <Box marginTop={0}>\n <Text>{pluginData.description}</Text>\n </Box>\n )}\n\n {/* Author */}\n {pluginData.author && (\n <Box marginTop={0}>\n <Text dimColor>By: {formatAuthor(pluginData.author)}</Text>\n </Box>\n )}\n\n {/* License */}\n {pluginData.license && (\n <Box marginTop={0}>\n <Text dimColor>License: {pluginData.license}</Text>\n </Box>\n )}\n\n {/* Homepage */}\n {pluginData.homepage && (\n <Box marginTop={0}>\n <Text dimColor>Homepage: {pluginData.homepage}</Text>\n </Box>\n )}\n\n {/* Repository */}\n {pluginData.repository && (\n <Box marginTop={0}>\n <Text dimColor>Repository: {pluginData.repository}</Text>\n </Box>\n )}\n\n {/* Source */}\n <Box marginTop={0}>\n <Text dimColor>Source: {formatSource(pluginData.source)}</Text>\n </Box>\n\n {/* Keywords/Tags */}\n {pluginData.keywords && pluginData.keywords.length > 0 && (\n <Box marginTop={0}>\n <Text dimColor>Keywords: {pluginData.keywords.join(', ')}</Text>\n </Box>\n )}\n\n {/* Components */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Will install:</Text>\n {pluginData.agents && pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Agents: {pluginData.agents.join(', ')}</Text>\n </Box>\n )}\n {pluginData.commands && pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Commands: {pluginData.commands.join(', ')}</Text>\n </Box>\n )}\n {pluginData.skills && pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Skills: {pluginData.skills.join(', ')}</Text>\n </Box>\n )}\n {pluginData.hooks && pluginData.hooks.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Hooks: {pluginData.hooks.join(', ')}</Text>\n </Box>\n )}\n {pluginData.mcpServers && pluginData.mcpServers.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 MCP Servers: {pluginData.mcpServers.join(', ')}</Text>\n </Box>\n )}\n {!pluginData.agents?.length &&\n !pluginData.commands?.length &&\n !pluginData.skills?.length &&\n !pluginData.hooks?.length &&\n !pluginData.mcpServers?.length && (\n <Box marginLeft={2}>\n <Text dimColor>\n Components will be auto-discovered from plugin directory\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Installation status */}\n {installing && (\n <Box marginTop={1}>\n <Text color={theme.primary}>Installing {pluginData.name}...</Text>\n </Box>\n )}\n\n {installSuccess && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2713 Successfully installed {pluginData.name}\n </Text>\n </Box>\n )}\n\n {installError && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.error}>\u2717 Installation failed</Text>\n <Text color={theme.error}>{installError}</Text>\n </Box>\n )}\n\n {/* Action menu */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Select\n options={actions}\n onChange={handleAction}\n visibleOptionCount={Math.min(actions.length, 5)}\n />\n </Box>\n )}\n\n {/* Help text */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Text dimColor>\u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Plugin Details & Install Component\n *\n * Shows complete plugin information and installation actions\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport {\n getMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { spawn } from 'child_process'\n\ninterface PluginDetailsInstallProps extends NavigationProps {\n marketplace: string\n plugin: string\n}\n\nexport const PluginDetailsInstall: React.FC<PluginDetailsInstallProps> = ({\n marketplace,\n plugin,\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n const [pluginData, setPluginData] = useState<MarketplacePlugin | null>(null)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n const [installSuccess, setInstallSuccess] = useState(false)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n loadPluginDetails()\n }, [marketplace, plugin])\n\n const loadPluginDetails = () => {\n try {\n setLoading(true)\n\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setPluginData(null)\n setLoading(false)\n return\n }\n\n const pluginInfo = marketplaceData.manifest.plugins.find(\n p => p.name === plugin,\n )\n setPluginData(pluginInfo || null)\n } catch (err) {\n console.error('Error loading plugin details:', err)\n setPluginData(null)\n } finally {\n setLoading(false)\n }\n }\n\n const handleInstall = async () => {\n if (!pluginData) return\n\n setInstalling(true)\n setInstallError(null)\n setInstallSuccess(false)\n\n try {\n // Install the plugin\n const installPath = await installPluginFromMarketplace(\n plugin,\n marketplace,\n )\n\n setInstallSuccess(true)\n setInstalling(false)\n\n // Auto-navigate back after short delay to show success message\n setTimeout(() => {\n onBack()\n }, 1500)\n } catch (error) {\n setInstalling(false)\n setInstallError(error instanceof Error ? error.message : String(error))\n }\n }\n\n const handleOpenHomepage = () => {\n if (!pluginData?.homepage) return\n\n // Open URL in default browser\n const url = pluginData.homepage\n const command =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open'\n\n spawn(command, [url], { detached: true, stdio: 'ignore' }).unref()\n }\n\n const handleAction = (value: string) => {\n if (value === 'install') {\n handleInstall()\n } else if (value === 'homepage') {\n handleOpenHomepage()\n } else if (value === 'back') {\n onBack()\n }\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugin details...</Text>\n </Box>\n )\n }\n\n if (!pluginData) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Plugin not found</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Plugin \"{plugin}\" not found in marketplace \"{marketplace}\"\n </Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build action menu\n const actions: Option[] = [{ label: 'Install now', value: 'install' }]\n\n if (pluginData.homepage) {\n actions.push({ label: 'Open homepage', value: 'homepage' })\n }\n\n actions.push({ label: 'Back to plugin list', value: 'back' })\n\n // Helper to format source\n const formatSource = (source: any): string => {\n if (typeof source === 'string') {\n return `Relative: ${source}`\n }\n if (source.source === 'github') {\n return `GitHub: ${source.repo}${source.ref ? `@${source.ref}` : ''}`\n }\n if (source.source === 'url') {\n return `URL: ${source.url}`\n }\n if (source.source === 'local') {\n return `Local: ${source.path}`\n }\n return 'Unknown'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n Plugin Details\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n {/* Plugin name and version */}\n <Text>\n <Text bold color={theme.success}>\n {pluginData.name}\n </Text>\n {pluginData.version && (\n <Text color={SEMANTIC_COLORS.dim}> v{pluginData.version}</Text>\n )}\n {pluginData.category && (\n <Text color={SEMANTIC_COLORS.dim}> [{pluginData.category}]</Text>\n )}\n </Text>\n\n {/* Description */}\n {pluginData.description && (\n <Box marginTop={0}>\n <Text>{pluginData.description}</Text>\n </Box>\n )}\n\n {/* Author */}\n {pluginData.author && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n By: {formatAuthor(pluginData.author)}\n </Text>\n </Box>\n )}\n\n {/* License */}\n {pluginData.license && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n License: {pluginData.license}\n </Text>\n </Box>\n )}\n\n {/* Homepage */}\n {pluginData.homepage && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Homepage: {pluginData.homepage}\n </Text>\n </Box>\n )}\n\n {/* Repository */}\n {pluginData.repository && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Repository: {pluginData.repository}\n </Text>\n </Box>\n )}\n\n {/* Source */}\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Source: {formatSource(pluginData.source)}\n </Text>\n </Box>\n\n {/* Keywords/Tags */}\n {pluginData.keywords && pluginData.keywords.length > 0 && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Keywords: {pluginData.keywords.join(', ')}\n </Text>\n </Box>\n )}\n\n {/* Components */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Will install:</Text>\n {pluginData.agents && pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Agents: {pluginData.agents.join(', ')}</Text>\n </Box>\n )}\n {pluginData.commands && pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Commands: {pluginData.commands.join(', ')}</Text>\n </Box>\n )}\n {pluginData.skills && pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Skills: {pluginData.skills.join(', ')}</Text>\n </Box>\n )}\n {pluginData.hooks && pluginData.hooks.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Hooks: {pluginData.hooks.join(', ')}</Text>\n </Box>\n )}\n {pluginData.mcpServers && pluginData.mcpServers.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 MCP Servers: {pluginData.mcpServers.join(', ')}</Text>\n </Box>\n )}\n {!pluginData.agents?.length &&\n !pluginData.commands?.length &&\n !pluginData.skills?.length &&\n !pluginData.hooks?.length &&\n !pluginData.mcpServers?.length && (\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n Components will be auto-discovered from plugin directory\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Installation status */}\n {installing && (\n <Box marginTop={1}>\n <Text color={theme.primary}>Installing {pluginData.name}...</Text>\n </Box>\n )}\n\n {installSuccess && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2713 Successfully installed {pluginData.name}\n </Text>\n </Box>\n )}\n\n {installError && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.error}>\u2717 Installation failed</Text>\n <Text color={theme.error}>{installError}</Text>\n </Box>\n )}\n\n {/* Action menu */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Select\n options={actions}\n onChange={handleAction}\n visibleOptionCount={Math.min(actions.length, 5)}\n />\n </Box>\n )}\n\n {/* Help text */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,6 +4,7 @@ import {
4
4
  getPlugin,
5
5
  togglePluginEnabled
6
6
  } from "../../utils/pluginLoader.js";
7
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
7
8
  import {
8
9
  updateMarketplace,
9
10
  installPluginFromMarketplace
@@ -186,7 +187,7 @@ const PluginDetailsManage = ({
186
187
  }
187
188
  };
188
189
  const confirm = confirmMessages[confirmAction];
189
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, confirm.title), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, confirm.message), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, confirm.warning), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
190
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, confirm.title), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, confirm.message), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, confirm.warning), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
190
191
  }
191
192
  if (actionInProgress) {
192
193
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, actionMessage));
@@ -198,10 +199,10 @@ const PluginDetailsManage = ({
198
199
  pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,
199
200
  pluginData.mcpServers.length > 0 && `${pluginData.mcpServers.length} MCP server(s)`
200
201
  ].filter(Boolean);
201
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, pluginData.manifest.displayName || pluginData.manifest.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace ? `@${marketplace}` : "local", " \xB7 v", pluginData.manifest.version), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.manifest.description), pluginData.manifest.author && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "By ", formatAuthor(pluginData.manifest.author)), /* @__PURE__ */ React.createElement(Text, null, "Status:", " ", /* @__PURE__ */ React.createElement(Text, { color: pluginData.enabled ? theme.success : theme.warning }, pluginData.enabled ? "Enabled" : "Disabled")), componentCounts.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Components:"), pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Agents: ", pluginData.agents.map((a) => a.name).join(", "))), pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Commands:", " ", pluginData.commands.map((c) => `/${c.name}`).join(", "))), pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Skills: ", pluginData.skills.map((s) => s.name).join(", "))))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Actions:"), availableActions.map((action, index) => {
202
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, pluginData.manifest.displayName || pluginData.manifest.name), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, marketplace ? `@${marketplace}` : "local", " \xB7 v", pluginData.manifest.version), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.manifest.description), pluginData.manifest.author && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "By ", formatAuthor(pluginData.manifest.author)), /* @__PURE__ */ React.createElement(Text, null, "Status:", " ", /* @__PURE__ */ React.createElement(Text, { color: pluginData.enabled ? theme.success : theme.warning }, pluginData.enabled ? "Enabled" : "Disabled")), componentCounts.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Components:"), pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2022 Agents: ", pluginData.agents.map((a) => a.name).join(", "))), pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2022 Commands:", " ", pluginData.commands.map((c) => `/${c.name}`).join(", "))), pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2022 Skills: ", pluginData.skills.map((s) => s.name).join(", "))))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Actions:"), availableActions.map((action, index) => {
202
203
  const isSelected = index === selectedIndex;
203
204
  return /* @__PURE__ */ React.createElement(Box, { key: action.value, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", action.label));
204
- }), actionMessage && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, actionMessage))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
205
+ }), actionMessage && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, actionMessage))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
205
206
  };
206
207
  export {
207
208
  PluginDetailsManage
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/PluginDetailsManage.tsx"],
4
- "sourcesContent": ["/**\n * Plugin Details Management\n *\n * Displays detailed information about an installed plugin with management actions.\n * Provides options to enable/disable, update, uninstall, and open homepage.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n getPlugin,\n togglePluginEnabled,\n disablePlugin,\n enablePlugin,\n} from '@utils/pluginLoader'\nimport {\n updateMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { rmSync } from 'fs'\n\ninterface PluginDetailsManageProps extends NavigationProps {\n plugin: LoadedPlugin\n}\n\ntype ActionOption = {\n label: string\n value: string\n disabled?: boolean\n}\n\nexport const PluginDetailsManage: React.FC<PluginDetailsManageProps> = ({\n plugin,\n onNavigate,\n onBack,\n}) => {\n const [pluginData, setPluginData] = useState<LoadedPlugin>(plugin)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<string | null>(null)\n const [actionInProgress, setActionInProgress] = useState(false)\n const [actionMessage, setActionMessage] = useState('')\n const theme = getTheme()\n\n const marketplace =\n pluginData.source.type === 'marketplace'\n ? pluginData.source.marketplace\n : null\n\n const loadPluginData = useCallback(() => {\n const p = getPlugin(plugin.manifest.name)\n if (p) {\n setPluginData(p)\n }\n }, [plugin])\n\n useEffect(() => {\n loadPluginData()\n }, [loadPluginData])\n\n const actions: ActionOption[] = [\n {\n label: pluginData.enabled ? 'Disable plugin' : 'Enable plugin',\n value: 'toggle',\n },\n {\n label: 'Mark for update',\n value: 'mark-update',\n disabled: !marketplace,\n },\n {\n label: 'Mark for uninstallation',\n value: 'mark-uninstall',\n },\n {\n label: 'Update now',\n value: 'update-now',\n disabled: !marketplace,\n },\n {\n label: 'Uninstall now',\n value: 'uninstall-now',\n },\n {\n label: 'Open homepage',\n value: 'homepage',\n disabled: !pluginData.manifest.homepage,\n },\n {\n label: 'Back to plugin list',\n value: 'back',\n },\n ]\n\n const availableActions = actions.filter(a => !a.disabled)\n\n const handleAction = useCallback(\n async (action: string) => {\n if (!pluginData) return\n\n switch (action) {\n case 'toggle':\n try {\n togglePluginEnabled(pluginData.manifest.name)\n loadPluginData()\n } catch (error) {\n setActionMessage(\n `Error toggling plugin: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n break\n\n case 'mark-update':\n setActionMessage(`Plugin marked for update`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'mark-uninstall':\n setActionMessage(`Plugin marked for uninstallation`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'update-now':\n if (marketplace) {\n setConfirmAction('update-now')\n setShowConfirm(true)\n }\n break\n\n case 'uninstall-now':\n setConfirmAction('uninstall-now')\n setShowConfirm(true)\n break\n\n case 'homepage':\n if (pluginData.manifest.homepage) {\n setActionMessage(`Opening ${pluginData.manifest.homepage}`)\n // In a real implementation, would open browser\n setTimeout(() => setActionMessage(''), 3000)\n }\n break\n\n case 'back':\n onBack()\n break\n }\n },\n [pluginData, marketplace, loadPluginData, onBack],\n )\n\n const handleConfirmAction = useCallback(async () => {\n if (!pluginData || !confirmAction) return\n\n setShowConfirm(false)\n setActionInProgress(true)\n\n try {\n if (confirmAction === 'update-now') {\n setActionMessage('Updating plugin...')\n\n if (marketplace) {\n // Update marketplace first\n await updateMarketplace(marketplace)\n\n // Uninstall current version\n rmSync(pluginData.location, { recursive: true, force: true })\n\n // Reinstall latest version\n await installPluginFromMarketplace(\n pluginData.manifest.name,\n marketplace,\n )\n\n setActionMessage('Plugin updated successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } else if (confirmAction === 'uninstall-now') {\n setActionMessage('Uninstalling plugin...')\n\n // Remove plugin directory\n rmSync(pluginData.location, { recursive: true, force: true })\n\n setActionMessage('Plugin uninstalled successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } catch (error) {\n setActionMessage(\n `Action failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n setTimeout(() => setActionMessage(''), 5000)\n } finally {\n setActionInProgress(false)\n setConfirmAction(null)\n }\n }, [pluginData, confirmAction, marketplace, onBack])\n\n useInput((input, key) => {\n if (actionInProgress) return\n\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmAction()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(availableActions.length - 1, prev + 1))\n } else if (key.return) {\n handleAction(availableActions[selectedIndex].value)\n }\n })\n\n if (showConfirm && confirmAction) {\n const confirmMessages = {\n 'update-now': {\n title: 'Confirm Update',\n message: `Update plugin \"${pluginData.manifest.name}\" to the latest version?`,\n warning:\n 'This will uninstall the current version and install the latest.',\n },\n 'uninstall-now': {\n title: 'Confirm Uninstall',\n message: `Permanently uninstall plugin \"${pluginData.manifest.name}\"?`,\n warning:\n 'This action cannot be undone. All plugin files will be removed.',\n },\n }\n\n const confirm =\n confirmMessages[confirmAction as keyof typeof confirmMessages]\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n {confirm.title}\n </Text>\n <Text>{''}</Text>\n <Text>{confirm.message}</Text>\n <Text dimColor>{confirm.warning}</Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n if (actionInProgress) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text color={theme.primary}>{actionMessage}</Text>\n </Box>\n )\n }\n\n const componentCounts = [\n pluginData.agents.length > 0 && `${pluginData.agents.length} agent(s)`,\n pluginData.commands.length > 0 &&\n `${pluginData.commands.length} command(s)`,\n pluginData.skills.length > 0 && `${pluginData.skills.length} skill(s)`,\n pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,\n pluginData.mcpServers.length > 0 &&\n `${pluginData.mcpServers.length} MCP server(s)`,\n ].filter(Boolean)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {pluginData.manifest.displayName || pluginData.manifest.name}\n </Text>\n <Text dimColor>\n {marketplace ? `@${marketplace}` : 'local'} \u00B7 v\n {pluginData.manifest.version}\n </Text>\n <Text>{''}</Text>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>{pluginData.manifest.description}</Text>\n {pluginData.manifest.author && (\n <Text dimColor>By {formatAuthor(pluginData.manifest.author)}</Text>\n )}\n <Text>\n Status:{' '}\n <Text color={pluginData.enabled ? theme.success : theme.warning}>\n {pluginData.enabled ? 'Enabled' : 'Disabled'}\n </Text>\n </Text>\n\n {componentCounts.length > 0 && (\n <>\n <Text>{''}</Text>\n <Text bold>Components:</Text>\n {pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Agents: {pluginData.agents.map(a => a.name).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Commands:{' '}\n {pluginData.commands.map(c => `/${c.name}`).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Skills: {pluginData.skills.map(s => s.name).join(', ')}\n </Text>\n </Box>\n )}\n </>\n )}\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Actions:\n </Text>\n\n {availableActions.map((action, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={action.value} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {action.label}\n </Text>\n </Box>\n )\n })}\n\n {actionMessage && (\n <>\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={theme.warning}>{actionMessage}</Text>\n </Box>\n </>\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text dimColor>\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Plugin Details Management\n *\n * Displays detailed information about an installed plugin with management actions.\n * Provides options to enable/disable, update, uninstall, and open homepage.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n getPlugin,\n togglePluginEnabled,\n disablePlugin,\n enablePlugin,\n} from '@utils/pluginLoader'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport {\n updateMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { rmSync } from 'fs'\n\ninterface PluginDetailsManageProps extends NavigationProps {\n plugin: LoadedPlugin\n}\n\ntype ActionOption = {\n label: string\n value: string\n disabled?: boolean\n}\n\nexport const PluginDetailsManage: React.FC<PluginDetailsManageProps> = ({\n plugin,\n onNavigate,\n onBack,\n}) => {\n const [pluginData, setPluginData] = useState<LoadedPlugin>(plugin)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<string | null>(null)\n const [actionInProgress, setActionInProgress] = useState(false)\n const [actionMessage, setActionMessage] = useState('')\n const theme = getTheme()\n\n const marketplace =\n pluginData.source.type === 'marketplace'\n ? pluginData.source.marketplace\n : null\n\n const loadPluginData = useCallback(() => {\n const p = getPlugin(plugin.manifest.name)\n if (p) {\n setPluginData(p)\n }\n }, [plugin])\n\n useEffect(() => {\n loadPluginData()\n }, [loadPluginData])\n\n const actions: ActionOption[] = [\n {\n label: pluginData.enabled ? 'Disable plugin' : 'Enable plugin',\n value: 'toggle',\n },\n {\n label: 'Mark for update',\n value: 'mark-update',\n disabled: !marketplace,\n },\n {\n label: 'Mark for uninstallation',\n value: 'mark-uninstall',\n },\n {\n label: 'Update now',\n value: 'update-now',\n disabled: !marketplace,\n },\n {\n label: 'Uninstall now',\n value: 'uninstall-now',\n },\n {\n label: 'Open homepage',\n value: 'homepage',\n disabled: !pluginData.manifest.homepage,\n },\n {\n label: 'Back to plugin list',\n value: 'back',\n },\n ]\n\n const availableActions = actions.filter(a => !a.disabled)\n\n const handleAction = useCallback(\n async (action: string) => {\n if (!pluginData) return\n\n switch (action) {\n case 'toggle':\n try {\n togglePluginEnabled(pluginData.manifest.name)\n loadPluginData()\n } catch (error) {\n setActionMessage(\n `Error toggling plugin: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n break\n\n case 'mark-update':\n setActionMessage(`Plugin marked for update`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'mark-uninstall':\n setActionMessage(`Plugin marked for uninstallation`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'update-now':\n if (marketplace) {\n setConfirmAction('update-now')\n setShowConfirm(true)\n }\n break\n\n case 'uninstall-now':\n setConfirmAction('uninstall-now')\n setShowConfirm(true)\n break\n\n case 'homepage':\n if (pluginData.manifest.homepage) {\n setActionMessage(`Opening ${pluginData.manifest.homepage}`)\n // In a real implementation, would open browser\n setTimeout(() => setActionMessage(''), 3000)\n }\n break\n\n case 'back':\n onBack()\n break\n }\n },\n [pluginData, marketplace, loadPluginData, onBack],\n )\n\n const handleConfirmAction = useCallback(async () => {\n if (!pluginData || !confirmAction) return\n\n setShowConfirm(false)\n setActionInProgress(true)\n\n try {\n if (confirmAction === 'update-now') {\n setActionMessage('Updating plugin...')\n\n if (marketplace) {\n // Update marketplace first\n await updateMarketplace(marketplace)\n\n // Uninstall current version\n rmSync(pluginData.location, { recursive: true, force: true })\n\n // Reinstall latest version\n await installPluginFromMarketplace(\n pluginData.manifest.name,\n marketplace,\n )\n\n setActionMessage('Plugin updated successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } else if (confirmAction === 'uninstall-now') {\n setActionMessage('Uninstalling plugin...')\n\n // Remove plugin directory\n rmSync(pluginData.location, { recursive: true, force: true })\n\n setActionMessage('Plugin uninstalled successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } catch (error) {\n setActionMessage(\n `Action failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n setTimeout(() => setActionMessage(''), 5000)\n } finally {\n setActionInProgress(false)\n setConfirmAction(null)\n }\n }, [pluginData, confirmAction, marketplace, onBack])\n\n useInput((input, key) => {\n if (actionInProgress) return\n\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmAction()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(availableActions.length - 1, prev + 1))\n } else if (key.return) {\n handleAction(availableActions[selectedIndex].value)\n }\n })\n\n if (showConfirm && confirmAction) {\n const confirmMessages = {\n 'update-now': {\n title: 'Confirm Update',\n message: `Update plugin \"${pluginData.manifest.name}\" to the latest version?`,\n warning:\n 'This will uninstall the current version and install the latest.',\n },\n 'uninstall-now': {\n title: 'Confirm Uninstall',\n message: `Permanently uninstall plugin \"${pluginData.manifest.name}\"?`,\n warning:\n 'This action cannot be undone. All plugin files will be removed.',\n },\n }\n\n const confirm =\n confirmMessages[confirmAction as keyof typeof confirmMessages]\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n {confirm.title}\n </Text>\n <Text>{''}</Text>\n <Text>{confirm.message}</Text>\n <Text color={SEMANTIC_COLORS.dim}>{confirm.warning}</Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n if (actionInProgress) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text color={theme.primary}>{actionMessage}</Text>\n </Box>\n )\n }\n\n const componentCounts = [\n pluginData.agents.length > 0 && `${pluginData.agents.length} agent(s)`,\n pluginData.commands.length > 0 &&\n `${pluginData.commands.length} command(s)`,\n pluginData.skills.length > 0 && `${pluginData.skills.length} skill(s)`,\n pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,\n pluginData.mcpServers.length > 0 &&\n `${pluginData.mcpServers.length} MCP server(s)`,\n ].filter(Boolean)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {pluginData.manifest.displayName || pluginData.manifest.name}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {marketplace ? `@${marketplace}` : 'local'} \u00B7 v\n {pluginData.manifest.version}\n </Text>\n <Text>{''}</Text>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>{pluginData.manifest.description}</Text>\n {pluginData.manifest.author && (\n <Text color={SEMANTIC_COLORS.dim}>\n By {formatAuthor(pluginData.manifest.author)}\n </Text>\n )}\n <Text>\n Status:{' '}\n <Text color={pluginData.enabled ? theme.success : theme.warning}>\n {pluginData.enabled ? 'Enabled' : 'Disabled'}\n </Text>\n </Text>\n\n {componentCounts.length > 0 && (\n <>\n <Text>{''}</Text>\n <Text bold>Components:</Text>\n {pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2022 Agents: {pluginData.agents.map(a => a.name).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2022 Commands:{' '}\n {pluginData.commands.map(c => `/${c.name}`).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2022 Skills: {pluginData.skills.map(s => s.name).join(', ')}\n </Text>\n </Box>\n )}\n </>\n )}\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Actions:\n </Text>\n\n {availableActions.map((action, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={action.value} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {action.label}\n </Text>\n </Box>\n )\n })}\n\n {actionMessage && (\n <>\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={theme.warning}>{actionMessage}</Text>\n </Box>\n </>\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -16,6 +16,7 @@ import {
16
16
  import { MarketplaceError } from "../types/marketplace.js";
17
17
  import { rmSync } from "fs";
18
18
  import { getTheme } from "../utils/theme.js";
19
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
19
20
  import { MainMenu } from "./plugin/MainMenu.js";
20
21
  import { MarketplaceSelector } from "./plugin/MarketplaceSelector.js";
21
22
  import { PluginBrowser } from "./plugin/PluginBrowser.js";
@@ -48,7 +49,7 @@ const PluginList = ({ onDone }) => {
48
49
  return /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error: ", error);
49
50
  }
50
51
  if (plugins.length === 0) {
51
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed."), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Install plugins with: /plugin install <name>[@marketplace]"));
52
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed."), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Install plugins with: /plugin install <name>[@marketplace]"));
52
53
  }
53
54
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.success }, "Installed Plugins (", plugins.length, ")"), /* @__PURE__ */ React.createElement(Text, null, ""), plugins.map((plugin2) => {
54
55
  const componentCounts = [
@@ -65,10 +66,10 @@ const PluginList = ({ onDone }) => {
65
66
  flexDirection: "column",
66
67
  marginBottom: 1
67
68
  },
68
- /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary, bold: true }, plugin2.manifest.displayName || plugin2.manifest.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " v", plugin2.manifest.version), !plugin2.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")),
69
- plugin2.manifest.description && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", plugin2.manifest.description),
70
- componentCounts.length > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Components: ", componentCounts.join(", ")),
71
- /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "Location:", " ", plugin2.source.type === "local" ? plugin2.source.path : plugin2.location)
69
+ /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary, bold: true }, plugin2.manifest.displayName || plugin2.manifest.name), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "v", plugin2.manifest.version), !plugin2.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")),
70
+ plugin2.manifest.description && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", plugin2.manifest.description),
71
+ componentCounts.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Components: ", componentCounts.join(", ")),
72
+ /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Location:", " ", plugin2.source.type === "local" ? plugin2.source.path : plugin2.location)
72
73
  );
73
74
  }));
74
75
  };
@@ -98,7 +99,7 @@ const PluginInfo = ({ pluginName, onDone }) => {
98
99
  if (error || !plugin2) {
99
100
  return /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error: ", error || "Plugin not found");
100
101
  }
101
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.success }, plugin2.manifest.displayName || plugin2.manifest.name), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Name:"), " ", plugin2.manifest.name), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Version:"), " ", plugin2.manifest.version), plugin2.manifest.description && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Description:"), " ", plugin2.manifest.description), plugin2.manifest.author && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Author:"), " ", plugin2.manifest.author), plugin2.manifest.license && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "License:"), " ", plugin2.manifest.license), plugin2.manifest.homepage && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Homepage:"), " ", plugin2.manifest.homepage), plugin2.manifest.repository && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Repository:"), " ", plugin2.manifest.repository), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Location:"), " ", plugin2.location), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Source:"), " ", plugin2.source.type), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Enabled:"), " ", plugin2.enabled ? "Yes" : "No")), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Components:"), plugin2.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Agents (", plugin2.agents.length, "):"), plugin2.agents.map((agent) => /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "\u2022 ", agent.name, agent.config.description ? ` - ${agent.config.description}` : ""))), plugin2.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Commands (", plugin2.commands.length, "):"), plugin2.commands.map((command) => /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "\u2022 /", command.name, command.config.description ? ` - ${command.config.description}` : ""))), plugin2.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Skills (", plugin2.skills.length, "):"), plugin2.skills.map((skill) => /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "\u2022 ", skill.name, skill.config.description ? ` - ${skill.config.description}` : ""))), plugin2.hooks.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Hooks (", plugin2.hooks.length, "):"), plugin2.hooks.map((hook) => /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "\u2022 ", hook.name, " (", hook.config.event, ")"))), plugin2.mcpServers.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "MCP Servers (", plugin2.mcpServers.length, "):"), plugin2.mcpServers.map((server) => /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "\u2022 ", server.name, " - ", server.config.command))), plugin2.agents.length === 0 && plugin2.commands.length === 0 && plugin2.skills.length === 0 && plugin2.hooks.length === 0 && plugin2.mcpServers.length === 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " No components loaded"), plugin2.manifest.engines && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Requirements:"), plugin2.manifest.engines.minto && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Minto: ", plugin2.manifest.engines.minto), plugin2.manifest.engines["claude-code"] && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "Claude Code: ", plugin2.manifest.engines["claude-code"]), plugin2.manifest.engines.node && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Node: ", plugin2.manifest.engines.node)));
102
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.success }, plugin2.manifest.displayName || plugin2.manifest.name), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Name:"), " ", plugin2.manifest.name), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Version:"), " ", plugin2.manifest.version), plugin2.manifest.description && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Description:"), " ", plugin2.manifest.description), plugin2.manifest.author && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Author:"), " ", plugin2.manifest.author), plugin2.manifest.license && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "License:"), " ", plugin2.manifest.license), plugin2.manifest.homepage && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Homepage:"), " ", plugin2.manifest.homepage), plugin2.manifest.repository && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Repository:"), " ", plugin2.manifest.repository), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Location:"), " ", plugin2.location), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Source:"), " ", plugin2.source.type), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Enabled:"), " ", plugin2.enabled ? "Yes" : "No")), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Components:"), plugin2.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Agents (", plugin2.agents.length, "):"), plugin2.agents.map((agent) => /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 ", agent.name, agent.config.description ? ` - ${agent.config.description}` : ""))), plugin2.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Commands (", plugin2.commands.length, "):"), plugin2.commands.map((command) => /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 /", command.name, command.config.description ? ` - ${command.config.description}` : ""))), plugin2.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Skills (", plugin2.skills.length, "):"), plugin2.skills.map((skill) => /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 ", skill.name, skill.config.description ? ` - ${skill.config.description}` : ""))), plugin2.hooks.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Hooks (", plugin2.hooks.length, "):"), plugin2.hooks.map((hook) => /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 ", hook.name, " (", hook.config.event, ")"))), plugin2.mcpServers.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "MCP Servers (", plugin2.mcpServers.length, "):"), plugin2.mcpServers.map((server) => /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 ", server.name, " - ", server.config.command))), plugin2.agents.length === 0 && plugin2.commands.length === 0 && plugin2.skills.length === 0 && plugin2.hooks.length === 0 && plugin2.mcpServers.length === 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " No components loaded"), plugin2.manifest.engines && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Requirements:"), plugin2.manifest.engines.minto && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Minto: ", plugin2.manifest.engines.minto), plugin2.manifest.engines["claude-code"] && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Claude Code: ", plugin2.manifest.engines["claude-code"]), plugin2.manifest.engines.node && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Node: ", plugin2.manifest.engines.node)));
102
103
  };
103
104
  const PluginInstall = ({
104
105
  pluginSpec,
@@ -143,7 +144,7 @@ const PluginInstall = ({
143
144
  installPlugin();
144
145
  }, [pluginSpec, onDone]);
145
146
  const color = status === "success" ? theme.success : status === "error" ? theme.error : theme.primary;
146
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color }, message), status === "success" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Plugin is now available. Use /plugin info ", pluginSpec.split("@")[0], " ", "to see details.")));
147
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color }, message), status === "success" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Plugin is now available. Use /plugin info ", pluginSpec.split("@")[0], " ", "to see details.")));
147
148
  };
148
149
  const PluginUninstall = ({
149
150
  pluginName,
@@ -258,9 +259,9 @@ const MarketplaceListView = ({ onDone }) => {
258
259
  return /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Loading marketplaces...");
259
260
  }
260
261
  if (marketplaces.length === 0) {
261
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No marketplaces registered."), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Register a marketplace with: /plugin marketplace add <source>"));
262
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No marketplaces registered."), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Register a marketplace with: /plugin marketplace add <source>"));
262
263
  }
263
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.success }, "Registered Marketplaces (", marketplaces.length, ")"), /* @__PURE__ */ React.createElement(Text, null, ""), marketplaces.map((marketplace) => /* @__PURE__ */ React.createElement(Box, { key: marketplace.name, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary, bold: true }, marketplace.name), !marketplace.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")), marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", marketplace.manifest.metadata.description), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, ` Plugins: ${marketplace.manifest.plugins.length}`, ` | Owner: ${marketplace.manifest.owner.name}`), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, ` Source: ${marketplace.source.type}`, marketplace.source.type === "github" && ` (${marketplace.source.repo})`, marketplace.source.type === "url" && ` (${marketplace.source.url})`, marketplace.source.type === "local" && ` (${marketplace.source.path})`), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, ` Last updated: ${new Date(marketplace.lastUpdated).toLocaleString()}`))));
264
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.success }, "Registered Marketplaces (", marketplaces.length, ")"), /* @__PURE__ */ React.createElement(Text, null, ""), marketplaces.map((marketplace) => /* @__PURE__ */ React.createElement(Box, { key: marketplace.name, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.primary, bold: true }, marketplace.name), !marketplace.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")), marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", marketplace.manifest.metadata.description), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, ` Plugins: ${marketplace.manifest.plugins.length}`, ` | Owner: ${marketplace.manifest.owner.name}`), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, ` Source: ${marketplace.source.type}`, marketplace.source.type === "github" && ` (${marketplace.source.repo})`, marketplace.source.type === "url" && ` (${marketplace.source.url})`, marketplace.source.type === "local" && ` (${marketplace.source.path})`), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, ` Last updated: ${new Date(marketplace.lastUpdated).toLocaleString()}`))));
264
265
  };
265
266
  const MarketplaceAdd = ({ source, onDone }) => {
266
267
  const [status, setStatus] = useState("adding");
@@ -293,7 +294,7 @@ const MarketplaceAdd = ({ source, onDone }) => {
293
294
  addMarketplaceAsync();
294
295
  }, [source, onDone]);
295
296
  const color = status === "success" ? theme.success : status === "error" ? theme.error : theme.primary;
296
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color }, message), status === "success" && marketplace && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Marketplace contains ", marketplace.manifest.plugins.length, " plugin(s)"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Use /plugin marketplace list to see all marketplaces")));
297
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color }, message), status === "success" && marketplace && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Marketplace contains ", marketplace.manifest.plugins.length, " plugin(s)"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Use /plugin marketplace list to see all marketplaces")));
297
298
  };
298
299
  const MarketplaceUpdate = ({
299
300
  name,
@@ -435,10 +436,10 @@ const MarketplaceDetails = ({ marketplace: marketplaceName, onNavigate, onBack,
435
436
  marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, marketplace.manifest.metadata.description)),
436
437
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Plugins: "), /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, marketplace.manifest.plugins.length)),
437
438
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Owner: "), /* @__PURE__ */ React.createElement(Text, null, marketplace.manifest.owner.name)),
438
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Source: "), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace.source.type, marketplace.source.type === "github" && ` (${marketplace.source.repo})`, marketplace.source.type === "url" && ` (${marketplace.source.url})`, marketplace.source.type === "local" && ` (${marketplace.source.path})`)),
439
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Last updated: "), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, new Date(marketplace.lastUpdated).toLocaleString())),
439
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Source: "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, marketplace.source.type, marketplace.source.type === "github" && ` (${marketplace.source.repo})`, marketplace.source.type === "url" && ` (${marketplace.source.url})`, marketplace.source.type === "local" && ` (${marketplace.source.path})`)),
440
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Last updated: "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, new Date(marketplace.lastUpdated).toLocaleString())),
440
441
  error && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error: ", error)),
441
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "p"), " to view plugins from this marketplace"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "u"), " to update marketplace"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "r"), " to remove marketplace"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to go back"))
442
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "p"), " to view plugins from this marketplace"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "u"), " to update marketplace"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "r"), " to remove marketplace"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to go back"))
442
443
  );
443
444
  };
444
445
  const InteractivePluginCommand = ({
@@ -557,7 +558,7 @@ const InteractivePluginCommand = ({
557
558
  }
558
559
  );
559
560
  default:
560
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, "Unknown screen state"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to exit"));
561
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, "Unknown screen state"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to exit"));
561
562
  }
562
563
  };
563
564
  const LegacyPluginCommand = ({
@@ -574,7 +575,7 @@ const LegacyPluginCommand = ({
574
575
  }
575
576
  }, [subcommand, onDone]);
576
577
  if (!subcommand || subcommand === "help" || subcommand === "--help") {
577
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.primary }, "Plugin Management Commands"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin list"), " - List all installed plugins"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin info <name>"), " - Show detailed plugin information"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin install <name>[@marketplace]"), " ", "- Install plugin from marketplace"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin uninstall <name>"), " - Remove installed plugin"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin validate [name]"), " - Validate plugin manifest and components"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Marketplace Commands:"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace add <source>"), " ", "- Register new marketplace"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace list"), " - List registered marketplaces"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace update <name>"), " ", "- Update marketplace manifest"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace remove <name>"), " ", "- Unregister marketplace"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Examples:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " /plugin list"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " /plugin info my-plugin"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " /plugin install awesome-plugin@official"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " /plugin marketplace add owner/repo"));
578
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: theme.primary }, "Plugin Management Commands"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin list"), " - List all installed plugins"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin info <name>"), " - Show detailed plugin information"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin install <name>[@marketplace]"), " ", "- Install plugin from marketplace"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin uninstall <name>"), " - Remove installed plugin"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin validate [name]"), " - Validate plugin manifest and components"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Marketplace Commands:"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace add <source>"), " ", "- Register new marketplace"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace list"), " - List registered marketplaces"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace update <name>"), " ", "- Update marketplace manifest"), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "/plugin marketplace remove <name>"), " ", "- Unregister marketplace"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Examples:"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " /plugin list"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " /plugin info my-plugin"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "/plugin install awesome-plugin@official"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "/plugin marketplace add owner/repo"));
578
579
  }
579
580
  switch (subcommand) {
580
581
  case "list":