@within-7/minto 0.2.0 → 0.3.3

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 (308) hide show
  1. package/dist/commands/agents/AgentsCommand.js +22 -24
  2. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  3. package/dist/commands/context.js +2 -1
  4. package/dist/commands/context.js.map +2 -2
  5. package/dist/commands/export.js +2 -1
  6. package/dist/commands/export.js.map +2 -2
  7. package/dist/commands/mcp-interactive.js +7 -6
  8. package/dist/commands/mcp-interactive.js.map +2 -2
  9. package/dist/commands/model.js +3 -2
  10. package/dist/commands/model.js.map +2 -2
  11. package/dist/commands/permissions.js +4 -3
  12. package/dist/commands/permissions.js.map +2 -2
  13. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  14. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  15. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  16. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  17. package/dist/commands/plugin/ErrorView.js +2 -1
  18. package/dist/commands/plugin/ErrorView.js.map +2 -2
  19. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  20. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  21. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  22. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  23. package/dist/commands/plugin/MainMenu.js +2 -1
  24. package/dist/commands/plugin/MainMenu.js.map +2 -2
  25. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  26. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  27. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  28. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  29. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  30. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  31. package/dist/commands/plugin/PluginBrowser.js +6 -5
  32. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  33. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  34. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  35. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  36. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  37. package/dist/commands/plugin.js +16 -15
  38. package/dist/commands/plugin.js.map +2 -2
  39. package/dist/commands/sandbox.js +4 -3
  40. package/dist/commands/sandbox.js.map +2 -2
  41. package/dist/commands/setup.js +2 -1
  42. package/dist/commands/setup.js.map +2 -2
  43. package/dist/commands/status.js +2 -1
  44. package/dist/commands/status.js.map +2 -2
  45. package/dist/commands/undo.js +245 -0
  46. package/dist/commands/undo.js.map +7 -0
  47. package/dist/commands.js +2 -0
  48. package/dist/commands.js.map +2 -2
  49. package/dist/components/AgentThinkingBlock.js +1 -1
  50. package/dist/components/AgentThinkingBlock.js.map +2 -2
  51. package/dist/components/AsciiLogo.js +7 -8
  52. package/dist/components/AsciiLogo.js.map +2 -2
  53. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  54. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  55. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  56. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  57. package/dist/components/CollapsibleHint.js +2 -1
  58. package/dist/components/CollapsibleHint.js.map +2 -2
  59. package/dist/components/Config.js +3 -2
  60. package/dist/components/Config.js.map +2 -2
  61. package/dist/components/ConsoleOAuthFlow.js +2 -1
  62. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  63. package/dist/components/Cost.js +2 -1
  64. package/dist/components/Cost.js.map +2 -2
  65. package/dist/components/HeaderBar.js +13 -8
  66. package/dist/components/HeaderBar.js.map +2 -2
  67. package/dist/components/HistorySearchOverlay.js +4 -3
  68. package/dist/components/HistorySearchOverlay.js.map +2 -2
  69. package/dist/components/HotkeyHelpPanel.js +8 -11
  70. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  71. package/dist/components/InvalidConfigDialog.js +2 -1
  72. package/dist/components/InvalidConfigDialog.js.map +2 -2
  73. package/dist/components/Logo.js +23 -67
  74. package/dist/components/Logo.js.map +2 -2
  75. package/dist/components/MCPServerApprovalDialog.js +2 -1
  76. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  77. package/dist/components/MCPServerDialogCopy.js +2 -1
  78. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  79. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  80. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  81. package/dist/components/MessageSelector.js +4 -3
  82. package/dist/components/MessageSelector.js.map +2 -2
  83. package/dist/components/ModeIndicator.js +2 -1
  84. package/dist/components/ModeIndicator.js.map +2 -2
  85. package/dist/components/ModelConfig.js +4 -3
  86. package/dist/components/ModelConfig.js.map +2 -2
  87. package/dist/components/ModelListManager.js +4 -3
  88. package/dist/components/ModelListManager.js.map +2 -2
  89. package/dist/components/ModelSelector/ModelSelector.js +26 -13
  90. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  91. package/dist/components/Onboarding.js +3 -2
  92. package/dist/components/Onboarding.js.map +2 -2
  93. package/dist/components/OperationSummary.js +130 -0
  94. package/dist/components/OperationSummary.js.map +7 -0
  95. package/dist/components/PromptInput.js +88 -75
  96. package/dist/components/PromptInput.js.map +2 -2
  97. package/dist/components/SensitiveFileWarning.js +31 -0
  98. package/dist/components/SensitiveFileWarning.js.map +7 -0
  99. package/dist/components/Spinner.js +71 -22
  100. package/dist/components/Spinner.js.map +2 -2
  101. package/dist/components/StructuredDiff.js +6 -8
  102. package/dist/components/StructuredDiff.js.map +2 -2
  103. package/dist/components/SubagentBlock.js +4 -2
  104. package/dist/components/SubagentBlock.js.map +2 -2
  105. package/dist/components/SubagentProgress.js +17 -6
  106. package/dist/components/SubagentProgress.js.map +2 -2
  107. package/dist/components/TaskCard.js +14 -11
  108. package/dist/components/TaskCard.js.map +2 -2
  109. package/dist/components/TextInput.js +9 -1
  110. package/dist/components/TextInput.js.map +2 -2
  111. package/dist/components/TodoPanel.js +44 -26
  112. package/dist/components/TodoPanel.js.map +2 -2
  113. package/dist/components/ToolUseLoader.js +2 -2
  114. package/dist/components/ToolUseLoader.js.map +2 -2
  115. package/dist/components/TreeConnector.js +4 -3
  116. package/dist/components/TreeConnector.js.map +2 -2
  117. package/dist/components/TrustDialog.js +2 -1
  118. package/dist/components/TrustDialog.js.map +2 -2
  119. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  120. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  121. package/dist/components/messages/AssistantTextMessage.js +17 -9
  122. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  123. package/dist/components/messages/AssistantToolUseMessage.js +8 -4
  124. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  125. package/dist/components/messages/GroupRenderer.js +2 -1
  126. package/dist/components/messages/GroupRenderer.js.map +2 -2
  127. package/dist/components/messages/NestedTasksPreview.js +13 -1
  128. package/dist/components/messages/NestedTasksPreview.js.map +2 -2
  129. package/dist/components/messages/ParallelTasksGroupView.js +4 -3
  130. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  131. package/dist/components/messages/TaskInModuleView.js +35 -15
  132. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  133. package/dist/components/messages/TaskOutputContent.js +9 -6
  134. package/dist/components/messages/TaskOutputContent.js.map +2 -2
  135. package/dist/components/messages/UserPromptMessage.js +2 -2
  136. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  137. package/dist/constants/colors.js +90 -72
  138. package/dist/constants/colors.js.map +2 -2
  139. package/dist/constants/prompts.js +22 -1
  140. package/dist/constants/prompts.js.map +2 -2
  141. package/dist/constants/toolInputExamples.js +84 -0
  142. package/dist/constants/toolInputExamples.js.map +7 -0
  143. package/dist/core/backupManager.js +321 -0
  144. package/dist/core/backupManager.js.map +7 -0
  145. package/dist/core/costTracker.js +9 -18
  146. package/dist/core/costTracker.js.map +2 -2
  147. package/dist/core/gitAutoCommit.js +287 -0
  148. package/dist/core/gitAutoCommit.js.map +7 -0
  149. package/dist/core/index.js +3 -0
  150. package/dist/core/index.js.map +2 -2
  151. package/dist/core/operationTracker.js +212 -0
  152. package/dist/core/operationTracker.js.map +7 -0
  153. package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
  154. package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
  155. package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
  157. package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
  158. package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
  159. package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
  160. package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
  161. package/dist/core/tokenStats.js +9 -0
  162. package/dist/core/tokenStats.js.map +7 -0
  163. package/dist/core/tokenStatsManager.js +331 -0
  164. package/dist/core/tokenStatsManager.js.map +7 -0
  165. package/dist/entrypoints/cli.js +122 -88
  166. package/dist/entrypoints/cli.js.map +2 -2
  167. package/dist/hooks/useAgentTokenStats.js +72 -0
  168. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  169. package/dist/hooks/useAgentTranscripts.js +30 -6
  170. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  171. package/dist/hooks/useLogMessages.js +12 -1
  172. package/dist/hooks/useLogMessages.js.map +2 -2
  173. package/dist/i18n/locales/en.js +6 -5
  174. package/dist/i18n/locales/en.js.map +2 -2
  175. package/dist/i18n/locales/zh-CN.js +6 -5
  176. package/dist/i18n/locales/zh-CN.js.map +2 -2
  177. package/dist/i18n/types.js.map +1 -1
  178. package/dist/permissions.js +147 -1
  179. package/dist/permissions.js.map +2 -2
  180. package/dist/query.js +78 -4
  181. package/dist/query.js.map +3 -3
  182. package/dist/screens/REPL.js +23 -3
  183. package/dist/screens/REPL.js.map +2 -2
  184. package/dist/screens/ResumeConversation.js +2 -0
  185. package/dist/screens/ResumeConversation.js.map +2 -2
  186. package/dist/services/claude.js +54 -3
  187. package/dist/services/claude.js.map +2 -2
  188. package/dist/services/intelligentCompactor.js +1 -1
  189. package/dist/services/intelligentCompactor.js.map +2 -2
  190. package/dist/services/mcpClient.js +81 -25
  191. package/dist/services/mcpClient.js.map +2 -2
  192. package/dist/services/sandbox/filesystemBoundary.js +58 -17
  193. package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
  194. package/dist/services/taskStore.js +205 -0
  195. package/dist/services/taskStore.js.map +7 -0
  196. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
  197. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  198. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +42 -4
  199. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  200. package/dist/tools/BashTool/BashTool.js +43 -7
  201. package/dist/tools/BashTool/BashTool.js.map +2 -2
  202. package/dist/tools/BashTool/prompt.js +184 -34
  203. package/dist/tools/BashTool/prompt.js.map +2 -2
  204. package/dist/tools/FileEditTool/FileEditTool.js +24 -9
  205. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  206. package/dist/tools/FileEditTool/prompt.js +10 -4
  207. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  208. package/dist/tools/FileEditTool/utils.js +10 -4
  209. package/dist/tools/FileEditTool/utils.js.map +2 -2
  210. package/dist/tools/FileReadTool/FileReadTool.js +1 -1
  211. package/dist/tools/FileReadTool/FileReadTool.js.map +1 -1
  212. package/dist/tools/FileReadTool/prompt.js +16 -1
  213. package/dist/tools/FileReadTool/prompt.js.map +2 -2
  214. package/dist/tools/FileWriteTool/FileWriteTool.js +1 -1
  215. package/dist/tools/FileWriteTool/FileWriteTool.js.map +1 -1
  216. package/dist/tools/FileWriteTool/prompt.js +12 -3
  217. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  218. package/dist/tools/GlobTool/prompt.js +12 -1
  219. package/dist/tools/GlobTool/prompt.js.map +2 -2
  220. package/dist/tools/GrepTool/GrepTool.js +333 -65
  221. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  222. package/dist/tools/GrepTool/prompt.js +15 -8
  223. package/dist/tools/GrepTool/prompt.js.map +2 -2
  224. package/dist/tools/MultiEditTool/prompt.js +5 -3
  225. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  226. package/dist/tools/NotebookEditTool/NotebookEditTool.js +59 -46
  227. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  228. package/dist/tools/NotebookEditTool/prompt.js +1 -1
  229. package/dist/tools/NotebookEditTool/prompt.js.map +1 -1
  230. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
  231. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  232. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
  233. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  234. package/dist/tools/PlanModeTool/prompt.js +1 -1
  235. package/dist/tools/PlanModeTool/prompt.js.map +1 -1
  236. package/dist/tools/SkillTool/SkillTool.js +4 -3
  237. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  238. package/dist/tools/SkillTool/prompt.js +1 -1
  239. package/dist/tools/SkillTool/prompt.js.map +1 -1
  240. package/dist/tools/TaskCreateTool/TaskCreateTool.js +102 -0
  241. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +7 -0
  242. package/dist/tools/TaskCreateTool/prompt.js +47 -0
  243. package/dist/tools/TaskCreateTool/prompt.js.map +7 -0
  244. package/dist/tools/TaskGetTool/TaskGetTool.js +115 -0
  245. package/dist/tools/TaskGetTool/TaskGetTool.js.map +7 -0
  246. package/dist/tools/TaskGetTool/prompt.js +28 -0
  247. package/dist/tools/TaskGetTool/prompt.js.map +7 -0
  248. package/dist/tools/TaskListTool/TaskListTool.js +102 -0
  249. package/dist/tools/TaskListTool/TaskListTool.js.map +7 -0
  250. package/dist/tools/TaskListTool/prompt.js +27 -0
  251. package/dist/tools/TaskListTool/prompt.js.map +7 -0
  252. package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
  253. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
  254. package/dist/tools/TaskStopTool/TaskStopTool.js +150 -0
  255. package/dist/tools/TaskStopTool/TaskStopTool.js.map +7 -0
  256. package/dist/tools/TaskStopTool/prompt.js +15 -0
  257. package/dist/tools/TaskStopTool/prompt.js.map +7 -0
  258. package/dist/tools/TaskTool/TaskTool.js +49 -1
  259. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  260. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +134 -0
  261. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +7 -0
  262. package/dist/tools/TaskUpdateTool/prompt.js +81 -0
  263. package/dist/tools/TaskUpdateTool/prompt.js.map +7 -0
  264. package/dist/tools/URLFetcherTool/prompt.js +1 -1
  265. package/dist/tools/URLFetcherTool/prompt.js.map +1 -1
  266. package/dist/tools.js +12 -0
  267. package/dist/tools.js.map +2 -2
  268. package/dist/utils/CircuitBreaker.js +242 -0
  269. package/dist/utils/CircuitBreaker.js.map +7 -0
  270. package/dist/utils/ask.js +2 -0
  271. package/dist/utils/ask.js.map +2 -2
  272. package/dist/utils/config.js +47 -5
  273. package/dist/utils/config.js.map +2 -2
  274. package/dist/utils/credentials/CredentialStore.js +1 -0
  275. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  276. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  277. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  278. package/dist/utils/credentials/index.js +37 -0
  279. package/dist/utils/credentials/index.js.map +7 -0
  280. package/dist/utils/credentials/migration.js +82 -0
  281. package/dist/utils/credentials/migration.js.map +7 -0
  282. package/dist/utils/markdown.js +13 -1
  283. package/dist/utils/markdown.js.map +2 -2
  284. package/dist/utils/model.js +15 -2
  285. package/dist/utils/model.js.map +2 -2
  286. package/dist/utils/permissions/filesystem.js +5 -1
  287. package/dist/utils/permissions/filesystem.js.map +2 -2
  288. package/dist/utils/ripgrep.js +53 -1
  289. package/dist/utils/ripgrep.js.map +2 -2
  290. package/dist/utils/safePath.js +132 -0
  291. package/dist/utils/safePath.js.map +7 -0
  292. package/dist/utils/sensitiveFiles.js +125 -0
  293. package/dist/utils/sensitiveFiles.js.map +7 -0
  294. package/dist/utils/taskDisplayUtils.js +9 -9
  295. package/dist/utils/taskDisplayUtils.js.map +2 -2
  296. package/dist/utils/terminal.js +12 -0
  297. package/dist/utils/terminal.js.map +2 -2
  298. package/dist/utils/theme.js +6 -6
  299. package/dist/utils/theme.js.map +1 -1
  300. package/dist/utils/toolRiskClassification.js +207 -0
  301. package/dist/utils/toolRiskClassification.js.map +7 -0
  302. package/dist/utils/tooling/safeRender.js +17 -17
  303. package/dist/utils/tooling/safeRender.js.map +2 -2
  304. package/dist/version.js +2 -2
  305. package/dist/version.js.map +1 -1
  306. package/package.json +22 -28
  307. package/dist/hooks/useCancelRequest.js +0 -31
  308. package/dist/hooks/useCancelRequest.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/SkillTool/SkillTool.tsx"],
