@within-7/minto 0.3.6 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/{cli.js → cli.cjs} +25 -23
  2. package/dist/commands/agents/AgentsCommand.js +459 -655
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/agents/types.js +1 -0
  5. package/dist/commands/agents/types.js.map +2 -2
  6. package/dist/commands/agents/utils/fileOperations.js +96 -36
  7. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  8. package/dist/commands/agents/utils/index.js +3 -1
  9. package/dist/commands/agents/utils/index.js.map +2 -2
  10. package/dist/commands/context.js +54 -23
  11. package/dist/commands/context.js.map +2 -2
  12. package/dist/commands/export.js +673 -93
  13. package/dist/commands/export.js.map +2 -2
  14. package/dist/commands/language.js +110 -0
  15. package/dist/commands/language.js.map +7 -0
  16. package/dist/commands/mcp-interactive.js +419 -217
  17. package/dist/commands/mcp-interactive.js.map +2 -2
  18. package/dist/commands/model.js +415 -66
  19. package/dist/commands/model.js.map +2 -2
  20. package/dist/commands/new.js +56 -0
  21. package/dist/commands/new.js.map +7 -0
  22. package/dist/commands/permissions.js +75 -49
  23. package/dist/commands/permissions.js.map +2 -2
  24. package/dist/commands/plugin.js +882 -185
  25. package/dist/commands/plugin.js.map +3 -3
  26. package/dist/commands/resume.js +251 -16
  27. package/dist/commands/resume.js.map +2 -2
  28. package/dist/commands/sandbox.js +168 -70
  29. package/dist/commands/sandbox.js.map +2 -2
  30. package/dist/commands/sessions.js +224 -0
  31. package/dist/commands/sessions.js.map +7 -0
  32. package/dist/commands/setup.js +596 -109
  33. package/dist/commands/setup.js.map +2 -2
  34. package/dist/commands/stats.js +292 -0
  35. package/dist/commands/stats.js.map +7 -0
  36. package/dist/commands/status.js +75 -7
  37. package/dist/commands/status.js.map +2 -2
  38. package/dist/commands/undo.js +154 -180
  39. package/dist/commands/undo.js.map +2 -2
  40. package/dist/commands.js +6 -0
  41. package/dist/commands.js.map +2 -2
  42. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  43. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  44. package/dist/components/Config.js +9 -8
  45. package/dist/components/Config.js.map +2 -2
  46. package/dist/components/HeaderBar.js +2 -1
  47. package/dist/components/HeaderBar.js.map +2 -2
  48. package/dist/components/Help.js +166 -32
  49. package/dist/components/Help.js.map +2 -2
  50. package/dist/components/HotkeyHelpPanel.js +46 -44
  51. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  52. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  53. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  54. package/dist/components/InfoPanel/index.js +5 -0
  55. package/dist/components/InfoPanel/index.js.map +7 -0
  56. package/dist/components/InfoPanel/types.js +1 -0
  57. package/dist/components/InfoPanel/types.js.map +7 -0
  58. package/dist/components/Logo.js +5 -2
  59. package/dist/components/Logo.js.map +2 -2
  60. package/dist/components/MCPServerApprovalDialog.js +6 -5
  61. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  62. package/dist/components/MCPServerMultiselectDialog.js +5 -4
  63. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  64. package/dist/components/MessageSelector.js +4 -3
  65. package/dist/components/MessageSelector.js.map +2 -2
  66. package/dist/components/ModelConfig.js +13 -12
  67. package/dist/components/ModelConfig.js.map +2 -2
  68. package/dist/components/ModelListManager.js +4 -3
  69. package/dist/components/ModelListManager.js.map +2 -2
  70. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  71. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  72. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  73. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  74. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  75. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  76. package/dist/components/ModelSelector/index.js +1 -3
  77. package/dist/components/ModelSelector/index.js.map +2 -2
  78. package/dist/components/PromptInput.js +77 -44
  79. package/dist/components/PromptInput.js.map +2 -2
  80. package/dist/components/SensitiveFileWarning.js +12 -8
  81. package/dist/components/SensitiveFileWarning.js.map +2 -2
  82. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  83. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  84. package/dist/components/SimpleSelector/index.js +5 -0
  85. package/dist/components/SimpleSelector/index.js.map +7 -0
  86. package/dist/components/SimpleSelector/types.js +1 -0
  87. package/dist/components/SimpleSelector/types.js.map +7 -0
  88. package/dist/components/StatusOverlayContent.js +21 -0
  89. package/dist/components/StatusOverlayContent.js.map +7 -0
  90. package/dist/components/TabbedListView/ScrollableList.js +117 -0
  91. package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
  92. package/dist/components/TabbedListView/SearchInput.js +23 -0
  93. package/dist/components/TabbedListView/SearchInput.js.map +7 -0
  94. package/dist/components/TabbedListView/TabBar.js +20 -0
  95. package/dist/components/TabbedListView/TabBar.js.map +7 -0
  96. package/dist/components/TabbedListView/TabbedListView.js +246 -0
  97. package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
  98. package/dist/components/TabbedListView/index.js +11 -0
  99. package/dist/components/TabbedListView/index.js.map +7 -0
  100. package/dist/components/TabbedListView/types.js +1 -0
  101. package/dist/components/TabbedListView/types.js.map +7 -0
  102. package/dist/components/TodoChangeBlock.js +6 -5
  103. package/dist/components/TodoChangeBlock.js.map +3 -3
  104. package/dist/components/TodoPanel.js +6 -3
  105. package/dist/components/TodoPanel.js.map +3 -3
  106. package/dist/components/TrustDialog.js +6 -5
  107. package/dist/components/TrustDialog.js.map +2 -2
  108. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
  109. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
  110. package/dist/constants/macros.js +1 -1
  111. package/dist/constants/macros.js.map +1 -1
  112. package/dist/constants/product.js +2 -2
  113. package/dist/constants/product.js.map +1 -1
  114. package/dist/constants/prompts.js +17 -0
  115. package/dist/constants/prompts.js.map +2 -2
  116. package/dist/constants/toolInputExamples.js +5 -1
  117. package/dist/constants/toolInputExamples.js.map +2 -2
  118. package/dist/core/backupHook.js +29 -0
  119. package/dist/core/backupHook.js.map +7 -0
  120. package/dist/core/config/defaults.js +8 -2
  121. package/dist/core/config/defaults.js.map +2 -2
  122. package/dist/core/config/schema.js +14 -2
  123. package/dist/core/config/schema.js.map +2 -2
  124. package/dist/core/costTracker.js +0 -16
  125. package/dist/core/costTracker.js.map +2 -2
  126. package/dist/core/tokenStatsManager.js +5 -0
  127. package/dist/core/tokenStatsManager.js.map +2 -2
  128. package/dist/cost-tracker.js +0 -16
  129. package/dist/cost-tracker.js.map +2 -2
  130. package/dist/entrypoints/bootstrap.js +56 -0
  131. package/dist/entrypoints/bootstrap.js.map +7 -0
  132. package/dist/entrypoints/cli.js +164 -23
  133. package/dist/entrypoints/cli.js.map +3 -3
  134. package/dist/history.js +75 -15
  135. package/dist/history.js.map +2 -2
  136. package/dist/i18n/index.js +2 -2
  137. package/dist/i18n/index.js.map +2 -2
  138. package/dist/i18n/locales/en.js +582 -1
  139. package/dist/i18n/locales/en.js.map +2 -2
  140. package/dist/i18n/locales/zh-CN.js +582 -1
  141. package/dist/i18n/locales/zh-CN.js.map +2 -2
  142. package/dist/i18n/types.js.map +1 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +2 -2
  145. package/dist/messages.js +11 -0
  146. package/dist/messages.js.map +2 -2
  147. package/dist/permissions.js.map +2 -2
  148. package/dist/query.js +9 -0
  149. package/dist/query.js.map +2 -2
  150. package/dist/screens/REPL.js +45 -7
  151. package/dist/screens/REPL.js.map +2 -2
  152. package/dist/services/customCommands.js +44 -16
  153. package/dist/services/customCommands.js.map +2 -2
  154. package/dist/services/plugins/lspServers.js +1 -1
  155. package/dist/services/plugins/lspServers.js.map +2 -2
  156. package/dist/services/plugins/pluginRuntime.js +2 -1
  157. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  158. package/dist/services/plugins/pluginValidation.js +10 -3
  159. package/dist/services/plugins/pluginValidation.js.map +2 -2
  160. package/dist/services/plugins/skillMarketplace.js +16 -8
  161. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  162. package/dist/services/systemReminder.js +17 -6
  163. package/dist/services/systemReminder.js.map +2 -2
  164. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  165. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  166. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  167. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  168. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  169. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  170. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  171. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  172. package/dist/tools/TaskTool/TaskTool.js +179 -1
  173. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  174. package/dist/tools/TodoWriteTool/prompt.js +21 -0
  175. package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
  176. package/dist/tools/URLFetcherTool/prompt.js +14 -9
  177. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  178. package/dist/tools/WebSearchTool/prompt.js +12 -6
  179. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  180. package/dist/types/PermissionMode.js +30 -1
  181. package/dist/types/PermissionMode.js.map +2 -2
  182. package/dist/types/plugin.js +2 -4
  183. package/dist/types/plugin.js.map +2 -2
  184. package/dist/utils/agentHookExecutor.js +103 -0
  185. package/dist/utils/agentHookExecutor.js.map +7 -0
  186. package/dist/utils/agentLoader.js +272 -32
  187. package/dist/utils/agentLoader.js.map +2 -2
  188. package/dist/utils/agentMemory.js +134 -0
  189. package/dist/utils/agentMemory.js.map +7 -0
  190. package/dist/utils/claudeCodeSync.js +439 -0
  191. package/dist/utils/claudeCodeSync.js.map +7 -0
  192. package/dist/utils/config.js +52 -24
  193. package/dist/utils/config.js.map +2 -2
  194. package/dist/utils/configPaths.js +199 -0
  195. package/dist/utils/configPaths.js.map +7 -0
  196. package/dist/utils/execFileNoThrow.js +2 -1
  197. package/dist/utils/execFileNoThrow.js.map +2 -2
  198. package/dist/utils/historyManager.js +234 -0
  199. package/dist/utils/historyManager.js.map +7 -0
  200. package/dist/utils/marketplaceManager.js +80 -43
  201. package/dist/utils/marketplaceManager.js.map +2 -2
  202. package/dist/utils/messages.js +13 -8
  203. package/dist/utils/messages.js.map +2 -2
  204. package/dist/utils/migration/index.js +37 -0
  205. package/dist/utils/migration/index.js.map +7 -0
  206. package/dist/utils/migration/migrateHistory.js +273 -0
  207. package/dist/utils/migration/migrateHistory.js.map +7 -0
  208. package/dist/utils/migration/migrateTodos.js +323 -0
  209. package/dist/utils/migration/migrateTodos.js.map +7 -0
  210. package/dist/utils/pasteCache.js +309 -0
  211. package/dist/utils/pasteCache.js.map +7 -0
  212. package/dist/utils/pluginInstaller.js +34 -24
  213. package/dist/utils/pluginInstaller.js.map +2 -2
  214. package/dist/utils/pluginLoader.js +54 -28
  215. package/dist/utils/pluginLoader.js.map +2 -2
  216. package/dist/utils/repoFetcher.js +110 -0
  217. package/dist/utils/repoFetcher.js.map +7 -0
  218. package/dist/utils/sessionIndex.js +192 -0
  219. package/dist/utils/sessionIndex.js.map +7 -0
  220. package/dist/utils/sessionTracker.js +170 -0
  221. package/dist/utils/sessionTracker.js.map +7 -0
  222. package/dist/utils/skillLoader.js +103 -5
  223. package/dist/utils/skillLoader.js.map +2 -2
  224. package/dist/utils/stats.js +417 -0
  225. package/dist/utils/stats.js.map +7 -0
  226. package/dist/utils/stringSubstitution.js +106 -0
  227. package/dist/utils/stringSubstitution.js.map +7 -0
  228. package/dist/utils/teamConfig.js +156 -14
  229. package/dist/utils/teamConfig.js.map +2 -2
  230. package/dist/utils/terminal.js +1 -1
  231. package/dist/utils/terminal.js.map +2 -2
  232. package/dist/utils/todoStorage.js +51 -19
  233. package/dist/utils/todoStorage.js.map +2 -2
  234. package/dist/utils/tooling/safeRender.js.map +2 -2
  235. package/dist/version.js +2 -2
  236. package/dist/version.js.map +1 -1
  237. package/package.json +71 -28
  238. package/scripts/{postinstall.js → postinstall.cjs} +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/export.tsx"],
