@within-7/minto 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +461 -657
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/types.js +1 -0
- package/dist/commands/agents/types.js.map +2 -2
- package/dist/commands/agents/utils/fileOperations.js +96 -36
- package/dist/commands/agents/utils/fileOperations.js.map +3 -3
- package/dist/commands/agents/utils/index.js +3 -1
- package/dist/commands/agents/utils/index.js.map +2 -2
- package/dist/commands/context.js +54 -23
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/ctx_viz.js +1 -1
- package/dist/commands/effort.js +87 -0
- package/dist/commands/effort.js.map +7 -0
- package/dist/commands/export.js +684 -94
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/ide.js +18 -0
- package/dist/commands/ide.js.map +7 -0
- package/dist/commands/language.js +19 -46
- package/dist/commands/language.js.map +2 -2
- package/dist/commands/mcp-interactive.js +425 -217
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/memory.js +168 -0
- package/dist/commands/memory.js.map +7 -0
- package/dist/commands/model.js +457 -65
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/outputStyle.js +64 -0
- package/dist/commands/outputStyle.js.map +7 -0
- package/dist/commands/permissions.js +75 -49
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin/utils.js +33 -1
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +891 -185
- package/dist/commands/plugin.js.map +3 -3
- package/dist/commands/refreshCommands.js +2 -0
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +593 -107
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +188 -131
- package/dist/commands/stats.js.map +2 -2
- package/dist/commands/status.js +75 -13
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -0
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands/undo.js +146 -174
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands/vim.js +22 -0
- package/dist/commands/vim.js.map +7 -0
- package/dist/commands.js +12 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/Help.js +165 -32
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HighlightedCode.js +1 -0
- package/dist/components/HighlightedCode.js.map +2 -2
- package/dist/components/InfoPanel/InfoPanel.js +123 -0
- package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
- package/dist/components/InfoPanel/index.js +5 -0
- package/dist/components/InfoPanel/index.js.map +7 -0
- package/dist/components/InfoPanel/types.js +1 -0
- package/dist/components/InfoPanel/types.js.map +7 -0
- package/dist/components/ModelSelector/BrandTextInput.js +43 -0
- package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +590 -565
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/ModelSelector/WizardContainer.js +45 -0
- package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
- package/dist/components/ModelSelector/index.js +1 -3
- package/dist/components/ModelSelector/index.js.map +2 -2
- package/dist/components/PromptInput.js +26 -11
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/PulseLabel.js +44 -0
- package/dist/components/PulseLabel.js.map +7 -0
- package/dist/components/RequestStatusIndicator.js +1 -1
- package/dist/components/RequestStatusIndicator.js.map +1 -1
- package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
- package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
- package/dist/components/SimpleSelector/index.js +5 -0
- package/dist/components/SimpleSelector/index.js.map +7 -0
- package/dist/components/SimpleSelector/types.js +1 -0
- package/dist/components/SimpleSelector/types.js.map +7 -0
- package/dist/components/Spinner.js +12 -42
- package/dist/components/Spinner.js.map +3 -3
- package/dist/components/StartupStatus.js +57 -0
- package/dist/components/StartupStatus.js.map +7 -0
- package/dist/components/StatusOverlayContent.js +21 -0
- package/dist/components/StatusOverlayContent.js.map +7 -0
- package/dist/components/SubagentBlock.js +43 -6
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/TabbedListView/ScrollableList.js +31 -5
- package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
- package/dist/components/TabbedListView/TabBar.js +13 -8
- package/dist/components/TabbedListView/TabBar.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +123 -48
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TodoPanel.js +1 -1
- package/dist/components/TodoPanel.js.map +1 -1
- package/dist/components/ToolUseLoader.js +5 -0
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TrustDialog.js +0 -2
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +1 -1
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js +1 -1
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +6 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/modelCapabilities.js +103 -18
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/product.js +2 -0
- package/dist/constants/product.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +30 -0
- package/dist/constants/prompts/agentPrompt.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +27 -0
- package/dist/constants/prompts/codeConventions.js.map +7 -0
- package/dist/constants/prompts/doingTasks.js +15 -0
- package/dist/constants/prompts/doingTasks.js.map +7 -0
- package/dist/constants/prompts/envInfo.js +17 -0
- package/dist/constants/prompts/envInfo.js.map +7 -0
- package/dist/constants/prompts/executingWithCare.js +17 -0
- package/dist/constants/prompts/executingWithCare.js.map +7 -0
- package/dist/constants/prompts/identity.js +10 -0
- package/dist/constants/prompts/identity.js.map +7 -0
- package/dist/constants/prompts/index.js +78 -0
- package/dist/constants/prompts/index.js.map +7 -0
- package/dist/constants/prompts/taskManagement.js +60 -0
- package/dist/constants/prompts/taskManagement.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +62 -0
- package/dist/constants/prompts/toneAndStyle.js.map +7 -0
- package/dist/constants/prompts/toolUsagePolicy.js +38 -0
- package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
- package/dist/constants/prompts.js +5 -176
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/providerRegistry.js +235 -0
- package/dist/constants/providerRegistry.js.map +7 -0
- package/dist/constants/providers.js +35 -0
- package/dist/constants/providers.js.map +7 -0
- package/dist/context/PermissionContext.js +0 -1
- package/dist/context/PermissionContext.js.map +2 -2
- package/dist/context.js +87 -31
- package/dist/context.js.map +2 -2
- package/dist/core/backupHook.js +29 -0
- package/dist/core/backupHook.js.map +7 -0
- package/dist/core/config/defaults.js +11 -2
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +21 -3
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +18 -16
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +2 -2
- package/dist/core/tokenStatsManager.js +22 -4
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +3 -1
- package/dist/entrypoints/bootstrap.js.map +2 -2
- package/dist/entrypoints/cli.js +81 -68
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +1 -1
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +2 -1
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useBackgroundShells.js +29 -0
- package/dist/hooks/useBackgroundShells.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +1 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +64 -0
- package/dist/hooks/useDeferredLoading.js.map +7 -0
- package/dist/hooks/useHookStatus.js +1 -1
- package/dist/hooks/useHookStatus.js.map +2 -2
- package/dist/hooks/useSessionTracking.js +55 -0
- package/dist/hooks/useSessionTracking.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +21 -0
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useTextInput.js +1 -0
- package/dist/hooks/useTextInput.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +3 -2
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/locales/en.js +299 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +300 -2
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js +41 -17
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +94 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +27 -19
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +83 -74
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +6 -0
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/agentTeams/index.js +35 -0
- package/dist/services/agentTeams/index.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +114 -0
- package/dist/services/agentTeams/mailbox.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +149 -0
- package/dist/services/agentTeams/teamManager.js.map +7 -0
- package/dist/services/agentTeams/teamTaskStore.js +114 -0
- package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
- package/dist/services/agentTeams/teammateSpawner.js +80 -0
- package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
- package/dist/services/checkpointManager.js +16 -3
- package/dist/services/checkpointManager.js.map +2 -2
- package/dist/services/claude.js +19 -1728
- package/dist/services/claude.js.map +3 -3
- package/dist/services/customCommands.js +30 -8
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/gpt5ConnectionTest.js +4 -2
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +411 -127
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +807 -0
- package/dist/services/llm/anthropicProvider.js.map +7 -0
- package/dist/services/llm/dispatch.js +218 -0
- package/dist/services/llm/dispatch.js.map +7 -0
- package/dist/services/llm/index.js +44 -0
- package/dist/services/llm/index.js.map +7 -0
- package/dist/services/llm/mintoContext.js +69 -0
- package/dist/services/llm/mintoContext.js.map +7 -0
- package/dist/services/llm/openaiProvider.js +622 -0
- package/dist/services/llm/openaiProvider.js.map +7 -0
- package/dist/services/llm/types.js +157 -0
- package/dist/services/llm/types.js.map +7 -0
- package/dist/services/mcpClient.js +183 -33
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/notifier.js +14 -0
- package/dist/services/notifier.js.map +2 -2
- package/dist/services/oauth.js +4 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +66 -56
- package/dist/services/openai.js.map +3 -3
- package/dist/services/outputStyles.js +102 -21
- package/dist/services/outputStyles.js.map +2 -2
- package/dist/services/plugins/lspServers.js +1 -1
- package/dist/services/plugins/lspServers.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +2 -1
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +10 -3
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +20 -9
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/sentry.js +1 -1
- package/dist/services/sentry.js.map +2 -2
- package/dist/services/sessionMemory.js +16 -3
- package/dist/services/sessionMemory.js.map +2 -2
- package/dist/services/systemReminder.js +367 -9
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +19 -0
- package/dist/services/taskStore.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
- package/dist/tools/BashTool/BashTool.js +28 -0
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +8 -1
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +14 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +10 -1
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js.map +1 -1
- package/dist/tools/GrepTool/GrepTool.js.map +1 -1
- package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/LspTool/LspTool.js +11 -2
- package/dist/tools/LspTool/LspTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js.map +1 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
- package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
- package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
- package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
- package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
- package/dist/tools/TaskTool/TaskTool.js +84 -11
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +12 -6
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
- package/dist/tools/WebSearchTool/searchProviders.js +2 -1
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools/lsTool/lsTool.js.map +2 -2
- package/dist/tools/lsTool/prompt.js.map +1 -1
- package/dist/tools.js +14 -3
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +21 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/agentTeams.js +1 -0
- package/dist/types/agentTeams.js.map +7 -0
- package/dist/types/hooks.js +8 -2
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +3 -5
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +1 -4
- package/dist/utils/agentHookExecutor.js.map +2 -2
- package/dist/utils/agentLoader.js +91 -15
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.js.map +2 -2
- package/dist/utils/animationManager.js +1 -1
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +1 -1
- package/dist/utils/async.js +5 -1
- package/dist/utils/async.js.map +2 -2
- package/dist/utils/autoCompactCore.js +60 -0
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +27 -151
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +227 -0
- package/dist/utils/configSchema.js.map +7 -0
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js +4 -3
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +34 -0
- package/dist/utils/envConfig.js.map +3 -3
- package/dist/utils/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- package/dist/utils/gpt5.js +146 -0
- package/dist/utils/gpt5.js.map +7 -0
- package/dist/utils/hookManager.js +374 -140
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/markdown.js +47 -0
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memoizeWithTTL.js +25 -0
- package/dist/utils/memoizeWithTTL.js.map +7 -0
- package/dist/utils/messages.js +2 -2
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +34 -9
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +68 -29
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +249 -57
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/repoFetcher.js +110 -0
- package/dist/utils/repoFetcher.js.map +7 -0
- package/dist/utils/safeFetch.js +45 -0
- package/dist/utils/safeFetch.js.map +7 -0
- package/dist/utils/skillLoader.js +77 -12
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/streamingState.js +52 -0
- package/dist/utils/streamingState.js.map +7 -0
- package/dist/utils/stringSubstitution.js +4 -5
- package/dist/utils/stringSubstitution.js.map +2 -2
- package/dist/utils/style.js +6 -3
- package/dist/utils/style.js.map +2 -2
- package/dist/utils/teamConfig.js +162 -16
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/terminal.js +1 -1
- package/dist/utils/terminal.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +0 -6
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React, { useMemo, useCallback } from "react";
|
|
2
|
+
import { SimpleSelector } from "../components/SimpleSelector/index.js";
|
|
3
|
+
import {
|
|
4
|
+
loadAllOutputStyles,
|
|
5
|
+
clearOutputStylesCache
|
|
6
|
+
} from "../services/outputStyles.js";
|
|
7
|
+
import { getGlobalConfig, saveGlobalConfig } from "../utils/config.js";
|
|
8
|
+
function OutputStyleSelector({
|
|
9
|
+
onClose
|
|
10
|
+
}) {
|
|
11
|
+
const items = useMemo(() => {
|
|
12
|
+
clearOutputStylesCache();
|
|
13
|
+
const styles = loadAllOutputStyles();
|
|
14
|
+
const config = getGlobalConfig();
|
|
15
|
+
const currentStyle = config.outputStyle || "";
|
|
16
|
+
return styles.map((style) => {
|
|
17
|
+
const sourceLabel = style.source === "builtin" ? "built-in" : style.source === "global" ? "global" : style.source === "project" ? "project" : style.source === "plugin" ? "plugin" : "";
|
|
18
|
+
return {
|
|
19
|
+
id: style.name,
|
|
20
|
+
label: style.name,
|
|
21
|
+
description: `${style.config.description || ""} (${sourceLabel})`.trim(),
|
|
22
|
+
isCurrent: style.name === currentStyle || !currentStyle && style.name === "default"
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}, []);
|
|
26
|
+
const handleSelect = useCallback(
|
|
27
|
+
(item) => {
|
|
28
|
+
const config = getGlobalConfig();
|
|
29
|
+
const styleName = item.id === "default" ? void 0 : item.id;
|
|
30
|
+
saveGlobalConfig({ ...config, outputStyle: styleName });
|
|
31
|
+
clearOutputStylesCache();
|
|
32
|
+
onClose(`Output style set to "${item.id}".`);
|
|
33
|
+
},
|
|
34
|
+
[onClose]
|
|
35
|
+
);
|
|
36
|
+
return /* @__PURE__ */ React.createElement(
|
|
37
|
+
SimpleSelector,
|
|
38
|
+
{
|
|
39
|
+
title: "Output Style",
|
|
40
|
+
items,
|
|
41
|
+
onSelect: handleSelect,
|
|
42
|
+
onClose: () => onClose()
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const outputStyle = {
|
|
47
|
+
name: "output-style",
|
|
48
|
+
description: "Select output style for response formatting",
|
|
49
|
+
isEnabled: true,
|
|
50
|
+
isHidden: false,
|
|
51
|
+
hidePromptInput: true,
|
|
52
|
+
type: "local-jsx",
|
|
53
|
+
userFacingName() {
|
|
54
|
+
return "output-style";
|
|
55
|
+
},
|
|
56
|
+
async call(onDone) {
|
|
57
|
+
return /* @__PURE__ */ React.createElement(OutputStyleSelector, { onClose: onDone });
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var outputStyle_default = outputStyle;
|
|
61
|
+
export {
|
|
62
|
+
outputStyle_default as default
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=outputStyle.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/outputStyle.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * /output-style command\n *\n * Interactive output style selector.\n * Lists all available styles (built-in + user + project + plugin)\n * and persists the selection to GlobalConfig.\n */\n\nimport React, { useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport {\n loadAllOutputStyles,\n clearOutputStylesCache,\n} from '@services/outputStyles'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport type { Command } from '../commands'\n\nfunction OutputStyleSelector({\n onClose,\n}: {\n onClose: (result?: string) => void\n}): React.ReactNode {\n const items = useMemo((): SelectorItem[] => {\n // Force fresh load\n clearOutputStylesCache()\n const styles = loadAllOutputStyles()\n const config = getGlobalConfig()\n const currentStyle = config.outputStyle || ''\n\n return styles.map(style => {\n const sourceLabel =\n style.source === 'builtin'\n ? 'built-in'\n : style.source === 'global'\n ? 'global'\n : style.source === 'project'\n ? 'project'\n : style.source === 'plugin'\n ? 'plugin'\n : ''\n\n return {\n id: style.name,\n label: style.name,\n description:\n `${style.config.description || ''} (${sourceLabel})`.trim(),\n isCurrent:\n style.name === currentStyle ||\n (!currentStyle && style.name === 'default'),\n }\n })\n }, [])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n const config = getGlobalConfig()\n const styleName = item.id === 'default' ? undefined : item.id\n saveGlobalConfig({ ...config, outputStyle: styleName })\n\n // Clear cache so next prompt assembly picks up the change\n clearOutputStylesCache()\n\n onClose(`Output style set to \"${item.id}\".`)\n },\n [onClose],\n )\n\n return (\n <SimpleSelector\n title=\"Output Style\"\n items={items}\n onSelect={handleSelect}\n onClose={() => onClose()}\n />\n )\n}\n\nconst outputStyle: Command = {\n name: 'output-style',\n description: 'Select output style for response formatting',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'output-style'\n },\n async call(onDone) {\n return <OutputStyleSelector onClose={onDone} />\n },\n}\n\nexport default outputStyle\n"],
|
|
5
|
+
"mappings": "AAQA,OAAO,SAAS,SAAS,mBAAmB;AAC5C,SAAS,sBAAsB;AAE/B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,wBAAwB;AAGlD,SAAS,oBAAoB;AAAA,EAC3B;AACF,GAEoB;AAClB,QAAM,QAAQ,QAAQ,MAAsB;AAE1C,2BAAuB;AACvB,UAAM,SAAS,oBAAoB;AACnC,UAAM,SAAS,gBAAgB;AAC/B,UAAM,eAAe,OAAO,eAAe;AAE3C,WAAO,OAAO,IAAI,WAAS;AACzB,YAAM,cACJ,MAAM,WAAW,YACb,aACA,MAAM,WAAW,WACf,WACA,MAAM,WAAW,YACf,YACA,MAAM,WAAW,WACf,WACA;AAEZ,aAAO;AAAA,QACL,IAAI,MAAM;AAAA,QACV,OAAO,MAAM;AAAA,QACb,aACE,GAAG,MAAM,OAAO,eAAe,EAAE,KAAK,WAAW,IAAI,KAAK;AAAA,QAC5D,WACE,MAAM,SAAS,gBACd,CAAC,gBAAgB,MAAM,SAAS;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,SAAuB;AACtB,YAAM,SAAS,gBAAgB;AAC/B,YAAM,YAAY,KAAK,OAAO,YAAY,SAAY,KAAK;AAC3D,uBAAiB,EAAE,GAAG,QAAQ,aAAa,UAAU,CAAC;AAGtD,6BAAuB;AAEvB,cAAQ,wBAAwB,KAAK,EAAE,IAAI;AAAA,IAC7C;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,SAAS,MAAM,QAAQ;AAAA;AAAA,EACzB;AAEJ;AAEA,MAAM,cAAuB;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ;AACjB,WAAO,oCAAC,uBAAoB,SAAS,QAAQ;AAAA,EAC/C;AACF;AAEA,IAAO,sBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,66 +1,92 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import { Box, Text, useInput } from "ink";
|
|
1
|
+
import React from "react";
|
|
3
2
|
import {
|
|
4
3
|
getPermissionRuleEngine
|
|
5
4
|
} from "../core/permissions/index.js";
|
|
6
5
|
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
7
|
-
|
|
6
|
+
import { SimpleSelector } from "../components/SimpleSelector/index.js";
|
|
7
|
+
import { t } from "../i18n/index.js";
|
|
8
|
+
function getDecisionIcon(decision) {
|
|
9
|
+
switch (decision) {
|
|
10
|
+
case "allow":
|
|
11
|
+
return "\u2713";
|
|
12
|
+
case "deny":
|
|
13
|
+
return "\u2717";
|
|
14
|
+
case "ask":
|
|
15
|
+
return "?";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function getDecisionColor(decision) {
|
|
19
|
+
switch (decision) {
|
|
20
|
+
case "allow":
|
|
21
|
+
return SEMANTIC_COLORS.success;
|
|
22
|
+
case "deny":
|
|
23
|
+
return SEMANTIC_COLORS.error;
|
|
24
|
+
case "ask":
|
|
25
|
+
return "#FFB86C";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function formatDecision(decision) {
|
|
29
|
+
switch (decision) {
|
|
30
|
+
case "allow":
|
|
31
|
+
return "ALLOW";
|
|
32
|
+
case "deny":
|
|
33
|
+
return "DENY";
|
|
34
|
+
case "ask":
|
|
35
|
+
return "ASK";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function rulesToSelectorItems(rules) {
|
|
39
|
+
return rules.map((rule) => ({
|
|
40
|
+
id: rule.id,
|
|
41
|
+
label: `${formatDecision(rule.decision).padEnd(6)} ${rule.pattern}`,
|
|
42
|
+
description: rule.description ? `P${rule.priority} - ${rule.description}` : `P${rule.priority}`,
|
|
43
|
+
statusIcon: getDecisionIcon(rule.decision),
|
|
44
|
+
statusColor: getDecisionColor(rule.decision),
|
|
45
|
+
category: rule.scope === "project" ? "Project Rules" : "Global Rules"
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
const PermissionsView = ({
|
|
8
49
|
rules,
|
|
9
50
|
defaultDecision,
|
|
10
51
|
onDone
|
|
11
52
|
}) => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
case "ask":
|
|
41
|
-
return "? ASK";
|
|
53
|
+
const items = rulesToSelectorItems(rules);
|
|
54
|
+
if (rules.length === 0) {
|
|
55
|
+
return /* @__PURE__ */ React.createElement(
|
|
56
|
+
SimpleSelector,
|
|
57
|
+
{
|
|
58
|
+
title: t("commands.permissions.description"),
|
|
59
|
+
subtitle: `${t("common.default")}: ${formatDecision(defaultDecision)}`,
|
|
60
|
+
items: [
|
|
61
|
+
{
|
|
62
|
+
id: "empty",
|
|
63
|
+
label: "No custom rules defined. Using default rules."
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
onSelect: () => onDone(),
|
|
67
|
+
onClose: () => onDone()
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
return /* @__PURE__ */ React.createElement(
|
|
72
|
+
SimpleSelector,
|
|
73
|
+
{
|
|
74
|
+
title: "Permission Rules",
|
|
75
|
+
subtitle: `${t("common.default")}: ${formatDecision(defaultDecision)}`,
|
|
76
|
+
items,
|
|
77
|
+
groupByCategory: true,
|
|
78
|
+
onSelect: () => {
|
|
79
|
+
},
|
|
80
|
+
onClose: () => onDone()
|
|
42
81
|
}
|
|
43
|
-
|
|
44
|
-
const renderRule = (rule, index) => {
|
|
45
|
-
const isSelected = index === selectedIndex;
|
|
46
|
-
return /* @__PURE__ */ React.createElement(Box, { key: rule.id, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u25B6 " : " ", /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(rule.decision) }, formatDecision(rule.decision).padEnd(10)), /* @__PURE__ */ React.createElement(Text, { bold: true }, rule.pattern.padEnd(30)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "P", rule.priority), rule.description && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " - ", rule.description)));
|
|
47
|
-
};
|
|
48
|
-
let displayIndex = 0;
|
|
49
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Permission Rules")), /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Default decision: "), /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(defaultDecision), bold: true }, formatDecision(defaultDecision)))), projectRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "blue" }, "Project Rules (", projectRules.length, ")")), projectRules.map((rule) => {
|
|
50
|
-
const result = renderRule(rule, displayIndex);
|
|
51
|
-
displayIndex++;
|
|
52
|
-
return result;
|
|
53
|
-
})), globalRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "magenta" }, "Global Rules (", globalRules.length, ")")), globalRules.map((rule) => {
|
|
54
|
-
const result = renderRule(rule, displayIndex);
|
|
55
|
-
displayIndex++;
|
|
56
|
-
return result;
|
|
57
|
-
})), rules.length === 0 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "No custom rules defined. Using default rules.")), /* @__PURE__ */ React.createElement(Box, { marginTop: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191/\u2193: Navigate | q/Esc: Exit")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Legend: ", /* @__PURE__ */ React.createElement(Text, { color: "green" }, "ALLOW"), " = auto-approve,", " ", /* @__PURE__ */ React.createElement(Text, { color: "red" }, "DENY"), " = block, ", /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "ASK"), " ", "= prompt user")));
|
|
82
|
+
);
|
|
58
83
|
};
|
|
59
84
|
const command = {
|
|
60
85
|
name: "permissions",
|
|
61
86
|
description: "View and manage permission rules for tool access",
|
|
62
87
|
isEnabled: true,
|
|
63
88
|
isHidden: false,
|
|
89
|
+
hidePromptInput: true,
|
|
64
90
|
type: "local-jsx",
|
|
65
91
|
aliases: ["perms"],
|
|
66
92
|
userFacingName() {
|
|
@@ -71,7 +97,7 @@ const command = {
|
|
|
71
97
|
const rules = engine.getRules();
|
|
72
98
|
const defaultDecision = engine.getDefaultDecision();
|
|
73
99
|
return /* @__PURE__ */ React.createElement(
|
|
74
|
-
|
|
100
|
+
PermissionsView,
|
|
75
101
|
{
|
|
76
102
|
rules,
|
|
77
103
|
defaultDecision,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/permissions.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Permissions Command\n *\n * View and manage permission rules for tool access.\n */\n\nimport React
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Permissions Command\n *\n * View and manage permission rules for tool access.\n * Uses SimpleSelector with groupByCategory for consistent UI.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getPermissionRuleEngine,\n type PatternPermissionRule,\n type RulePermissionDecision,\n} from '../core/permissions'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport { t } from '@i18n'\n\nfunction getDecisionIcon(decision: RulePermissionDecision): string {\n switch (decision) {\n case 'allow':\n return '\\u2713'\n case 'deny':\n return '\\u2717'\n case 'ask':\n return '?'\n }\n}\n\nfunction getDecisionColor(decision: RulePermissionDecision): string {\n switch (decision) {\n case 'allow':\n return SEMANTIC_COLORS.success\n case 'deny':\n return SEMANTIC_COLORS.error\n case 'ask':\n return '#FFB86C' // warning\n }\n}\n\nfunction formatDecision(decision: RulePermissionDecision): string {\n switch (decision) {\n case 'allow':\n return 'ALLOW'\n case 'deny':\n return 'DENY'\n case 'ask':\n return 'ASK'\n }\n}\n\nfunction rulesToSelectorItems(rules: PatternPermissionRule[]): SelectorItem[] {\n return rules.map(rule => ({\n id: rule.id,\n label: `${formatDecision(rule.decision).padEnd(6)} ${rule.pattern}`,\n description: rule.description\n ? `P${rule.priority} - ${rule.description}`\n : `P${rule.priority}`,\n statusIcon: getDecisionIcon(rule.decision),\n statusColor: getDecisionColor(rule.decision),\n category: rule.scope === 'project' ? 'Project Rules' : 'Global Rules',\n }))\n}\n\ninterface PermissionsViewProps {\n rules: PatternPermissionRule[]\n defaultDecision: RulePermissionDecision\n onDone: (result?: string) => void\n}\n\nconst PermissionsView: React.FC<PermissionsViewProps> = ({\n rules,\n defaultDecision,\n onDone,\n}) => {\n const items = rulesToSelectorItems(rules)\n\n if (rules.length === 0) {\n return (\n <SimpleSelector\n title={t('commands.permissions.description')}\n subtitle={`${t('common.default')}: ${formatDecision(defaultDecision)}`}\n items={[\n {\n id: 'empty',\n label: 'No custom rules defined. Using default rules.',\n },\n ]}\n onSelect={() => onDone()}\n onClose={() => onDone()}\n />\n )\n }\n\n return (\n <SimpleSelector\n title=\"Permission Rules\"\n subtitle={`${t('common.default')}: ${formatDecision(defaultDecision)}`}\n items={items}\n groupByCategory={true}\n onSelect={() => {\n /* read-only for now */\n }}\n onClose={() => onDone()}\n />\n )\n}\n\nconst command: Command = {\n name: 'permissions',\n description: 'View and manage permission rules for tool access',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n aliases: ['perms'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const engine = getPermissionRuleEngine()\n const rules = engine.getRules()\n const defaultDecision = engine.getDefaultDecision()\n\n return (\n <PermissionsView\n rules={rules}\n defaultDecision={defaultDecision}\n onDone={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,WAAW;AAGlB;AAAA,EACE;AAAA,OAGK;AACP,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAE/B,SAAS,SAAS;AAElB,SAAS,gBAAgB,UAA0C;AACjE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,iBAAiB,UAA0C;AAClE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,gBAAgB;AAAA,IACzB,KAAK;AACH,aAAO,gBAAgB;AAAA,IACzB,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,UAA0C;AAChE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,OAAgD;AAC5E,SAAO,MAAM,IAAI,WAAS;AAAA,IACxB,IAAI,KAAK;AAAA,IACT,OAAO,GAAG,eAAe,KAAK,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO;AAAA,IACjE,aAAa,KAAK,cACd,IAAI,KAAK,QAAQ,MAAM,KAAK,WAAW,KACvC,IAAI,KAAK,QAAQ;AAAA,IACrB,YAAY,gBAAgB,KAAK,QAAQ;AAAA,IACzC,aAAa,iBAAiB,KAAK,QAAQ;AAAA,IAC3C,UAAU,KAAK,UAAU,YAAY,kBAAkB;AAAA,EACzD,EAAE;AACJ;AAQA,MAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,qBAAqB,KAAK;AAExC,MAAI,MAAM,WAAW,GAAG;AACtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,kCAAkC;AAAA,QAC3C,UAAU,GAAG,EAAE,gBAAgB,CAAC,KAAK,eAAe,eAAe,CAAC;AAAA,QACpE,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,UAAU,MAAM,OAAO;AAAA,QACvB,SAAS,MAAM,OAAO;AAAA;AAAA,IACxB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,UAAU,GAAG,EAAE,gBAAgB,CAAC,KAAK,eAAe,eAAe,CAAC;AAAA,MACpE;AAAA,MACA,iBAAiB;AAAA,MACjB,UAAU,MAAM;AAAA,MAEhB;AAAA,MACA,SAAS,MAAM,OAAO;AAAA;AAAA,EACxB;AAEJ;AAEA,MAAM,UAAmB;AAAA,EACvB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,SAAS,CAAC,OAAO;AAAA,EAEjB,iBAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,QAAQ,UAAU;AAC3B,UAAM,SAAS,wBAAwB;AACvC,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,kBAAkB,OAAO,mBAAmB;AAElD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAO,sBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { getCwd } from "../../utils/state.js";
|
|
1
5
|
function truncate(text, maxLength) {
|
|
2
6
|
if (text.length <= maxLength) return text;
|
|
3
7
|
return text.slice(0, maxLength - 3) + "...";
|
|
@@ -56,7 +60,35 @@ function formatTimeAgo(date) {
|
|
|
56
60
|
return formatDate(d);
|
|
57
61
|
}
|
|
58
62
|
function countInstalledPlugins(marketplaceName) {
|
|
59
|
-
|
|
63
|
+
const cwd = getCwd();
|
|
64
|
+
const home = homedir();
|
|
65
|
+
const pluginDirs = [
|
|
66
|
+
join(home, ".claude", "plugins"),
|
|
67
|
+
join(home, ".minto", "plugins"),
|
|
68
|
+
join(cwd, ".claude", "plugins"),
|
|
69
|
+
join(cwd, ".minto", "plugins")
|
|
70
|
+
];
|
|
71
|
+
let count = 0;
|
|
72
|
+
for (const dir of pluginDirs) {
|
|
73
|
+
if (!existsSync(dir)) continue;
|
|
74
|
+
try {
|
|
75
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
if (!entry.isDirectory()) continue;
|
|
78
|
+
const metaPath = join(dir, entry.name, ".marketplace-meta.json");
|
|
79
|
+
if (!existsSync(metaPath)) continue;
|
|
80
|
+
try {
|
|
81
|
+
const meta = JSON.parse(readFileSync(metaPath, "utf-8"));
|
|
82
|
+
if (meta.marketplace === marketplaceName) {
|
|
83
|
+
count++;
|
|
84
|
+
}
|
|
85
|
+
} catch {
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch {
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return count;
|
|
60
92
|
}
|
|
61
93
|
function formatAuthor(author) {
|
|
62
94
|
if (!author) return "Unknown";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/utils.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Plugin Command Utility Functions\n *\n * Helper functions for formatting and displaying plugin information.\n */\n\n/**\n * Truncate text to maximum length\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Format date as YYYY/MM/DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}/${month}/${day}`\n}\n\n/**\n * Format plugin count statistics for display.\n *\n * @param available - Total number of plugins available in marketplace\n * @param installed - Number of plugins already installed\n * @returns Formatted string like \"65 plugins available \u00B7 8 already installed\"\n */\nexport const formatPluginCount = (\n available: number,\n installed: number,\n): string => {\n const availableText =\n available === 1 ? '1 plugin available' : `${available} plugins available`\n const installedText =\n installed === 1 ? '1 already installed' : `${installed} already installed`\n return `${availableText} \u00B7 ${installedText}`\n}\n\n/**\n * Shorten long file paths for display.\n * Truncates from the beginning if path exceeds max length.\n *\n * @param path - Full file system path\n * @param maxLength - Maximum length before truncation (default: 80)\n * @returns Formatted path, possibly with leading \"...\"\n */\nexport const formatMarketplacePathShort = (\n path: string,\n maxLength: number = 80,\n): string => {\n if (path.length > maxLength) {\n return '...' + path.slice(-(maxLength - 3))\n }\n return path\n}\n\n/**\n * Format marketplace source path for display\n */\nexport function formatMarketplacePath(source: any): string {\n switch (source.type) {\n case 'github':\n return `github:${source.repo}${source.ref ? `@${source.ref}` : ''}`\n case 'url':\n return truncate(source.url, 60)\n case 'local':\n return source.path\n default:\n return 'unknown'\n }\n}\n\n/**\n * Format marketplace source for display.\n * Converts source type and details into readable string.\n *\n * @param type - Source type (github, url, local)\n * @param details - Additional source details\n * @returns Formatted source string\n */\nexport const formatMarketplaceSource = (\n type: string,\n details: string,\n): string => {\n switch (type) {\n case 'github':\n return `GitHub: ${details}`\n case 'url':\n return `URL: ${details}`\n case 'local':\n return `Local: ${formatMarketplacePathShort(details)}`\n default:\n return `${type}: ${details}`\n }\n}\n\n/**\n * Format time ago\n */\nexport function formatTimeAgo(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const seconds = Math.floor((now.getTime() - d.getTime()) / 1000)\n\n if (seconds < 60) return 'just now'\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`\n if (seconds < 2592000) return `${Math.floor(seconds / 604800)}w ago`\n\n return formatDate(d)\n}\n\n/**\n * Count installed plugins from a marketplace\n */\nexport function countInstalledPlugins(marketplaceName: string): number {\n
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Command Utility Functions\n *\n * Helper functions for formatting and displaying plugin information.\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { getCwd } from '@utils/state'\n\n/**\n * Truncate text to maximum length\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Format date as YYYY/MM/DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}/${month}/${day}`\n}\n\n/**\n * Format plugin count statistics for display.\n *\n * @param available - Total number of plugins available in marketplace\n * @param installed - Number of plugins already installed\n * @returns Formatted string like \"65 plugins available \u00B7 8 already installed\"\n */\nexport const formatPluginCount = (\n available: number,\n installed: number,\n): string => {\n const availableText =\n available === 1 ? '1 plugin available' : `${available} plugins available`\n const installedText =\n installed === 1 ? '1 already installed' : `${installed} already installed`\n return `${availableText} \u00B7 ${installedText}`\n}\n\n/**\n * Shorten long file paths for display.\n * Truncates from the beginning if path exceeds max length.\n *\n * @param path - Full file system path\n * @param maxLength - Maximum length before truncation (default: 80)\n * @returns Formatted path, possibly with leading \"...\"\n */\nexport const formatMarketplacePathShort = (\n path: string,\n maxLength: number = 80,\n): string => {\n if (path.length > maxLength) {\n return '...' + path.slice(-(maxLength - 3))\n }\n return path\n}\n\n/**\n * Format marketplace source path for display\n */\nexport function formatMarketplacePath(source: any): string {\n switch (source.type) {\n case 'github':\n return `github:${source.repo}${source.ref ? `@${source.ref}` : ''}`\n case 'url':\n return truncate(source.url, 60)\n case 'local':\n return source.path\n default:\n return 'unknown'\n }\n}\n\n/**\n * Format marketplace source for display.\n * Converts source type and details into readable string.\n *\n * @param type - Source type (github, url, local)\n * @param details - Additional source details\n * @returns Formatted source string\n */\nexport const formatMarketplaceSource = (\n type: string,\n details: string,\n): string => {\n switch (type) {\n case 'github':\n return `GitHub: ${details}`\n case 'url':\n return `URL: ${details}`\n case 'local':\n return `Local: ${formatMarketplacePathShort(details)}`\n default:\n return `${type}: ${details}`\n }\n}\n\n/**\n * Format time ago\n */\nexport function formatTimeAgo(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const seconds = Math.floor((now.getTime() - d.getTime()) / 1000)\n\n if (seconds < 60) return 'just now'\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`\n if (seconds < 2592000) return `${Math.floor(seconds / 604800)}w ago`\n\n return formatDate(d)\n}\n\n/**\n * Count installed plugins from a marketplace by scanning plugin directories\n * for .marketplace-meta.json files matching the given marketplace name.\n */\nexport function countInstalledPlugins(marketplaceName: string): number {\n const cwd = getCwd()\n const home = homedir()\n\n const pluginDirs = [\n join(home, '.claude', 'plugins'),\n join(home, '.minto', 'plugins'),\n join(cwd, '.claude', 'plugins'),\n join(cwd, '.minto', 'plugins'),\n ]\n\n let count = 0\n for (const dir of pluginDirs) {\n if (!existsSync(dir)) continue\n try {\n const entries = readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const metaPath = join(dir, entry.name, '.marketplace-meta.json')\n if (!existsSync(metaPath)) continue\n try {\n const meta = JSON.parse(readFileSync(metaPath, 'utf-8'))\n if (meta.marketplace === marketplaceName) {\n count++\n }\n } catch {\n // Skip invalid meta files\n }\n }\n } catch {\n // Skip inaccessible directories\n }\n }\n return count\n}\n\n/**\n * Format author field for display.\n * Handles both string and object formats.\n *\n * @param author - Author information (string or object)\n * @returns Formatted author string\n */\nexport function formatAuthor(\n author: string | { name: string; email?: string; url?: string } | undefined,\n): string {\n if (!author) return 'Unknown'\n if (typeof author === 'string') return author\n return author.name\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|