@within-7/minto 0.3.10 → 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.
Files changed (306) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +2 -2
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/ctx_viz.js +1 -1
  5. package/dist/commands/effort.js +87 -0
  6. package/dist/commands/effort.js.map +7 -0
  7. package/dist/commands/export.js +19 -9
  8. package/dist/commands/export.js.map +2 -2
  9. package/dist/commands/ide.js +18 -0
  10. package/dist/commands/ide.js.map +7 -0
  11. package/dist/commands/mcp-interactive.js +14 -8
  12. package/dist/commands/mcp-interactive.js.map +2 -2
  13. package/dist/commands/memory.js +168 -0
  14. package/dist/commands/memory.js.map +7 -0
  15. package/dist/commands/model.js +45 -2
  16. package/dist/commands/model.js.map +2 -2
  17. package/dist/commands/outputStyle.js +64 -0
  18. package/dist/commands/outputStyle.js.map +7 -0
  19. package/dist/commands/plugin/utils.js +33 -1
  20. package/dist/commands/plugin/utils.js.map +2 -2
  21. package/dist/commands/plugin.js +10 -1
  22. package/dist/commands/plugin.js.map +2 -2
  23. package/dist/commands/refreshCommands.js +2 -0
  24. package/dist/commands/refreshCommands.js.map +2 -2
  25. package/dist/commands/review.js +51 -0
  26. package/dist/commands/review.js.map +7 -0
  27. package/dist/commands/terminalSetup.js +6 -0
  28. package/dist/commands/terminalSetup.js.map +2 -2
  29. package/dist/commands/undo.js +8 -0
  30. package/dist/commands/undo.js.map +2 -2
  31. package/dist/commands/vim.js +22 -0
  32. package/dist/commands/vim.js.map +7 -0
  33. package/dist/commands.js +12 -0
  34. package/dist/commands.js.map +2 -2
  35. package/dist/components/HighlightedCode.js +1 -0
  36. package/dist/components/HighlightedCode.js.map +2 -2
  37. package/dist/components/ModelSelector/ModelSelector.js +250 -143
  38. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  39. package/dist/components/PromptInput.js +21 -6
  40. package/dist/components/PromptInput.js.map +2 -2
  41. package/dist/components/PulseLabel.js +44 -0
  42. package/dist/components/PulseLabel.js.map +7 -0
  43. package/dist/components/RequestStatusIndicator.js +1 -1
  44. package/dist/components/RequestStatusIndicator.js.map +1 -1
  45. package/dist/components/Spinner.js +12 -42
  46. package/dist/components/Spinner.js.map +3 -3
  47. package/dist/components/StartupStatus.js +57 -0
  48. package/dist/components/StartupStatus.js.map +7 -0
  49. package/dist/components/SubagentBlock.js +43 -6
  50. package/dist/components/SubagentBlock.js.map +2 -2
  51. package/dist/components/TabbedListView/TabBar.js +13 -8
  52. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  53. package/dist/components/TabbedListView/TabbedListView.js +1 -1
  54. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  55. package/dist/components/TodoPanel.js +1 -1
  56. package/dist/components/TodoPanel.js.map +1 -1
  57. package/dist/components/ToolUseLoader.js +5 -0
  58. package/dist/components/ToolUseLoader.js.map +2 -2
  59. package/dist/components/TrustDialog.js +0 -2
  60. package/dist/components/TrustDialog.js.map +2 -2
  61. package/dist/components/messages/TaskInModuleView.js +1 -1
  62. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  63. package/dist/components/messages/TaskToolMessage.js +1 -1
  64. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  65. package/dist/components/messages/UserPromptMessage.js +6 -1
  66. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  67. package/dist/constants/modelCapabilities.js +103 -18
  68. package/dist/constants/modelCapabilities.js.map +2 -2
  69. package/dist/constants/product.js +2 -0
  70. package/dist/constants/product.js.map +2 -2
  71. package/dist/constants/prompts/agentPrompt.js +30 -0
  72. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  73. package/dist/constants/prompts/codeConventions.js +27 -0
  74. package/dist/constants/prompts/codeConventions.js.map +7 -0
  75. package/dist/constants/prompts/doingTasks.js +15 -0
  76. package/dist/constants/prompts/doingTasks.js.map +7 -0
  77. package/dist/constants/prompts/envInfo.js +17 -0
  78. package/dist/constants/prompts/envInfo.js.map +7 -0
  79. package/dist/constants/prompts/executingWithCare.js +17 -0
  80. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  81. package/dist/constants/prompts/identity.js +10 -0
  82. package/dist/constants/prompts/identity.js.map +7 -0
  83. package/dist/constants/prompts/index.js +78 -0
  84. package/dist/constants/prompts/index.js.map +7 -0
  85. package/dist/constants/prompts/taskManagement.js +60 -0
  86. package/dist/constants/prompts/taskManagement.js.map +7 -0
  87. package/dist/constants/prompts/toneAndStyle.js +62 -0
  88. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  89. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  90. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  91. package/dist/constants/prompts.js +5 -176
  92. package/dist/constants/prompts.js.map +2 -2
  93. package/dist/constants/providerRegistry.js +235 -0
  94. package/dist/constants/providerRegistry.js.map +7 -0
  95. package/dist/constants/providers.js +35 -0
  96. package/dist/constants/providers.js.map +7 -0
  97. package/dist/context/PermissionContext.js +0 -1
  98. package/dist/context/PermissionContext.js.map +2 -2
  99. package/dist/context.js +87 -31
  100. package/dist/context.js.map +2 -2
  101. package/dist/core/backupHook.js +2 -2
  102. package/dist/core/backupHook.js.map +2 -2
  103. package/dist/core/config/defaults.js +4 -1
  104. package/dist/core/config/defaults.js.map +2 -2
  105. package/dist/core/config/schema.js +7 -1
  106. package/dist/core/config/schema.js.map +2 -2
  107. package/dist/core/costTracker.js +18 -0
  108. package/dist/core/costTracker.js.map +2 -2
  109. package/dist/core/index.js +0 -1
  110. package/dist/core/index.js.map +2 -2
  111. package/dist/core/tokenStatsManager.js +22 -4
  112. package/dist/core/tokenStatsManager.js.map +2 -2
  113. package/dist/entrypoints/cli.js +65 -84
  114. package/dist/entrypoints/cli.js.map +2 -2
  115. package/dist/hooks/useAgentTokenStats.js +1 -1
  116. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  117. package/dist/hooks/useAgentTranscripts.js +2 -1
  118. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  119. package/dist/hooks/useBackgroundShells.js +29 -0
  120. package/dist/hooks/useBackgroundShells.js.map +7 -0
  121. package/dist/hooks/useCanUseTool.js +1 -1
  122. package/dist/hooks/useCanUseTool.js.map +2 -2
  123. package/dist/hooks/useDeferredLoading.js +64 -0
  124. package/dist/hooks/useDeferredLoading.js.map +7 -0
  125. package/dist/hooks/useHookStatus.js +1 -1
  126. package/dist/hooks/useHookStatus.js.map +2 -2
  127. package/dist/hooks/useSessionTracking.js +55 -0
  128. package/dist/hooks/useSessionTracking.js.map +7 -0
  129. package/dist/hooks/useTerminalSize.js +21 -0
  130. package/dist/hooks/useTerminalSize.js.map +2 -2
  131. package/dist/hooks/useTextInput.js +1 -0
  132. package/dist/hooks/useTextInput.js.map +2 -2
  133. package/dist/hooks/useUnifiedCompletion.js +3 -2
  134. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  135. package/dist/i18n/locales/en.js +8 -9
  136. package/dist/i18n/locales/en.js.map +2 -2
  137. package/dist/i18n/locales/zh-CN.js +8 -9
  138. package/dist/i18n/locales/zh-CN.js.map +2 -2
  139. package/dist/i18n/types.js.map +1 -1
  140. package/dist/messages.js +41 -17
  141. package/dist/messages.js.map +2 -2
  142. package/dist/permissions.js +94 -1
  143. package/dist/permissions.js.map +2 -2
  144. package/dist/query.js +27 -19
  145. package/dist/query.js.map +2 -2
  146. package/dist/screens/REPL.js +83 -74
  147. package/dist/screens/REPL.js.map +2 -2
  148. package/dist/services/adapters/responsesAPI.js +6 -0
  149. package/dist/services/adapters/responsesAPI.js.map +2 -2
  150. package/dist/services/agentTeams/index.js +35 -0
  151. package/dist/services/agentTeams/index.js.map +7 -0
  152. package/dist/services/agentTeams/mailbox.js +114 -0
  153. package/dist/services/agentTeams/mailbox.js.map +7 -0
  154. package/dist/services/agentTeams/teamManager.js +149 -0
  155. package/dist/services/agentTeams/teamManager.js.map +7 -0
  156. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  157. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  158. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  159. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  160. package/dist/services/checkpointManager.js +16 -3
  161. package/dist/services/checkpointManager.js.map +2 -2
  162. package/dist/services/claude.js +19 -1728
  163. package/dist/services/claude.js.map +3 -3
  164. package/dist/services/gpt5ConnectionTest.js +4 -2
  165. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  166. package/dist/services/hookExecutor.js +411 -127
  167. package/dist/services/hookExecutor.js.map +2 -2
  168. package/dist/services/llm/anthropicProvider.js +807 -0
  169. package/dist/services/llm/anthropicProvider.js.map +7 -0
  170. package/dist/services/llm/dispatch.js +218 -0
  171. package/dist/services/llm/dispatch.js.map +7 -0
  172. package/dist/services/llm/index.js +44 -0
  173. package/dist/services/llm/index.js.map +7 -0
  174. package/dist/services/llm/mintoContext.js +69 -0
  175. package/dist/services/llm/mintoContext.js.map +7 -0
  176. package/dist/services/llm/openaiProvider.js +622 -0
  177. package/dist/services/llm/openaiProvider.js.map +7 -0
  178. package/dist/services/llm/types.js +157 -0
  179. package/dist/services/llm/types.js.map +7 -0
  180. package/dist/services/mcpClient.js +183 -33
  181. package/dist/services/mcpClient.js.map +2 -2
  182. package/dist/services/notifier.js +14 -0
  183. package/dist/services/notifier.js.map +2 -2
  184. package/dist/services/oauth.js +4 -2
  185. package/dist/services/oauth.js.map +2 -2
  186. package/dist/services/openai.js +66 -56
  187. package/dist/services/openai.js.map +3 -3
  188. package/dist/services/outputStyles.js +102 -21
  189. package/dist/services/outputStyles.js.map +2 -2
  190. package/dist/services/plugins/skillMarketplace.js +4 -1
  191. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  192. package/dist/services/sentry.js +1 -1
  193. package/dist/services/sentry.js.map +2 -2
  194. package/dist/services/sessionMemory.js +16 -3
  195. package/dist/services/sessionMemory.js.map +2 -2
  196. package/dist/services/systemReminder.js +350 -3
  197. package/dist/services/systemReminder.js.map +2 -2
  198. package/dist/services/taskStore.js +19 -0
  199. package/dist/services/taskStore.js.map +2 -2
  200. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  201. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  202. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  203. package/dist/tools/BashTool/BashTool.js +28 -0
  204. package/dist/tools/BashTool/BashTool.js.map +2 -2
  205. package/dist/tools/FileEditTool/FileEditTool.js +1 -1
  206. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  207. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  208. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  209. package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
  210. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  211. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  212. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  213. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  214. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  215. package/dist/tools/LspTool/LspTool.js +11 -2
  216. package/dist/tools/LspTool/LspTool.js.map +2 -2
  217. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  218. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  219. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  220. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  221. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  222. package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
  223. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
  224. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  225. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  226. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  227. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  228. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  229. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  230. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  231. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  232. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  233. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  234. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  235. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  236. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  237. package/dist/tools/TaskTool/TaskTool.js +75 -5
  238. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  239. package/dist/tools/TaskTool/prompt.js +12 -6
  240. package/dist/tools/TaskTool/prompt.js.map +2 -2
  241. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  242. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  243. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  244. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  245. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  246. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  247. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  248. package/dist/tools/lsTool/lsTool.js.map +2 -2
  249. package/dist/tools/lsTool/prompt.js.map +1 -1
  250. package/dist/tools.js +14 -3
  251. package/dist/tools.js.map +2 -2
  252. package/dist/types/PermissionMode.js +21 -1
  253. package/dist/types/PermissionMode.js.map +2 -2
  254. package/dist/types/agentTeams.js +1 -0
  255. package/dist/types/agentTeams.js.map +7 -0
  256. package/dist/types/hooks.js +8 -2
  257. package/dist/types/hooks.js.map +2 -2
  258. package/dist/types/plugin.js +1 -1
  259. package/dist/types/plugin.js.map +2 -2
  260. package/dist/utils/agentLoader.js +25 -3
  261. package/dist/utils/agentLoader.js.map +2 -2
  262. package/dist/utils/animationManager.js +1 -1
  263. package/dist/utils/animationManager.js.map +2 -2
  264. package/dist/utils/ask.js +1 -1
  265. package/dist/utils/async.js +5 -1
  266. package/dist/utils/async.js.map +2 -2
  267. package/dist/utils/autoCompactCore.js +60 -0
  268. package/dist/utils/autoCompactCore.js.map +2 -2
  269. package/dist/utils/config.js +26 -128
  270. package/dist/utils/config.js.map +2 -2
  271. package/dist/utils/configSchema.js +227 -0
  272. package/dist/utils/configSchema.js.map +7 -0
  273. package/dist/utils/debugLogger.js.map +2 -2
  274. package/dist/utils/env.js +4 -3
  275. package/dist/utils/env.js.map +2 -2
  276. package/dist/utils/envConfig.js +34 -0
  277. package/dist/utils/envConfig.js.map +3 -3
  278. package/dist/utils/gpt5.js +146 -0
  279. package/dist/utils/gpt5.js.map +7 -0
  280. package/dist/utils/hookManager.js +374 -140
  281. package/dist/utils/hookManager.js.map +2 -2
  282. package/dist/utils/markdown.js +47 -0
  283. package/dist/utils/markdown.js.map +2 -2
  284. package/dist/utils/memoizeWithTTL.js +25 -0
  285. package/dist/utils/memoizeWithTTL.js.map +7 -0
  286. package/dist/utils/model.js +34 -9
  287. package/dist/utils/model.js.map +2 -2
  288. package/dist/utils/pluginInstaller.js +34 -5
  289. package/dist/utils/pluginInstaller.js.map +2 -2
  290. package/dist/utils/pluginLoader.js +201 -32
  291. package/dist/utils/pluginLoader.js.map +2 -2
  292. package/dist/utils/safeFetch.js +45 -0
  293. package/dist/utils/safeFetch.js.map +7 -0
  294. package/dist/utils/skillLoader.js +59 -6
  295. package/dist/utils/skillLoader.js.map +2 -2
  296. package/dist/utils/streamingState.js +52 -0
  297. package/dist/utils/streamingState.js.map +7 -0
  298. package/dist/utils/style.js +6 -3
  299. package/dist/utils/style.js.map +2 -2
  300. package/dist/utils/teamConfig.js +9 -3
  301. package/dist/utils/teamConfig.js.map +2 -2
  302. package/dist/utils/toolRiskClassification.js +0 -6
  303. package/dist/utils/toolRiskClassification.js.map +2 -2
  304. package/dist/version.js +2 -2
  305. package/dist/version.js.map +1 -1
  306. package/package.json +2 -1