4
- "sourcesContent": ["/**\n * Export Command\n *\n * Export session data, configuration, or conversation history.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { writeFile } from 'fs/promises'\nimport { join } from 'path'\nimport type { Command } from '@commands'\nimport { getMessagesGetter } from '@messages'\nimport { getCwd } from '@utils/state'\nimport { loadGlobalConfig, loadProjectConfig } from '../core/config'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype ExportType = 'conversation' | 'config' | 'summary'\n\ninterface ExportOption {\n type: ExportType\n label: string\n description: string\n}\n\nconst EXPORT_OPTIONS: ExportOption[] = [\n {\n type: 'conversation',\n label: 'Conversation',\n description: 'Export full conversation history as JSON',\n },\n {\n type: 'config',\n label: 'Configuration',\n description: 'Export current configuration settings',\n },\n {\n type: 'summary',\n label: 'Summary',\n description: 'Export a markdown summary of the session',\n },\n]\n\ninterface ExportMenuProps {\n onDone: (result?: string) => void\n}\n\nconst ExportMenu = ({ onDone }: ExportMenuProps) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [exporting, setExporting] = useState(false)\n const [result, setResult] = useState<{\n success: boolean\n message: string\n } | null>(null)\n\n useInput(async (input, key) => {\n if (exporting) return\n\n if (key.upArrow) {\n setSelectedIndex(Math.max(0, selectedIndex - 1))\n } else if (key.downArrow) {\n setSelectedIndex(Math.min(EXPORT_OPTIONS.length - 1, selectedIndex + 1))\n } else if (key.return) {\n await handleExport(EXPORT_OPTIONS[selectedIndex]!.type)\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n const handleExport = async (type: ExportType) => {\n setExporting(true)\n\n try {\n const cwd = getCwd()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n let filename: string\n let content: string\n\n switch (type) {\n case 'conversation': {\n const messages = getMessagesGetter()()\n filename = `minto-conversation-${timestamp}.json`\n content = JSON.stringify(messages, null, 2)\n break\n }\n case 'config': {\n const [globalConfig, projectConfig] = await Promise.all([\n Promise.resolve(loadGlobalConfig()),\n Promise.resolve(loadProjectConfig(cwd)),\n ])\n filename = `minto-config-${timestamp}.json`\n content = JSON.stringify(\n {\n global: globalConfig,\n project: projectConfig,\n },\n null,\n 2,\n )\n break\n }\n case 'summary': {\n const messages = getMessagesGetter()()\n filename = `minto-summary-${timestamp}.md`\n content = generateSummary(messages)\n break\n }\n }\n\n const filepath = join(cwd, filename)\n await writeFile(filepath, content, 'utf-8')\n\n setResult({\n success: true,\n message: `Exported to ${filename}`,\n })\n\n // Auto-dismiss after 2 seconds\n setTimeout(() => onDone(`Exported to ${filepath}`), 2000)\n } catch (error) {\n setResult({\n success: false,\n message: `Export failed: ${error instanceof Error ? error.message : String(error)}`,\n })\n } finally {\n setExporting(false)\n }\n }\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Export Data\n </Text>\n </Box>\n\n {!result ? (\n <>\n <Box flexDirection=\"column\" marginBottom={1}>\n {EXPORT_OPTIONS.map((option, index) => (\n <Box key={option.type} paddingLeft={1}>\n <Text color={index === selectedIndex ? 'cyan' : undefined}>\n {index === selectedIndex ? '\u25B6 ' : ' '}\n <Text bold>{option.label}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n - {option.description}\n </Text>\n </Text>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191/\u2193: Navigate | Enter: Export | q/Esc: Cancel\n </Text>\n </Box>\n </>\n ) : (\n <Box>\n {result.success ? (\n <Text color=\"green\">\u2713 {result.message}</Text>\n ) : (\n <Text color=\"red\">\u2717 {result.message}</Text>\n )}\n </Box>\n )}\n\n {exporting && (\n <Box>\n <Text color=\"yellow\">Exporting...</Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Generate a markdown summary of the conversation\n */\nfunction generateSummary(messages: unknown[]): string {\n const lines: string[] = [\n '# Minto Session Summary',\n '',\n `Generated: ${new Date().toISOString()}`,\n '',\n '## Conversation Overview',\n '',\n `Total messages: ${messages.length}`,\n '',\n '## Message Summary',\n '',\n ]\n\n for (const msg of messages) {\n const m = msg as { role?: string; content?: unknown }\n if (!m.role) continue\n\n const role = m.role === 'user' ? '\uD83D\uDC64 User' : '\uD83E\uDD16 Assistant'\n\n if (typeof m.content === 'string') {\n const preview = m.content.slice(0, 200).replace(/\\n/g, ' ')\n lines.push(`### ${role}`)\n lines.push('')\n lines.push(`> ${preview}${m.content.length > 200 ? '...' : ''}`)\n lines.push('')\n } else if (Array.isArray(m.content)) {\n lines.push(`### ${role}`)\n lines.push('')\n for (const block of m.content) {\n if (block.type === 'text') {\n const preview = String(block.text || '')\n .slice(0, 200)\n .replace(/\\n/g, ' ')\n lines.push(\n `> ${preview}${String(block.text || '').length > 200 ? '...' : ''}`,\n )\n } else if (block.type === 'tool_use') {\n lines.push(`- Tool: \\`${block.name}\\``)\n } else if (block.type === 'tool_result') {\n lines.push(`- Tool result received`)\n }\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\nconst command: Command = {\n name: 'export',\n description: 'Export session data, configuration, or conversation history',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n return <ExportMenu onDone={onDone} />\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Export Command\n *\n * Export configuration, team templates, or conversation data.\n * Uses TabbedListView with flat tab-based selection for consistent UX.\n *\n * Supports three scopes:\n * - user: ~/.minto/ config only\n * - project: ./.minto/ config only\n * - all: both user and project config combined\n */\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { writeFile, readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport type { Command } from '@commands'\nimport { getMessagesGetter } from '@messages'\nimport { getCwd } from '@utils/state'\nimport { loadGlobalConfig, loadProjectConfig } from '../core/config'\nimport { t } from '@i18n'\nimport { listMarketplaces } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { loadAllSkills } from '@utils/skillLoader'\nimport { loadCustomCommands } from '@services/customCommands'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport type {\n TeamConfig,\n TeamConfigScope,\n TeamAgentConfig,\n TeamHooksConfig,\n TeamSkillConfig,\n TeamCommandConfig,\n} from '@utils/teamConfig'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype ExportCategory = 'runtime' | 'team' | 'conversation' | 'summary'\ntype SensitiveHandling = 'include' | 'placeholder'\n\ninterface ExportItemData {\n category: ExportCategory\n scope: TeamConfigScope\n sensitive: SensitiveHandling\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a markdown summary of the conversation\n */\nfunction generateSummary(messages: unknown[]): string {\n const lines: string[] = [\n '# Minto Session Summary',\n '',\n `Generated: ${new Date().toISOString()}`,\n '',\n '## Conversation Overview',\n '',\n `Total messages: ${messages.length}`,\n '',\n '## Message Summary',\n '',\n ]\n\n for (const msg of messages) {\n const m = msg as { role?: string; content?: unknown }\n if (!m.role) continue\n\n const role = m.role === 'user' ? '\uD83D\uDC64 User' : '\uD83E\uDD16 Assistant'\n\n if (typeof m.content === 'string') {\n const preview = m.content.slice(0, 200).replace(/\\n/g, ' ')\n lines.push(`### ${role}`)\n lines.push('')\n lines.push(`> ${preview}${m.content.length > 200 ? '...' : ''}`)\n lines.push('')\n } else if (Array.isArray(m.content)) {\n lines.push(`### ${role}`)\n lines.push('')\n for (const block of m.content) {\n if (block.type === 'text') {\n const preview = String(block.text || '')\n .slice(0, 200)\n .replace(/\\n/g, ' ')\n lines.push(\n `> ${preview}${String(block.text || '').length > 200 ? '...' : ''}`,\n )\n } else if (block.type === 'tool_use') {\n lines.push(`- Tool: \\`${block.name}\\``)\n } else if (block.type === 'tool_result') {\n lines.push(`- Tool result received`)\n }\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Parse a hooks.json file into TeamHooksConfig\n */\nfunction parseHooksFile(content: string): TeamHooksConfig | null {\n try {\n const parsed = JSON.parse(content)\n\n if (!parsed.hooks) {\n return null\n }\n\n const result: TeamHooksConfig = {}\n\n if (parsed.hooks.SessionStart) {\n result.sessionStart = parsed.hooks.SessionStart.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.SessionEnd) {\n result.sessionEnd = parsed.hooks.SessionEnd.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.UserPromptSubmit) {\n result.userPromptSubmit = parsed.hooks.UserPromptSubmit.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.PreToolUse) {\n result.preToolUse = parsed.hooks.PreToolUse\n }\n if (parsed.hooks.PostToolUse) {\n result.postToolUse = parsed.hooks.PostToolUse\n }\n\n return result\n } catch {\n return null\n }\n}\n\n/**\n * Load hooks configuration by scope\n */\nasync function loadHooksConfigByScope(scope: TeamConfigScope): Promise<{\n userHooks: TeamHooksConfig | null\n projectHooks: TeamHooksConfig | null\n}> {\n let userHooks: TeamHooksConfig | null = null\n let projectHooks: TeamHooksConfig | null = null\n\n if (scope === 'user' || scope === 'all') {\n const mintoPath = join(homedir(), '.minto', 'hooks.json')\n const claudePath = join(homedir(), '.claude', 'hooks.json')\n const hooksPath = existsSync(mintoPath)\n ? mintoPath\n : existsSync(claudePath)\n ? claudePath\n : null\n\n if (hooksPath) {\n try {\n const content = await readFile(hooksPath, 'utf-8')\n userHooks = parseHooksFile(content)\n } catch {\n // ignore\n }\n }\n }\n\n if (scope === 'project' || scope === 'all') {\n const cwd = getCwd()\n const mintoPath = join(cwd, '.minto', 'hooks.json')\n const claudePath = join(cwd, '.claude', 'hooks.json')\n const hooksPath = existsSync(mintoPath)\n ? mintoPath\n : existsSync(claudePath)\n ? claudePath\n : null\n\n if (hooksPath) {\n try {\n const content = await readFile(hooksPath, 'utf-8')\n projectHooks = parseHooksFile(content)\n } catch {\n // ignore\n }\n }\n }\n\n return { userHooks, projectHooks }\n}\n\n/**\n * Parse an agent markdown file into TeamAgentConfig\n */\nfunction parseAgentFile(content: string): TeamAgentConfig | null {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/)\n\n if (!frontmatterMatch) return null\n\n const frontmatter = frontmatterMatch[1]\n const body = frontmatterMatch[2].trim()\n\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m)\n const descMatch = frontmatter.match(/^description:\\s*\"?([^\"\\n]+)\"?$/m)\n const toolsMatch = frontmatter.match(/^tools:\\s*(.+)$/m)\n const modelMatch = frontmatter.match(/^model_name:\\s*(.+)$/m)\n const colorMatch = frontmatter.match(/^color:\\s*\"?([^\"\\n]+)\"?$/m)\n\n if (!nameMatch || !descMatch) return null\n\n let tools: string[] | '*' = '*'\n if (toolsMatch) {\n const toolsValue = toolsMatch[1].trim()\n if (toolsValue === '*') {\n tools = '*'\n } else {\n try {\n tools = JSON.parse(toolsValue)\n } catch {\n tools = '*'\n }\n }\n }\n\n return {\n name: nameMatch[1].trim(),\n description: descMatch[1].trim(),\n tools,\n systemPrompt: body,\n model: modelMatch ? modelMatch[1].trim() : undefined,\n color: colorMatch ? colorMatch[1].trim() : undefined,\n }\n}\n\n/**\n * Scan a directory for agent .md files and parse them\n */\nasync function scanAgentsDir(\n agentsDir: string,\n): Promise<Map<string, TeamAgentConfig>> {\n const agentMap = new Map<string, TeamAgentConfig>()\n\n if (!existsSync(agentsDir)) return agentMap\n\n try {\n const files = readdirSync(agentsDir)\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue\n\n const filePath = join(agentsDir, file)\n const content = await readFile(filePath, 'utf-8')\n const agent = parseAgentFile(content)\n if (agent) {\n agentMap.set(agent.name, agent)\n }\n }\n } catch {\n // Ignore errors\n }\n\n return agentMap\n}\n\n/**\n * Load agents by scope\n * .minto agents take precedence over .claude agents with the same name\n */\nasync function loadAgentsConfigByScope(scope: TeamConfigScope): Promise<{\n userAgents: TeamAgentConfig[]\n projectAgents: TeamAgentConfig[]\n}> {\n const userAgentMap = new Map<string, TeamAgentConfig>()\n const projectAgentMap = new Map<string, TeamAgentConfig>()\n\n if (scope === 'user' || scope === 'all') {\n // .claude first, then .minto overrides\n const claudeAgents = await scanAgentsDir(\n join(homedir(), '.claude', 'agents'),\n )\n const mintoAgents = await scanAgentsDir(join(homedir(), '.minto', 'agents'))\n\n for (const [name, agent] of claudeAgents) {\n userAgentMap.set(name, agent)\n }\n for (const [name, agent] of mintoAgents) {\n userAgentMap.set(name, agent)\n }\n }\n\n if (scope === 'project' || scope === 'all') {\n const cwd = getCwd()\n const claudeAgents = await scanAgentsDir(join(cwd, '.claude', 'agents'))\n const mintoAgents = await scanAgentsDir(join(cwd, '.minto', 'agents'))\n\n for (const [name, agent] of claudeAgents) {\n projectAgentMap.set(name, agent)\n }\n for (const [name, agent] of mintoAgents) {\n projectAgentMap.set(name, agent)\n }\n }\n\n return {\n userAgents: Array.from(userAgentMap.values()),\n projectAgents: Array.from(projectAgentMap.values()),\n }\n}\n\n/**\n * Determine plugin scope from its location path\n */\nfunction getPluginScope(location: string): 'user' | 'project' {\n const cwd = getCwd()\n if (\n location.startsWith(join(cwd, '.minto')) ||\n location.startsWith(join(cwd, '.claude'))\n ) {\n return 'project'\n }\n return 'user'\n}\n\n/**\n * Get installed plugin source strings by scope using loadAllPlugins()\n */\nasync function getInstalledPluginSourcesByScope(\n scope: TeamConfigScope,\n): Promise<{ userPlugins: string[]; projectPlugins: string[] }> {\n const plugins = loadAllPlugins()\n const userPlugins: string[] = []\n const projectPlugins: string[] = []\n\n for (const plugin of plugins) {\n const pluginScope = getPluginScope(plugin.location)\n\n // Skip plugins not in the requested scope\n if (scope === 'user' && pluginScope !== 'user') continue\n if (scope === 'project' && pluginScope !== 'project') continue\n\n // Build plugin source string from metadata\n const metaPath = join(plugin.location, '.marketplace-meta.json')\n let pluginName: string\n if (existsSync(metaPath)) {\n try {\n const content = await readFile(metaPath, 'utf-8')\n const meta = JSON.parse(content)\n pluginName =\n meta.plugin && meta.marketplace\n ? `${meta.plugin}@${meta.marketplace}`\n : meta.plugin || plugin.name\n } catch {\n pluginName = plugin.name\n }\n } else {\n pluginName = plugin.name\n }\n\n if (pluginScope === 'user') {\n userPlugins.push(pluginName)\n } else {\n projectPlugins.push(pluginName)\n }\n }\n\n return { userPlugins, projectPlugins }\n}\n\n/**\n * Load standalone skills by scope\n */\nfunction loadStandaloneSkillsByScope(scope: TeamConfigScope): {\n userSkills: TeamSkillConfig[]\n projectSkills: TeamSkillConfig[]\n} {\n const allSkills = loadAllSkills()\n const userSkills: TeamSkillConfig[] = []\n const projectSkills: TeamSkillConfig[] = []\n\n for (const skill of allSkills) {\n // Only export standalone skills (not plugin-provided)\n if (skill.pluginName !== 'standalone') continue\n\n const teamSkill: TeamSkillConfig = {\n name: skill.name,\n description: skill.config.description,\n content: skill.config.content || '',\n argumentHint: skill.config.argumentHint,\n disableModelInvocation: skill.config.disableModelInvocation,\n userInvocable: skill.config.userInvocable,\n allowedTools: skill.config.allowedTools,\n model: skill.config.model,\n context: skill.config.context,\n agent: skill.config.agent,\n }\n\n if (skill.source === 'user' && (scope === 'user' || scope === 'all')) {\n userSkills.push(teamSkill)\n } else if (\n skill.source === 'project' &&\n (scope === 'project' || scope === 'all')\n ) {\n projectSkills.push(teamSkill)\n }\n }\n\n return { userSkills, projectSkills }\n}\n\n/**\n * Load standalone commands by scope\n */\nasync function loadStandaloneCommandsByScope(scope: TeamConfigScope): Promise<{\n userCommands: TeamCommandConfig[]\n projectCommands: TeamCommandConfig[]\n}> {\n const allCommands = await loadCustomCommands()\n const userCommands: TeamCommandConfig[] = []\n const projectCommands: TeamCommandConfig[] = []\n\n for (const cmd of allCommands) {\n // Skip plugin commands - they're installed via plugin install\n if (cmd.name.startsWith('plugin:')) continue\n\n const teamCmd: TeamCommandConfig = {\n name: cmd.name,\n description: cmd.description,\n content: '', // Will be populated from getPromptForCommand\n aliases: cmd.aliases,\n enabled: cmd.isEnabled,\n hidden: cmd.isHidden,\n progressMessage: cmd.progressMessage,\n argNames: cmd.argNames,\n }\n\n // Get the raw content by calling getPromptForCommand with empty args\n try {\n const messages = await cmd.getPromptForCommand('')\n if (messages.length > 0) {\n const firstMsg = messages[0]\n if (typeof firstMsg.content === 'string') {\n teamCmd.content = firstMsg.content\n }\n }\n } catch {\n // If content extraction fails, skip this command\n continue\n }\n\n if (cmd.scope === 'user' && (scope === 'user' || scope === 'all')) {\n userCommands.push(teamCmd)\n } else if (\n cmd.scope === 'project' &&\n (scope === 'project' || scope === 'all')\n ) {\n projectCommands.push(teamCmd)\n }\n }\n\n return { userCommands, projectCommands }\n}\n\n/**\n * Get marketplace URLs from registry\n */\nfunction getMarketplaceUrls(): string[] {\n const marketplaces = listMarketplaces()\n const urls: string[] = []\n\n for (const mp of marketplaces) {\n if (mp.source.type === 'github') {\n urls.push(`https://github.com/${mp.source.repo}.git`)\n } else if (mp.source.type === 'url') {\n urls.push(mp.source.url)\n } else if (mp.source.type === 'local') {\n urls.push(mp.source.path)\n }\n }\n\n return urls\n}\n\n/**\n * Build MCP server config for export, with optional placeholder handling\n */\nfunction buildMcpServersConfig(\n mcpServers: Record<string, any>,\n usePlaceholders: boolean,\n): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (const [name, server] of Object.entries(mcpServers)) {\n if (server.type === 'sse') {\n result[name] = {\n type: 'sse',\n url: server.url,\n enabled: server.enabled,\n }\n } else {\n const env = server.env\n ? usePlaceholders\n ? Object.fromEntries(\n Object.entries(server.env).map(([key, value]) => {\n const isSecret =\n key.toLowerCase().includes('key') ||\n key.toLowerCase().includes('secret') ||\n key.toLowerCase().includes('token') ||\n key.toLowerCase().includes('password')\n return [key, isSecret ? `\\${${key}}` : value]\n }),\n )\n : server.env\n : undefined\n result[name] = {\n type: 'stdio',\n command: server.command,\n args: server.args,\n env,\n enabled: server.enabled,\n }\n }\n }\n\n return result\n}\n\n/**\n * Build team configuration for export\n */\nasync function buildTeamConfig(\n scope: TeamConfigScope,\n usePlaceholders: boolean,\n): Promise<TeamConfig> {\n const cwd = getCwd()\n const globalConfig = loadGlobalConfig()\n const projectConfig = loadProjectConfig(cwd)\n\n const scopeLabel =\n scope === 'user'\n ? 'User Configuration'\n : scope === 'project'\n ? `Project: ${cwd.split('/').pop()}`\n : `All: ${cwd.split('/').pop()}`\n\n const config: TeamConfig = {\n version: '1.0',\n name: scopeLabel,\n description: `Exported from Minto on ${new Date().toISOString()}`,\n scope,\n }\n\n // Models configuration \u2014 user-level only (not project)\n if (scope !== 'project') {\n if (globalConfig.modelProfiles && globalConfig.modelProfiles.length > 0) {\n config.models = {\n profiles: globalConfig.modelProfiles.map(profile => ({\n name: profile.name,\n provider: profile.provider,\n modelName: profile.modelName,\n baseURL: profile.baseURL,\n apiKey: usePlaceholders\n ? `\\${${profile.provider.toUpperCase()}_API_KEY}`\n : profile.apiKey,\n maxTokens: profile.maxTokens,\n contextLength: profile.contextLength,\n reasoningEffort: profile.reasoningEffort,\n isActive: profile.isActive,\n })),\n pointers: globalConfig.modelPointers,\n defaultModel: globalConfig.defaultModelName,\n }\n }\n }\n\n // MCP Servers configuration \u2014 scope-aware\n if (scope === 'user') {\n if (\n globalConfig.mcpServers &&\n Object.keys(globalConfig.mcpServers).length > 0\n ) {\n config.mcpServers = buildMcpServersConfig(\n globalConfig.mcpServers,\n usePlaceholders,\n )\n }\n } else if (scope === 'project') {\n if (\n projectConfig.mcpServers &&\n Object.keys(projectConfig.mcpServers).length > 0\n ) {\n config.mcpServers = buildMcpServersConfig(\n projectConfig.mcpServers,\n usePlaceholders,\n )\n }\n } else {\n // all: merge both\n const merged = {\n ...globalConfig.mcpServers,\n ...projectConfig.mcpServers,\n }\n if (Object.keys(merged).length > 0) {\n config.mcpServers = buildMcpServersConfig(merged, usePlaceholders)\n }\n }\n\n // Plugins configuration \u2014 scope-aware\n const marketplaceUrls = getMarketplaceUrls()\n const { userPlugins, projectPlugins } =\n await getInstalledPluginSourcesByScope(scope)\n\n if (\n marketplaceUrls.length > 0 ||\n userPlugins.length > 0 ||\n projectPlugins.length > 0\n ) {\n config.plugins = {}\n if (marketplaceUrls.length > 0) {\n config.plugins.marketplaces = marketplaceUrls\n }\n if (userPlugins.length > 0) {\n config.plugins.userInstall = userPlugins\n }\n if (projectPlugins.length > 0) {\n config.plugins.projectInstall = projectPlugins\n }\n }\n\n // Agents configuration \u2014 scope-aware\n const { userAgents, projectAgents } = await loadAgentsConfigByScope(scope)\n if (userAgents.length > 0 || projectAgents.length > 0) {\n config.agents = {}\n if (userAgents.length > 0) {\n config.agents.userAgents = userAgents\n }\n if (projectAgents.length > 0) {\n config.agents.projectAgents = projectAgents\n }\n }\n\n // Skills configuration \u2014 scope-aware\n const { userSkills, projectSkills } = loadStandaloneSkillsByScope(scope)\n if (userSkills.length > 0 || projectSkills.length > 0) {\n config.skills = {}\n if (userSkills.length > 0) {\n config.skills.userSkills = userSkills\n }\n if (projectSkills.length > 0) {\n config.skills.projectSkills = projectSkills\n }\n }\n\n // Commands configuration \u2014 scope-aware\n const { userCommands, projectCommands } =\n await loadStandaloneCommandsByScope(scope)\n if (userCommands.length > 0 || projectCommands.length > 0) {\n config.commands = {}\n if (userCommands.length > 0) {\n config.commands.userCommands = userCommands\n }\n if (projectCommands.length > 0) {\n config.commands.projectCommands = projectCommands\n }\n }\n\n // Hooks configuration \u2014 scope-aware\n const { userHooks, projectHooks } = await loadHooksConfigByScope(scope)\n if (userHooks) {\n config.hooks = userHooks\n }\n if (projectHooks) {\n config.projectHooks = projectHooks\n }\n\n // Settings \u2014 user-level only (not project)\n if (scope !== 'project') {\n config.settings = {\n theme: globalConfig.theme as 'dark' | 'light',\n verbose: globalConfig.verbose,\n compressionMode: globalConfig.compressionMode,\n thinking: globalConfig.thinking,\n proxy: globalConfig.proxy,\n stream: globalConfig.stream,\n language: globalConfig.language,\n safetyMode: globalConfig.safetyMode,\n skipOnboarding: globalConfig.hasCompletedOnboarding,\n }\n }\n\n // Post-install instructions (only when using placeholders)\n if (usePlaceholders) {\n config.postInstallInstructions = `\n1. Set environment variables for API keys (e.g., ANTHROPIC_API_KEY, OPENAI_API_KEY)\n2. Run 'minto' to start using your configured setup\n`.trim()\n }\n\n return config\n}\n\n/**\n * Export runtime configuration\n */\nasync function exportRuntimeConfig(\n scope: TeamConfigScope,\n): Promise<{ content: string; filename: string }> {\n const cwd = getCwd()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n\n if (scope === 'user') {\n const globalConfig = loadGlobalConfig()\n return {\n content: JSON.stringify({ global: globalConfig }, null, 2),\n filename: `minto-config-user-${timestamp}.json`,\n }\n } else if (scope === 'project') {\n const projectConfig = loadProjectConfig(cwd)\n return {\n content: JSON.stringify({ project: projectConfig }, null, 2),\n filename: `minto-config-project-${timestamp}.json`,\n }\n } else {\n const globalConfig = loadGlobalConfig()\n const projectConfig = loadProjectConfig(cwd)\n return {\n content: JSON.stringify(\n { global: globalConfig, project: projectConfig },\n null,\n 2,\n ),\n filename: `minto-config-all-${timestamp}.json`,\n }\n }\n}\n\n/**\n * Export team template\n */\nasync function exportTeamTemplate(\n scope: TeamConfigScope,\n usePlaceholders: boolean,\n): Promise<{ content: string; filename: string }> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const teamConfig = await buildTeamConfig(scope, usePlaceholders)\n\n return {\n content: JSON.stringify(teamConfig, null, 2),\n filename: `minto-team-${scope}-${timestamp}.json`,\n }\n}\n\n// ============================================================================\n// Tab & Item Definitions\n// ============================================================================\n\nconst EXPORT_TABS: TabDefinition[] = [\n { id: 'team', label: t('commands.export.typeTeam') },\n { id: 'runtime', label: t('commands.export.typeRuntime') },\n { id: 'conversation', label: t('commands.export.typeConversation') },\n { id: 'summary', label: t('commands.export.typeSummary') },\n]\n\nfunction getItemsForTab(tabId: string): ListItem[] {\n switch (tabId) {\n case 'team':\n return [\n {\n id: 'team-user-include',\n label: t('commands.export.itemTeamUserInclude'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'team',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-user-placeholder',\n label: t('commands.export.itemTeamUserPlaceholder'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'team',\n scope: 'user',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n {\n id: 'team-project-include',\n label: t('commands.export.itemTeamProjectInclude'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'team',\n scope: 'project',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-project-placeholder',\n label: t('commands.export.itemTeamProjectPlaceholder'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'team',\n scope: 'project',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n {\n id: 'team-all-include',\n label: t('commands.export.itemTeamAllInclude'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'team',\n scope: 'all',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-all-placeholder',\n label: t('commands.export.itemTeamAllPlaceholder'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'team',\n scope: 'all',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n ]\n case 'runtime':\n return [\n {\n id: 'runtime-user',\n label: t('commands.export.itemRuntimeUser'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'runtime',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'runtime-project',\n label: t('commands.export.itemRuntimeProject'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'runtime',\n scope: 'project',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'runtime-all',\n label: t('commands.export.itemRuntimeAll'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'runtime',\n scope: 'all',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n case 'conversation':\n return [\n {\n id: 'conversation',\n label: t('commands.export.itemConversation'),\n description: t('commands.export.typeConversationDesc'),\n data: {\n category: 'conversation',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n case 'summary':\n return [\n {\n id: 'summary',\n label: t('commands.export.itemSummary'),\n description: t('commands.export.typeSummaryDesc'),\n data: {\n category: 'summary',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n default:\n return []\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\ninterface ExportMenuProps {\n onDone: (result?: string) => void\n}\n\nconst ExportMenu = ({ onDone }: ExportMenuProps) => {\n const [activeTab, setActiveTab] = useState('team')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n\n const items = useMemo(() => getItemsForTab(activeTab), [activeTab])\n\n const handleSelect = useCallback(async (item: ListItem) => {\n const data = item.data as ExportItemData\n\n setStatusOverlay({\n type: 'loading',\n message: t('commands.export.exporting'),\n })\n\n try {\n const cwd = getCwd()\n let filename: string\n let content: string\n\n switch (data.category) {\n case 'conversation': {\n const messages = getMessagesGetter()()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n filename = `minto-conversation-${timestamp}.json`\n content = JSON.stringify(messages, null, 2)\n break\n }\n case 'summary': {\n const messages = getMessagesGetter()()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n filename = `minto-summary-${timestamp}.md`\n content = generateSummary(messages)\n break\n }\n case 'runtime': {\n const result = await exportRuntimeConfig(data.scope)\n filename = result.filename\n content = result.content\n break\n }\n case 'team': {\n const usePlaceholders = data.sensitive === 'placeholder'\n const result = await exportTeamTemplate(data.scope, usePlaceholders)\n filename = result.filename\n content = result.content\n break\n }\n }\n\n const filepath = join(cwd, filename)\n await writeFile(filepath, content, 'utf-8')\n\n setStatusOverlay({\n type: 'success',\n message: `${t('commands.export.success')} ${filename}`,\n })\n } catch (error) {\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.export.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }, [])\n\n const handleClose = useCallback(() => {\n onDone()\n }, [onDone])\n\n return (\n <TabbedListView\n title={t('commands.export.title')}\n tabs={EXPORT_TABS}\n activeTab={activeTab}\n onTabChange={tab => {\n setActiveTab(tab)\n setSearchQuery('')\n }}\n items={items}\n searchEnabled={false}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelect={handleSelect}\n onClose={handleClose}\n footerHint={t('commands.export.footerHint')}\n statusOverlay={statusOverlay}\n statusDismissHint=\"Esc Close\"\n />\n )\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst command: Command = {\n name: 'export',\n description: t('commands.export.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n return <ExportMenu onDone={onDone} />\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,110 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
4
+ import { SimpleSelector } from "../components/SimpleSelector/index.js";
5
+ import {
6
+ t,
7
+ getLanguage,
8
+ setLanguage,
9
+ getSupportedLanguages,
10
+ getLanguageDisplayName
11
+ } from "../i18n/index.js";
12
+ import { getGlobalConfig, saveGlobalConfig } from "../utils/config.js";
13
+ import { triggerLanguageChange } from "../messages.js";
14
+ async function applyLanguageChange(newLang) {
15
+ setLanguage(newLang);
16
+ await triggerLanguageChange();
17
+ }
18
+ const command = {
19
+ name: "language",
20
+ aliases: ["lang"],
21
+ description: t("commands.language.description"),
22
+ isEnabled: true,
23
+ isHidden: false,
24
+ hidePromptInput: true,
25
+ type: "local-jsx",
26
+ userFacingName() {
27
+ return this.name;
28
+ },
29
+ async call(onDone, _context, args) {
30
+ const currentLang = getLanguage();
31
+ if (args) {
32
+ const arg = args.trim().toLowerCase();
33
+ let targetLang = null;
34
+ if (arg === "en" || arg === "english") {
35
+ targetLang = "en";
36
+ } else if (arg === "zh-cn" || arg === "zh" || arg === "chinese" || arg === "\u4E2D\u6587") {
37
+ targetLang = "zh-CN";
38
+ }
39
+ if (targetLang && targetLang !== currentLang) {
40
+ const config = getGlobalConfig();
41
+ saveGlobalConfig({ ...config, language: targetLang });
42
+ const DirectChangeConfirm = () => {
43
+ const [applied, setApplied] = useState(false);
44
+ useEffect(() => {
45
+ if (!applied) {
46
+ setApplied(true);
47
+ setTimeout(async () => {
48
+ onDone();
49
+ await new Promise((resolve) => setTimeout(resolve, 50));
50
+ await applyLanguageChange(targetLang);
51
+ }, 100);
52
+ }
53
+ }, [applied]);
54
+ return /* @__PURE__ */ React.createElement(Box, { paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.success }, "\u2713", " "), /* @__PURE__ */ React.createElement(Text, null, t("commands.language.changed"), " ", getLanguageDisplayName(targetLang)));
55
+ };
56
+ return /* @__PURE__ */ React.createElement(DirectChangeConfirm, null);
57
+ } else if (targetLang === currentLang) {
58
+ return /* @__PURE__ */ React.createElement(Box, { paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("commands.language.alreadyUsing"), " ", getLanguageDisplayName(targetLang)));
59
+ }
60
+ }
61
+ const LanguageWrapper = () => {
62
+ const [pendingLang, setPendingLang] = useState(null);
63
+ useEffect(() => {
64
+ if (pendingLang) {
65
+ const applyChange = async () => {
66
+ onDone();
67
+ await new Promise((resolve) => setTimeout(resolve, 50));
68
+ await applyLanguageChange(pendingLang);
69
+ };
70
+ applyChange();
71
+ }
72
+ }, [pendingLang]);
73
+ const handleSelect = (item) => {
74
+ const lang = item.id;
75
+ if (lang !== currentLang) {
76
+ const config = getGlobalConfig();
77
+ saveGlobalConfig({ ...config, language: lang });
78
+ setPendingLang(lang);
79
+ } else {
80
+ onDone();
81
+ }
82
+ };
83
+ if (pendingLang) {
84
+ return /* @__PURE__ */ React.createElement(Box, { paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.success }, "\u2713", " "), /* @__PURE__ */ React.createElement(Text, null, t("commands.language.changed"), " ", getLanguageDisplayName(pendingLang)));
85
+ }
86
+ const languages = getSupportedLanguages();
87
+ const items = languages.map((lang) => ({
88
+ id: lang,
89
+ label: getLanguageDisplayName(lang),
90
+ isCurrent: lang === currentLang
91
+ }));
92
+ return /* @__PURE__ */ React.createElement(
93
+ SimpleSelector,
94
+ {
95
+ title: "Language Settings / \\u8BED\\u8A00\\u8BBE\\u7F6E",
96
+ subtitle: `${t("commands.language.current")}: ${getLanguageDisplayName(currentLang)}`,
97
+ items,
98
+ onSelect: handleSelect,
99
+ onClose: onDone
100
+ }
101
+ );
102
+ };
103
+ return /* @__PURE__ */ React.createElement(LanguageWrapper, null);
104
+ }
105
+ };
106
+ var language_default = command;
107
+ export {
108
+ language_default as default
109
+ };
110
+ //# sourceMappingURL=language.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/language.tsx"],
4
+ "sourcesContent": ["/**\n * Language Command\n *\n * Interactive language switching for Minto CLI.\n * Uses SimpleSelector for consistent UI.\n *\n * Flow:\n * 1. User selects new language via SimpleSelector\n * 2. Save preference to config\n * 3. Update runtime language\n * 4. Exit menu and return to input state\n * 5. Clear screen and re-render UI with new language\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport {\n t,\n getLanguage,\n setLanguage,\n getSupportedLanguages,\n getLanguageDisplayName,\n type Language,\n} from '@i18n'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { triggerLanguageChange } from '@messages'\n\n/**\n * Apply language change\n * 1. Update runtime language\n * 2. Trigger UI re-render (preserves conversation history)\n */\nasync function applyLanguageChange(newLang: Language) {\n setLanguage(newLang)\n await triggerLanguageChange()\n}\n\nconst command: Command = {\n name: 'language',\n aliases: ['lang'],\n description: t('commands.language.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context, args) {\n const currentLang = getLanguage()\n\n // Handle direct language argument: /language en or /language zh-CN\n if (args) {\n const arg = args.trim().toLowerCase()\n let targetLang: Language | null = null\n\n if (arg === 'en' || arg === 'english') {\n targetLang = 'en'\n } else if (\n arg === 'zh-cn' ||\n arg === 'zh' ||\n arg === 'chinese' ||\n arg === '\u4E2D\u6587'\n ) {\n targetLang = 'zh-CN'\n }\n\n if (targetLang && targetLang !== currentLang) {\n const config = getGlobalConfig()\n saveGlobalConfig({ ...config, language: targetLang })\n\n const DirectChangeConfirm = () => {\n const [applied, setApplied] = useState(false)\n\n useEffect(() => {\n if (!applied) {\n setApplied(true)\n setTimeout(async () => {\n onDone()\n await new Promise(resolve => setTimeout(resolve, 50))\n await applyLanguageChange(targetLang!)\n }, 100)\n }\n }, [applied])\n\n return (\n <Box paddingY={1}>\n <Text color={SEMANTIC_COLORS.success}>{'\\u2713'} </Text>\n <Text>\n {t('commands.language.changed')}{' '}\n {getLanguageDisplayName(targetLang!)}\n </Text>\n </Box>\n )\n }\n\n return <DirectChangeConfirm />\n } else if (targetLang === currentLang) {\n return (\n <Box paddingY={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n {t('commands.language.alreadyUsing')}{' '}\n {getLanguageDisplayName(targetLang)}\n </Text>\n </Box>\n )\n }\n // Invalid argument - fall through to interactive mode\n }\n\n // Interactive mode using SimpleSelector\n const LanguageWrapper = () => {\n const [pendingLang, setPendingLang] = useState<Language | null>(null)\n\n useEffect(() => {\n if (pendingLang) {\n const applyChange = async () => {\n onDone()\n await new Promise(resolve => setTimeout(resolve, 50))\n await applyLanguageChange(pendingLang)\n }\n applyChange()\n }\n }, [pendingLang])\n\n const handleSelect = (item: SelectorItem) => {\n const lang = item.id as Language\n if (lang !== currentLang) {\n const config = getGlobalConfig()\n saveGlobalConfig({ ...config, language: lang })\n setPendingLang(lang)\n } else {\n onDone()\n }\n }\n\n if (pendingLang) {\n return (\n <Box paddingY={1}>\n <Text color={SEMANTIC_COLORS.success}>{'\\u2713'} </Text>\n <Text>\n {t('commands.language.changed')}{' '}\n {getLanguageDisplayName(pendingLang)}\n </Text>\n </Box>\n )\n }\n\n const languages = getSupportedLanguages()\n const items: SelectorItem[] = languages.map(lang => ({\n id: lang,\n label: getLanguageDisplayName(lang),\n isCurrent: lang === currentLang,\n }))\n\n return (\n <SimpleSelector\n title=\"Language Settings / \\u8BED\\u8A00\\u8BBE\\u7F6E\"\n subtitle={`${t('commands.language.current')}: ${getLanguageDisplayName(currentLang)}`}\n items={items}\n onSelect={handleSelect}\n onClose={onDone}\n />\n )\n }\n\n return <LanguageWrapper />\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }