@within-7/minto 0.3.9 → 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 (141) hide show
  1. package/dist/commands/agents/AgentsCommand.js +459 -655
  2. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  3. package/dist/commands/agents/types.js +1 -0
  4. package/dist/commands/agents/types.js.map +2 -2
  5. package/dist/commands/agents/utils/fileOperations.js +96 -36
  6. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  7. package/dist/commands/agents/utils/index.js +3 -1
  8. package/dist/commands/agents/utils/index.js.map +2 -2
  9. package/dist/commands/context.js +54 -23
  10. package/dist/commands/context.js.map +2 -2
  11. package/dist/commands/export.js +673 -93
  12. package/dist/commands/export.js.map +2 -2
  13. package/dist/commands/language.js +19 -46
  14. package/dist/commands/language.js.map +2 -2
  15. package/dist/commands/mcp-interactive.js +419 -217
  16. package/dist/commands/mcp-interactive.js.map +2 -2
  17. package/dist/commands/model.js +415 -66
  18. package/dist/commands/model.js.map +2 -2
  19. package/dist/commands/permissions.js +75 -49
  20. package/dist/commands/permissions.js.map +2 -2
  21. package/dist/commands/plugin.js +882 -185
  22. package/dist/commands/plugin.js.map +3 -3
  23. package/dist/commands/resume.js +1 -1
  24. package/dist/commands/resume.js.map +1 -1
  25. package/dist/commands/sandbox.js +168 -70
  26. package/dist/commands/sandbox.js.map +2 -2
  27. package/dist/commands/setup.js +593 -107
  28. package/dist/commands/setup.js.map +2 -2
  29. package/dist/commands/stats.js +188 -131
  30. package/dist/commands/stats.js.map +2 -2
  31. package/dist/commands/status.js +75 -13
  32. package/dist/commands/status.js.map +2 -2
  33. package/dist/commands/undo.js +138 -174
  34. package/dist/commands/undo.js.map +2 -2
  35. package/dist/commands.js.map +1 -1
  36. package/dist/components/Help.js +165 -32
  37. package/dist/components/Help.js.map +2 -2
  38. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  39. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  40. package/dist/components/InfoPanel/index.js +5 -0
  41. package/dist/components/InfoPanel/index.js.map +7 -0
  42. package/dist/components/InfoPanel/types.js +1 -0
  43. package/dist/components/InfoPanel/types.js.map +7 -0
  44. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  45. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  46. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  47. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  48. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  49. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  50. package/dist/components/ModelSelector/index.js +1 -3
  51. package/dist/components/ModelSelector/index.js.map +2 -2
  52. package/dist/components/PromptInput.js +5 -5
  53. package/dist/components/PromptInput.js.map +2 -2
  54. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  55. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  56. package/dist/components/SimpleSelector/index.js +5 -0
  57. package/dist/components/SimpleSelector/index.js.map +7 -0
  58. package/dist/components/SimpleSelector/types.js +1 -0
  59. package/dist/components/SimpleSelector/types.js.map +7 -0
  60. package/dist/components/StatusOverlayContent.js +21 -0
  61. package/dist/components/StatusOverlayContent.js.map +7 -0
  62. package/dist/components/TabbedListView/ScrollableList.js +31 -5
  63. package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
  64. package/dist/components/TabbedListView/TabbedListView.js +122 -47
  65. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  66. package/dist/core/backupHook.js +29 -0
  67. package/dist/core/backupHook.js.map +7 -0
  68. package/dist/core/config/defaults.js +8 -2
  69. package/dist/core/config/defaults.js.map +2 -2
  70. package/dist/core/config/schema.js +14 -2
  71. package/dist/core/config/schema.js.map +2 -2
  72. package/dist/core/costTracker.js +0 -16
  73. package/dist/core/costTracker.js.map +2 -2
  74. package/dist/cost-tracker.js +0 -16
  75. package/dist/cost-tracker.js.map +2 -2
  76. package/dist/entrypoints/bootstrap.js +3 -1
  77. package/dist/entrypoints/bootstrap.js.map +2 -2
  78. package/dist/entrypoints/cli.js +32 -0
  79. package/dist/entrypoints/cli.js.map +2 -2
  80. package/dist/i18n/locales/en.js +300 -1
  81. package/dist/i18n/locales/en.js.map +2 -2
  82. package/dist/i18n/locales/zh-CN.js +301 -2
  83. package/dist/i18n/locales/zh-CN.js.map +2 -2
  84. package/dist/i18n/types.js.map +1 -1
  85. package/dist/services/customCommands.js +30 -8
  86. package/dist/services/customCommands.js.map +2 -2
  87. package/dist/services/plugins/lspServers.js +1 -1
  88. package/dist/services/plugins/lspServers.js.map +2 -2
  89. package/dist/services/plugins/pluginRuntime.js +2 -1
  90. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  91. package/dist/services/plugins/pluginValidation.js +10 -3
  92. package/dist/services/plugins/pluginValidation.js.map +2 -2
  93. package/dist/services/plugins/skillMarketplace.js +16 -8
  94. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  95. package/dist/services/systemReminder.js +17 -6
  96. package/dist/services/systemReminder.js.map +2 -2
  97. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  98. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  99. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  100. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  101. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  102. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  103. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  104. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  105. package/dist/tools/TaskTool/TaskTool.js +9 -6
  106. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  107. package/dist/types/PermissionMode.js.map +1 -1
  108. package/dist/types/plugin.js +2 -4
  109. package/dist/types/plugin.js.map +2 -2
  110. package/dist/utils/agentHookExecutor.js +1 -4
  111. package/dist/utils/agentHookExecutor.js.map +2 -2
  112. package/dist/utils/agentLoader.js +67 -13
  113. package/dist/utils/agentLoader.js.map +2 -2
  114. package/dist/utils/agentMemory.js.map +2 -2
  115. package/dist/utils/claudeCodeSync.js +439 -0
  116. package/dist/utils/claudeCodeSync.js.map +7 -0
  117. package/dist/utils/config.js +1 -23
  118. package/dist/utils/config.js.map +2 -2
  119. package/dist/utils/execFileNoThrow.js +2 -1
  120. package/dist/utils/execFileNoThrow.js.map +2 -2
  121. package/dist/utils/marketplaceManager.js +80 -43
  122. package/dist/utils/marketplaceManager.js.map +2 -2
  123. package/dist/utils/messages.js +2 -2
  124. package/dist/utils/messages.js.map +2 -2
  125. package/dist/utils/pluginInstaller.js +34 -24
  126. package/dist/utils/pluginInstaller.js.map +2 -2
  127. package/dist/utils/pluginLoader.js +48 -25
  128. package/dist/utils/pluginLoader.js.map +2 -2
  129. package/dist/utils/repoFetcher.js +110 -0
  130. package/dist/utils/repoFetcher.js.map +7 -0
  131. package/dist/utils/skillLoader.js +18 -6
  132. package/dist/utils/skillLoader.js.map +2 -2
  133. package/dist/utils/stringSubstitution.js +4 -5
  134. package/dist/utils/stringSubstitution.js.map +2 -2
  135. package/dist/utils/teamConfig.js +153 -13
  136. package/dist/utils/teamConfig.js.map +2 -2
  137. package/dist/utils/terminal.js +1 -1
  138. package/dist/utils/terminal.js.map +2 -2
  139. package/dist/version.js +2 -2
  140. package/dist/version.js.map +1 -1
  141. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/setup.tsx"],
4
- "sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file\n */\n\nimport React from 'react'\nimport { Text, Box } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n installRemoteAgents,\n installInlineAgents,\n installTeamHooks,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\ntype SetupProps = {\n source: string // URL or file path\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\ntype SetupState =\n | { stage: 'loading' }\n | { stage: 'applying' }\n | { stage: 'adding-marketplaces'; total: number }\n | { stage: 'installing-plugins'; total: number }\n | { stage: 'installing-agents'; total: number }\n | { stage: 'installing-hooks' }\n | {\n stage: 'success'\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n marketplacesAdded?: number\n pluginsInstalled?: number\n agentsInstalled?: number\n hooksInstalled?: boolean\n instructions?: string\n }\n | { stage: 'error'; message: string }\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [state, setState] = React.useState<SetupState>({ stage: 'loading' })\n\n React.useEffect(() => {\n async function init() {\n try {\n // Step 1: Load configuration\n setState({ stage: 'loading' })\n\n const teamConfig =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n // Step 2: Apply configuration\n setState({ stage: 'applying' })\n\n const result = applyTeamConfig(teamConfig, strategy)\n\n // Step 3: Add marketplaces (if configured)\n let marketplacesAdded = 0\n if (shouldInstallPlugins && teamConfig.plugins?.marketplaces) {\n const marketplaceCount = teamConfig.plugins.marketplaces.length\n setState({ stage: 'adding-marketplaces', total: marketplaceCount })\n\n const marketplaceResult = await addMarketplaces(\n teamConfig.plugins.marketplaces,\n )\n\n marketplacesAdded = marketplaceResult.added\n }\n\n // Step 4: Install plugins (if configured)\n let pluginsInstalled = 0\n if (shouldInstallPlugins && teamConfig.plugins?.install) {\n const pluginCount = teamConfig.plugins.install.length\n setState({ stage: 'installing-plugins', total: pluginCount })\n\n const pluginResult = await installPlugins(teamConfig.plugins.install)\n\n pluginsInstalled = pluginResult.installed\n }\n\n // Step 5: Install agents (if configured)\n let agentsInstalled = 0\n if (shouldInstallPlugins && teamConfig.agents) {\n const remoteCount = teamConfig.agents.remoteAgents?.length || 0\n const inlineCount = teamConfig.agents.inlineAgents?.length || 0\n const totalAgents = remoteCount + inlineCount\n\n if (totalAgents > 0) {\n setState({ stage: 'installing-agents', total: totalAgents })\n\n if (teamConfig.agents.remoteAgents) {\n const remoteResult = await installRemoteAgents(\n teamConfig.agents.remoteAgents,\n )\n agentsInstalled += remoteResult.installed\n }\n\n if (teamConfig.agents.inlineAgents) {\n const inlineResult = await installInlineAgents(\n teamConfig.agents.inlineAgents,\n )\n agentsInstalled += inlineResult.installed\n }\n }\n }\n\n // Step 6: Install hooks (if configured)\n let hooksInstalled = false\n if (shouldInstallPlugins && teamConfig.hooks) {\n setState({ stage: 'installing-hooks' })\n const hookResult = await installTeamHooks(teamConfig.hooks)\n hooksInstalled = hookResult.installed\n }\n\n // Success\n setState({\n stage: 'success',\n modelsAdded: result.modelsAdded,\n mcpServersAdded: result.mcpServersAdded,\n settingsUpdated: result.settingsUpdated,\n marketplacesAdded:\n marketplacesAdded > 0 ? marketplacesAdded : undefined,\n pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : undefined,\n agentsInstalled: agentsInstalled > 0 ? agentsInstalled : undefined,\n hooksInstalled: hooksInstalled || undefined,\n instructions: teamConfig.postInstallInstructions,\n })\n\n // Notify parent component\n setTimeout(() => onDone('Configuration applied successfully'), 2000)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n setState({\n stage: 'error',\n message: errorMessage,\n })\n\n // Notify parent component of error\n setTimeout(() => onDone(), 2000)\n }\n }\n\n init()\n }, [source, strategy, shouldInstallPlugins, onDone])\n\n if (state.stage === 'loading') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Loading configuration from {source}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'applying') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Applying configuration...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'adding-marketplaces') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Adding {state.total} marketplace\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-plugins') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} plugin\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-agents') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} agent\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-hooks') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing hooks...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\u2717 Initialization failed</Text>\n <Text color=\"red\">{state.message}</Text>\n </Box>\n )\n }\n\n // Success state\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text color=\"green\" bold>\n \u2713 Configuration applied successfully!\n </Text>\n\n <Box flexDirection=\"column\" paddingTop={1}>\n {state.modelsAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.modelsAdded}</Text> model profile\n {state.modelsAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.mcpServersAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.mcpServersAdded}</Text> MCP server\n {state.mcpServersAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.settingsUpdated.length > 0 && (\n <Text>\n \u2022 Updated <Text color=\"cyan\">{state.settingsUpdated.length}</Text>{' '}\n setting\n {state.settingsUpdated.length !== 1 ? 's' : ''}:{' '}\n {state.settingsUpdated.join(', ')}\n </Text>\n )}\n\n {state.marketplacesAdded !== undefined &&\n state.marketplacesAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.marketplacesAdded}</Text>{' '}\n marketplace\n {state.marketplacesAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.pluginsInstalled !== undefined && state.pluginsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.pluginsInstalled}</Text>{' '}\n plugin\n {state.pluginsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.agentsInstalled !== undefined && state.agentsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.agentsInstalled}</Text> agent\n {state.agentsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.hooksInstalled && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">hooks</Text> configuration\n </Text>\n )}\n </Box>\n\n {state.instructions && (\n <Box\n flexDirection=\"column\"\n paddingTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text color=\"yellow\" bold>\n \uD83D\uDCCB Next Steps:\n </Text>\n <Text>{state.instructions}</Text>\n </Box>\n )}\n\n <Box paddingTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Run <Text color=\"cyan\">minto</Text> to start using your configured\n setup.\n </Text>\n </Box>\n </Box>\n )\n}\n\n// Command definition\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: 'Initialize Minto with team configuration from a URL or file',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context, commandArgs) {\n // Parse arguments from either slash command args or process.argv (CLI mode)\n // Slash command: /setup --from <url> passes args as commandArgs\n // CLI mode: minto setup --from <url> uses process.argv\n const argsString = commandArgs || process.argv.slice(2).join(' ')\n const args = argsString.split(/\\s+/).filter(Boolean)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone()\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Error: --from parameter is required</Text>\n <Text>\n Usage: minto setup --from &lt;url|path&gt; [--strategy\n &lt;merge|replace|skip-existing&gt;] [--no-plugins]\n </Text>\n </Box>\n )\n }\n\n const source = args[fromIndex + 1]\n const strategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={strategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file.\n * Uses TabbedListView for configuration preview before applying.\n *\n * Supports scope-aware installation:\n * - userInstall/userAgents/userSkills/userCommands \u2192 ~/.minto/\n * - projectInstall/projectAgents/projectSkills/projectCommands \u2192 ./.minto/\n * - v1.0 compat: install/inlineAgents \u2192 ~/.minto/ (user scope)\n *\n * Flow: loading \u2192 preview (TabbedListView) \u2192 installing (statusOverlay) \u2192 done\n */\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { Text, Box } from 'ink'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { getCwd } from '@utils/state'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n installRemoteAgents,\n installInlineAgents,\n installTeamHooks,\n installInlineSkills,\n installInlineCommands,\n type TeamConfig,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype SetupPhase = 'loading' | 'preview' | 'installing'\n\ninterface SetupProps {\n source: string\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\n// ============================================================================\n// Helper: count hooks in a TeamHooksConfig\n// ============================================================================\n\nfunction countHooks(hooks: TeamConfig['hooks']): number {\n if (!hooks) return 0\n return (\n (hooks.sessionStart?.length || 0) +\n (hooks.sessionEnd?.length || 0) +\n (hooks.userPromptSubmit?.length || 0) +\n (hooks.preToolUse?.length || 0) +\n (hooks.postToolUse?.length || 0)\n )\n}\n\n// ============================================================================\n// Preview Tab/Item builders\n// ============================================================================\n\nfunction buildTabs(config: TeamConfig): TabDefinition[] {\n const tabs: TabDefinition[] = [\n { id: 'overview', label: t('commands.setup.tabOverview') },\n ]\n\n if (config.models?.profiles && config.models.profiles.length > 0) {\n tabs.push({\n id: 'models',\n label: t('commands.setup.tabModels'),\n badge: config.models.profiles.length,\n })\n }\n\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n tabs.push({\n id: 'mcp',\n label: t('commands.setup.tabMcp'),\n badge: Object.keys(config.mcpServers).length,\n })\n }\n\n // Plugins: count all variants\n const pluginCount =\n (config.plugins?.install?.length || 0) +\n (config.plugins?.userInstall?.length || 0) +\n (config.plugins?.projectInstall?.length || 0) +\n (config.plugins?.marketplaces?.length || 0)\n if (pluginCount > 0) {\n tabs.push({\n id: 'plugins',\n label: t('commands.setup.tabPlugins'),\n badge: pluginCount,\n })\n }\n\n // Agents: count all variants\n const agentCount =\n (config.agents?.remoteAgents?.length || 0) +\n (config.agents?.inlineAgents?.length || 0) +\n (config.agents?.userAgents?.length || 0) +\n (config.agents?.projectAgents?.length || 0)\n if (agentCount > 0) {\n tabs.push({\n id: 'agents',\n label: t('commands.setup.tabAgents'),\n badge: agentCount,\n })\n }\n\n // Skills\n const skillCount =\n (config.skills?.userSkills?.length || 0) +\n (config.skills?.projectSkills?.length || 0)\n if (skillCount > 0) {\n tabs.push({\n id: 'skills',\n label: t('commands.setup.tabSkills'),\n badge: skillCount,\n })\n }\n\n // Commands\n const commandCount =\n (config.commands?.userCommands?.length || 0) +\n (config.commands?.projectCommands?.length || 0)\n if (commandCount > 0) {\n tabs.push({\n id: 'commands',\n label: t('commands.setup.tabCommands'),\n badge: commandCount,\n })\n }\n\n // Hooks: count user + project hooks\n const hookCount = countHooks(config.hooks) + countHooks(config.projectHooks)\n if (hookCount > 0) {\n tabs.push({\n id: 'hooks',\n label: t('commands.setup.tabHooks'),\n badge: hookCount,\n })\n }\n\n if (config.settings && Object.keys(config.settings).length > 0) {\n tabs.push({\n id: 'settings',\n label: t('commands.setup.tabSettings'),\n badge: Object.keys(config.settings).length,\n })\n }\n\n return tabs\n}\n\nfunction buildItems(tabId: string, config: TeamConfig): ListItem[] {\n switch (tabId) {\n case 'overview': {\n const items: ListItem[] = [\n {\n id: 'name',\n label: config.name || 'Team Configuration',\n description: config.description,\n category: 'Info',\n },\n ]\n\n if (config.scope) {\n items.push({\n id: 'overview-scope',\n label: `Scope: ${config.scope}`,\n category: 'Info',\n })\n }\n\n const modelCount = config.models?.profiles?.length || 0\n if (modelCount > 0) {\n items.push({\n id: 'overview-models',\n label: `${modelCount} model profile${modelCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const mcpCount = config.mcpServers\n ? Object.keys(config.mcpServers).length\n : 0\n if (mcpCount > 0) {\n items.push({\n id: 'overview-mcp',\n label: `${mcpCount} MCP server${mcpCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const pluginCount =\n (config.plugins?.install?.length || 0) +\n (config.plugins?.userInstall?.length || 0) +\n (config.plugins?.projectInstall?.length || 0)\n if (pluginCount > 0) {\n items.push({\n id: 'overview-plugins',\n label: `${pluginCount} plugin${pluginCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const agentCount =\n (config.agents?.remoteAgents?.length || 0) +\n (config.agents?.inlineAgents?.length || 0) +\n (config.agents?.userAgents?.length || 0) +\n (config.agents?.projectAgents?.length || 0)\n if (agentCount > 0) {\n items.push({\n id: 'overview-agents',\n label: `${agentCount} agent${agentCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const skillCount =\n (config.skills?.userSkills?.length || 0) +\n (config.skills?.projectSkills?.length || 0)\n if (skillCount > 0) {\n items.push({\n id: 'overview-skills',\n label: `${skillCount} skill${skillCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const commandCount =\n (config.commands?.userCommands?.length || 0) +\n (config.commands?.projectCommands?.length || 0)\n if (commandCount > 0) {\n items.push({\n id: 'overview-commands',\n label: `${commandCount} command${commandCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n return items\n }\n\n case 'models':\n return (config.models?.profiles || []).map((p, i) => ({\n id: `model-${i}`,\n label: p.name,\n description: `${p.provider} / ${p.modelName}`,\n status: p.isActive ? ('enabled' as const) : ('disabled' as const),\n }))\n\n case 'mcp':\n return Object.entries(config.mcpServers || {}).map(([name, server]) => ({\n id: `mcp-${name}`,\n label: name,\n description:\n server.type === 'sse'\n ? `SSE: ${server.url}`\n : `stdio: ${server.command}`,\n status:\n server.enabled !== false\n ? ('enabled' as const)\n : ('disabled' as const),\n }))\n\n case 'plugins': {\n const items: ListItem[] = []\n for (const mp of config.plugins?.marketplaces || []) {\n items.push({\n id: `mp-${mp}`,\n label: mp,\n description: 'Marketplace source',\n category: 'Marketplaces',\n })\n }\n // v1.0 compat\n for (const p of config.plugins?.install || []) {\n items.push({\n id: `plugin-${p}`,\n label: p,\n description: 'Plugin \u2192 User',\n category: 'User',\n })\n }\n for (const p of config.plugins?.userInstall || []) {\n items.push({\n id: `plugin-user-${p}`,\n label: p,\n description: 'Plugin \u2192 User',\n category: 'User',\n })\n }\n for (const p of config.plugins?.projectInstall || []) {\n items.push({\n id: `plugin-project-${p}`,\n label: p,\n description: 'Plugin \u2192 Project',\n category: 'Project',\n })\n }\n return items\n }\n\n case 'agents': {\n const items: ListItem[] = []\n for (const a of config.agents?.remoteAgents || []) {\n items.push({\n id: `remote-agent-${a}`,\n label: a,\n description: 'Remote agent URL',\n category: 'Remote',\n })\n }\n // v1.0 compat\n for (const a of config.agents?.inlineAgents || []) {\n items.push({\n id: `inline-agent-${a.name}`,\n label: a.name,\n description: a.description,\n category: 'User',\n })\n }\n for (const a of config.agents?.userAgents || []) {\n items.push({\n id: `user-agent-${a.name}`,\n label: a.name,\n description: a.description,\n category: 'User',\n })\n }\n for (const a of config.agents?.projectAgents || []) {\n items.push({\n id: `project-agent-${a.name}`,\n label: a.name,\n description: a.description,\n category: 'Project',\n })\n }\n return items\n }\n\n case 'skills': {\n const items: ListItem[] = []\n for (const s of config.skills?.userSkills || []) {\n items.push({\n id: `skill-user-${s.name}`,\n label: s.name,\n description: s.description,\n category: 'User',\n })\n }\n for (const s of config.skills?.projectSkills || []) {\n items.push({\n id: `skill-project-${s.name}`,\n label: s.name,\n description: s.description,\n category: 'Project',\n })\n }\n return items\n }\n\n case 'commands': {\n const items: ListItem[] = []\n for (const c of config.commands?.userCommands || []) {\n items.push({\n id: `cmd-user-${c.name}`,\n label: c.name,\n description: c.description,\n category: 'User',\n })\n }\n for (const c of config.commands?.projectCommands || []) {\n items.push({\n id: `cmd-project-${c.name}`,\n label: c.name,\n description: c.description,\n category: 'Project',\n })\n }\n return items\n }\n\n case 'hooks': {\n const items: ListItem[] = []\n const addHooks = (\n hookList: unknown[] | undefined,\n category: string,\n prefix: string,\n ) => {\n if (!hookList) return\n for (let i = 0; i < hookList.length; i++) {\n const h = hookList[i] as { type?: string; command?: string }\n items.push({\n id: `hook-${prefix}-${category}-${i}`,\n label: h.type || h.command || `Hook ${i + 1}`,\n description: h.command,\n category,\n })\n }\n }\n // User hooks\n if (config.hooks) {\n addHooks(config.hooks.sessionStart, 'User \u00B7 Session Start', 'user')\n addHooks(config.hooks.sessionEnd, 'User \u00B7 Session End', 'user')\n addHooks(\n config.hooks.userPromptSubmit,\n 'User \u00B7 User Prompt Submit',\n 'user',\n )\n addHooks(config.hooks.preToolUse, 'User \u00B7 Pre Tool Use', 'user')\n addHooks(config.hooks.postToolUse, 'User \u00B7 Post Tool Use', 'user')\n }\n // Project hooks\n if (config.projectHooks) {\n addHooks(\n config.projectHooks.sessionStart,\n 'Project \u00B7 Session Start',\n 'project',\n )\n addHooks(\n config.projectHooks.sessionEnd,\n 'Project \u00B7 Session End',\n 'project',\n )\n addHooks(\n config.projectHooks.userPromptSubmit,\n 'Project \u00B7 User Prompt Submit',\n 'project',\n )\n addHooks(\n config.projectHooks.preToolUse,\n 'Project \u00B7 Pre Tool Use',\n 'project',\n )\n addHooks(\n config.projectHooks.postToolUse,\n 'Project \u00B7 Post Tool Use',\n 'project',\n )\n }\n return items\n }\n\n case 'settings':\n return Object.entries(config.settings || {}).map(([key, value]) => ({\n id: `setting-${key}`,\n label: key,\n description: String(value),\n }))\n\n default:\n return []\n }\n}\n\n// ============================================================================\n// Install logic \u2014 scope-aware with v1.0 backward compatibility\n// ============================================================================\n\nasync function runInstall(\n config: TeamConfig,\n strategy: MergeStrategy,\n shouldInstallPlugins: boolean,\n onProgress: (message: string) => void,\n): Promise<string> {\n const cwd = getCwd()\n const home = homedir()\n const userDir = join(home, '.minto')\n const projectDir = join(cwd, '.minto')\n\n // Step 1: Apply configuration (settings/models/MCP \u2192 globalConfig)\n onProgress(t('commands.setup.applying'))\n const result = applyTeamConfig(config, strategy)\n\n const summary: string[] = []\n\n if (result.modelsAdded > 0) {\n summary.push(\n `${result.modelsAdded} model${result.modelsAdded !== 1 ? 's' : ''}`,\n )\n }\n if (result.mcpServersAdded > 0) {\n summary.push(\n `${result.mcpServersAdded} MCP server${result.mcpServersAdded !== 1 ? 's' : ''}`,\n )\n }\n if (result.settingsUpdated.length > 0) {\n summary.push(\n `${result.settingsUpdated.length} setting${result.settingsUpdated.length !== 1 ? 's' : ''}`,\n )\n }\n\n if (shouldInstallPlugins) {\n // Step 2: Marketplaces (always global)\n if (\n config.plugins?.marketplaces &&\n config.plugins.marketplaces.length > 0\n ) {\n onProgress(t('commands.setup.addingMarketplaces'))\n const mpResult = await addMarketplaces(config.plugins.marketplaces)\n if (mpResult.added > 0) {\n summary.push(\n `${mpResult.added} marketplace${mpResult.added !== 1 ? 's' : ''}`,\n )\n }\n }\n\n // Step 3: Plugins \u2014 scope-aware\n let pluginsInstalled = 0\n\n // v1.0 compat: install \u2192 user scope\n if (config.plugins?.install && config.plugins.install.length > 0) {\n onProgress(t('commands.setup.installingPlugins'))\n const r = await installPlugins(\n config.plugins.install,\n join(userDir, 'plugins'),\n )\n pluginsInstalled += r.installed\n }\n // User plugins\n if (config.plugins?.userInstall && config.plugins.userInstall.length > 0) {\n onProgress(t('commands.setup.installingPlugins'))\n const r = await installPlugins(\n config.plugins.userInstall,\n join(userDir, 'plugins'),\n )\n pluginsInstalled += r.installed\n }\n // Project plugins\n if (\n config.plugins?.projectInstall &&\n config.plugins.projectInstall.length > 0\n ) {\n onProgress(t('commands.setup.installingProjectPlugins'))\n const r = await installPlugins(\n config.plugins.projectInstall,\n join(projectDir, 'plugins'),\n )\n pluginsInstalled += r.installed\n }\n if (pluginsInstalled > 0) {\n summary.push(\n `${pluginsInstalled} plugin${pluginsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 4: Agents \u2014 scope-aware\n let agentsInstalled = 0\n\n if (config.agents) {\n if (config.agents.remoteAgents && config.agents.remoteAgents.length > 0) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installRemoteAgents(\n config.agents.remoteAgents,\n join(userDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n // v1.0 compat: inlineAgents \u2192 user scope\n if (config.agents.inlineAgents && config.agents.inlineAgents.length > 0) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installInlineAgents(\n config.agents.inlineAgents,\n join(userDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n // User agents\n if (config.agents.userAgents && config.agents.userAgents.length > 0) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installInlineAgents(\n config.agents.userAgents,\n join(userDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n // Project agents\n if (\n config.agents.projectAgents &&\n config.agents.projectAgents.length > 0\n ) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installInlineAgents(\n config.agents.projectAgents,\n join(projectDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n }\n if (agentsInstalled > 0) {\n summary.push(\n `${agentsInstalled} agent${agentsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 5: Skills \u2014 scope-aware\n let skillsInstalled = 0\n\n if (config.skills) {\n if (config.skills.userSkills && config.skills.userSkills.length > 0) {\n onProgress(t('commands.setup.installingSkills'))\n const r = await installInlineSkills(\n config.skills.userSkills,\n join(userDir, 'skills'),\n )\n skillsInstalled += r.installed\n }\n if (\n config.skills.projectSkills &&\n config.skills.projectSkills.length > 0\n ) {\n onProgress(t('commands.setup.installingSkills'))\n const r = await installInlineSkills(\n config.skills.projectSkills,\n join(projectDir, 'skills'),\n )\n skillsInstalled += r.installed\n }\n }\n if (skillsInstalled > 0) {\n summary.push(\n `${skillsInstalled} skill${skillsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 6: Commands \u2014 scope-aware\n let commandsInstalled = 0\n\n if (config.commands) {\n if (\n config.commands.userCommands &&\n config.commands.userCommands.length > 0\n ) {\n onProgress(t('commands.setup.installingCommands'))\n const r = await installInlineCommands(\n config.commands.userCommands,\n join(userDir, 'commands'),\n )\n commandsInstalled += r.installed\n }\n if (\n config.commands.projectCommands &&\n config.commands.projectCommands.length > 0\n ) {\n onProgress(t('commands.setup.installingCommands'))\n const r = await installInlineCommands(\n config.commands.projectCommands,\n join(projectDir, 'commands'),\n )\n commandsInstalled += r.installed\n }\n }\n if (commandsInstalled > 0) {\n summary.push(\n `${commandsInstalled} command${commandsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 7: Hooks \u2014 scope-aware\n let hooksInstalled = false\n\n if (config.hooks) {\n onProgress(t('commands.setup.installingHooks'))\n const r = await installTeamHooks(\n config.hooks,\n join(userDir, 'hooks.json'),\n )\n if (r.installed) hooksInstalled = true\n }\n if (config.projectHooks) {\n onProgress(t('commands.setup.installingHooks'))\n const r = await installTeamHooks(\n config.projectHooks,\n join(projectDir, 'hooks.json'),\n )\n if (r.installed) hooksInstalled = true\n }\n if (hooksInstalled) {\n summary.push('hooks')\n }\n }\n\n return summary.length > 0\n ? `${t('commands.setup.success')} (${summary.join(', ')})`\n : t('commands.setup.success')\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [phase, setPhase] = useState<SetupPhase>('loading')\n const [teamConfig, setTeamConfig] = useState<TeamConfig | null>(null)\n const [activeTab, setActiveTab] = useState('overview')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n\n // Load configuration on mount\n React.useEffect(() => {\n async function load() {\n try {\n const config =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n setTeamConfig(config)\n setPhase('preview')\n } catch (error) {\n setTeamConfig(null)\n setPhase('preview')\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.setup.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }\n load()\n }, [source])\n\n const tabs = useMemo(\n () =>\n teamConfig\n ? buildTabs(teamConfig)\n : [{ id: 'overview', label: t('commands.setup.tabOverview') }],\n [teamConfig],\n )\n\n const items = useMemo(\n () => (teamConfig ? buildItems(activeTab, teamConfig) : []),\n [teamConfig, activeTab],\n )\n\n const handleSelect = useCallback(async () => {\n if (!teamConfig || phase !== 'preview') return\n\n setPhase('installing')\n setStatusOverlay({\n type: 'loading',\n message: t('commands.setup.applying'),\n })\n\n try {\n const successMessage = await runInstall(\n teamConfig,\n strategy,\n shouldInstallPlugins,\n (message: string) => {\n setStatusOverlay({ type: 'loading', message })\n },\n )\n\n setStatusOverlay({\n type: 'success',\n message: successMessage,\n })\n } catch (error) {\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.setup.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }, [teamConfig, phase, strategy, shouldInstallPlugins])\n\n const handleClose = useCallback(() => {\n onDone()\n }, [onDone])\n\n // Loading phase - simple spinner before TabbedListView\n if (phase === 'loading') {\n return (\n <Box>\n <SimpleSpinner />\n <Text color=\"cyan\"> {t('commands.setup.loading')}</Text>\n </Box>\n )\n }\n\n // Preview & Installing phases - both use TabbedListView\n return (\n <TabbedListView\n title={t('commands.setup.previewTitle')}\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n items={items}\n searchEnabled={false}\n onSelect={handleSelect}\n onClose={handleClose}\n footerHint={t('commands.setup.confirmHint')}\n statusOverlay={statusOverlay}\n statusDismissHint=\"Esc Close\"\n groupByCategory={\n activeTab === 'overview' ||\n activeTab === 'plugins' ||\n activeTab === 'agents' ||\n activeTab === 'skills' ||\n activeTab === 'commands' ||\n activeTab === 'hooks'\n }\n isActive={phase !== 'installing' || statusOverlay?.type !== 'loading'}\n />\n )\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: t('commands.setup.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context, commandArgs) {\n const argsString = commandArgs || process.argv.slice(2).join(' ')\n const args = argsString.split(/\\s+/).filter(Boolean)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone(\n `${t('commands.setup.errorMissingFrom')}\\n${t('commands.setup.errorUsage')}`,\n )\n return null\n }\n\n const source = args[fromIndex + 1]\n const setupStrategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={setupStrategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,4 @@
1
1
  import React from "react";
2
- import { Box, Text, useInput } from "ink";
3
2
  import { t } from "../i18n/index.js";
4
3
  import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
5
4
  import {
@@ -9,29 +8,17 @@ import {
9
8
  getModelUsageStats,
10
9
  getToolUsageStats
11
10
  } from "../utils/stats.js";
12
- import { PressEnterToContinue } from "../components/PressEnterToContinue.js";
13
- function renderProgressBar(value, max, width = 40) {
14
- if (max === 0) return "\u2591".repeat(width);
15
- const filled = Math.min(Math.round(value / max * width), width);
16
- const empty = width - filled;
17
- return "\u2588".repeat(filled) + "\u2591".repeat(empty);
18
- }
11
+ import { InfoPanel } from "../components/InfoPanel/index.js";
19
12
  function formatNumber(n) {
20
13
  return n.toLocaleString();
21
14
  }
22
15
  function formatCompactNumber(n) {
23
- if (n >= 1e6) {
24
- return `${(n / 1e6).toFixed(1)}M`;
25
- }
26
- if (n >= 1e3) {
27
- return `${(n / 1e3).toFixed(1)}K`;
28
- }
16
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
17
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
29
18
  return n.toString();
30
19
  }
31
20
  function formatCost(cost) {
32
- if (cost < 0.01) {
33
- return `$${cost.toFixed(4)}`;
34
- }
21
+ if (cost < 0.01) return `$${cost.toFixed(4)}`;
35
22
  return `$${cost.toFixed(2)}`;
36
23
  }
37
24
  function getTodayString() {
@@ -61,64 +48,7 @@ function sumDailyStats(days) {
61
48
  }
62
49
  );
63
50
  }
64
- function StatRow({
65
- label,
66
- value,
67
- max,
68
- barWidth = 20,
69
- comparison,
70
- suffix
71
- }) {
72
- const bar = renderProgressBar(value, max, barWidth);
73
- const formattedValue = formatNumber(value);
74
- const paddedLabel = label.padEnd(12);
75
- const paddedValue = formattedValue.padStart(8);
76
- return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, paddedLabel), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, paddedValue), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, bar), comparison !== void 0 && comparison !== 0 && /* @__PURE__ */ React.createElement(
77
- Text,
78
- {
79
- color: comparison > 0 ? SEMANTIC_COLORS.success : SEMANTIC_COLORS.error
80
- },
81
- " ",
82
- "(",
83
- comparison > 0 ? "+" : "",
84
- comparison,
85
- " ",
86
- t("commands.stats.vsYesterday"),
87
- ")"
88
- ), suffix && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", suffix));
89
- }
90
- function ModelRow({ model, totalCalls, barWidth = 40 }) {
91
- const percentage = safePercentage(model.calls, totalCalls);
92
- const bar = renderProgressBar(model.calls, totalCalls, barWidth);
93
- const displayName = model.model.length > 14 ? model.model.slice(0, 11) + "..." : model.model;
94
- return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, displayName.padEnd(14)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, String(percentage).padStart(3), "%"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.MIDDLE }, bar), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", formatNumber(model.calls), " ", t("commands.stats.calls"), ")"));
95
- }
96
- function ToolRow({ tool, rank }) {
97
- const successRate = safePercentage(tool.successCount, tool.calls);
98
- const displayName = tool.toolName.length > 16 ? tool.toolName.slice(0, 13) + "..." : tool.toolName;
99
- return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, String(rank).padStart(2), ". "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, displayName.padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(tool.calls).padStart(6)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", t("commands.stats.calls")), tool.errorCount > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.error }, " (", successRate, "% success)"));
100
- }
101
- function StatsDisplay({
102
- stats,
103
- today,
104
- yesterday,
105
- weekStats,
106
- showWeek,
107
- showMonth,
108
- showModels,
109
- showTools,
110
- onClose
111
- }) {
112
- useInput((_, key) => {
113
- if (key.return || key.escape) onClose();
114
- });
115
- const modelStats = getModelUsageStats();
116
- const toolStats = getToolUsageStats();
117
- const totalModelCalls = modelStats.reduce((sum, m) => sum + m.calls, 0);
118
- const msgDiff = today && yesterday ? today.messageCount - yesterday.messageCount : void 0;
119
- const sessionDiff = today && yesterday ? today.sessionCount - yesterday.sessionCount : void 0;
120
- const toolDiff = today && yesterday ? today.toolCallCount - yesterday.toolCallCount : void 0;
121
- const tokenDiff = today && yesterday ? today.tokensUsed - yesterday.tokensUsed : void 0;
51
+ function buildTodaySection(today, yesterday) {
122
52
  const maxMsg = Math.max(
123
53
  today?.messageCount ?? 0,
124
54
  yesterday?.messageCount ?? 0,
@@ -139,53 +69,139 @@ function StatsDisplay({
139
69
  yesterday?.tokensUsed ?? 0,
140
70
  1
141
71
  );
142
- const hasData = stats.lifetime.totalMessages > 0 || stats.lifetime.totalSessions > 0;
143
- if (!hasData) {
144
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, t("commands.stats.title"))), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("commands.stats.noData")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(PressEnterToContinue, null)));
145
- }
146
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, t("commands.stats.title"))), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2500".repeat(65)), !showWeek && !showMonth && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("commands.stats.today"), " (", getTodayString(), ")")), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(
147
- StatRow,
148
- {
149
- label: t("commands.stats.messages"),
150
- value: today?.messageCount ?? 0,
151
- max: maxMsg * 1.2,
152
- comparison: msgDiff
153
- }
154
- ), /* @__PURE__ */ React.createElement(
155
- StatRow,
156
- {
157
- label: t("commands.stats.sessions"),
158
- value: today?.sessionCount ?? 0,
159
- max: maxSession * 1.2,
160
- comparison: sessionDiff
161
- }
162
- ), /* @__PURE__ */ React.createElement(
163
- StatRow,
164
- {
165
- label: t("commands.stats.toolCalls"),
166
- value: today?.toolCallCount ?? 0,
167
- max: maxTool * 1.2,
168
- comparison: toolDiff
169
- }
170
- ), /* @__PURE__ */ React.createElement(
171
- StatRow,
172
- {
173
- label: t("commands.stats.tokens"),
174
- value: today?.tokensUsed ?? 0,
175
- max: maxToken * 1.2,
176
- comparison: tokenDiff
177
- }
178
- ))), (showWeek || !showMonth) && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("commands.stats.thisWeek"))), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalMessages").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(weekStats.messageCount))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalSessions").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(weekStats.sessionCount))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalTools").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(weekStats.toolCallCount))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.estCost").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatCost(weekStats.costEstimate))))), showMonth && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("commands.stats.thisMonth"))), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, (() => {
179
- const monthStats = sumDailyStats(getStatsForDays(30));
180
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalMessages").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(monthStats.messageCount))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalSessions").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(monthStats.sessionCount))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalTools").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(monthStats.toolCallCount))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.estCost").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatCost(monthStats.costEstimate))));
181
- })())), (showModels || !showWeek && !showMonth && !showTools) && modelStats.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("commands.stats.modelUsage"))), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, modelStats.slice(0, 5).map((model) => /* @__PURE__ */ React.createElement(
182
- ModelRow,
183
- {
184
- key: model.model,
185
- model,
186
- totalCalls: totalModelCalls
187
- }
188
- )))), (showTools || !showWeek && !showMonth && !showModels) && toolStats.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("commands.stats.topTools"))), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, toolStats.slice(0, 5).map((tool, index) => /* @__PURE__ */ React.createElement(ToolRow, { key: tool.toolName, tool, rank: index + 1 })))), !showWeek && !showMonth && !showModels && !showTools && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("commands.stats.lifetime"))), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalMessages").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(stats.lifetime.totalMessages))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalSessions").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(stats.lifetime.totalSessions))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.totalTools").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(stats.lifetime.totalToolCalls))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.tokens").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatCompactNumber(stats.lifetime.totalTokens))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.estCost").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatCost(stats.lifetime.totalCost))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, t("commands.stats.firstUsed").padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, stats.lifetime.firstUsed.split("T")[0])))), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2500".repeat(65)), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(PressEnterToContinue, null)));
72
+ const msgDiff = today && yesterday ? today.messageCount - yesterday.messageCount : void 0;
73
+ const sessionDiff = today && yesterday ? today.sessionCount - yesterday.sessionCount : void 0;
74
+ const toolDiff = today && yesterday ? today.toolCallCount - yesterday.toolCallCount : void 0;
75
+ const tokenDiff = today && yesterday ? today.tokensUsed - yesterday.tokensUsed : void 0;
76
+ return {
77
+ title: `${t("commands.stats.today")} (${getTodayString()})`,
78
+ items: [
79
+ {
80
+ label: t("commands.stats.messages"),
81
+ value: formatNumber(today?.messageCount ?? 0),
82
+ progress: {
83
+ percent: safePercentage(today?.messageCount ?? 0, maxMsg * 1.2),
84
+ width: 20
85
+ },
86
+ delta: msgDiff !== void 0 ? { value: msgDiff, label: t("commands.stats.vsYesterday") } : void 0
87
+ },
88
+ {
89
+ label: t("commands.stats.sessions"),
90
+ value: formatNumber(today?.sessionCount ?? 0),
91
+ progress: {
92
+ percent: safePercentage(today?.sessionCount ?? 0, maxSession * 1.2),
93
+ width: 20
94
+ },
95
+ delta: sessionDiff !== void 0 ? { value: sessionDiff, label: t("commands.stats.vsYesterday") } : void 0
96
+ },
97
+ {
98
+ label: t("commands.stats.toolCalls"),
99
+ value: formatNumber(today?.toolCallCount ?? 0),
100
+ progress: {
101
+ percent: safePercentage(today?.toolCallCount ?? 0, maxTool * 1.2),
102
+ width: 20
103
+ },
104
+ delta: toolDiff !== void 0 ? { value: toolDiff, label: t("commands.stats.vsYesterday") } : void 0
105
+ },
106
+ {
107
+ label: t("commands.stats.tokens"),
108
+ value: formatNumber(today?.tokensUsed ?? 0),
109
+ progress: {
110
+ percent: safePercentage(today?.tokensUsed ?? 0, maxToken * 1.2),
111
+ width: 20
112
+ },
113
+ delta: tokenDiff !== void 0 ? { value: tokenDiff, label: t("commands.stats.vsYesterday") } : void 0
114
+ }
115
+ ]
116
+ };
117
+ }
118
+ function buildPeriodSection(title, stats) {
119
+ return {
120
+ title,
121
+ items: [
122
+ {
123
+ label: t("commands.stats.totalMessages"),
124
+ value: formatNumber(stats.messageCount)
125
+ },
126
+ {
127
+ label: t("commands.stats.totalSessions"),
128
+ value: formatNumber(stats.sessionCount)
129
+ },
130
+ {
131
+ label: t("commands.stats.totalTools"),
132
+ value: formatNumber(stats.toolCallCount)
133
+ },
134
+ {
135
+ label: t("commands.stats.estCost"),
136
+ value: formatCost(stats.costEstimate)
137
+ }
138
+ ]
139
+ };
140
+ }
141
+ function buildModelSection() {
142
+ const modelStats = getModelUsageStats();
143
+ if (modelStats.length === 0) return null;
144
+ const totalCalls = modelStats.reduce((sum, m) => sum + m.calls, 0);
145
+ const items = modelStats.slice(0, 5).map((model) => {
146
+ const percentage = safePercentage(model.calls, totalCalls);
147
+ const displayName = model.model.length > 14 ? model.model.slice(0, 11) + "..." : model.model;
148
+ return {
149
+ label: displayName,
150
+ value: `${formatNumber(model.calls)} ${t("commands.stats.calls")}`,
151
+ progress: {
152
+ percent: percentage,
153
+ width: 20,
154
+ color: BRAND_GRADIENT.MIDDLE
155
+ }
156
+ };
157
+ });
158
+ return { title: t("commands.stats.modelUsage"), items };
159
+ }
160
+ function buildToolSection() {
161
+ const toolStats = getToolUsageStats();
162
+ if (toolStats.length === 0) return null;
163
+ const items = toolStats.slice(0, 5).map((tool, index) => {
164
+ const successRate = safePercentage(tool.successCount, tool.calls);
165
+ const displayName = tool.toolName.length > 16 ? tool.toolName.slice(0, 13) + "..." : tool.toolName;
166
+ return {
167
+ label: `${index + 1}. ${displayName}`,
168
+ value: `${formatNumber(tool.calls)} ${t("commands.stats.calls")}${tool.errorCount > 0 ? ` (${successRate}% success)` : ""}`
169
+ };
170
+ });
171
+ return { title: t("commands.stats.topTools"), items };
172
+ }
173
+ function buildLifetimeSection() {
174
+ const stats = getStats();
175
+ return {
176
+ title: t("commands.stats.lifetime"),
177
+ items: [
178
+ {
179
+ label: t("commands.stats.totalMessages"),
180
+ value: formatNumber(stats.lifetime.totalMessages)
181
+ },
182
+ {
183
+ label: t("commands.stats.totalSessions"),
184
+ value: formatNumber(stats.lifetime.totalSessions)
185
+ },
186
+ {
187
+ label: t("commands.stats.totalTools"),
188
+ value: formatNumber(stats.lifetime.totalToolCalls)
189
+ },
190
+ {
191
+ label: t("commands.stats.tokens"),
192
+ value: formatCompactNumber(stats.lifetime.totalTokens)
193
+ },
194
+ {
195
+ label: t("commands.stats.estCost"),
196
+ value: formatCost(stats.lifetime.totalCost)
197
+ },
198
+ {
199
+ label: t("commands.stats.firstUsed"),
200
+ value: stats.lifetime.firstUsed.split("T")[0] || "",
201
+ valueColor: SEMANTIC_COLORS.dim
202
+ }
203
+ ]
204
+ };
189
205
  }
190
206
  function parseArgs(args) {
191
207
  const trimmed = args.trim().toLowerCase();
@@ -201,6 +217,7 @@ const command = {
201
217
  description: t("commands.stats.description"),
202
218
  isEnabled: true,
203
219
  isHidden: false,
220
+ hidePromptInput: true,
204
221
  type: "local-jsx",
205
222
  userFacingName() {
206
223
  return this.name;
@@ -209,20 +226,60 @@ const command = {
209
226
  const parsedArgs = parseArgs(args ?? "");
210
227
  const stats = getStats();
211
228
  const today = getTodayStats();
229
+ const hasData = stats.lifetime.totalMessages > 0 || stats.lifetime.totalSessions > 0;
230
+ if (!hasData) {
231
+ return /* @__PURE__ */ React.createElement(
232
+ InfoPanel,
233
+ {
234
+ title: t("commands.stats.title"),
235
+ sections: [
236
+ {
237
+ title: t("commands.stats.today"),
238
+ items: [
239
+ {
240
+ label: "",
241
+ value: t("commands.stats.noData"),
242
+ valueColor: SEMANTIC_COLORS.dim
243
+ }
244
+ ]
245
+ }
246
+ ],
247
+ onClose: onDone
248
+ }
249
+ );
250
+ }
212
251
  const recentDays = getStatsForDays(2);
213
252
  const yesterday = recentDays.length >= 2 ? recentDays[1] ?? null : null;
214
253
  const weekStats = sumDailyStats(getStatsForDays(7));
254
+ const sections = [];
255
+ if (!parsedArgs.week && !parsedArgs.month) {
256
+ sections.push(buildTodaySection(today, yesterday));
257
+ }
258
+ if (parsedArgs.week || !parsedArgs.month) {
259
+ sections.push(buildPeriodSection(t("commands.stats.thisWeek"), weekStats));
260
+ }
261
+ if (parsedArgs.month) {
262
+ const monthStats = sumDailyStats(getStatsForDays(30));
263
+ sections.push(
264
+ buildPeriodSection(t("commands.stats.thisMonth"), monthStats)
265
+ );
266
+ }
267
+ if (parsedArgs.models || !parsedArgs.week && !parsedArgs.month && !parsedArgs.tools) {
268
+ const modelSection = buildModelSection();
269
+ if (modelSection) sections.push(modelSection);
270
+ }
271
+ if (parsedArgs.tools || !parsedArgs.week && !parsedArgs.month && !parsedArgs.models) {
272
+ const toolSection = buildToolSection();
273
+ if (toolSection) sections.push(toolSection);
274
+ }
275
+ if (!parsedArgs.week && !parsedArgs.month && !parsedArgs.models && !parsedArgs.tools) {
276
+ sections.push(buildLifetimeSection());
277
+ }
215
278
  return /* @__PURE__ */ React.createElement(
216
- StatsDisplay,
279
+ InfoPanel,
217
280
  {
218
- stats,
219
- today,
220
- yesterday,
221
- weekStats,
222
- showWeek: parsedArgs.week,
223
- showMonth: parsedArgs.month,
224
- showModels: parsedArgs.models,
225
- showTools: parsedArgs.tools,
281
+ title: t("commands.stats.title"),
282
+ sections,
226
283
  onClose: onDone
227
284
  }
228
285
  );