@@ -5,27 +5,48 @@ import {
5
5
  statSync,
6
6
  writeFileSync
7
7
  } from "fs";
8
- import { join, basename } from "path";
8
+ import { debug as debugLogger } from "./debugLogger.js";
9
+ import { join, resolve, basename } from "path";
9
10
  import { homedir } from "os";
10
11
  import matter from "gray-matter";
12
+ import { validatePluginDirectory } from "../services/plugins/pluginValidation.js";
11
13
  import {
12
14
  PluginManifestSchema,
13
15
  PluginError,
14
16
  PluginErrorCode
15
17
  } from "../types/plugin.js";
16
18
  import { getCwd } from "./state.js";
19
+ let extraPluginDirs = [];
20
+ function addExtraPluginDir(dir) {
21
+ const resolved = resolve(dir);
22
+ if (!extraPluginDirs.includes(resolved)) {
23
+ extraPluginDirs.push(resolved);
24
+ }
25
+ }
26
+ function getManagedPluginsDir() {
27
+ if (process.platform === "darwin") {
28
+ return "/Library/Application Support/Minto/managed-plugins";
29
+ }
30
+ return "/etc/minto/managed-plugins";
31
+ }
17
32
  function getPluginDirectories() {
18
33
  const cwd = getCwd();
19
34
  const home = homedir();
20
35
  return [
36
+ getManagedPluginsDir(),
37
+ // Managed (enterprise, read-only, lowest)
21
38
  join(home, ".claude", "plugins"),
22
39
  // User global (legacy)
23
40
  join(home, ".minto", "plugins"),
24
41
  // User global
25
42
  join(cwd, ".claude", "plugins"),
26
43
  // Project (legacy)
27
- join(cwd, ".minto", "plugins")
28
- // Project (highest priority)
44
+ join(cwd, ".minto", "plugins"),
45
+ // Project
46
+ join(cwd, ".minto", "plugins.local"),
47
+ // Project local (gitignored)
48
+ ...extraPluginDirs
49
+ // CLI --plugin-dir (highest priority)
29
50
  ];
30
51
  }
