@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/refreshCommands.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport {\n reloadCustomCommands,\n reloadPluginCommands,\n} from '@services/customCommands'\nimport { getCommands } from '@commands'\n\n/**\n * Refresh Commands - Reload custom and plugin commands from filesystem\n *\n * This command provides a runtime mechanism to refresh the custom commands\n * and plugin commands cache without restarting the application. It's particularly\n * useful during development or when users are actively creating/modifying\n * custom commands or installing/updating plugins.\n *\n * The command follows the standard local command pattern used throughout\n * the project and provides detailed feedback about the refresh operation.\n */\nconst refreshCommands = {\n type: 'local',\n name: 'refresh-commands',\n description: '[Developer] Reload custom and plugin commands from filesystem',\n isEnabled: true,\n isHidden: true,\n async call(_, context) {\n try {\n // Clear custom commands cache to force filesystem rescan\n reloadCustomCommands()\n\n // Clear plugin commands cache to force plugin rescan\n reloadPluginCommands()\n\n // Clear the main commands cache to ensure full reload\n // This ensures that changes to custom and plugin commands are reflected in the main command list\n getCommands.cache.clear?.()\n\n // Reload commands to get updated count and validate the refresh\n const commands = await getCommands()\n const customCommands = commands.filter(\n cmd => cmd.name.startsWith('project:') || cmd.name.startsWith('user:'),\n )\n const pluginCommands = commands.filter(cmd =>\n cmd.name.startsWith('plugin:'),\n )\n\n // Provide detailed feedback about the refresh operation\n return `\u2705 Commands refreshed successfully!\n\nCustom commands reloaded: ${customCommands.length}\n- Project commands: ${customCommands.filter(cmd => cmd.name.startsWith('project:')).length}\n- User commands: ${customCommands.filter(cmd => cmd.name.startsWith('user:')).length}\n\nPlugin commands reloaded: ${pluginCommands.length}\n\nUse /help to see updated command list.`\n } catch (error) {\n console.error('Failed to refresh commands:', error)\n return '\u274C Failed to refresh commands. Check console for details.'\n }\n },\n userFacingName() {\n return 'refresh-commands'\n },\n} satisfies Command\n\nexport default refreshCommands\n"],
5
- "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAa5B,MAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,QAAI;AAEF,2BAAqB;AAGrB,2BAAqB;AAIrB,kBAAY,MAAM,QAAQ;AAG1B,YAAM,WAAW,MAAM,YAAY;AACnC,YAAM,iBAAiB,SAAS;AAAA,QAC9B,SAAO,IAAI,KAAK,WAAW,UAAU,KAAK,IAAI,KAAK,WAAW,OAAO;AAAA,MACvE;AACA,YAAM,iBAAiB,SAAS;AAAA,QAAO,SACrC,IAAI,KAAK,WAAW,SAAS;AAAA,MAC/B;AAGA,aAAO;AAAA;AAAA,4BAEe,eAAe,MAAM;AAAA,sBAC3B,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,UAAU,CAAC,EAAE,MAAM;AAAA,mBACvE,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,OAAO,CAAC,EAAE,MAAM;AAAA;AAAA,4BAExD,eAAe,MAAM;AAAA;AAAA;AAAA,IAG7C,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;",
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport {\n reloadCustomCommands,\n reloadPluginCommands,\n} from '@services/customCommands'\nimport { clearSkillsCache } from '@utils/skillLoader'\nimport { getCommands } from '@commands'\n\n/**\n * Refresh Commands - Reload custom and plugin commands from filesystem\n *\n * This command provides a runtime mechanism to refresh the custom commands\n * and plugin commands cache without restarting the application. It's particularly\n * useful during development or when users are actively creating/modifying\n * custom commands or installing/updating plugins.\n *\n * The command follows the standard local command pattern used throughout\n * the project and provides detailed feedback about the refresh operation.\n */\nconst refreshCommands = {\n type: 'local',\n name: 'refresh-commands',\n description: '[Developer] Reload custom and plugin commands from filesystem',\n isEnabled: true,\n isHidden: true,\n async call(_, context) {\n try {\n // Clear custom commands cache to force filesystem rescan\n reloadCustomCommands()\n\n // Clear plugin commands cache to force plugin rescan\n reloadPluginCommands()\n\n // Clear skills cache to force skills rescan\n clearSkillsCache()\n\n // Clear the main commands cache to ensure full reload\n // This ensures that changes to custom and plugin commands are reflected in the main command list\n getCommands.cache.clear?.()\n\n // Reload commands to get updated count and validate the refresh\n const commands = await getCommands()\n const customCommands = commands.filter(\n cmd => cmd.name.startsWith('project:') || cmd.name.startsWith('user:'),\n )\n const pluginCommands = commands.filter(cmd =>\n cmd.name.startsWith('plugin:'),\n )\n\n // Provide detailed feedback about the refresh operation\n return `\u2705 Commands refreshed successfully!\n\nCustom commands reloaded: ${customCommands.length}\n- Project commands: ${customCommands.filter(cmd => cmd.name.startsWith('project:')).length}\n- User commands: ${customCommands.filter(cmd => cmd.name.startsWith('user:')).length}\n\nPlugin commands reloaded: ${pluginCommands.length}\n\nUse /help to see updated command list.`\n } catch (error) {\n console.error('Failed to refresh commands:', error)\n return '\u274C Failed to refresh commands. Check console for details.'\n }\n },\n userFacingName() {\n return 'refresh-commands'\n },\n} satisfies Command\n\nexport default refreshCommands\n"],
5
+ "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAa5B,MAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,QAAI;AAEF,2BAAqB;AAGrB,2BAAqB;AAGrB,uBAAiB;AAIjB,kBAAY,MAAM,QAAQ;AAG1B,YAAM,WAAW,MAAM,YAAY;AACnC,YAAM,iBAAiB,SAAS;AAAA,QAC9B,SAAO,IAAI,KAAK,WAAW,UAAU,KAAK,IAAI,KAAK,WAAW,OAAO;AAAA,MACvE;AACA,YAAM,iBAAiB,SAAS;AAAA,QAAO,SACrC,IAAI,KAAK,WAAW,SAAS;AAAA,MAC/B;AAGA,aAAO;AAAA;AAAA,4BAEe,eAAe,MAAM;AAAA,sBAC3B,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,UAAU,CAAC,EAAE,MAAM;AAAA,mBACvE,eAAe,OAAO,SAAO,IAAI,KAAK,WAAW,OAAO,CAAC,EAAE,MAAM;AAAA;AAAA,4BAExD,eAAe,MAAM;AAAA;AAAA;AAAA,IAG7C,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,51 @@
1
+ const review = {
2
+ name: "review",
3
+ description: "Review code changes (staged git diff or specified files)",
4
+ isEnabled: true,
5
+ isHidden: false,
6
+ type: "prompt",
7
+ progressMessage: "Reviewing code...",
8
+ userFacingName() {
9
+ return "review";
10
+ },
11
+ async getPromptForCommand(args) {
12
+ const target = args.trim();
13
+ if (target) {
14
+ return [
15
+ {
16
+ role: "user",
17
+ content: `Please review the following files or changes: ${target}
18
+
19
+ Perform a thorough code review. For each issue found:
20
+ 1. Identify the file and line
21
+ 2. Describe the issue (bug, style, performance, security, etc.)
22
+ 3. Suggest a fix
23
+
24
+ Also note any positive patterns worth highlighting. Be constructive and specific.`
25
+ }
26
+ ];
27
+ }
28
+ return [
29
+ {
30
+ role: "user",
31
+ content: `Please review the current git changes. Follow these steps:
32
+
33
+ 1. Run \`git diff --staged\` to see staged changes. If no staged changes, run \`git diff\` for unstaged changes.
34
+ 2. For each changed file, analyze the diff thoroughly.
35
+ 3. Report issues organized by severity:
36
+ - **Critical**: Bugs, security vulnerabilities, data loss risks
37
+ - **Important**: Logic errors, missing error handling, performance issues
38
+ - **Minor**: Style, naming, documentation gaps
39
+ 4. Note positive patterns worth highlighting.
40
+ 5. Provide a brief summary with overall assessment.
41
+
42
+ Be constructive, specific, and actionable.`
43
+ }
44
+ ];
45
+ }
46
+ };
47
+ var review_default = review;
48
+ export {
49
+ review_default as default
50
+ };
51
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/review.ts"],
4
+ "sourcesContent": ["/**\n * /review command\n *\n * Prompt-type command that enters code review mode.\n * Reviews staged git changes or specified files.\n */\n\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { Command } from '../commands'\n\nconst review: Command = {\n name: 'review',\n description: 'Review code changes (staged git diff or specified files)',\n isEnabled: true,\n isHidden: false,\n type: 'prompt',\n progressMessage: 'Reviewing code...',\n userFacingName() {\n return 'review'\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n const target = args.trim()\n\n if (target) {\n return [\n {\n role: 'user',\n content: `Please review the following files or changes: ${target}\n\nPerform a thorough code review. For each issue found:\n1. Identify the file and line\n2. Describe the issue (bug, style, performance, security, etc.)\n3. Suggest a fix\n\nAlso note any positive patterns worth highlighting. Be constructive and specific.`,\n },\n ]\n }\n\n return [\n {\n role: 'user',\n content: `Please review the current git changes. Follow these steps:\n\n1. Run \\`git diff --staged\\` to see staged changes. If no staged changes, run \\`git diff\\` for unstaged changes.\n2. For each changed file, analyze the diff thoroughly.\n3. Report issues organized by severity:\n - **Critical**: Bugs, security vulnerabilities, data loss risks\n - **Important**: Logic errors, missing error handling, performance issues\n - **Minor**: Style, naming, documentation gaps\n4. Note positive patterns worth highlighting.\n5. Provide a brief summary with overall assessment.\n\nBe constructive, specific, and actionable.`,\n },\n ]\n },\n}\n\nexport default review\n"],
5
+ "mappings": "AAUA,MAAM,SAAkB;AAAA,EACtB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,oBAAoB,MAAuC;AAC/D,UAAM,SAAS,KAAK,KAAK;AAEzB,QAAI,QAAQ;AACV,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SAAS,iDAAiD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQlE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYX;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }
@@ -46,6 +46,12 @@ function handleHashCommand(interpreted) {
46
46
  const claudePath = join(cwd, "CLAUDE.md");
47
47
  const filesToUpdate = [];
48
48
  filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE });
49
+ const agentsPath = join(cwd, "AGENTS.md");
50
+ try {
51
+ readFileSync(agentsPath, "utf-8");
52
+ filesToUpdate.push({ path: agentsPath, name: "AGENTS.md" });
53
+ } catch {
54
+ }
49
55
  try {
50
56
  readFileSync(claudePath, "utf-8");
51
57
  filesToUpdate.push({ path: claudePath, name: "CLAUDE.md" });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/terminalSetup.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { EOL, platform, homedir } from 'os'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport chalk from 'chalk'\nimport { getTheme } from '@utils/theme'\nimport { env } from '@utils/env'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { markProjectOnboardingComplete } from '@components/ProjectOnboarding'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { safeParseJSON } from '@utils/json'\nimport { logError } from '@utils/log'\nimport { PROJECT_FILE } from '@constants/product'\n\nconst terminalSetup: Command = {\n type: 'local',\n name: 'terminal-setup',\n userFacingName() {\n return 'terminal-setup'\n },\n description:\n '[Developer] Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)',\n isEnabled:\n (platform() === 'darwin' && env.terminal === 'iTerm.app') ||\n env.terminal === 'vscode',\n isHidden: true,\n async call() {\n let result = ''\n\n switch (env.terminal) {\n case 'iTerm.app':\n result = await installBindingsForITerm2()\n break\n case 'vscode':\n result = installBindingsForVSCodeTerminal()\n break\n }\n\n // Update global config to indicate Shift+Enter key binding is installed\n const config = getGlobalConfig()\n config.shiftEnterKeyBindingInstalled = true\n saveGlobalConfig(config)\n\n // Mark onboarding as complete\n markProjectOnboardingComplete()\n\n return result\n },\n}\n\nexport function isShiftEnterKeyBindingInstalled(): boolean {\n return getGlobalConfig().shiftEnterKeyBindingInstalled === true\n}\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to both MINTO.md and CLAUDE.md (if exists)\n try {\n const cwd = process.cwd()\n const codeContextPath = join(cwd, PROJECT_FILE)\n const claudePath = join(cwd, 'CLAUDE.md')\n\n // Check which files exist and update them\n const filesToUpdate = []\n\n // Always try to update MINTO.md (create if not exists)\n filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE })\n\n // Update CLAUDE.md only if it exists\n try {\n readFileSync(claudePath, 'utf-8')\n filesToUpdate.push({ path: claudePath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles = []\n\n for (const file of filesToUpdate) {\n try {\n // Check if file exists, if not create it\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n\n // Add a separator if the file already has content\n const separator = existingContent ? '\\n\\n' : ''\n\n // Combine everything and write to file\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n console.error(\n chalk.hex(getTheme().error)(\n `Failed to update ${file.name}: ${error.message}`,\n ),\n )\n }\n }\n\n if (updatedFiles.length > 0) {\n console.log(\n chalk.hex(getTheme().success)(\n `Added note to ${updatedFiles.join(' and ')}`,\n ),\n )\n }\n } catch (e) {\n logError(e)\n console.error(\n chalk.hex(getTheme().error)(`Failed to add note: ${e.message}`),\n )\n }\n}\n\nexport default terminalSetup\n\nasync function installBindingsForITerm2(): Promise<string> {\n const { code } = await execFileNoThrow('defaults', [\n 'write',\n 'com.googlecode.iterm2',\n 'GlobalKeyMap',\n '-dict-add',\n '0xd-0x20000-0x24',\n `<dict>\n <key>Text</key>\n <string>\\\\n</string>\n <key>Action</key>\n <integer>12</integer>\n <key>Version</key>\n <integer>1</integer>\n <key>Keycode</key>\n <integer>13</integer>\n <key>Modifiers</key>\n <integer>131072</integer>\n </dict>`,\n ])\n\n if (code !== 0) {\n throw new Error('Failed to install iTerm2 Shift+Enter key binding')\n }\n\n return `${chalk.hex(getTheme().success)(\n 'Installed iTerm2 Shift+Enter key binding',\n )}${EOL}${chalk.dim('See iTerm2 \u2192 Preferences \u2192 Keys')}${EOL}`\n}\n\ntype VSCodeKeybinding = {\n key: string\n command: string\n args: { text: string }\n when: string\n}\n\nfunction installBindingsForVSCodeTerminal(): string {\n const vscodeKeybindingsPath = join(\n homedir(),\n platform() === 'win32'\n ? join('AppData', 'Roaming', 'Code', 'User')\n : platform() === 'darwin'\n ? join('Library', 'Application Support', 'Code', 'User')\n : join('.config', 'Code', 'User'),\n 'keybindings.json',\n )\n\n try {\n const content = readFileSync(vscodeKeybindingsPath, 'utf-8')\n const keybindings: VSCodeKeybinding[] =\n (safeParseJSON(content) as VSCodeKeybinding[]) ?? []\n\n // Check if keybinding already exists\n const existingBinding = keybindings.find(\n binding =>\n binding.key === 'shift+enter' &&\n binding.command === 'workbench.action.terminal.sendSequence' &&\n binding.when === 'terminalFocus',\n )\n if (existingBinding) {\n return `${chalk.hex(getTheme().warning)(\n 'Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n }\n\n // Add the keybinding\n keybindings.push({\n key: 'shift+enter',\n command: 'workbench.action.terminal.sendSequence',\n args: { text: '\\\\\\r\\n' },\n when: 'terminalFocus',\n })\n\n writeFileSync(\n vscodeKeybindingsPath,\n JSON.stringify(keybindings, null, 4),\n 'utf-8',\n )\n\n return `${chalk.hex(getTheme().success)(\n 'Installed VSCode terminal Shift+Enter key binding',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n } catch (e) {\n logError(e)\n throw new Error('Failed to install VSCode terminal Shift+Enter key binding')\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport { EOL, platform, homedir } from 'os'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport chalk from 'chalk'\nimport { getTheme } from '@utils/theme'\nimport { env } from '@utils/env'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { markProjectOnboardingComplete } from '@components/ProjectOnboarding'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { safeParseJSON } from '@utils/json'\nimport { logError } from '@utils/log'\nimport { PROJECT_FILE } from '@constants/product'\n\nconst terminalSetup: Command = {\n type: 'local',\n name: 'terminal-setup',\n userFacingName() {\n return 'terminal-setup'\n },\n description:\n '[Developer] Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)',\n isEnabled:\n (platform() === 'darwin' && env.terminal === 'iTerm.app') ||\n env.terminal === 'vscode',\n isHidden: true,\n async call() {\n let result = ''\n\n switch (env.terminal) {\n case 'iTerm.app':\n result = await installBindingsForITerm2()\n break\n case 'vscode':\n result = installBindingsForVSCodeTerminal()\n break\n }\n\n // Update global config to indicate Shift+Enter key binding is installed\n const config = getGlobalConfig()\n config.shiftEnterKeyBindingInstalled = true\n saveGlobalConfig(config)\n\n // Mark onboarding as complete\n markProjectOnboardingComplete()\n\n return result\n },\n}\n\nexport function isShiftEnterKeyBindingInstalled(): boolean {\n return getGlobalConfig().shiftEnterKeyBindingInstalled === true\n}\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to both MINTO.md and CLAUDE.md (if exists)\n try {\n const cwd = process.cwd()\n const codeContextPath = join(cwd, PROJECT_FILE)\n const claudePath = join(cwd, 'CLAUDE.md')\n\n // Check which files exist and update them\n const filesToUpdate = []\n\n // Always try to update MINTO.md (create if not exists)\n filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE })\n\n // Update AGENTS.md only if it exists\n const agentsPath = join(cwd, 'AGENTS.md')\n try {\n readFileSync(agentsPath, 'utf-8')\n filesToUpdate.push({ path: agentsPath, name: 'AGENTS.md' })\n } catch {\n // AGENTS.md doesn't exist, skip it\n }\n\n // Update CLAUDE.md only if it exists\n try {\n readFileSync(claudePath, 'utf-8')\n filesToUpdate.push({ path: claudePath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles = []\n\n for (const file of filesToUpdate) {\n try {\n // Check if file exists, if not create it\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n\n // Add a separator if the file already has content\n const separator = existingContent ? '\\n\\n' : ''\n\n // Combine everything and write to file\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n console.error(\n chalk.hex(getTheme().error)(\n `Failed to update ${file.name}: ${error.message}`,\n ),\n )\n }\n }\n\n if (updatedFiles.length > 0) {\n console.log(\n chalk.hex(getTheme().success)(\n `Added note to ${updatedFiles.join(' and ')}`,\n ),\n )\n }\n } catch (e) {\n logError(e)\n console.error(\n chalk.hex(getTheme().error)(`Failed to add note: ${e.message}`),\n )\n }\n}\n\nexport default terminalSetup\n\nasync function installBindingsForITerm2(): Promise<string> {\n const { code } = await execFileNoThrow('defaults', [\n 'write',\n 'com.googlecode.iterm2',\n 'GlobalKeyMap',\n '-dict-add',\n '0xd-0x20000-0x24',\n `<dict>\n <key>Text</key>\n <string>\\\\n</string>\n <key>Action</key>\n <integer>12</integer>\n <key>Version</key>\n <integer>1</integer>\n <key>Keycode</key>\n <integer>13</integer>\n <key>Modifiers</key>\n <integer>131072</integer>\n </dict>`,\n ])\n\n if (code !== 0) {\n throw new Error('Failed to install iTerm2 Shift+Enter key binding')\n }\n\n return `${chalk.hex(getTheme().success)(\n 'Installed iTerm2 Shift+Enter key binding',\n )}${EOL}${chalk.dim('See iTerm2 \u2192 Preferences \u2192 Keys')}${EOL}`\n}\n\ntype VSCodeKeybinding = {\n key: string\n command: string\n args: { text: string }\n when: string\n}\n\nfunction installBindingsForVSCodeTerminal(): string {\n const vscodeKeybindingsPath = join(\n homedir(),\n platform() === 'win32'\n ? join('AppData', 'Roaming', 'Code', 'User')\n : platform() === 'darwin'\n ? join('Library', 'Application Support', 'Code', 'User')\n : join('.config', 'Code', 'User'),\n 'keybindings.json',\n )\n\n try {\n const content = readFileSync(vscodeKeybindingsPath, 'utf-8')\n const keybindings: VSCodeKeybinding[] =\n (safeParseJSON(content) as VSCodeKeybinding[]) ?? []\n\n // Check if keybinding already exists\n const existingBinding = keybindings.find(\n binding =>\n binding.key === 'shift+enter' &&\n binding.command === 'workbench.action.terminal.sendSequence' &&\n binding.when === 'terminalFocus',\n )\n if (existingBinding) {\n return `${chalk.hex(getTheme().warning)(\n 'Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n }\n\n // Add the keybinding\n keybindings.push({\n key: 'shift+enter',\n command: 'workbench.action.terminal.sendSequence',\n args: { text: '\\\\\\r\\n' },\n when: 'terminalFocus',\n })\n\n writeFileSync(\n vscodeKeybindingsPath,\n JSON.stringify(keybindings, null, 4),\n 'utf-8',\n )\n\n return `${chalk.hex(getTheme().success)(\n 'Installed VSCode terminal Shift+Enter key binding',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n } catch (e) {\n logError(e)\n throw new Error('Failed to install VSCode terminal Shift+Enter key binding')\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -116,6 +116,14 @@ const UndoCommand = ({ onClose }) => {
116
116
  emptyText: "No versions found"
117
117
  };
118
118
  }
119
+ default:
120
+ return {
121
+ tabs: [],
122
+ items: [],
123
+ title: "",
124
+ footerHint: "",
125
+ emptyText: ""
126
+ };
119
127
  }
120
128
  }, [phase, files, versions]);
121
129
  const handleStatusDismiss = useCallback(() => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/undo.tsx"],
4
- "sourcesContent": ["/**\n * Undo Command\n *\n * Interactive command to restore file versions from backups.\n * Uses TabbedListView with a phase state machine for consistent UI.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react'\nimport type { Command } from '@commands'\nimport { getCwd } from '@utils/state'\nimport {\n listBackedUpFiles,\n getBackupVersions,\n restoreBackup,\n type BackupFileSummary,\n type BackupMetadata,\n} from '../core/backupManager'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport { t } from '@i18n'\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp)\n const now = new Date()\n const diff = now.getTime() - timestamp\n const timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`\n\n if (diff < 60 * 60 * 1000) {\n const minutes = Math.floor(diff / (60 * 1000))\n return minutes <= 1\n ? t('commands.undo.justNow')\n : t('commands.undo.minutesAgo', { count: minutes })\n }\n\n if (\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear()\n ) {\n return `${t('commands.undo.today')} ${timeStr}`\n }\n\n if (diff < 7 * 24 * 60 * 60 * 1000) {\n const weekdayKeys = [\n 'commands.undo.weekday.sun',\n 'commands.undo.weekday.mon',\n 'commands.undo.weekday.tue',\n 'commands.undo.weekday.wed',\n 'commands.undo.weekday.thu',\n 'commands.undo.weekday.fri',\n 'commands.undo.weekday.sat',\n ] as const\n return `${t(weekdayKeys[date.getDay()])} ${timeStr}`\n }\n\n return `${date.getMonth() + 1}/${date.getDate()} ${timeStr}`\n}\n\nfunction getRelativePath(filePath: string): string {\n const cwd = getCwd()\n if (filePath.startsWith(cwd)) {\n const relative = filePath.slice(cwd.length)\n return relative.startsWith('/') ? relative.slice(1) : relative\n }\n return filePath\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype UndoPhase =\n | { type: 'file-list' }\n | { type: 'version-list'; file: BackupFileSummary }\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nconst UndoCommand: React.FC<{ onClose: () => void }> = ({ onClose }) => {\n const [phase, setPhase] = useState<UndoPhase>({ type: 'file-list' })\n const [files, setFiles] = useState<BackupFileSummary[]>([])\n const [versions, setVersions] = useState<BackupMetadata[]>([])\n const [loading, setLoading] = useState(true)\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n\n // Load files on mount\n useEffect(() => {\n const loadFiles = async () => {\n try {\n const backupFiles = await listBackedUpFiles()\n setFiles(backupFiles)\n } catch {\n setFiles([])\n } finally {\n setLoading(false)\n }\n }\n loadFiles()\n }, [])\n\n // Load versions when entering version-list phase\n useEffect(() => {\n if (phase.type === 'version-list') {\n const loadVersions = async () => {\n setLoading(true)\n try {\n const fileVersions = await getBackupVersions(phase.file.filePath)\n setVersions(fileVersions)\n } catch {\n setVersions([])\n } finally {\n setLoading(false)\n }\n }\n loadVersions()\n }\n }, [phase])\n\n // Build tabs, items, title based on phase\n const { tabs, items, title, footerHint, emptyText } = useMemo(() => {\n switch (phase.type) {\n case 'file-list': {\n const fileTabs: TabDefinition[] = [\n { id: 'files', label: t('commands.undo.tabFiles') },\n ]\n\n const fileItems: ListItem[] = files.map(file => ({\n id: file.filePath,\n label: getRelativePath(file.filePath),\n description: t('commands.undo.versions', {\n count: file.versionCount,\n }),\n data: { file },\n }))\n\n return {\n tabs: fileTabs,\n items: fileItems,\n title: t('commands.undo.title'),\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Close',\n emptyText: t('commands.undo.noBackups'),\n }\n }\n\n case 'version-list': {\n const versionTabs: TabDefinition[] = [\n { id: 'versions', label: t('commands.undo.tabVersions') },\n ]\n\n const versionItems: ListItem[] = versions.map(version => ({\n id: String(version.version),\n label: `v${version.version}: ${version.operation}`,\n description: formatTimestamp(version.timestamp),\n data: { version },\n }))\n\n return {\n tabs: versionTabs,\n items: versionItems,\n title: getRelativePath(phase.file.filePath),\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Restore \u00B7 Esc Back',\n emptyText: 'No versions found',\n }\n }\n }\n }, [phase, files, versions])\n\n // Handle status overlay dismiss\n const handleStatusDismiss = useCallback(() => {\n setStatusOverlay(null)\n onClose()\n }, [onClose])\n\n // Handle back / close\n const handleBack = useCallback(() => {\n if (statusOverlay && statusOverlay.type !== 'loading') {\n handleStatusDismiss()\n return\n }\n if (phase.type === 'file-list') {\n onClose()\n } else {\n setPhase({ type: 'file-list' })\n }\n }, [phase, statusOverlay, onClose, handleStatusDismiss])\n\n const handleClose = handleBack\n\n // Handle tab change (no-op, single tab per phase)\n const handleTabChange = useCallback(() => {}, [])\n\n // Handle item selection\n const handleSelect = useCallback(\n async (item: ListItem) => {\n switch (phase.type) {\n case 'file-list': {\n const data = item.data as { file: BackupFileSummary }\n setPhase({ type: 'version-list', file: data.file })\n break\n }\n\n case 'version-list': {\n const data = item.data as { version: BackupMetadata }\n setStatusOverlay({\n type: 'loading',\n message: 'Restoring file...',\n })\n\n try {\n const success = await restoreBackup(\n phase.file.filePath,\n data.version.version,\n )\n if (success) {\n setStatusOverlay({\n type: 'success',\n message: `${t('commands.undo.fileRestored')}: v${data.version.version}`,\n })\n } else {\n setStatusOverlay({\n type: 'error',\n message: t('commands.undo.restoreFailed'),\n })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n break\n }\n }\n },\n [phase],\n )\n\n const currentTab = phase.type === 'file-list' ? 'files' : 'versions'\n\n return (\n <TabbedListView\n title={title}\n tabs={tabs}\n activeTab={currentTab}\n onTabChange={handleTabChange}\n items={items}\n searchEnabled={false}\n onSelect={handleSelect}\n onClose={handleClose}\n onBack={handleBack}\n statusOverlay={statusOverlay}\n footerHint={footerHint}\n isLoading={loading}\n loadingText={t('commands.undo.loading')}\n emptyText={emptyText}\n statusDismissHint=\"Enter Close\"\n />\n )\n}\n\n// =============================================================================\n// Command Export\n// =============================================================================\n\nconst command: Command = {\n name: 'undo',\n description: t('commands.undo.description'),\n type: 'local-jsx' as const,\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n\n userFacingName() {\n return 'undo'\n },\n\n async call(onDone: (result?: string) => void) {\n return <UndoCommand onClose={onDone} />\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Undo Command\n *\n * Interactive command to restore file versions from backups.\n * Uses TabbedListView with a phase state machine for consistent UI.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react'\nimport type { Command } from '@commands'\nimport { getCwd } from '@utils/state'\nimport {\n listBackedUpFiles,\n getBackupVersions,\n restoreBackup,\n type BackupFileSummary,\n type BackupMetadata,\n} from '../core/backupManager'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport { t } from '@i18n'\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp)\n const now = new Date()\n const diff = now.getTime() - timestamp\n const timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`\n\n if (diff < 60 * 60 * 1000) {\n const minutes = Math.floor(diff / (60 * 1000))\n return minutes <= 1\n ? t('commands.undo.justNow')\n : t('commands.undo.minutesAgo', { count: minutes })\n }\n\n if (\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear()\n ) {\n return `${t('commands.undo.today')} ${timeStr}`\n }\n\n if (diff < 7 * 24 * 60 * 60 * 1000) {\n const weekdayKeys = [\n 'commands.undo.weekday.sun',\n 'commands.undo.weekday.mon',\n 'commands.undo.weekday.tue',\n 'commands.undo.weekday.wed',\n 'commands.undo.weekday.thu',\n 'commands.undo.weekday.fri',\n 'commands.undo.weekday.sat',\n ] as const\n return `${t(weekdayKeys[date.getDay()])} ${timeStr}`\n }\n\n return `${date.getMonth() + 1}/${date.getDate()} ${timeStr}`\n}\n\nfunction getRelativePath(filePath: string): string {\n const cwd = getCwd()\n if (filePath.startsWith(cwd)) {\n const relative = filePath.slice(cwd.length)\n return relative.startsWith('/') ? relative.slice(1) : relative\n }\n return filePath\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype UndoPhase =\n | { type: 'file-list' }\n | { type: 'version-list'; file: BackupFileSummary }\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nconst UndoCommand: React.FC<{ onClose: () => void }> = ({ onClose }) => {\n const [phase, setPhase] = useState<UndoPhase>({ type: 'file-list' })\n const [files, setFiles] = useState<BackupFileSummary[]>([])\n const [versions, setVersions] = useState<BackupMetadata[]>([])\n const [loading, setLoading] = useState(true)\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n\n // Load files on mount\n useEffect(() => {\n const loadFiles = async () => {\n try {\n const backupFiles = await listBackedUpFiles()\n setFiles(backupFiles)\n } catch {\n setFiles([])\n } finally {\n setLoading(false)\n }\n }\n loadFiles()\n }, [])\n\n // Load versions when entering version-list phase\n useEffect(() => {\n if (phase.type === 'version-list') {\n const loadVersions = async () => {\n setLoading(true)\n try {\n const fileVersions = await getBackupVersions(phase.file.filePath)\n setVersions(fileVersions)\n } catch {\n setVersions([])\n } finally {\n setLoading(false)\n }\n }\n loadVersions()\n }\n }, [phase])\n\n // Build tabs, items, title based on phase\n const { tabs, items, title, footerHint, emptyText } = useMemo(() => {\n switch (phase.type) {\n case 'file-list': {\n const fileTabs: TabDefinition[] = [\n { id: 'files', label: t('commands.undo.tabFiles') },\n ]\n\n const fileItems: ListItem[] = files.map(file => ({\n id: file.filePath,\n label: getRelativePath(file.filePath),\n description: t('commands.undo.versions', {\n count: file.versionCount,\n }),\n data: { file },\n }))\n\n return {\n tabs: fileTabs,\n items: fileItems,\n title: t('commands.undo.title'),\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Close',\n emptyText: t('commands.undo.noBackups'),\n }\n }\n\n case 'version-list': {\n const versionTabs: TabDefinition[] = [\n { id: 'versions', label: t('commands.undo.tabVersions') },\n ]\n\n const versionItems: ListItem[] = versions.map(version => ({\n id: String(version.version),\n label: `v${version.version}: ${version.operation}`,\n description: formatTimestamp(version.timestamp),\n data: { version },\n }))\n\n return {\n tabs: versionTabs,\n items: versionItems,\n title: getRelativePath(phase.file.filePath),\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Restore \u00B7 Esc Back',\n emptyText: 'No versions found',\n }\n }\n default:\n return {\n tabs: [],\n items: [],\n title: '',\n footerHint: '',\n emptyText: '',\n }\n }\n }, [phase, files, versions])\n\n // Handle status overlay dismiss\n const handleStatusDismiss = useCallback(() => {\n setStatusOverlay(null)\n onClose()\n }, [onClose])\n\n // Handle back / close\n const handleBack = useCallback(() => {\n if (statusOverlay && statusOverlay.type !== 'loading') {\n handleStatusDismiss()\n return\n }\n if (phase.type === 'file-list') {\n onClose()\n } else {\n setPhase({ type: 'file-list' })\n }\n }, [phase, statusOverlay, onClose, handleStatusDismiss])\n\n const handleClose = handleBack\n\n // Handle tab change (no-op, single tab per phase)\n const handleTabChange = useCallback(() => {}, [])\n\n // Handle item selection\n const handleSelect = useCallback(\n async (item: ListItem) => {\n switch (phase.type) {\n case 'file-list': {\n const data = item.data as { file: BackupFileSummary }\n setPhase({ type: 'version-list', file: data.file })\n break\n }\n\n case 'version-list': {\n const data = item.data as { version: BackupMetadata }\n setStatusOverlay({\n type: 'loading',\n message: 'Restoring file...',\n })\n\n try {\n const success = await restoreBackup(\n phase.file.filePath,\n data.version.version,\n )\n if (success) {\n setStatusOverlay({\n type: 'success',\n message: `${t('commands.undo.fileRestored')}: v${data.version.version}`,\n })\n } else {\n setStatusOverlay({\n type: 'error',\n message: t('commands.undo.restoreFailed'),\n })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n break\n }\n }\n },\n [phase],\n )\n\n const currentTab = phase.type === 'file-list' ? 'files' : 'versions'\n\n return (\n <TabbedListView\n title={title}\n tabs={tabs}\n activeTab={currentTab}\n onTabChange={handleTabChange}\n items={items}\n searchEnabled={false}\n onSelect={handleSelect}\n onClose={handleClose}\n onBack={handleBack}\n statusOverlay={statusOverlay}\n footerHint={footerHint}\n isLoading={loading}\n loadingText={t('commands.undo.loading')}\n emptyText={emptyText}\n statusDismissHint=\"Enter Close\"\n />\n )\n}\n\n// =============================================================================\n// Command Export\n// =============================================================================\n\nconst command: Command = {\n name: 'undo',\n description: t('commands.undo.description'),\n type: 'local-jsx' as const,\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n\n userFacingName() {\n return 'undo'\n },\n\n async call(onDone: (result?: string) => void) {\n return <UndoCommand onClose={onDone} />\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,22 @@
1
+ import { getGlobalConfig, saveGlobalConfig } from "../utils/config.js";
2
+ const vim = {
3
+ name: "vim",
4
+ description: "Toggle vim keybinding mode",
5
+ isEnabled: true,
6
+ isHidden: false,
7
+ type: "local",
8
+ userFacingName() {
9
+ return "vim";
10
+ },
11
+ async call() {
12
+ const config = getGlobalConfig();
13
+ const newValue = !config.viMode;
14
+ saveGlobalConfig({ ...config, viMode: newValue });
15
+ return newValue ? "Vim mode enabled. Use vim keybindings in the input prompt." : "Vim mode disabled. Standard keybindings restored.";
16
+ }
17
+ };
18
+ var vim_default = vim;
19
+ export {
20
+ vim_default as default
21
+ };
22
+ //# sourceMappingURL=vim.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/vim.ts"],
4
+ "sourcesContent": ["/**\n * /vim command\n *\n * Toggle vim keybinding mode on/off.\n */\n\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport type { Command } from '../commands'\n\nconst vim: Command = {\n name: 'vim',\n description: 'Toggle vim keybinding mode',\n isEnabled: true,\n isHidden: false,\n type: 'local',\n userFacingName() {\n return 'vim'\n },\n async call() {\n const config = getGlobalConfig()\n const newValue = !config.viMode\n saveGlobalConfig({ ...config, viMode: newValue })\n\n return newValue\n ? 'Vim mode enabled. Use vim keybindings in the input prompt.'\n : 'Vim mode disabled. Standard keybindings restored.'\n },\n}\n\nexport default vim\n"],
5
+ "mappings": "AAMA,SAAS,iBAAiB,wBAAwB;AAGlD,MAAM,MAAe;AAAA,EACnB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO;AACX,UAAM,SAAS,gBAAgB;AAC/B,UAAM,WAAW,CAAC,OAAO;AACzB,qBAAiB,EAAE,GAAG,QAAQ,QAAQ,SAAS,CAAC;AAEhD,WAAO,WACH,+DACA;AAAA,EACN;AACF;AAEA,IAAO,cAAQ;",
6
+ "names": []
7
+ }
package/dist/commands.js CHANGED
@@ -23,6 +23,10 @@ import undo from "./commands/undo.js";
23
23
  import language from "./commands/language.js";
24
24
  import { quit } from "./commands/quit.js";
25
25
  import stats from "./commands/stats.js";
26
+ import effort from "./commands/effort.js";
27
+ import memory from "./commands/memory.js";
28
+ import outputStyle from "./commands/outputStyle.js";
29
+ import review from "./commands/review.js";
26
30
  import doctor from "./commands/doctor.js";
27
31
  import bug from "./commands/bug.js";
28
32
  import tasks from "./commands/tasks.js";
@@ -43,17 +47,21 @@ const COMMANDS = memoize(() => [
43
47
  context,
44
48
  cost,
45
49
  doctor,
50
+ effort,
46
51
  exportCmd,
47
52
  help,
48
53
  init,
49
54
  language,
50
55
  mcp,
56
+ memory,
51
57
  model,
52
58
  newCmd,
59
+ outputStyle,
53
60
  permissions,
54
61
  plugin,
55
62
  quit,
56
63
  resume,
64
+ review,
57
65
  sandbox,
58
66
  setup,
59
67
  stats,
@@ -63,6 +71,9 @@ const COMMANDS = memoize(() => [
63
71
  undo,
64
72
  ...HIDDEN_COMMANDS
65
73
  ]);
74
+ function getBuiltInCommands() {
75
+ return [...COMMANDS()].sort((a, b) => a.userFacingName().localeCompare(b.userFacingName())).filter((_) => _.isEnabled);
76
+ }
66
77
  const getCommands = memoize(async () => {
67
78
  const [mcpCommands, customCommands, pluginCommands] = await Promise.all([
68
79
  getMCPCommands(),
@@ -109,6 +120,7 @@ function getCommand(commandName, commands) {
109
120
  return command;
110
121
  }
111
122
  export {
123
+ getBuiltInCommands,
112
124
  getCommand,
113
125
  getCommands,
114
126
  hasCommand
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/commands.ts"],
4
- "sourcesContent": ["import React from 'react'\nimport clear from './commands/clear'\nimport compact from './commands/compact'\nimport config from './commands/config'\nimport context from './commands/context'\nimport cost from './commands/cost'\nimport ctx_viz from './commands/ctx_viz'\nimport exportCmd from './commands/export'\nimport help from './commands/help'\nimport init from './commands/init'\nimport mcp from './commands/mcp-interactive'\nimport model from './commands/model'\nimport permissions from './commands/permissions'\nimport refreshCommands from './commands/refreshCommands'\nimport sandbox from './commands/sandbox'\nimport setup from './commands/setup'\nimport status from './commands/status'\nimport terminalSetup from './commands/terminalSetup'\nimport { Tool, ToolUseContext } from './Tool'\nimport resume from './commands/resume'\nimport newCmd from './commands/new'\nimport agents from './commands/agents'\nimport plugin from './commands/plugin'\nimport undo from './commands/undo'\nimport language from './commands/language'\nimport { quit } from './commands/quit'\nimport stats from './commands/stats'\n// Phase 4: Diagnostic and task management commands\nimport doctor from './commands/doctor'\nimport bug from './commands/bug'\nimport tasks from './commands/tasks'\nimport todos from './commands/todos'\nimport { getMCPCommands } from './services/mcpClient'\nimport {\n loadCustomCommands,\n loadPluginCommands,\n} from './services/customCommands'\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { memoize } from 'lodash-es'\nimport type { Message } from './query'\n\ntype PromptCommand = {\n type: 'prompt'\n progressMessage: string\n argNames?: string[]\n getPromptForCommand(args: string): Promise<MessageParam[]>\n}\n\ntype LocalCommand = {\n type: 'local'\n call(\n args: string,\n context: {\n options: {\n commands: Command[]\n tools: Tool[]\n slowAndCapableModel: string\n }\n abortController: AbortController\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n },\n ): Promise<string>\n}\n\ntype LocalJSXCommand = {\n type: 'local-jsx'\n call(\n onDone: (result?: string) => void,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n /** Unmount current REPL (for commands that need to replace the entire UI) */\n unmount?: () => void\n },\n args?: string,\n ): Promise<React.ReactNode>\n}\n\nexport type Command = {\n description: string\n isEnabled: boolean\n isHidden: boolean\n name: string\n aliases?: string[]\n /** When true, the command's JSX replaces the PromptInput instead of rendering below it */\n hidePromptInput?: boolean\n userFacingName(): string\n} & (PromptCommand | LocalCommand | LocalJSXCommand)\n\n// Hidden developer commands (not shown in /help but still accessible)\nconst HIDDEN_COMMANDS = [ctx_viz, refreshCommands, terminalSetup]\n\n// Declared as a function so that we don't run this until getCommands is called,\n// since underlying functions read from config, which can't be read at module initialization time\nconst COMMANDS = memoize((): Command[] => [\n agents,\n bug,\n clear,\n compact,\n config,\n context,\n cost,\n doctor,\n exportCmd,\n help,\n init,\n language,\n mcp,\n model,\n newCmd,\n permissions,\n plugin,\n quit,\n resume,\n sandbox,\n setup,\n stats,\n status,\n tasks,\n todos,\n undo,\n ...HIDDEN_COMMANDS,\n])\n\nexport const getCommands = memoize(async (): Promise<Command[]> => {\n const [mcpCommands, customCommands, pluginCommands] = await Promise.all([\n getMCPCommands(),\n loadCustomCommands(),\n loadPluginCommands(),\n ])\n\n // Get built-in commands\n const builtInCommands = COMMANDS()\n\n // Sort built-in commands alphabetically by name\n const sortedBuiltIn = [...builtInCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Sort MCP commands alphabetically by name\n const sortedMCP = [...mcpCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Sort plugin commands alphabetically by name\n const sortedPlugin = [...pluginCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Sort custom commands alphabetically by name\n const sortedCustom = [...customCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Command priority (later overrides earlier):\n // 1. MCP commands (lowest priority) - sorted alphabetically\n // 2. Plugin commands - sorted alphabetically\n // 3. Custom commands (user/project) - sorted alphabetically\n // 4. Built-in commands (highest priority) - sorted alphabetically\n // Display order: Built-in first, then custom/plugin/MCP\n return [\n ...sortedBuiltIn,\n ...sortedCustom,\n ...sortedPlugin,\n ...sortedMCP,\n ].filter(_ => _.isEnabled)\n})\n\nexport function hasCommand(commandName: string, commands: Command[]): boolean {\n return commands.some(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n )\n}\n\nexport function getCommand(commandName: string, commands: Command[]): Command {\n const command = commands.find(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n ) as Command | undefined\n if (!command) {\n throw ReferenceError(\n `Command ${commandName} not found. Available commands: ${commands\n .map(_ => {\n const name = _.userFacingName()\n return _.aliases ? `${name} (aliases: ${_.aliases.join(', ')})` : name\n })\n .join(', ')}`,\n )\n }\n\n return command\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from 'react'\nimport clear from './commands/clear'\nimport compact from './commands/compact'\nimport config from './commands/config'\nimport context from './commands/context'\nimport cost from './commands/cost'\nimport ctx_viz from './commands/ctx_viz'\nimport exportCmd from './commands/export'\nimport help from './commands/help'\nimport init from './commands/init'\nimport mcp from './commands/mcp-interactive'\nimport model from './commands/model'\nimport permissions from './commands/permissions'\nimport refreshCommands from './commands/refreshCommands'\nimport sandbox from './commands/sandbox'\nimport setup from './commands/setup'\nimport status from './commands/status'\nimport terminalSetup from './commands/terminalSetup'\nimport { Tool, ToolUseContext } from './Tool'\nimport resume from './commands/resume'\nimport newCmd from './commands/new'\nimport agents from './commands/agents'\nimport plugin from './commands/plugin'\nimport undo from './commands/undo'\nimport language from './commands/language'\nimport { quit } from './commands/quit'\nimport stats from './commands/stats'\n// Phase: CC compatibility commands\nimport effort from './commands/effort'\nimport memory from './commands/memory'\nimport outputStyle from './commands/outputStyle'\nimport review from './commands/review'\n// Phase 4: Diagnostic and task management commands\nimport doctor from './commands/doctor'\nimport bug from './commands/bug'\nimport tasks from './commands/tasks'\nimport todos from './commands/todos'\nimport { getMCPCommands } from './services/mcpClient'\nimport {\n loadCustomCommands,\n loadPluginCommands,\n} from './services/customCommands'\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { memoize } from 'lodash-es'\nimport type { Message } from './query'\n\ntype PromptCommand = {\n type: 'prompt'\n progressMessage: string\n argNames?: string[]\n getPromptForCommand(args: string): Promise<MessageParam[]>\n}\n\ntype LocalCommand = {\n type: 'local'\n call(\n args: string,\n context: {\n options: {\n commands: Command[]\n tools: Tool[]\n slowAndCapableModel: string\n }\n abortController: AbortController\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n },\n ): Promise<string>\n}\n\ntype LocalJSXCommand = {\n type: 'local-jsx'\n call(\n onDone: (result?: string) => void,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n /** Unmount current REPL (for commands that need to replace the entire UI) */\n unmount?: () => void\n },\n args?: string,\n ): Promise<React.ReactNode>\n}\n\nexport type Command = {\n description: string\n isEnabled: boolean\n isHidden: boolean\n name: string\n aliases?: string[]\n /** When true, the command's JSX replaces the PromptInput instead of rendering below it */\n hidePromptInput?: boolean\n userFacingName(): string\n} & (PromptCommand | LocalCommand | LocalJSXCommand)\n\n// Hidden developer commands (not shown in /help but still accessible)\nconst HIDDEN_COMMANDS = [ctx_viz, refreshCommands, terminalSetup]\n\n// Declared as a function so that we don't run this until getCommands is called,\n// since underlying functions read from config, which can't be read at module initialization time\nconst COMMANDS = memoize((): Command[] => [\n agents,\n bug,\n clear,\n compact,\n config,\n context,\n cost,\n doctor,\n effort,\n exportCmd,\n help,\n init,\n language,\n mcp,\n memory,\n model,\n newCmd,\n outputStyle,\n permissions,\n plugin,\n quit,\n resume,\n review,\n sandbox,\n setup,\n stats,\n status,\n tasks,\n todos,\n undo,\n ...HIDDEN_COMMANDS,\n])\n\n/**\n * Get built-in commands only (no MCP/custom/plugin I/O).\n * Synchronous \u2014 safe to call before render for instant startup.\n */\nexport function getBuiltInCommands(): Command[] {\n return [...COMMANDS()]\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n .filter(_ => _.isEnabled)\n}\n\nexport const getCommands = memoize(async (): Promise<Command[]> => {\n const [mcpCommands, customCommands, pluginCommands] = await Promise.all([\n getMCPCommands(),\n loadCustomCommands(),\n loadPluginCommands(),\n ])\n\n // Get built-in commands\n const builtInCommands = COMMANDS()\n\n // Sort built-in commands alphabetically by name\n const sortedBuiltIn = [...builtInCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Sort MCP commands alphabetically by name\n const sortedMCP = [...mcpCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Sort plugin commands alphabetically by name\n const sortedPlugin = [...pluginCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Sort custom commands alphabetically by name\n const sortedCustom = [...customCommands].sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n )\n\n // Command priority (later overrides earlier):\n // 1. MCP commands (lowest priority) - sorted alphabetically\n // 2. Plugin commands - sorted alphabetically\n // 3. Custom commands (user/project) - sorted alphabetically\n // 4. Built-in commands (highest priority) - sorted alphabetically\n // Display order: Built-in first, then custom/plugin/MCP\n return [\n ...sortedBuiltIn,\n ...sortedCustom,\n ...sortedPlugin,\n ...sortedMCP,\n ].filter(_ => _.isEnabled)\n})\n\nexport function hasCommand(commandName: string, commands: Command[]): boolean {\n return commands.some(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n )\n}\n\nexport function getCommand(commandName: string, commands: Command[]): Command {\n const command = commands.find(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n ) as Command | undefined\n if (!command) {\n throw ReferenceError(\n `Command ${commandName} not found. Available commands: ${commands\n .map(_ => {\n const name = _.userFacingName()\n return _.aliases ? `${name} (aliases: ${_.aliases.join(', ')})` : name\n })\n .join(', ')}`,\n )\n }\n\n return command\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -20,6 +20,7 @@ function HighlightedCode({ code, language }) {
20
20
  );
21
21
  return highlight(code, { language: "markdown" });
22
22
  }
23
+ return highlight(code, { language: "markdown" });
23
24
  }
24
25
  }, [code, language]);
25
26
  return /* @__PURE__ */ React.createElement(Text, null, highlightedCode);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/HighlightedCode.tsx"],
4
- "sourcesContent": ["import { highlight, supportsLanguage } from 'cli-highlight'\nimport { Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { logError } from '@utils/log'\n\ntype Props = {\n code: string\n language: string\n}\n\nexport function HighlightedCode({ code, language }: Props): React.ReactElement {\n const highlightedCode = useMemo(() => {\n try {\n if (supportsLanguage(language)) {\n return highlight(code, { language })\n } else {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${language}`,\n )\n return highlight(code, { language: 'markdown' })\n }\n } catch (e) {\n if (e instanceof Error && e.message.includes('Unknown language')) {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${e}`,\n )\n return highlight(code, { language: 'markdown' })\n }\n }\n }, [code, language])\n\n return <Text>{highlightedCode}</Text>\n}\n"],
5
- "mappings": "AAAA,SAAS,WAAW,wBAAwB;AAC5C,SAAS,YAAY;AACrB,OAAO,SAAS,eAAe;AAC/B,SAAS,gBAAgB;AAOlB,SAAS,gBAAgB,EAAE,MAAM,SAAS,GAA8B;AAC7E,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI;AACF,UAAI,iBAAiB,QAAQ,GAAG;AAC9B,eAAO,UAAU,MAAM,EAAE,SAAS,CAAC;AAAA,MACrC,OAAO;AACL;AAAA,UACE,6EAA6E,QAAQ;AAAA,QACvF;AACA,eAAO,UAAU,MAAM,EAAE,UAAU,WAAW,CAAC;AAAA,MACjD;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,SAAS,EAAE,QAAQ,SAAS,kBAAkB,GAAG;AAChE;AAAA,UACE,6EAA6E,CAAC;AAAA,QAChF;AACA,eAAO,UAAU,MAAM,EAAE,UAAU,WAAW,CAAC;AAAA,MACjD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,SAAO,oCAAC,YAAM,eAAgB;AAChC;",
4
+ "sourcesContent": ["import { highlight, supportsLanguage } from 'cli-highlight'\nimport { Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { logError } from '@utils/log'\n\ntype Props = {\n code: string\n language: string\n}\n\nexport function HighlightedCode({ code, language }: Props): React.ReactElement {\n const highlightedCode = useMemo(() => {\n try {\n if (supportsLanguage(language)) {\n return highlight(code, { language })\n } else {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${language}`,\n )\n return highlight(code, { language: 'markdown' })\n }\n } catch (e) {\n if (e instanceof Error && e.message.includes('Unknown language')) {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${e}`,\n )\n return highlight(code, { language: 'markdown' })\n }\n return highlight(code, { language: 'markdown' })\n }\n }, [code, language])\n\n return <Text>{highlightedCode}</Text>\n}\n"],
5
+ "mappings": "AAAA,SAAS,WAAW,wBAAwB;AAC5C,SAAS,YAAY;AACrB,OAAO,SAAS,eAAe;AAC/B,SAAS,gBAAgB;AAOlB,SAAS,gBAAgB,EAAE,MAAM,SAAS,GAA8B;AAC7E,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI;AACF,UAAI,iBAAiB,QAAQ,GAAG;AAC9B,eAAO,UAAU,MAAM,EAAE,SAAS,CAAC;AAAA,MACrC,OAAO;AACL;AAAA,UACE,6EAA6E,QAAQ;AAAA,QACvF;AACA,eAAO,UAAU,MAAM,EAAE,UAAU,WAAW,CAAC;AAAA,MACjD;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,SAAS,EAAE,QAAQ,SAAS,kBAAkB,GAAG;AAChE;AAAA,UACE,6EAA6E,CAAC;AAAA,QAChF;AACA,eAAO,UAAU,MAAM,EAAE,UAAU,WAAW,CAAC;AAAA,MACjD;AACA,aAAO,UAAU,MAAM,EAAE,UAAU,WAAW,CAAC;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,SAAO,oCAAC,YAAM,eAAgB;AAChC;",
6
6
  "names": []
7
7
  }