4
- "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport {\n loadAllSkills,\n getSkill,\n loadSkillContent,\n searchSkills,\n getSkillCount,\n} from '@utils/skillLoader'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n action: z\n .enum(['list', 'load', 'search'])\n .describe(\n 'Action to perform: list all skills, load a specific skill, or search skills',\n ),\n name: z\n .string()\n .optional()\n .describe('Name of skill to load (required for \"load\" action)'),\n query: z\n .string()\n .optional()\n .describe('Search query (required for \"search\" action)'),\n})\n\ntype SkillToolOutput =\n | {\n type: 'list'\n skills: Array<{ name: string; description: string; plugin: string }>\n }\n | {\n type: 'load'\n skill: {\n name: string\n description: string\n plugin: string\n content: string\n }\n }\n | {\n type: 'search'\n skills: Array<{ name: string; description: string; plugin: string }>\n query: string\n }\n\nexport const SkillTool = {\n name: 'Skill',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Skill'\n },\n async isEnabled() {\n // Enable if there are any skills available\n return getSkillCount() > 0\n },\n isReadOnly() {\n return true // Skills are read-only resources\n },\n isConcurrencySafe() {\n return true // Reading skills is safe for concurrent execution\n },\n needsPermissions() {\n return false // No permissions needed for reading skills\n },\n renderResultForAssistant(output: SkillToolOutput) {\n if (output.type === 'list') {\n if (output.skills.length === 0) {\n return 'No skills available. Install plugins with skills to use this feature.'\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Available skills (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'search') {\n if (output.skills.length === 0) {\n return `No skills found matching \"${output.query}\".`\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Skills matching \"${output.query}\" (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'load') {\n const { skill } = output\n return `# Skill: ${skill.name}\n\n**Plugin**: ${skill.plugin}\n**Description**: ${skill.description}\n\n---\n\n${skill.content}\n\n---\n\n*End of skill content. Apply these instructions to complete your task.*`\n }\n\n return 'Unknown skill operation'\n },\n renderToolUseMessage(input, { verbose }) {\n if (input.action === 'list') {\n return 'Listing all available skills'\n }\n if (input.action === 'load' && input.name) {\n return `Loading skill: ${input.name}`\n }\n if (input.action === 'search' && input.query) {\n return `Searching skills for: ${input.query}`\n }\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: SkillToolOutput) {\n // Guard against undefined or null output\n if (!output || !output.type) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n }\n\n if (output.type === 'list') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''}\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text dimColor> ({skill?.plugin || 'Unknown'})</Text>\n </Text>\n <Text dimColor> {skill?.description || ''}</Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text dimColor> ... and {skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'search') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''} matching &quot;\n {output.query || ''}&quot;\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text dimColor> ({skill?.plugin || 'Unknown'})</Text>\n </Text>\n <Text dimColor> {skill?.description || ''}</Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text dimColor> ... and {skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'load') {\n const skill = output.skill || {\n name: '',\n description: '',\n plugin: '',\n content: '',\n }\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\u2713 Loaded skill: {skill.name || 'Unknown'}</Text>\n <Text dimColor> Plugin: {skill.plugin || 'Unknown'}</Text>\n <Text dimColor>\n {' '}\n Content: {(skill.content || '').length} characters\n </Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n },\n async validateInput(input) {\n if (input.action === 'load') {\n if (!input.name) {\n return {\n result: false,\n message: 'Skill name is required for \"load\" action',\n }\n }\n\n const skill = getSkill(input.name)\n if (!skill) {\n const allSkills = loadAllSkills()\n const availableNames = allSkills.map(s => s.name).join(', ')\n return {\n result: false,\n message: `Skill \"${input.name}\" not found. Available skills: ${availableNames}`,\n }\n }\n }\n\n if (input.action === 'search') {\n if (!input.query) {\n return {\n result: false,\n message: 'Query is required for \"search\" action',\n }\n }\n }\n\n return { result: true }\n },\n async *call(input) {\n try {\n // List all skills\n if (input.action === 'list') {\n const skills = loadAllSkills()\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'list',\n skills: skillsList,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Load specific skill\n if (input.action === 'load' && input.name) {\n const skill = getSkill(input.name)\n if (!skill) {\n throw new Error(`Skill \"${input.name}\" not found`)\n }\n\n // Load full content\n const content = await loadSkillContent(skill)\n\n const output: SkillToolOutput = {\n type: 'load',\n skill: {\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n content,\n },\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Search skills\n if (input.action === 'search' && input.query) {\n const skills = searchSkills(input.query)\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'search',\n skills: skillsList,\n query: input.query,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n throw new Error('Invalid skill action or missing required parameters')\n } catch (error) {\n throw new Error(\n `Skill operation failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n} satisfies Tool<typeof inputSchema, SkillToolOutput>\n"],
5
- "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAE/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa,cAAc;AAEpC,MAAM,cAAc,EAAE,aAAa;AAAA,EACjC,QAAQ,EACL,KAAK,CAAC,QAAQ,QAAQ,QAAQ,CAAC,EAC/B;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,oDAAoD;AAAA,EAChE,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,6CAA6C;AAC3D,CAAC;AAsBM,MAAM,YAAY;AAAA,EACvB,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAEhB,WAAO,cAAc,IAAI;AAAA,EAC3B;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAyB;AAChD,QAAI,OAAO,SAAS,QAAQ;AAC1B,UAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,OAAO,OACvB;AAAA,QACC,WACE,OAAO,MAAM,IAAI,OAAO,MAAM,MAAM,MAAM,MAAM,WAAW;AAAA,MAC/D,EACC,KAAK,IAAI;AAEZ,aAAO,qBAAqB,OAAO,OAAO,MAAM;AAAA;AAAA,EAAS,UAAU;AAAA;AAAA;AAAA,IACrE;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,eAAO,6BAA6B,OAAO,KAAK;AAAA,MAClD;AAEA,YAAM,aAAa,OAAO,OACvB;AAAA,QACC,WACE,OAAO,MAAM,IAAI,OAAO,MAAM,MAAM,MAAM,MAAM,WAAW;AAAA,MAC/D,EACC,KAAK,IAAI;AAEZ,aAAO,oBAAoB,OAAO,KAAK,MAAM,OAAO,OAAO,MAAM;AAAA;AAAA,EAAS,UAAU;AAAA;AAAA;AAAA,IACtF;AAEA,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,EAAE,MAAM,IAAI;AAClB,aAAO,YAAY,MAAM,IAAI;AAAA;AAAA,cAErB,MAAM,MAAM;AAAA,mBACP,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA,EAIlC,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKX;AAEA,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,OAAO,EAAE,QAAQ,GAAG;AACvC,QAAI,MAAM,WAAW,QAAQ;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,MAAM,WAAW,UAAU,MAAM,MAAM;AACzC,aAAO,kBAAkB,MAAM,IAAI;AAAA,IACrC;AACA,QAAI,MAAM,WAAW,YAAY,MAAM,OAAO;AAC5C,aAAO,yBAAyB,MAAM,KAAK;AAAA,IAC7C;AACA,WAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,EACxD,KAAK,IAAI;AAAA,EACd;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAyB;AAE/C,QAAI,CAAC,UAAU,CAAC,OAAO,MAAM;AAC3B,aACE,oCAAC,OAAI,aAAa,KAChB,oCAAC,YAAK,2BAAyB,CACjC;AAAA,IAEJ;AAEA,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,SAAS,OAAO,UAAU,CAAC;AACjC,aACE,oCAAC,OAAI,eAAc,UAAS,aAAa,KACvC,oCAAC,QAAK,OAAM,WAAQ,iBACT,OAAO,QAAO,UACtB,OAAO,WAAW,IAAI,MAAM,EAC/B,GACC,OAAO,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,MAC/B,oCAAC,OAAI,KAAK,GAAG,eAAc,YACzB,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAE,OAAO,QAAQ,SAAU,GACrC,oCAAC,QAAK,UAAQ,QAAC,MAAG,OAAO,UAAU,WAAU,GAAC,CAChD,GACA,oCAAC,QAAK,UAAQ,QAAC,KAAE,OAAO,eAAe,EAAG,CAC5C,CACD,GACA,OAAO,SAAS,MACf,oCAAC,QAAK,UAAQ,QAAC,aAAU,OAAO,SAAS,IAAG,OAAK,CAErD;AAAA,IAEJ;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,SAAS,OAAO,UAAU,CAAC;AACjC,aACE,oCAAC,OAAI,eAAc,UAAS,aAAa,KACvC,oCAAC,QAAK,OAAM,WAAQ,iBACT,OAAO,QAAO,UACtB,OAAO,WAAW,IAAI,MAAM,IAAG,eAC/B,OAAO,SAAS,IAAG,GACtB,GACC,OAAO,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,MAC/B,oCAAC,OAAI,KAAK,GAAG,eAAc,YACzB,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAE,OAAO,QAAQ,SAAU,GACrC,oCAAC,QAAK,UAAQ,QAAC,MAAG,OAAO,UAAU,WAAU,GAAC,CAChD,GACA,oCAAC,QAAK,UAAQ,QAAC,KAAE,OAAO,eAAe,EAAG,CAC5C,CACD,GACA,OAAO,SAAS,MACf,oCAAC,QAAK,UAAQ,QAAC,aAAU,OAAO,SAAS,IAAG,OAAK,CAErD;AAAA,IAEJ;AAEA,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,QAAQ,OAAO,SAAS;AAAA,QAC5B,MAAM;AAAA,QACN,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AACA,aACE,oCAAC,OAAI,eAAc,UAAS,aAAa,KACvC,oCAAC,QAAK,OAAM,WAAQ,yBAAiB,MAAM,QAAQ,SAAU,GAC7D,oCAAC,QAAK,UAAQ,QAAC,aAAU,MAAM,UAAU,SAAU,GACnD,oCAAC,QAAK,UAAQ,QACX,KAAI,cACM,MAAM,WAAW,IAAI,QAAO,aACzC,CACF;AAAA,IAEJ;AAEA,WACE,oCAAC,OAAI,aAAa,KAChB,oCAAC,YAAK,2BAAyB,CACjC;AAAA,EAEJ;AAAA,EACA,MAAM,cAAc,OAAO;AACzB,QAAI,MAAM,WAAW,QAAQ;AAC3B,UAAI,CAAC,MAAM,MAAM;AACf,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,UAAI,CAAC,OAAO;AACV,cAAM,YAAY,cAAc;AAChC,cAAM,iBAAiB,UAAU,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAC3D,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS,UAAU,MAAM,IAAI,kCAAkC,cAAc;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,UAAU;AAC7B,UAAI,CAAC,MAAM,OAAO;AAChB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,OAAO;AACjB,QAAI;AAEF,UAAI,MAAM,WAAW,QAAQ;AAC3B,cAAM,SAAS,cAAc;AAC7B,cAAM,aAAa,OAAO,IAAI,YAAU;AAAA,UACtC,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM,OAAO;AAAA,UAC1B,QAAQ,MAAM;AAAA,QAChB,EAAE;AAEF,cAAM,SAA0B;AAAA,UAC9B,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAEA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,QAC1D;AACA;AAAA,MACF;AAGA,UAAI,MAAM,WAAW,UAAU,MAAM,MAAM;AACzC,cAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,MAAM,UAAU,MAAM,IAAI,aAAa;AAAA,QACnD;AAGA,cAAM,UAAU,MAAM,iBAAiB,KAAK;AAE5C,cAAM,SAA0B;AAAA,UAC9B,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM,MAAM;AAAA,YACZ,aAAa,MAAM,OAAO;AAAA,YAC1B,QAAQ,MAAM;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,QAC1D;AACA;AAAA,MACF;AAGA,UAAI,MAAM,WAAW,YAAY,MAAM,OAAO;AAC5C,cAAM,SAAS,aAAa,MAAM,KAAK;AACvC,cAAM,aAAa,OAAO,IAAI,YAAU;AAAA,UACtC,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM,OAAO;AAAA,UAC1B,QAAQ,MAAM;AAAA,QAChB,EAAE;AAEF,cAAM,SAA0B;AAAA,UAC9B,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO,MAAM;AAAA,QACf;AAEA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,QAC1D;AACA;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport {\n loadAllSkills,\n getSkill,\n loadSkillContent,\n searchSkills,\n getSkillCount,\n} from '@utils/skillLoader'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nconst inputSchema = z.strictObject({\n action: z\n .enum(['list', 'load', 'search'])\n .describe(\n 'Action to perform: list all skills, load a specific skill, or search skills',\n ),\n name: z\n .string()\n .optional()\n .describe('Name of skill to load (required for \"load\" action)'),\n query: z\n .string()\n .optional()\n .describe('Search query (required for \"search\" action)'),\n})\n\ntype SkillToolOutput =\n | {\n type: 'list'\n skills: Array<{ name: string; description: string; plugin: string }>\n }\n | {\n type: 'load'\n skill: {\n name: string\n description: string\n plugin: string\n content: string\n }\n }\n | {\n type: 'search'\n skills: Array<{ name: string; description: string; plugin: string }>\n query: string\n }\n\nexport const SkillTool = {\n name: 'Skill',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Skill'\n },\n async isEnabled() {\n // Enable if there are any skills available\n return getSkillCount() > 0\n },\n isReadOnly() {\n return true // Skills are read-only resources\n },\n isConcurrencySafe() {\n return true // Reading skills is safe for concurrent execution\n },\n needsPermissions() {\n return false // No permissions needed for reading skills\n },\n renderResultForAssistant(output: SkillToolOutput) {\n if (output.type === 'list') {\n if (output.skills.length === 0) {\n return 'No skills available. Install plugins with skills to use this feature.'\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Available skills (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'search') {\n if (output.skills.length === 0) {\n return `No skills found matching \"${output.query}\".`\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Skills matching \"${output.query}\" (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'load') {\n const { skill } = output\n return `# Skill: ${skill.name}\n\n**Plugin**: ${skill.plugin}\n**Description**: ${skill.description}\n\n---\n\n${skill.content}\n\n---\n\n*End of skill content. Apply these instructions to complete your task.*`\n }\n\n return 'Unknown skill operation'\n },\n renderToolUseMessage(input, { verbose }) {\n if (input.action === 'list') {\n return 'Listing all available skills'\n }\n if (input.action === 'load' && input.name) {\n return `Loading skill: ${input.name}`\n }\n if (input.action === 'search' && input.query) {\n return `Searching skills for: ${input.query}`\n }\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: SkillToolOutput) {\n // Guard against undefined or null output\n if (!output || !output.type) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n }\n\n if (output.type === 'list') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''}\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({skill?.plugin || 'Unknown'})\n </Text>\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {skill?.description || ''}\n </Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ... and {skills.length - 10} more\n </Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'search') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''} matching &quot;\n {output.query || ''}&quot;\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({skill?.plugin || 'Unknown'})\n </Text>\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {skill?.description || ''}\n </Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ... and {skills.length - 10} more\n </Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'load') {\n const skill = output.skill || {\n name: '',\n description: '',\n plugin: '',\n content: '',\n }\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\u2713 Loaded skill: {skill.name || 'Unknown'}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Plugin: {skill.plugin || 'Unknown'}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Content: {(skill.content || '').length} characters\n </Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n },\n async validateInput(input) {\n if (input.action === 'load') {\n if (!input.name) {\n return {\n result: false,\n message: 'Skill name is required for \"load\" action',\n }\n }\n\n const skill = getSkill(input.name)\n if (!skill) {\n const allSkills = loadAllSkills()\n const availableNames = allSkills.map(s => s.name).join(', ')\n return {\n result: false,\n message: `Skill \"${input.name}\" not found. Available skills: ${availableNames}`,\n }\n }\n }\n\n if (input.action === 'search') {\n if (!input.query) {\n return {\n result: false,\n message: 'Query is required for \"search\" action',\n }\n }\n }\n\n return { result: true }\n },\n async *call(input) {\n try {\n // List all skills\n if (input.action === 'list') {\n const skills = loadAllSkills()\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'list',\n skills: skillsList,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Load specific skill\n if (input.action === 'load' && input.name) {\n const skill = getSkill(input.name)\n if (!skill) {\n throw new Error(`Skill \"${input.name}\" not found`)\n }\n\n // Load full content\n const content = await loadSkillContent(skill)\n\n const output: SkillToolOutput = {\n type: 'load',\n skill: {\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n content,\n },\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Search skills\n if (input.action === 'search' && input.query) {\n const skills = searchSkills(input.query)\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'search',\n skills: skillsList,\n query: input.query,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n throw new Error('Invalid skill action or missing required parameters')\n } catch (error) {\n throw new Error(\n `Skill operation failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n} satisfies Tool<typeof inputSchema, SkillToolOutput>\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -64,7 +64,7 @@ Skills typically include:
64
64
  2. Search or list skills to find "microservices-patterns"