31
52
  function discoverPluginPaths() {
@@ -95,7 +116,7 @@ function loadAgents(pluginPath, manifest) {
95
116
  for (const agentPath of manifest.agents || []) {
96
117
  const fullPath = join(pluginPath, agentPath);
97
118
  if (!existsSync(fullPath)) {
98
- console.warn(`Agent file not found: ${fullPath}`);
119
+ debugLogger.warn("PLUGIN_LOADER", `Agent file not found: ${fullPath}`);
99
120
  continue;
100
121
  }
101
122
  try {
@@ -114,7 +135,10 @@ function loadAgents(pluginPath, manifest) {
114
135
  pluginName: manifest.name
115
136
  });
116
137
  } catch (error) {
117
- console.error(`Error loading agent ${agentPath}:`, error);
138
+ debugLogger.warn(
139
+ "PLUGIN_LOADER",
140
+ `Error loading agent ${agentPath}: ${error instanceof Error ? error.message : String(error)}`
141
+ );
118
142
  }
119
143
  }
120
144
  if (existsSync(agentsDir) && statSync(agentsDir).isDirectory()) {
@@ -138,7 +162,10 @@ function loadAgents(pluginPath, manifest) {
138
162
  pluginName: manifest.name
139
163
  });
140
164
  } catch (error) {
141
- console.error(`Error loading agent ${file}:`, error);
165
+ debugLogger.warn(
166
+ "PLUGIN_LOADER",
167
+ `Error loading agent ${file}: ${error instanceof Error ? error.message : String(error)}`
168
+ );
142
169
  }
143
170
  }
144
171
  }
@@ -150,7 +177,7 @@ function loadCommands(pluginPath, manifest) {
150
177
  for (const commandPath of manifest.commands || []) {
151
178
  const fullPath = join(pluginPath, commandPath);
152
179
  if (!existsSync(fullPath)) {
153
- console.warn(`Command file not found: ${fullPath}`);
180
+ debugLogger.warn("PLUGIN_LOADER", `Command file not found: ${fullPath}`);
154
181
  continue;
155
182
  }
156
183
  try {
@@ -173,7 +200,10 @@ function loadCommands(pluginPath, manifest) {
173
200
  pluginName: manifest.name
174
201
  });
175
202
  } catch (error) {
176
- console.error(`Error loading command ${commandPath}:`, error);
203
+ debugLogger.warn(
204
+ "PLUGIN_LOADER",
205
+ `Error loading command ${commandPath}: ${error instanceof Error ? error.message : String(error)}`
206
+ );
177
207
  }
178
208
  }
179
209
  if (existsSync(commandsDir) && statSync(commandsDir).isDirectory()) {
@@ -201,7 +231,10 @@ function loadCommands(pluginPath, manifest) {
201
231
  pluginName: manifest.name
202
232
  });
203
233
  } catch (error) {
204
- console.error(`Error loading command ${file}:`, error);
234
+ debugLogger.warn(
235
+ "PLUGIN_LOADER",
236
+ `Error loading command ${file}: ${error instanceof Error ? error.message : String(error)}`
237
+ );
205
238
  }