65
65
  3. Load the skill to get detailed instructions
66
66
  4. Follow skill guidance to architect the system
67
- 5. Use referenced tools (FileWrite, etc.) to implement
67
+ 5. Use referenced tools (Replace, Edit, etc.) to implement
68
68
 
69
69
  ## Important Notes
70
70
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/SkillTool/prompt.ts"],
4
- "sourcesContent": ["export const DESCRIPTION = `Use this tool to discover and load skills from installed plugins. Skills provide specialized knowledge and instructions for specific tasks (e.g., API design, testing patterns, architecture patterns).\n\nSkills use progressive disclosure - list skills to see what's available, then load specific skills to get detailed instructions.`\n\nexport const PROMPT = `# Skill Tool\n\n## Purpose\nLoad and apply skills from plugins. Skills provide expert knowledge, best practices, and step-by-step instructions for specialized tasks.\n\n## Available Operations\n\n### List Skills\n\\`\\`\\`json\n{\n \"action\": \"list\"\n}\n\\`\\`\\`\nReturns all available skills with their names, descriptions, and source plugins.\n\n### Load Skill\n\\`\\`\\`json\n{\n \"action\": \"load\",\n \"name\": \"skill-name\"\n}\n\\`\\`\\`\nLoads and displays the full content of a specific skill. Use this when you need detailed instructions for a task.\n\n### Search Skills\n\\`\\`\\`json\n{\n \"action\": \"search\",\n \"query\": \"search-term\"\n}\n\\`\\`\\`\nSearches skills by name, description, or plugin name. Returns matching skills.\n\n## Usage Pattern\n\n1. **Discover**: Use \"list\" or \"search\" to find relevant skills\n2. **Load**: Use \"load\" to get full skill instructions\n3. **Apply**: Follow the skill's instructions to complete the task\n4. **Context**: Skills may reference tools, patterns, or other resources\n\n## When to Use Skills\n\n- User requests expertise in a specific domain (e.g., \"design a REST API\")\n- Task matches a skill description (e.g., backend architecture, testing)\n- Need best practices or patterns for a technology\n- Want step-by-step guidance for complex operations\n\n## Skill Content Structure\n\nSkills typically include:\n- Overview and purpose\n- Key concepts and principles\n- Step-by-step instructions\n- Code examples and patterns\n- Best practices and anti-patterns\n- Common pitfalls and solutions\n\n## Example Workflow\n\n1. User: \"Help me design a microservices architecture\"\n2. Search or list skills to find \"microservices-patterns\"\n3. Load the skill to get detailed instructions\n4. Follow skill guidance to architect the system\n5. Use referenced tools (FileWrite, etc.) to implement\n\n## Important Notes\n\n- Skills are loaded from installed plugins\n- Each skill comes from a specific plugin source\n- Skills are cached for performance\n- Load skills progressively - metadata first, full content on demand\n- Skills complement your existing knowledge - use them as guides, not rigid rules\n`\n"],
4
+ "sourcesContent": ["export const DESCRIPTION = `Use this tool to discover and load skills from installed plugins. Skills provide specialized knowledge and instructions for specific tasks (e.g., API design, testing patterns, architecture patterns).\n\nSkills use progressive disclosure - list skills to see what's available, then load specific skills to get detailed instructions.`\n\nexport const PROMPT = `# Skill Tool\n\n## Purpose\nLoad and apply skills from plugins. Skills provide expert knowledge, best practices, and step-by-step instructions for specialized tasks.\n\n## Available Operations\n\n### List Skills\n\\`\\`\\`json\n{\n \"action\": \"list\"\n}\n\\`\\`\\`\nReturns all available skills with their names, descriptions, and source plugins.\n\n### Load Skill\n\\`\\`\\`json\n{\n \"action\": \"load\",\n \"name\": \"skill-name\"\n}\n\\`\\`\\`\nLoads and displays the full content of a specific skill. Use this when you need detailed instructions for a task.\n\n### Search Skills\n\\`\\`\\`json\n{\n \"action\": \"search\",\n \"query\": \"search-term\"\n}\n\\`\\`\\`\nSearches skills by name, description, or plugin name. Returns matching skills.\n\n## Usage Pattern\n\n1. **Discover**: Use \"list\" or \"search\" to find relevant skills\n2. **Load**: Use \"load\" to get full skill instructions\n3. **Apply**: Follow the skill's instructions to complete the task\n4. **Context**: Skills may reference tools, patterns, or other resources\n\n## When to Use Skills\n\n- User requests expertise in a specific domain (e.g., \"design a REST API\")\n- Task matches a skill description (e.g., backend architecture, testing)\n- Need best practices or patterns for a technology\n- Want step-by-step guidance for complex operations\n\n## Skill Content Structure\n\nSkills typically include:\n- Overview and purpose\n- Key concepts and principles\n- Step-by-step instructions\n- Code examples and patterns\n- Best practices and anti-patterns\n- Common pitfalls and solutions\n\n## Example Workflow\n\n1. User: \"Help me design a microservices architecture\"\n2. Search or list skills to find \"microservices-patterns\"\n3. Load the skill to get detailed instructions\n4. Follow skill guidance to architect the system\n5. Use referenced tools (Replace, Edit, etc.) to implement\n\n## Important Notes\n\n- Skills are loaded from installed plugins\n- Each skill comes from a specific plugin source\n- Skills are cached for performance\n- Load skills progressively - metadata first, full content on demand\n- Skills complement your existing knowledge - use them as guides, not rigid rules\n`\n"],
5
5
  "mappings": "AAAO,MAAM,cAAc;AAAA;AAAA;AAIpB,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,102 @@