206
239
  }
207
240
  }
@@ -213,7 +246,7 @@ function loadSkills(pluginPath, manifest) {
213
246
  for (const skillPath of manifest.skills || []) {
214
247
  const fullPath = join(pluginPath, skillPath);
215
248
  if (!existsSync(fullPath)) {
216
- console.warn(`Skill file not found: ${fullPath}`);
249
+ debugLogger.warn("PLUGIN_LOADER", `Skill file not found: ${fullPath}`);
217
250
  continue;
218
251
  }
219
252
  try {
@@ -231,7 +264,10 @@ function loadSkills(pluginPath, manifest) {
231
264
  source: "plugin"
232
265
  });
233
266
  } catch (error) {
234
- console.error(`Error loading skill ${skillPath}:`, error);
267
+ debugLogger.warn(
268
+ "PLUGIN_LOADER",
269
+ `Error loading skill ${skillPath}: ${error instanceof Error ? error.message : String(error)}`
270
+ );
235
271
  }
236
272
  }
237
273
  if (existsSync(skillsDir) && statSync(skillsDir).isDirectory()) {
@@ -256,7 +292,10 @@ function loadSkills(pluginPath, manifest) {
256
292
  source: "plugin"
257
293
  });
258
294
  } catch (error) {
259
- console.error(`Error loading skill from ${skillMdPath}:`, error);
295
+ debugLogger.warn(
296
+ "PLUGIN_LOADER",
297
+ `Error loading skill from ${skillMdPath}: ${error instanceof Error ? error.message : String(error)}`
298
+ );
260
299
  }
261
300
  }
262
301
  } else if (entry.isFile() && entry.name.endsWith(".md")) {
@@ -277,7 +316,10 @@ function loadSkills(pluginPath, manifest) {
277
316
  source: "plugin"
278
317
  });
279
318
  } catch (error) {
280
- console.error(`Error loading skill ${entry.name}:`, error);
319
+ debugLogger.warn(
320
+ "PLUGIN_LOADER",
321
+ `Error loading skill ${entry.name}: ${error instanceof Error ? error.message : String(error)}`
322
+ );
281
323
  }
282
324
  }
283
325
  }
@@ -295,7 +337,10 @@ function loadHooks(pluginPath, manifest) {
295
337
  const content = readFileSync(hooksJsonPath, "utf-8");
296
338
  const hooksConfig = JSON.parse(content);
297
339
  if (!hooksConfig.hooks || typeof hooksConfig.hooks !== "object") {
298
- console.warn(`Invalid hooks.json in ${pluginPath}: missing "hooks" field`);
340
+ debugLogger.warn(
341
+ "PLUGIN_LOADER",
342
+ `Invalid hooks.json in ${pluginPath}: missing "hooks" field`
343
+ );
299
344
  return hooks;
300
345
  }
301
346
  for (const [eventName, matchers] of Object.entries(
@@ -313,8 +358,7 @@ function loadHooks(pluginPath, manifest) {
313
358
  matcher: matcher.matcher,
314
359
  type: hookDef.type || "command",
315
360
  command: hookDef.command,
316
- message: hookDef.prompt,
317
- // Claude Code uses "prompt", we use "message" internally
361
+ prompt: hookDef.prompt,
318
362
  blocking: hookDef.type === "prompt",
319
363
  timeout: hookDef.timeout || 60
320
364
  },
@@ -326,7 +370,10 @@ function loadHooks(pluginPath, manifest) {
326
370
  }
327
371
  }
328
372
  } catch (error) {
329
- console.error(`Error loading hooks from ${hooksJsonPath}:`, error);
373
+ debugLogger.warn(
374
+ "PLUGIN_LOADER",
375
+ `Error loading hooks from ${hooksJsonPath}: ${error instanceof Error ? error.message : String(error)}`
376
+ );
330
377
  }
331
378
  return hooks;
332
379
  }
@@ -389,7 +436,10 @@ function loadMCPServers(pluginPath, manifest) {
389
436
  mcpJsonServers = parsed.mcpServers;
390
437
  }
391
438
  } catch (error) {
392
- console.error(`Error loading .mcp.json from ${pluginPath}:`, error);
439
+ debugLogger.warn(
440
+ "PLUGIN_LOADER",
441
+ `Error loading .mcp.json from ${pluginPath}: ${error instanceof Error ? error.message : String(error)}`
442
+ );
393
443
  }
394
444
  }
395
445
  let inlineServers = {};