1
+ import { Box, Text } from "ink";
2
+ import * as React from "react";
3
+ import { z } from "zod";
4
+ import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
5
+ import { createTask } from "../../services/taskStore.js";
6
+ import { DESCRIPTION, PROMPT } from "./prompt.js";
7
+ import { getTheme } from "../../utils/theme.js";
8
+ const inputSchema = z.strictObject({
9
+ subject: z.string().describe("A brief title for the task"),
10
+ description: z.string().describe("A detailed description of what needs to be done"),
11
+ activeForm: z.string().optional().describe(
12
+ 'Present continuous form shown in spinner when in_progress (e.g., "Running tests")'
13
+ ),
14
+ metadata: z.record(z.unknown()).optional().describe("Arbitrary metadata to attach to the task")
15
+ });
16
+ const TaskCreateTool = {
17
+ name: "TaskCreate",
18
+ async description() {
19
+ return DESCRIPTION;
20
+ },
21
+ async prompt() {
22
+ return PROMPT;
23
+ },
24
+ inputSchema,
25
+ userFacingName() {
26
+ return "Create Task";
27
+ },
28
+ async isEnabled() {
29
+ return true;
30
+ },
31
+ isReadOnly() {
32
+ return false;
33
+ },
34
+ isConcurrencySafe() {
35
+ return false;
36
+ },
37
+ needsPermissions() {
38
+ return false;
39
+ },
40
+ renderToolUseMessage(input) {
41
+ const subject = input.subject || "";
42
+ const truncated = subject.length > 50 ? subject.slice(0, 50) + "..." : subject;
43
+ return `subject: "${truncated}"`;
44
+ },
45
+ renderToolUseRejectedMessage() {
46
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
47
+ },
48
+ renderToolResultMessage(output) {
49
+ if (!output || !output.taskId) {
50
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, "Task created"));
51
+ }
52
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().success }, "Task #", output.taskId, " created: ", output.subject));
53
+ },
54
+ renderResultForAssistant(result) {
55
+ return `Task #${result.taskId} created successfully: ${result.subject}`;
56
+ },
57
+ async validateInput({ subject, description }) {
58
+ if (!subject?.trim()) {
59
+ return {
60
+ result: false,
61
+ message: "Task subject cannot be empty"
62
+ };
63
+ }
64
+ if (!description?.trim()) {
65
+ return {
66
+ result: false,
67
+ message: "Task description cannot be empty"
68
+ };
69
+ }
70
+ return { result: true };
71
+ },
72
+ async *call(input) {
73
+ try {
74
+ const task = createTask({
75
+ subject: input.subject,
76
+ description: input.description,
77
+ activeForm: input.activeForm,
78
+ metadata: input.metadata
79
+ });
80
+ const result = {
81
+ taskId: task.id,
82
+ subject: task.subject
83
+ };
84
+ yield {
85
+ type: "result",
86
+ data: result,
87
+ resultForAssistant: this.renderResultForAssistant(result)
88
+ };
89
+ } catch (error) {
90
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
91
+ yield {
92
+ type: "result",
93
+ data: { error: errorMessage },
94
+ resultForAssistant: `Error creating task: ${errorMessage}`
95
+ };
96
+ }
97
+ }
98
+ };
99
+ export {
100
+ TaskCreateTool
101
+ };
102
+ //# sourceMappingURL=TaskCreateTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskCreateTool/TaskCreateTool.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { createTask } from '@services/taskStore'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({\n subject: z.string().describe('A brief title for the task'),\n description: z\n .string()\n .describe('A detailed description of what needs to be done'),\n activeForm: z\n .string()\n .optional()\n .describe(\n 'Present continuous form shown in spinner when in_progress (e.g., \"Running tests\")',\n ),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Arbitrary metadata to attach to the task'),\n})\n\nexport const TaskCreateTool = {\n name: 'TaskCreate',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Create Task'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions() {\n return false\n },\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n const subject = input.subject || ''\n const truncated =\n subject.length > 50 ? subject.slice(0, 50) + '...' : subject\n return `subject: \"${truncated}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: { taskId: string; subject: string }) {\n if (!output || !output.taskId) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>Task created</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().success}>\n Task #{output.taskId} created: {output.subject}\n </Text>\n </Box>\n )\n },\n renderResultForAssistant(result: { taskId: string; subject: string }) {\n return `Task #${result.taskId} created successfully: ${result.subject}`\n },\n async validateInput({ subject, description }: z.infer<typeof inputSchema>) {\n if (!subject?.trim()) {\n return {\n result: false,\n message: 'Task subject cannot be empty',\n }\n }\n if (!description?.trim()) {\n return {\n result: false,\n message: 'Task description cannot be empty',\n }\n }\n return { result: true }\n },\n async *call(input: z.infer<typeof inputSchema>) {\n try {\n const task = createTask({\n subject: input.subject,\n description: input.description,\n activeForm: input.activeForm,\n metadata: input.metadata,\n })\n\n const result = {\n taskId: task.id,\n subject: task.subject,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n yield {\n type: 'result',\n data: { error: errorMessage },\n resultForAssistant: `Error creating task: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<\n typeof inputSchema,\n { taskId: string; subject: string } | { error: string }\n>\n"],
5
+ "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAE/C,SAAS,kBAAkB;AAC3B,SAAS,aAAa,cAAc;AACpC,SAAS,gBAAgB;AAEzB,MAAM,cAAc,EAAE,aAAa;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,EACzD,aAAa,EACV,OAAO,EACP,SAAS,iDAAiD;AAAA,EAC7D,YAAY,EACT,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,UAAU,EACP,OAAO,EAAE,QAAQ,CAAC,EAClB,SAAS,EACT,SAAS,0CAA0C;AACxD,CAAC;AAEM,MAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,OAAoC;AACvD,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,YACJ,QAAQ,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,QAAQ;AACvD,WAAO,aAAa,SAAS;AAAA,EAC/B;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAA6C;AACnE,QAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,YAAK,cAAY,CACpB;AAAA,IAEJ;AAEA,WACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,QAAK,OAAO,SAAS,EAAE,WAAS,UACxB,OAAO,QAAO,cAAW,OAAO,OACzC,CACF;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAA6C;AACpE,WAAO,SAAS,OAAO,MAAM,0BAA0B,OAAO,OAAO;AAAA,EACvE;AAAA,EACA,MAAM,cAAc,EAAE,SAAS,YAAY,GAAgC;AACzE,QAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,OAAoC;AAC9C,QAAI;AACF,YAAM,OAAO,WAAW;AAAA,QACtB,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,MAClB,CAAC;AAED,YAAM,SAAS;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,MAChB;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,MAC1D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,EAAE,OAAO,aAAa;AAAA,QAC5B,oBAAoB,wBAAwB,YAAY;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,47 @@
1
+ const PROMPT = `Use this tool to create a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.
2
+ It also helps the user understand the progress of the task and overall progress of their requests.
3
+
4
+ ## When to Use This Tool
5
+
6
+ Use this tool proactively in these scenarios:
7
+
8
+ - Complex multi-step tasks - When a task requires 3 or more distinct steps or actions
9
+ - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations
10
+ - Plan mode - When using plan mode, create a task list to track the work
11
+ - User explicitly requests todo list - When the user directly asks you to use the todo list
12
+ - User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)
13
+ - After receiving new instructions - Immediately capture user requirements as tasks
14
+ - When you start working on a task - Mark it as in_progress BEFORE beginning work
15
+ - After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation
16
+
17
+ ## When NOT to Use This Tool
18
+
19
+ Skip using this tool when:
20
+ - There is only a single, straightforward task
21
+ - The task is trivial and tracking it provides no organizational benefit
22
+ - The task can be completed in less than 3 trivial steps
23
+ - The task is purely conversational or informational
24
+
25
+ NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.
26
+
27
+ ## Task Fields
28
+
29
+ - **subject**: A brief, actionable title in imperative form (e.g., "Fix authentication bug in login flow")
30
+ - **description**: Detailed description of what needs to be done, including context and acceptance criteria
31
+ - **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., "Fixing authentication bug"). This is displayed to the user while you work on the task.
32
+
33
+ **IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative ("Run tests") while activeForm should be present continuous ("Running tests"). All tasks are created with status \`pending\`.
34
+
35
+ ## Tips
36
+
37
+ - Create tasks with clear, specific subjects that describe the outcome
38
+ - Include enough detail in the description for another agent to understand and complete the task
39
+ - After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed
40
+ - Check TaskList first to avoid creating duplicate tasks
41
+ `;
42
+ const DESCRIPTION = "Create a new task to track progress on complex work";
43
+ export {
44
+ DESCRIPTION,
45
+ PROMPT
46
+ };
47
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskCreateTool/prompt.ts"],
4
+ "sourcesContent": ["export const PROMPT = `Use this tool to create a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\nIt also helps the user understand the progress of the task and overall progress of their requests.\n\n## When to Use This Tool\n\nUse this tool proactively in these scenarios:\n\n- Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n- Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n- Plan mode - When using plan mode, create a task list to track the work\n- User explicitly requests todo list - When the user directly asks you to use the todo list\n- User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n- After receiving new instructions - Immediately capture user requirements as tasks\n- When you start working on a task - Mark it as in_progress BEFORE beginning work\n- After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n- There is only a single, straightforward task\n- The task is trivial and tracking it provides no organizational benefit\n- The task can be completed in less than 3 trivial steps\n- The task is purely conversational or informational\n\nNOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n\n## Task Fields\n\n- **subject**: A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")\n- **description**: Detailed description of what needs to be done, including context and acceptance criteria\n- **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.\n\n**IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative (\"Run tests\") while activeForm should be present continuous (\"Running tests\"). All tasks are created with status \\`pending\\`.\n\n## Tips\n\n- Create tasks with clear, specific subjects that describe the outcome\n- Include enough detail in the description for another agent to understand and complete the task\n- After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed\n- Check TaskList first to avoid creating duplicate tasks\n`\n\nexport const DESCRIPTION = 'Create a new task to track progress on complex work'\n"],
5
+ "mappings": "AAAO,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Cf,MAAM,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,115 @@
1
+ import { Box, Text } from "ink";
2
+ import * as React from "react";
3
+ import { z } from "zod";
4
+ import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
5
+ import { getTaskById } from "../../services/taskStore.js";
6
+ import { DESCRIPTION, PROMPT } from "./prompt.js";
7
+ import { getTheme } from "../../utils/theme.js";
8
+ const inputSchema = z.strictObject({
9
+ taskId: z.string().describe("The ID of the task to retrieve")
10
+ });
11
+ const TaskGetTool = {
12
+ name: "TaskGet",
13
+ async description() {
14
+ return DESCRIPTION;
15
+ },
16
+ async prompt() {
17
+ return PROMPT;
18
+ },
19
+ inputSchema,
20
+ userFacingName() {
21
+ return "Get Task";
22
+ },
23
+ async isEnabled() {
24
+ return true;
25
+ },
26
+ isReadOnly() {
27
+ return true;
28
+ },
29
+ isConcurrencySafe() {
30
+ return true;
31
+ },
32
+ needsPermissions() {
33
+ return false;
34
+ },
35
+ renderToolUseMessage(input) {
36
+ return `taskId: ${input.taskId}`;
37
+ },
38
+ renderToolUseRejectedMessage() {
39
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
40
+ },
41
+ renderToolResultMessage(output) {
42
+ if (!output || "error" in output) {
43
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().error }, output && "error" in output ? output.error : "Task not found"));
44
+ }
45
+ const statusColor = output.status === "completed" ? getTheme().success : output.status === "in_progress" ? getTheme().warning : getTheme().secondaryText;
46
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { bold: true }, "#", output.id), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, null, output.subject)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", paddingLeft: 5 }, /* @__PURE__ */ React.createElement(Text, { color: statusColor }, "[", output.status, "]"), output.owner && /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, " owner: ", output.owner)));
47
+ },
48
+ renderResultForAssistant(result) {
49
+ if ("error" in result) {
50
+ return `Error: ${result.error}`;
51
+ }
52
+ const lines = [
53
+ `Task #${result.id}:`,
54
+ ` Subject: ${result.subject}`,
55
+ ` Status: ${result.status}`,
56
+ ` Description: ${result.description}`
57
+ ];
58
+ if (result.activeForm) {
59
+ lines.push(` Active Form: ${result.activeForm}`);
60
+ }
61
+ if (result.owner) {
62
+ lines.push(` Owner: ${result.owner}`);
63
+ }
64
+ if (result.blocks && result.blocks.length > 0) {
65
+ lines.push(` Blocks: [${result.blocks.join(", ")}]`);
66
+ }
67
+ if (result.blockedBy && result.blockedBy.length > 0) {
68
+ lines.push(` Blocked By: [${result.blockedBy.join(", ")}]`);
69
+ }
70
+ if (result.metadata && Object.keys(result.metadata).length > 0) {
71
+ lines.push(` Metadata: ${JSON.stringify(result.metadata)}`);
72
+ }
73
+ return lines.join("\n");
74
+ },
75
+ async validateInput({ taskId }) {
76
+ if (!taskId?.trim()) {
77
+ return {
78
+ result: false,
79
+ message: "Task ID is required"
80
+ };
81
+ }
82
+ return { result: true };
83
+ },
84
+ async *call(input) {
85
+ try {
86
+ const task = getTaskById(input.taskId);
87
+ if (!task) {
88
+ const result = { error: `Task with ID '${input.taskId}' not found` };
89
+ yield {
90
+ type: "result",
91
+ data: result,
92
+ resultForAssistant: this.renderResultForAssistant(result)
93
+ };
94
+ return;
95
+ }
96
+ yield {
97
+ type: "result",
98
+ data: task,
99
+ resultForAssistant: this.renderResultForAssistant(task)
100
+ };
101
+ } catch (error) {
102
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
103
+ const result = { error: errorMessage };
104
+ yield {
105
+ type: "result",
106
+ data: result,
107
+ resultForAssistant: `Error getting task: ${errorMessage}`
108
+ };
109
+ }
110
+ }
111
+ };
112
+ export {
113
+ TaskGetTool
114
+ };
115
+ //# sourceMappingURL=TaskGetTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskGetTool/TaskGetTool.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { getTaskById, Task } from '@services/taskStore'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({\n taskId: z.string().describe('The ID of the task to retrieve'),\n})\n\nexport const TaskGetTool = {\n name: 'TaskGet',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Get Task'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n return `taskId: ${input.taskId}`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Task | { error: string }) {\n if (!output || 'error' in output) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().error}>\n {output && 'error' in output ? output.error : 'Task not found'}\n </Text>\n </Box>\n )\n }\n\n const statusColor =\n output.status === 'completed'\n ? getTheme().success\n : output.status === 'in_progress'\n ? getTheme().warning\n : getTheme().secondaryText\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text bold>#{output.id}</Text>\n <Text> </Text>\n <Text>{output.subject}</Text>\n </Box>\n <Box flexDirection=\"row\" paddingLeft={5}>\n <Text color={statusColor}>[{output.status}]</Text>\n {output.owner && (\n <Text color={getTheme().secondaryText}> owner: {output.owner}</Text>\n )}\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(result: Task | { error: string }) {\n if ('error' in result) {\n return `Error: ${result.error}`\n }\n\n const lines: string[] = [\n `Task #${result.id}:`,\n ` Subject: ${result.subject}`,\n ` Status: ${result.status}`,\n ` Description: ${result.description}`,\n ]\n\n if (result.activeForm) {\n lines.push(` Active Form: ${result.activeForm}`)\n }\n if (result.owner) {\n lines.push(` Owner: ${result.owner}`)\n }\n if (result.blocks && result.blocks.length > 0) {\n lines.push(` Blocks: [${result.blocks.join(', ')}]`)\n }\n if (result.blockedBy && result.blockedBy.length > 0) {\n lines.push(` Blocked By: [${result.blockedBy.join(', ')}]`)\n }\n if (result.metadata && Object.keys(result.metadata).length > 0) {\n lines.push(` Metadata: ${JSON.stringify(result.metadata)}`)\n }\n\n return lines.join('\\n')\n },\n async validateInput({ taskId }: z.infer<typeof inputSchema>) {\n if (!taskId?.trim()) {\n return {\n result: false,\n message: 'Task ID is required',\n }\n }\n return { result: true }\n },\n async *call(input: z.infer<typeof inputSchema>) {\n try {\n const task = getTaskById(input.taskId)\n\n if (!task) {\n const result = { error: `Task with ID '${input.taskId}' not found` }\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n return\n }\n\n yield {\n type: 'result',\n data: task,\n resultForAssistant: this.renderResultForAssistant(task),\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n const result = { error: errorMessage }\n yield {\n type: 'result',\n data: result,\n resultForAssistant: `Error getting task: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Task | { error: string }>\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,28 @@
1
+ const PROMPT = `Use this tool to retrieve a task by its ID from the task list.
2
+
3
+ ## When to Use This Tool
4
+
5
+ - When you need the full description and context before starting work on a task
6
+ - To understand task dependencies (what it blocks, what blocks it)
7
+ - After being assigned a task, to get complete requirements
8
+
9
+ ## Output
10
+
11
+ Returns full task details:
12
+ - **subject**: Task title
13
+ - **description**: Detailed requirements and context
14
+ - **status**: 'pending', 'in_progress', or 'completed'
15
+ - **blocks**: Tasks waiting on this one to complete
16
+ - **blockedBy**: Tasks that must complete before this one can start
17
+
18
+ ## Tips
19
+
20
+ - After fetching a task, verify its blockedBy list is empty before beginning work.
21
+ - Use TaskList to see all tasks in summary form.
22
+ `;
23
+ const DESCRIPTION = "Get full details of a task by its ID";
24
+ export {
25
+ DESCRIPTION,
26
+ PROMPT
27
+ };
28
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskGetTool/prompt.ts"],
4
+ "sourcesContent": ["export const PROMPT = `Use this tool to retrieve a task by its ID from the task list.\n\n## When to Use This Tool\n\n- When you need the full description and context before starting work on a task\n- To understand task dependencies (what it blocks, what blocks it)\n- After being assigned a task, to get complete requirements\n\n## Output\n\nReturns full task details:\n- **subject**: Task title\n- **description**: Detailed requirements and context\n- **status**: 'pending', 'in_progress', or 'completed'\n- **blocks**: Tasks waiting on this one to complete\n- **blockedBy**: Tasks that must complete before this one can start\n\n## Tips\n\n- After fetching a task, verify its blockedBy list is empty before beginning work.\n- Use TaskList to see all tasks in summary form.\n`\n\nexport const DESCRIPTION = 'Get full details of a task by its ID'\n"],
5
+ "mappings": "AAAO,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBf,MAAM,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,102 @@
1
+ import { Box, Text } from "ink";
2
+ import * as React from "react";
3
+ import { z } from "zod";
4
+ import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
5
+ import { getTaskList, getTaskStatistics } from "../../services/taskStore.js";
6
+ import { DESCRIPTION, PROMPT } from "./prompt.js";
7
+ import { getTheme } from "../../utils/theme.js";
8
+ const inputSchema = z.strictObject({});
9
+ const TaskListTool = {
10
+ name: "TaskList",
11
+ async description() {
12
+ return DESCRIPTION;
13
+ },
14
+ async prompt() {
15
+ return PROMPT;
16
+ },
17
+ inputSchema,
18
+ userFacingName() {
19
+ return "List Tasks";
20
+ },
21
+ async isEnabled() {
22
+ return true;
23
+ },
24
+ isReadOnly() {
25
+ return true;
26
+ },
27
+ isConcurrencySafe() {
28
+ return true;
29
+ },
30
+ needsPermissions() {
31
+ return false;
32
+ },
33
+ renderToolUseMessage() {
34
+ return "";
35
+ },
36
+ renderToolUseRejectedMessage() {
37
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
38
+ },
39
+ renderToolResultMessage(output) {
40
+ if (!output || !output.tasks) {
41
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, "No tasks found"));
42
+ }
43
+ const { tasks, stats } = output;
44
+ if (tasks.length === 0) {
45
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, "No tasks in list"));
46
+ }
47
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, stats.total, " task(s): ", stats.pending, " pending, ", stats.inProgress, " ", "in progress, ", stats.completed, " completed")), tasks.slice(0, 5).map((task) => {
48
+ const statusColor = task.status === "completed" ? getTheme().success : task.status === "in_progress" ? getTheme().warning : getTheme().secondaryText;
49
+ return /* @__PURE__ */ React.createElement(Box, { key: task.id, flexDirection: "row", paddingLeft: 5 }, /* @__PURE__ */ React.createElement(Text, { color: statusColor }, "#", task.id), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, null, task.subject.length > 40 ? task.subject.slice(0, 40) + "..." : task.subject), task.blockedBy && task.blockedBy.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: getTheme().error }, " ", "(blocked by: ", task.blockedBy.join(", "), ")"));
50
+ }), tasks.length > 5 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 5 }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, "... and ", tasks.length - 5, " more")));
51
+ },
52
+ renderResultForAssistant(result) {
53
+ const { tasks, stats } = result;
54
+ if (tasks.length === 0) {
55
+ return "No tasks in the task list.";
56
+ }
57
+ const lines = [
58
+ `Task List (${stats.total} total: ${stats.pending} pending, ${stats.inProgress} in progress, ${stats.completed} completed):`,
59
+ ""
60
+ ];
61
+ for (const task of tasks) {
62
+ let line = `#${task.id} [${task.status}] ${task.subject}`;
63
+ if (task.owner) {
64
+ line += ` (owner: ${task.owner})`;
65
+ }
66
+ if (task.blockedBy && task.blockedBy.length > 0) {
67
+ line += ` (blocked by: ${task.blockedBy.join(", ")})`;
68
+ }
69
+ lines.push(line);
70
+ }
71
+ return lines.join("\n");
72
+ },
73
+ async *call() {
74
+ try {
75
+ const tasks = getTaskList();
76
+ const stats = getTaskStatistics();
77
+ const result = {
78
+ tasks,
79
+ stats
80
+ };
81
+ yield {
82
+ type: "result",
83
+ data: result,
84
+ resultForAssistant: this.renderResultForAssistant(result)
85
+ };
86
+ } catch (error) {
87
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
88
+ yield {
89
+ type: "result",
90
+ data: {
91
+ tasks: [],
92
+ stats: { total: 0, pending: 0, inProgress: 0, completed: 0 }
93
+ },
94
+ resultForAssistant: `Error listing tasks: ${errorMessage}`
95
+ };
96
+ }
97
+ }
98
+ };
99
+ export {
100
+ TaskListTool
101
+ };
102
+ //# sourceMappingURL=TaskListTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskListTool/TaskListTool.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { getTaskList, getTaskStatistics } from '@services/taskStore'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({})\n\ntype TaskSummary = {\n id: string\n subject: string\n status: 'pending' | 'in_progress' | 'completed'\n owner?: string\n blockedBy?: string[]\n}\n\ntype TaskListOutput = {\n tasks: TaskSummary[]\n stats: {\n total: number\n pending: number\n inProgress: number\n completed: number\n }\n}\n\nexport const TaskListTool = {\n name: 'TaskList',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'List Tasks'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderToolUseMessage() {\n return ''\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: TaskListOutput) {\n if (!output || !output.tasks) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>No tasks found</Text>\n </Box>\n )\n }\n\n const { tasks, stats } = output\n\n if (tasks.length === 0) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().secondaryText}>No tasks in list</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>\n {stats.total} task(s): {stats.pending} pending, {stats.inProgress}{' '}\n in progress, {stats.completed} completed\n </Text>\n </Box>\n {tasks.slice(0, 5).map(task => {\n const statusColor =\n task.status === 'completed'\n ? getTheme().success\n : task.status === 'in_progress'\n ? getTheme().warning\n : getTheme().secondaryText\n\n return (\n <Box key={task.id} flexDirection=\"row\" paddingLeft={5}>\n <Text color={statusColor}>#{task.id}</Text>\n <Text> </Text>\n <Text>\n {task.subject.length > 40\n ? task.subject.slice(0, 40) + '...'\n : task.subject}\n </Text>\n {task.blockedBy && task.blockedBy.length > 0 && (\n <Text color={getTheme().error}>\n {' '}\n (blocked by: {task.blockedBy.join(', ')})\n </Text>\n )}\n </Box>\n )\n })}\n {tasks.length > 5 && (\n <Box paddingLeft={5}>\n <Text color={getTheme().secondaryText}>\n ... and {tasks.length - 5} more\n </Text>\n </Box>\n )}\n </Box>\n )\n },\n renderResultForAssistant(result: TaskListOutput) {\n const { tasks, stats } = result\n\n if (tasks.length === 0) {\n return 'No tasks in the task list.'\n }\n\n const lines: string[] = [\n `Task List (${stats.total} total: ${stats.pending} pending, ${stats.inProgress} in progress, ${stats.completed} completed):`,\n '',\n ]\n\n for (const task of tasks) {\n let line = `#${task.id} [${task.status}] ${task.subject}`\n if (task.owner) {\n line += ` (owner: ${task.owner})`\n }\n if (task.blockedBy && task.blockedBy.length > 0) {\n line += ` (blocked by: ${task.blockedBy.join(', ')})`\n }\n lines.push(line)\n }\n\n return lines.join('\\n')\n },\n async *call() {\n try {\n const tasks = getTaskList()\n const stats = getTaskStatistics()\n\n const result: TaskListOutput = {\n tasks,\n stats,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n yield {\n type: 'result',\n data: {\n tasks: [],\n stats: { total: 0, pending: 0, inProgress: 0, completed: 0 },\n },\n resultForAssistant: `Error listing tasks: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<typeof inputSchema, TaskListOutput>\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,27 @@
1
+ const PROMPT = `Use this tool to list all tasks in the task list.
2
+
3
+ ## When to Use This Tool
4
+
5
+ - To see what tasks are available to work on (status: 'pending', no owner, not blocked)
6
+ - To check overall progress on the project
7
+ - To find tasks that are blocked and need dependencies resolved
8
+ - After completing a task, to check for newly unblocked work or claim the next available task
9
+ - **Prefer working on tasks in ID order** (lowest ID first) when multiple tasks are available, as earlier tasks often set up context for later ones
10
+
11
+ ## Output
12
+
13
+ Returns a summary of each task:
14
+ - **id**: Task identifier (use with TaskGet, TaskUpdate)
15
+ - **subject**: Brief description of the task
16
+ - **status**: 'pending', 'in_progress', or 'completed'
17
+ - **owner**: Agent ID if assigned, empty if available
18
+ - **blockedBy**: List of open task IDs that must be resolved first (tasks with blockedBy cannot be claimed until dependencies resolve)
19
+
20
+ Use TaskGet with a specific task ID to view full details including description and comments.
21
+ `;
22
+ const DESCRIPTION = "List all tasks in the task list";
23
+ export {
24
+ DESCRIPTION,
25
+ PROMPT
26
+ };
27
+ //# sourceMappingURL=prompt.js.map