@@ -402,13 +452,15 @@ function loadMCPServers(pluginPath, manifest) {
402
452
  const expandedConfig = expandServerConfig(config, pluginPath);
403
453
  const serverType = expandedConfig.type || "stdio";
404
454
  if (serverType === "stdio" && !expandedConfig.command) {
405
- console.warn(
455
+ debugLogger.warn(
456
+ "PLUGIN_LOADER",
406
457
  `MCP server "${name}" in ${manifest.name} is missing required "command" field for stdio type`
407
458
  );
408
459
  continue;
409
460
  }
410
461
  if ((serverType === "http" || serverType === "sse") && !expandedConfig.url) {
411
- console.warn(
462
+ debugLogger.warn(
463
+ "PLUGIN_LOADER",
412
464
  `MCP server "${name}" in ${manifest.name} is missing required "url" field for ${serverType} type`
413
465
  );
414
466
  continue;
@@ -425,14 +477,72 @@ function loadMCPServers(pluginPath, manifest) {
425
477
  pluginName: manifest.name
426
478
  });
427
479
  } catch (error) {
428
- console.error(
429
- `Error loading MCP server "${name}" from ${manifest.name}:`,
430
- error
480
+ debugLogger.warn(
481
+ "PLUGIN_LOADER",
482
+ `Error loading MCP server "${name}" from ${manifest.name}: ${error instanceof Error ? error.message : String(error)}`
431
483
  );
432
484
  }
433
485
  }
434
486
  return mcpServers;
435
487
  }
488
+ function loadLSPServers(pluginPath, manifest) {
489
+ const lspServers = [];
490
+ const lspJsonPath = join(pluginPath, ".lsp.json");
491
+ let lspJsonServers = {};
492
+ if (existsSync(lspJsonPath)) {
493
+ try {
494
+ const content = readFileSync(lspJsonPath, "utf-8");
495
+ const parsed = JSON.parse(content);
496
+ if (parsed.lspServers && typeof parsed.lspServers === "object") {
497
+ lspJsonServers = parsed.lspServers;
498
+ } else if (typeof parsed === "object" && !Array.isArray(parsed)) {
499
+ lspJsonServers = parsed;
500
+ }
501
+ } catch (error) {
502
+ debugLogger.warn(
503
+ "PLUGIN_LOADER",
504
+ `Error loading .lsp.json from ${pluginPath}: ${error instanceof Error ? error.message : String(error)}`
505
+ );
506
+ }
507
+ }
508
+ const manifestData = manifest;
509
+ let inlineServers = {};
510
+ if (manifestData.lspServers && typeof manifestData.lspServers === "object" && !Array.isArray(manifestData.lspServers)) {
511
+ inlineServers = manifestData.lspServers;
512
+ }
513
+ const allServers = { ...lspJsonServers, ...inlineServers };
514
+ for (const [name, config] of Object.entries(allServers)) {
515
+ try {
516
+ const expandedConfig = expandServerConfig(config, pluginPath);
517
+ if (!expandedConfig.command) {
518
+ debugLogger.warn(
519
+ "PLUGIN_LOADER",
520
+ `LSP server "${name}" in ${manifest.name} is missing required "command" field`
521
+ );
522
+ continue;
523
+ }
524
+ lspServers.push({
525
+ name,
526
+ filePath: existsSync(lspJsonPath) ? lspJsonPath : join(pluginPath, "plugin.json"),
527
+ config: {
528
+ command: expandedConfig.command,
529
+ args: expandedConfig.args || [],
530
+ env: expandedConfig.env || {},
531
+ filePatterns: expandedConfig.filePatterns,
532
+ languages: expandedConfig.languages,
533
+ initializationOptions: expandedConfig.initializationOptions
534
+ },
535
+ pluginName: manifest.name
536
+ });
537
+ } catch (error) {
538
+ debugLogger.warn(
539
+ "PLUGIN_LOADER",
540
+ `Error loading LSP server "${name}" from ${manifest.name}: ${error instanceof Error ? error.message : String(error)}`
541
+ );
542
+ }
543
+ }
544
+ return lspServers;
545
+ }
436
546
  function determinePluginSource(pluginPath) {
437
547
  const home = homedir();
438
548
  const cwd = getCwd();
@@ -461,22 +571,63 @@ function determinePluginSource(pluginPath) {
461
571
  };
462
572
  }
463
573
  } catch (error) {
464
- console.warn(
465
- `Failed to read marketplace metadata from ${marketplaceMetaPath}:`,
466
- error
574
+ debugLogger.warn(
575
+ "PLUGIN_LOADER",
576
+ `Failed to read marketplace metadata from ${marketplaceMetaPath}: ${error instanceof Error ? error.message : String(error)}`
467
577
  );
468
578
  }
469
579
  }
470
- if (pluginPath.startsWith(join(home, ".minto", "plugins"))) {
580
+ const managedDir = getManagedPluginsDir();
581
+ if (pluginPath.startsWith(managedDir)) {
582
+ return { type: "local", path: "managed" };
583
+ } else if (pluginPath.startsWith(join(home, ".minto", "plugins"))) {
471
584
  return { type: "local", path: "user-global" };
585
+ } else if (pluginPath.startsWith(join(cwd, ".minto", "plugins.local"))) {
586
+ return { type: "local", path: "local" };
472
587
  } else if (pluginPath.startsWith(join(cwd, ".minto", "plugins"))) {
473
588
  return { type: "local", path: "project" };
474
589
  } else {
475
590
  return { type: "local", path: pluginPath };
476
591
  }
477
592
  }
593
+ function loadPluginSettings(pluginPath) {
594
+ const settingsPaths = [
595
+ join(pluginPath, ".minto-plugin", "settings.json"),
596
+ join(pluginPath, ".claude-plugin", "settings.json"),
597
+ join(pluginPath, "settings.json")
598
+ ];
599
+ for (const settingsPath of settingsPaths) {
600
+ if (!existsSync(settingsPath)) continue;
601
+ try {
602
+ const content = readFileSync(settingsPath, "utf-8");
603
+ const parsed = JSON.parse(content);
604
+ if (parsed.agent && typeof parsed.agent === "object") {
605
+ return parsed.agent;
606
+ }
607
+ return parsed;
608
+ } catch (error) {
609
+ debugLogger.warn(
610
+ "PLUGIN_LOADER",
611
+ `Failed to parse plugin settings from ${settingsPath}: ${error instanceof Error ? error.message : String(error)}`
612
+ );
613
+ }
614
+ }
615
+ return null;
616
+ }
478
617
  function loadPlugin(pluginPath) {
479
618
  const manifest = loadManifest(pluginPath);
619
+ try {
620
+ const validation = validatePluginDirectory(pluginPath);
621
+ if (validation.warnings.length > 0) {
622
+ for (const warning of validation.warnings) {
623
+ debugLogger.warn(
624
+ "PLUGIN_LOADER",
625
+ `Plugin "${manifest.name}": ${warning}`
626
+ );
627
+ }
628
+ }
629
+ } catch {
630
+ }
480
631
  const source = determinePluginSource(pluginPath);
481
632
  const pluginConfig = loadPluginConfig(pluginPath);
482
633
  const agents = loadAgents(pluginPath, manifest);
@@ -484,6 +635,8 @@ function loadPlugin(pluginPath) {
484
635
  const skills = loadSkills(pluginPath, manifest);
485
636
  const hooks = loadHooks(pluginPath, manifest);
486
637
  const mcpServers = loadMCPServers(pluginPath, manifest);
638
+ const lspServers = loadLSPServers(pluginPath, manifest);
639
+ const settings = loadPluginSettings(pluginPath);
487
640
  return {
488
641
  manifest,
489
642
  name: manifest.name,
@@ -494,8 +647,10 @@ function loadPlugin(pluginPath) {
494
647
  skills,
495
648
  hooks,
496
649
  mcpServers,
650
+ lspServers,
497
651
  enabled: pluginConfig.enabled,
498
- config: pluginConfig.config
652
+ config: pluginConfig.config,
653
+ settings
499
654
  };
500
655
  }
501
656
  function loadAllPlugins() {
@@ -507,9 +662,15 @@ function loadAllPlugins() {
507
662
  plugins.push(plugin);
508
663
  } catch (error) {
509
664
  if (error instanceof PluginError) {
510
- console.error(`Error loading plugin ${name}:`, error.message);
665
+ debugLogger.warn(
666
+ "PLUGIN_LOADER",
667
+ `Error loading plugin ${name}: ${error.message}`
668
+ );
511
669
  } else {
512
- console.error(`Unexpected error loading plugin ${name}:`, error);
670
+ debugLogger.warn(
671
+ "PLUGIN_LOADER",
672
+ `Unexpected error loading plugin ${name}: ${error instanceof Error ? error.message : String(error)}`
673
+ );
513
674
  }
514
675
  }
515
676
  }
@@ -522,7 +683,10 @@ function getPlugin(name) {
522
683
  try {
523
684
  return loadPlugin(pluginPath);
524
685
  } catch (error) {
525
- console.error(`Error loading plugin ${name}:`, error);
686
+ debugLogger.warn(
687
+ "PLUGIN_LOADER",
688
+ `Error loading plugin ${name}: ${error instanceof Error ? error.message : String(error)}`
689
+ );
526
690
  return void 0;
527
691
  }
528
692
  }
@@ -555,7 +719,10 @@ function loadPluginConfig(pluginPath) {
555
719
  config: data.config || {}
556
720
  };
557
721
  } catch (error) {
558
- console.error(`Error loading plugin config from ${configPath}:`, error);
722
+ debugLogger.warn(
723
+ "PLUGIN_LOADER",
724
+ `Error loading plugin config from ${configPath}: ${error instanceof Error ? error.message : String(error)}`
725
+ );
559
726
  return { enabled: true, config: {} };
560
727
  }
561
728
  }
@@ -620,12 +787,14 @@ function updatePluginConfig(pluginName, config) {
620
787
  savePluginConfig(plugin.location, plugin.enabled, config);
621
788
  }
622
789
  export {
790
+ addExtraPluginDir,
623
791
  disablePlugin,
624
792
  enablePlugin,
625
793
  getPlugin,
626
794
  listPlugins,
627
795
  loadAllPlugins,
628
796
  loadPlugin,
797
+ loadPluginSettings,
629
798
  togglePluginEnabled,
630
799
  updatePluginConfig
631
800
  };