@polka-codes/cli 0.10.22 → 0.10.24

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 (350) hide show
  1. package/dist/index.js +3990 -353
  2. package/package.json +4 -4
  3. package/dist/ApiProviderConfig.js +0 -57
  4. package/dist/ApiProviderConfig.js.map +0 -1
  5. package/dist/ApiProviderConfig.test.js +0 -278
  6. package/dist/ApiProviderConfig.test.js.map +0 -1
  7. package/dist/agent/advanced-discovery.js +0 -604
  8. package/dist/agent/advanced-discovery.js.map +0 -1
  9. package/dist/agent/config.js +0 -139
  10. package/dist/agent/config.js.map +0 -1
  11. package/dist/agent/config.test.js +0 -140
  12. package/dist/agent/config.test.js.map +0 -1
  13. package/dist/agent/constants.js +0 -172
  14. package/dist/agent/constants.js.map +0 -1
  15. package/dist/agent/constants.test.js +0 -132
  16. package/dist/agent/constants.test.js.map +0 -1
  17. package/dist/agent/debug-logger.js +0 -281
  18. package/dist/agent/debug-logger.js.map +0 -1
  19. package/dist/agent/debug-logger.test.js +0 -294
  20. package/dist/agent/debug-logger.test.js.map +0 -1
  21. package/dist/agent/error-handling.js +0 -114
  22. package/dist/agent/error-handling.js.map +0 -1
  23. package/dist/agent/error-handling.test.js +0 -191
  24. package/dist/agent/error-handling.test.js.map +0 -1
  25. package/dist/agent/errors.js +0 -301
  26. package/dist/agent/errors.js.map +0 -1
  27. package/dist/agent/executor.js +0 -206
  28. package/dist/agent/executor.js.map +0 -1
  29. package/dist/agent/executor.test.js +0 -228
  30. package/dist/agent/executor.test.js.map +0 -1
  31. package/dist/agent/goal-decomposer.js +0 -281
  32. package/dist/agent/goal-decomposer.js.map +0 -1
  33. package/dist/agent/goal-decomposer.test.js +0 -225
  34. package/dist/agent/goal-decomposer.test.js.map +0 -1
  35. package/dist/agent/health-monitor.js +0 -89
  36. package/dist/agent/health-monitor.js.map +0 -1
  37. package/dist/agent/improvement-loop.js +0 -177
  38. package/dist/agent/improvement-loop.js.map +0 -1
  39. package/dist/agent/index.js +0 -38
  40. package/dist/agent/index.js.map +0 -1
  41. package/dist/agent/metrics.js +0 -158
  42. package/dist/agent/metrics.js.map +0 -1
  43. package/dist/agent/metrics.test.js +0 -311
  44. package/dist/agent/metrics.test.js.map +0 -1
  45. package/dist/agent/orchestrator.js +0 -438
  46. package/dist/agent/orchestrator.js.map +0 -1
  47. package/dist/agent/planner.js +0 -199
  48. package/dist/agent/planner.js.map +0 -1
  49. package/dist/agent/planner.test.js +0 -135
  50. package/dist/agent/planner.test.js.map +0 -1
  51. package/dist/agent/progress.js +0 -298
  52. package/dist/agent/progress.js.map +0 -1
  53. package/dist/agent/progress.test.js +0 -255
  54. package/dist/agent/progress.test.js.map +0 -1
  55. package/dist/agent/resource-monitor.js +0 -114
  56. package/dist/agent/resource-monitor.js.map +0 -1
  57. package/dist/agent/safety/approval.js +0 -178
  58. package/dist/agent/safety/approval.js.map +0 -1
  59. package/dist/agent/safety/approval.test.js +0 -142
  60. package/dist/agent/safety/approval.test.js.map +0 -1
  61. package/dist/agent/safety/checks.js +0 -152
  62. package/dist/agent/safety/checks.js.map +0 -1
  63. package/dist/agent/safety/checks.test.js +0 -89
  64. package/dist/agent/safety/checks.test.js.map +0 -1
  65. package/dist/agent/safety/interrupt.js +0 -92
  66. package/dist/agent/safety/interrupt.js.map +0 -1
  67. package/dist/agent/safety/interrupt.test.js +0 -53
  68. package/dist/agent/safety/interrupt.test.js.map +0 -1
  69. package/dist/agent/session.js +0 -117
  70. package/dist/agent/session.js.map +0 -1
  71. package/dist/agent/session.test.js +0 -213
  72. package/dist/agent/session.test.js.map +0 -1
  73. package/dist/agent/state-manager.js +0 -287
  74. package/dist/agent/state-manager.js.map +0 -1
  75. package/dist/agent/task-discovery.js +0 -433
  76. package/dist/agent/task-discovery.js.map +0 -1
  77. package/dist/agent/task-discovery.test.js +0 -40
  78. package/dist/agent/task-discovery.test.js.map +0 -1
  79. package/dist/agent/task-history.js +0 -128
  80. package/dist/agent/task-history.js.map +0 -1
  81. package/dist/agent/task-prioritizer.js +0 -286
  82. package/dist/agent/task-prioritizer.js.map +0 -1
  83. package/dist/agent/test-fixtures.js +0 -112
  84. package/dist/agent/test-fixtures.js.map +0 -1
  85. package/dist/agent/types.js +0 -15
  86. package/dist/agent/types.js.map +0 -1
  87. package/dist/agent/workflow-adapter.js +0 -219
  88. package/dist/agent/workflow-adapter.js.map +0 -1
  89. package/dist/agent/workflow-adapter.test.js +0 -11
  90. package/dist/agent/workflow-adapter.test.js.map +0 -1
  91. package/dist/agent/working-dir-discovery.js +0 -54
  92. package/dist/agent/working-dir-discovery.js.map +0 -1
  93. package/dist/agent/working-space.js +0 -484
  94. package/dist/agent/working-space.js.map +0 -1
  95. package/dist/agent/working-space.test.js +0 -436
  96. package/dist/agent/working-space.test.js.map +0 -1
  97. package/dist/api.js +0 -279
  98. package/dist/api.js.map +0 -1
  99. package/dist/builtin-commands.js +0 -20
  100. package/dist/builtin-commands.js.map +0 -1
  101. package/dist/chunk-2LRQ2QH6.js +0 -1353
  102. package/dist/chunk-FSNPWI3C.js +0 -128
  103. package/dist/chunk-HB7PTE3H.js +0 -176
  104. package/dist/chunk-LLMPMGV3.js +0 -140
  105. package/dist/chunk-NRDSZGMF.js +0 -675
  106. package/dist/chunk-UEEU3SCC.js +0 -390
  107. package/dist/chunk-YPUL66UK.js +0 -277
  108. package/dist/chunk-ZS4K5RFU.js +0 -176
  109. package/dist/chunk-ZU4UU65A.js +0 -40
  110. package/dist/code.workflow-5TAWK2DE.js +0 -10
  111. package/dist/commandSummarizer.js +0 -96
  112. package/dist/commandSummarizer.js.map +0 -1
  113. package/dist/commands/__tests__/command-detection.integration.test.js +0 -238
  114. package/dist/commands/__tests__/command-detection.integration.test.js.map +0 -1
  115. package/dist/commands/__tests__/script-generator.integration.test.js +0 -271
  116. package/dist/commands/__tests__/script-generator.integration.test.js.map +0 -1
  117. package/dist/commands/agent.js +0 -218
  118. package/dist/commands/agent.js.map +0 -1
  119. package/dist/commands/code.js +0 -102
  120. package/dist/commands/code.js.map +0 -1
  121. package/dist/commands/command.constants.js +0 -13
  122. package/dist/commands/command.constants.js.map +0 -1
  123. package/dist/commands/commit.js +0 -17
  124. package/dist/commands/commit.js.map +0 -1
  125. package/dist/commands/fix.js +0 -17
  126. package/dist/commands/fix.js.map +0 -1
  127. package/dist/commands/init.js +0 -501
  128. package/dist/commands/init.js.map +0 -1
  129. package/dist/commands/mcp-server.js +0 -122
  130. package/dist/commands/mcp-server.js.map +0 -1
  131. package/dist/commands/memory.js +0 -410
  132. package/dist/commands/memory.js.map +0 -1
  133. package/dist/commands/memory.test.js +0 -453
  134. package/dist/commands/memory.test.js.map +0 -1
  135. package/dist/commands/meta.js +0 -142
  136. package/dist/commands/meta.js.map +0 -1
  137. package/dist/commands/plan.js +0 -39
  138. package/dist/commands/plan.js.map +0 -1
  139. package/dist/commands/pr.js +0 -14
  140. package/dist/commands/pr.js.map +0 -1
  141. package/dist/commands/review-json.test.js +0 -33
  142. package/dist/commands/review-json.test.js.map +0 -1
  143. package/dist/commands/review.js +0 -137
  144. package/dist/commands/review.js.map +0 -1
  145. package/dist/commands/review.usage.test.js +0 -41
  146. package/dist/commands/review.usage.test.js.map +0 -1
  147. package/dist/commands/run.js +0 -107
  148. package/dist/commands/run.js.map +0 -1
  149. package/dist/commands/skills.js +0 -175
  150. package/dist/commands/skills.js.map +0 -1
  151. package/dist/commands/task.js +0 -34
  152. package/dist/commands/task.js.map +0 -1
  153. package/dist/commands/workflow.js +0 -117
  154. package/dist/commands/workflow.js.map +0 -1
  155. package/dist/commit.workflow-Z64PNSTS.js +0 -9
  156. package/dist/configPrompt.js +0 -39
  157. package/dist/configPrompt.js.map +0 -1
  158. package/dist/env.js +0 -22
  159. package/dist/env.js.map +0 -1
  160. package/dist/errors.js +0 -132
  161. package/dist/errors.js.map +0 -1
  162. package/dist/errors.test.js +0 -21
  163. package/dist/errors.test.js.map +0 -1
  164. package/dist/file-attachments.js +0 -77
  165. package/dist/file-attachments.js.map +0 -1
  166. package/dist/file-attachments.test.js +0 -214
  167. package/dist/file-attachments.test.js.map +0 -1
  168. package/dist/fix.workflow-KLHJU5Z6.js +0 -7
  169. package/dist/getModel.js +0 -229
  170. package/dist/getModel.js.map +0 -1
  171. package/dist/getModel.test.js +0 -67
  172. package/dist/getModel.test.js.map +0 -1
  173. package/dist/getProviderOptions.js +0 -58
  174. package/dist/getProviderOptions.js.map +0 -1
  175. package/dist/git-operations.js +0 -363
  176. package/dist/git-operations.js.map +0 -1
  177. package/dist/git-operations.test.js +0 -81
  178. package/dist/git-operations.test.js.map +0 -1
  179. package/dist/index.js.map +0 -1
  180. package/dist/logger.js +0 -41
  181. package/dist/logger.js.map +0 -1
  182. package/dist/mcp/client.js +0 -11
  183. package/dist/mcp/client.js.map +0 -1
  184. package/dist/mcp/error-scenarios.test.js +0 -206
  185. package/dist/mcp/error-scenarios.test.js.map +0 -1
  186. package/dist/mcp/errors.js +0 -63
  187. package/dist/mcp/errors.js.map +0 -1
  188. package/dist/mcp/index.js +0 -9
  189. package/dist/mcp/index.js.map +0 -1
  190. package/dist/mcp/manager.js +0 -231
  191. package/dist/mcp/manager.js.map +0 -1
  192. package/dist/mcp/manager.test.js +0 -40
  193. package/dist/mcp/manager.test.js.map +0 -1
  194. package/dist/mcp/sdk-client.js +0 -166
  195. package/dist/mcp/sdk-client.js.map +0 -1
  196. package/dist/mcp/shared-types.js +0 -3
  197. package/dist/mcp/shared-types.js.map +0 -1
  198. package/dist/mcp/tools-integration.test.js +0 -198
  199. package/dist/mcp/tools-integration.test.js.map +0 -1
  200. package/dist/mcp/tools.js +0 -60
  201. package/dist/mcp/tools.js.map +0 -1
  202. package/dist/mcp/transport.js +0 -257
  203. package/dist/mcp/transport.js.map +0 -1
  204. package/dist/mcp/types.js +0 -3
  205. package/dist/mcp/types.js.map +0 -1
  206. package/dist/mcp-server/index.js +0 -5
  207. package/dist/mcp-server/index.js.map +0 -1
  208. package/dist/mcp-server/plan-formatting.test.js +0 -74
  209. package/dist/mcp-server/plan-formatting.test.js.map +0 -1
  210. package/dist/mcp-server/sdk-server.js +0 -102
  211. package/dist/mcp-server/sdk-server.js.map +0 -1
  212. package/dist/mcp-server/sdk-server.test.js +0 -363
  213. package/dist/mcp-server/sdk-server.test.js.map +0 -1
  214. package/dist/mcp-server/tools.js +0 -785
  215. package/dist/mcp-server/tools.js.map +0 -1
  216. package/dist/mcp-server/types.js +0 -3
  217. package/dist/mcp-server/types.js.map +0 -1
  218. package/dist/options.js +0 -85
  219. package/dist/options.js.map +0 -1
  220. package/dist/options.test.js +0 -177
  221. package/dist/options.test.js.map +0 -1
  222. package/dist/plan.workflow-P2Y6W4FA.js +0 -8
  223. package/dist/prices.js +0 -61
  224. package/dist/prices.js.map +0 -1
  225. package/dist/prices.test.js +0 -148
  226. package/dist/prices.test.js.map +0 -1
  227. package/dist/review.workflow-I7RHWKU7.js +0 -8
  228. package/dist/runWorkflow.js +0 -313
  229. package/dist/runWorkflow.js.map +0 -1
  230. package/dist/script/__tests__/execution.integration.test.js +0 -274
  231. package/dist/script/__tests__/execution.integration.test.js.map +0 -1
  232. package/dist/script/__tests__/runner.test.js +0 -176
  233. package/dist/script/__tests__/runner.test.js.map +0 -1
  234. package/dist/script/__tests__/validator.test.js +0 -180
  235. package/dist/script/__tests__/validator.test.js.map +0 -1
  236. package/dist/script/executor.js +0 -127
  237. package/dist/script/executor.js.map +0 -1
  238. package/dist/script/index.js +0 -4
  239. package/dist/script/index.js.map +0 -1
  240. package/dist/script/runner.js +0 -258
  241. package/dist/script/runner.js.map +0 -1
  242. package/dist/sdk-client-KBYJRPEG.js +0 -155
  243. package/dist/skillIntegration.js +0 -46
  244. package/dist/skillIntegration.js.map +0 -1
  245. package/dist/skillIntegration.test.js +0 -128
  246. package/dist/skillIntegration.test.js.map +0 -1
  247. package/dist/test/utils.js +0 -200
  248. package/dist/test/utils.js.map +0 -1
  249. package/dist/test/workflow-fixtures.js +0 -120
  250. package/dist/test/workflow-fixtures.js.map +0 -1
  251. package/dist/tool-implementations.js +0 -521
  252. package/dist/tool-implementations.js.map +0 -1
  253. package/dist/tool-implementations.skill-tools.test.js +0 -106
  254. package/dist/tool-implementations.skill-tools.test.js.map +0 -1
  255. package/dist/tools/getTodoItem.js +0 -33
  256. package/dist/tools/getTodoItem.js.map +0 -1
  257. package/dist/tools/gitDiff.js +0 -108
  258. package/dist/tools/gitDiff.js.map +0 -1
  259. package/dist/tools/index.js +0 -8
  260. package/dist/tools/index.js.map +0 -1
  261. package/dist/tools/listMemoryTopics.js +0 -24
  262. package/dist/tools/listMemoryTopics.js.map +0 -1
  263. package/dist/tools/listTodoItems.js +0 -35
  264. package/dist/tools/listTodoItems.js.map +0 -1
  265. package/dist/tools/listTodoItems.test.js +0 -89
  266. package/dist/tools/listTodoItems.test.js.map +0 -1
  267. package/dist/tools/readMemory.js +0 -33
  268. package/dist/tools/readMemory.js.map +0 -1
  269. package/dist/tools/updateMemory.js +0 -62
  270. package/dist/tools/updateMemory.js.map +0 -1
  271. package/dist/tools/updateMemory.test.js +0 -109
  272. package/dist/tools/updateMemory.test.js.map +0 -1
  273. package/dist/tools/updateTodoItem.js +0 -31
  274. package/dist/tools/updateTodoItem.js.map +0 -1
  275. package/dist/tools/utils/diffLineNumbers.js +0 -178
  276. package/dist/tools/utils/diffLineNumbers.js.map +0 -1
  277. package/dist/utils/cacheControl.js +0 -59
  278. package/dist/utils/cacheControl.js.map +0 -1
  279. package/dist/utils/cacheControl.test.js +0 -128
  280. package/dist/utils/cacheControl.test.js.map +0 -1
  281. package/dist/utils/command.js +0 -50
  282. package/dist/utils/command.js.map +0 -1
  283. package/dist/utils/shell.js +0 -56
  284. package/dist/utils/shell.js.map +0 -1
  285. package/dist/utils/userInput.js +0 -47
  286. package/dist/utils/userInput.js.map +0 -1
  287. package/dist/workflow-tools.js +0 -21
  288. package/dist/workflow-tools.js.map +0 -1
  289. package/dist/workflows/agent-builder.js +0 -90
  290. package/dist/workflows/agent-builder.js.map +0 -1
  291. package/dist/workflows/agent-builder.test.js +0 -115
  292. package/dist/workflows/agent-builder.test.js.map +0 -1
  293. package/dist/workflows/code.workflow.js +0 -145
  294. package/dist/workflows/code.workflow.js.map +0 -1
  295. package/dist/workflows/commit.workflow.js +0 -111
  296. package/dist/workflows/commit.workflow.js.map +0 -1
  297. package/dist/workflows/commit.workflow.test.js +0 -141
  298. package/dist/workflows/commit.workflow.test.js.map +0 -1
  299. package/dist/workflows/fix.workflow.js +0 -172
  300. package/dist/workflows/fix.workflow.js.map +0 -1
  301. package/dist/workflows/fix.workflow.test.js +0 -137
  302. package/dist/workflows/fix.workflow.test.js.map +0 -1
  303. package/dist/workflows/git-file-tools.js +0 -408
  304. package/dist/workflows/git-file-tools.js.map +0 -1
  305. package/dist/workflows/index.js +0 -12
  306. package/dist/workflows/index.js.map +0 -1
  307. package/dist/workflows/init-interactive.workflow.js +0 -198
  308. package/dist/workflows/init-interactive.workflow.js.map +0 -1
  309. package/dist/workflows/init.workflow.js +0 -41
  310. package/dist/workflows/init.workflow.js.map +0 -1
  311. package/dist/workflows/meta.workflow.js +0 -107
  312. package/dist/workflows/meta.workflow.js.map +0 -1
  313. package/dist/workflows/plan.workflow.js +0 -275
  314. package/dist/workflows/plan.workflow.js.map +0 -1
  315. package/dist/workflows/plan.workflow.test.js +0 -419
  316. package/dist/workflows/plan.workflow.test.js.map +0 -1
  317. package/dist/workflows/pr.workflow.js +0 -54
  318. package/dist/workflows/pr.workflow.js.map +0 -1
  319. package/dist/workflows/pr.workflow.test.js +0 -98
  320. package/dist/workflows/pr.workflow.test.js.map +0 -1
  321. package/dist/workflows/prompts/coder.js +0 -85
  322. package/dist/workflows/prompts/coder.js.map +0 -1
  323. package/dist/workflows/prompts/commit.js +0 -16
  324. package/dist/workflows/prompts/commit.js.map +0 -1
  325. package/dist/workflows/prompts/fix.js +0 -44
  326. package/dist/workflows/prompts/fix.js.map +0 -1
  327. package/dist/workflows/prompts/index.js +0 -10
  328. package/dist/workflows/prompts/index.js.map +0 -1
  329. package/dist/workflows/prompts/init.js +0 -48
  330. package/dist/workflows/prompts/init.js.map +0 -1
  331. package/dist/workflows/prompts/meta.js +0 -17
  332. package/dist/workflows/prompts/meta.js.map +0 -1
  333. package/dist/workflows/prompts/plan.js +0 -212
  334. package/dist/workflows/prompts/plan.js.map +0 -1
  335. package/dist/workflows/prompts/pr.js +0 -15
  336. package/dist/workflows/prompts/pr.js.map +0 -1
  337. package/dist/workflows/prompts/review.js +0 -145
  338. package/dist/workflows/prompts/review.js.map +0 -1
  339. package/dist/workflows/prompts/shared.js +0 -93
  340. package/dist/workflows/prompts/shared.js.map +0 -1
  341. package/dist/workflows/review.workflow.js +0 -357
  342. package/dist/workflows/review.workflow.js.map +0 -1
  343. package/dist/workflows/task.workflow.js +0 -47
  344. package/dist/workflows/task.workflow.js.map +0 -1
  345. package/dist/workflows/testing/helper.js +0 -41
  346. package/dist/workflows/testing/helper.js.map +0 -1
  347. package/dist/workflows/workflow.utils.js +0 -351
  348. package/dist/workflows/workflow.utils.js.map +0 -1
  349. package/dist/workflows/workflow.utils.test.js +0 -45
  350. package/dist/workflows/workflow.utils.test.js.map +0 -1
@@ -1,258 +0,0 @@
1
- // generated by polka.codes
2
- /**
3
- * Script execution runtime for custom TypeScript scripts
4
- *
5
- * Provides in-process execution of TypeScript scripts with:
6
- * - Dynamic module loading
7
- * - Timeout enforcement
8
- * - Error handling with stack traces
9
- * - Security validation
10
- *
11
- * **IMPORTANT: Memory Limitation**
12
- * This runner uses cache busting (?t=timestamp) to ensure scripts are reloaded
13
- * on each execution. This creates a new module entry in Bun's module cache
14
- * every time a script runs. For CLI commands (which exit after one run),
15
- * this is acceptable. However, in long-running processes (watch mode,
16
- * daemon, server), this will cause memory leaks as each execution creates
17
- * new uncached module entries. Do NOT use this runner in long-running
18
- * processes (like packages/runner) without implementing a proper cache
19
- * management strategy.
20
- */
21
- import { existsSync } from 'node:fs';
22
- import { relative, resolve } from 'node:path';
23
- import { pathToFileURL } from 'node:url';
24
- import { createErrorClass } from '@polka-codes/core';
25
- /**
26
- * Error thrown when script validation fails
27
- */
28
- export const ScriptValidationError = createErrorClass('ScriptValidationError', ([message]) => `Script validation failed: ${message}`);
29
- /**
30
- * Error thrown when script execution times out
31
- */
32
- export const ScriptTimeoutError = createErrorClass('ScriptTimeoutError', ([scriptPath, timeout]) => `Script execution timeout: ${scriptPath} exceeded ${timeout}ms`);
33
- /**
34
- * Error thrown when script execution fails
35
- */
36
- export const ScriptExecutionError = createErrorClass('ScriptExecutionError', (args) => `Script execution failed: ${args[0]}`);
37
- /**
38
- * Validates that a script path is safe to execute
39
- *
40
- * @param scriptPath - Path to the script file
41
- * @param projectRoot - Root directory of the project (defaults to cwd)
42
- * @throws {ScriptValidationError} if validation fails
43
- */
44
- export function validateScriptPath(scriptPath, projectRoot = process.cwd()) {
45
- // Normalize and resolve to absolute paths
46
- const normalizedRoot = resolve(projectRoot);
47
- const normalizedScript = resolve(projectRoot, scriptPath);
48
- // Check if path is within project directory (prevent path traversal)
49
- const relativePath = relative(normalizedRoot, normalizedScript);
50
- // Check for path traversal attempts (.. segments at start or in path components)
51
- if (relativePath.startsWith('..')) {
52
- throw new ScriptValidationError(`Script path '${scriptPath}' is outside project directory`);
53
- }
54
- // Check if file exists
55
- if (!existsSync(normalizedScript)) {
56
- throw new ScriptValidationError(`Script file not found: ${scriptPath}`);
57
- }
58
- // Check file extension (Bun supports .ts, .js, .mjs, .cjs)
59
- const validExtensions = ['.ts', '.js', '.mjs', '.cjs'];
60
- const hasValidExtension = validExtensions.some((ext) => normalizedScript.endsWith(ext));
61
- if (!hasValidExtension) {
62
- throw new ScriptValidationError(`Script must be a .ts, .js, .mjs, or .cjs file: ${scriptPath}`);
63
- }
64
- }
65
- /**
66
- * Validates script permissions based on security configuration
67
- *
68
- * IMPORTANT: TypeScript scripts currently run with full process permissions.
69
- * Permission declarations in the config are ADVISORY ONLY for future sandboxing.
70
- * Scripts can access filesystem, network, and subprocesses regardless of declared permissions.
71
- *
72
- * @param script - Script configuration
73
- * @throws {ScriptValidationError} if permissions are invalid
74
- */
75
- export function validateScriptPermissions(script, logger) {
76
- if (typeof script === 'string' || 'command' in script || 'workflow' in script) {
77
- // These types don't have permission checks
78
- return;
79
- }
80
- if ('script' in script && script.permissions) {
81
- // Warn user that permissions are advisory only
82
- logger?.warn('Script permissions are currently advisory only. Scripts run with full process permissions.');
83
- // Validate permission values
84
- const { fs, network, subprocess } = script.permissions;
85
- if (fs && !['read', 'write', 'none'].includes(fs)) {
86
- throw new ScriptValidationError(`Invalid fs permission: ${fs}. Must be 'read', 'write', or 'none'`);
87
- }
88
- if (typeof network !== 'boolean' && network !== undefined) {
89
- throw new ScriptValidationError(`Invalid network permission: must be true or false`);
90
- }
91
- if (typeof subprocess !== 'boolean' && subprocess !== undefined) {
92
- throw new ScriptValidationError(`Invalid subprocess permission: must be true or false`);
93
- }
94
- }
95
- }
96
- /**
97
- * In-process script runner for TypeScript files
98
- *
99
- * Executes TypeScript scripts by dynamically importing them as modules.
100
- * Scripts should export a `main(args: string[], context: ScriptContext)` function.
101
- *
102
- * **Important Limitations:**
103
- *
104
- * 1. **Synchronous Blocking**: The timeout mechanism uses `Promise.race()` which only
105
- * handles timeouts for asynchronous operations. If a script performs a synchronous
106
- * blocking operation (e.g., `while(true) {}`), the timeout will not trigger and the
107
- * process will hang indefinitely. This is a known limitation of in-process script
108
- * execution without using Worker threads or child processes.
109
- *
110
- * 2. **Path Resolution**: Script paths are resolved relative to `process.cwd()`. If the
111
- * CLI is run from a subdirectory, script paths from config may not resolve correctly.
112
- * The caller should ensure paths are absolute or relative to the correct working directory.
113
- *
114
- * 3. **Memory Leak Warning**: Cache busting via timestamp query parameters (`?t=...`)
115
- * only invalidates the entry point script. If a script imports other local modules,
116
- * those dependencies remain cached across executions. This is acceptable for CLI
117
- * commands that run once and exit, but **will cause memory leaks in long-running
118
- * processes**. Do NOT use this ScriptRunner in the `packages/runner` service or
119
- * other long-lived contexts without implementing proper module cache clearing
120
- * strategies (e.g., using a custom VM context or Worker threads).
121
- *
122
- * @example
123
- * ```typescript
124
- * // Script file (scripts/deploy.ts):
125
- * export async function main(args: string[], context: ScriptContext) {
126
- * const { logger, projectRoot } = context
127
- * logger.info('Deploying...')
128
- * // Use logger and projectRoot as needed
129
- * }
130
- *
131
- * // Execution:
132
- * const runner = new ScriptRunner()
133
- * const result = await runner.execute({
134
- * scriptPath: './scripts/deploy.ts',
135
- * args: ['--production'],
136
- * context: { projectRoot: '/path/to/project' },
137
- * logger: createLogger({ verbose: 1 }),
138
- * timeout: 60000
139
- * })
140
- * ```
141
- */
142
- export class ScriptRunner {
143
- /**
144
- * Execute a TypeScript script
145
- *
146
- * @param options - Script execution options
147
- * @returns Promise<ScriptExecutionResult>
148
- * @throws {ScriptValidationError} if validation fails
149
- * @throws {ScriptTimeoutError} if execution times out
150
- * @throws {ScriptExecutionError} if execution fails
151
- */
152
- async execute(options) {
153
- const { scriptPath, args, logger, timeout = 300000, context } = options;
154
- // Validate script path
155
- validateScriptPath(scriptPath);
156
- // Log execution start
157
- logger.debug(`Executing script: ${scriptPath}`);
158
- logger.debug(`Arguments: ${args.join(' ')}`);
159
- logger.debug(`Timeout: ${timeout}ms`);
160
- try {
161
- // Execute with timeout
162
- const returnValue = await this.withTimeout(timeout, async () => {
163
- // Resolve script path relative to project root (where config was loaded)
164
- const projectRoot = context.projectRoot || process.cwd();
165
- const absolutePath = resolve(projectRoot, scriptPath);
166
- // Cache busting ensures we reload the script on each execution
167
- // WARNING: This creates a new module entry in the cache on each execution.
168
- // For CLI commands that run once and exit, this is acceptable and ensures
169
- // scripts are reloaded without process restart. However, in long-running
170
- // processes (watch mode, daemon), this will cause memory leaks as each unique
171
- // URL creates an uncached module entry. If used in long-running processes,
172
- // implement explicit cache clearing or use a different strategy.
173
- const cacheBustUrl = `${pathToFileURL(absolutePath).href}?t=${Date.now()}`;
174
- // Dynamic import of the script module
175
- const scriptModule = await import(cacheBustUrl);
176
- // Check if script exports a main function
177
- if (typeof scriptModule.main !== 'function') {
178
- throw new ScriptExecutionError(scriptPath, new Error(`Script must export a 'main(args: string[], context: ScriptContext)' function`));
179
- }
180
- // Build script context with logger and project root
181
- const scriptContext = {
182
- logger,
183
- projectRoot,
184
- ...context, // Spread additional context (config, etc.)
185
- };
186
- // Execute the main function with args and context
187
- return await scriptModule.main(args, scriptContext);
188
- });
189
- logger.debug(`Script completed successfully: ${scriptPath}`);
190
- return {
191
- success: true,
192
- returnValue,
193
- };
194
- }
195
- catch (error) {
196
- const executionError = error instanceof Error ? error : new Error(String(error));
197
- // Check if it's a timeout
198
- if (executionError.name === 'ScriptTimeoutError') {
199
- throw executionError;
200
- }
201
- logger.error(`Script execution failed: ${scriptPath}`);
202
- logger.error(executionError.message);
203
- // Show stack trace in debug mode
204
- if (executionError.stack) {
205
- logger.debug('Stack trace:');
206
- logger.debug(executionError.stack);
207
- }
208
- // Show helpful hint for debugging
209
- logger.info(`💡 Tip: Run with --verbose=1 for more details`);
210
- return {
211
- success: false,
212
- error: executionError,
213
- };
214
- }
215
- }
216
- /**
217
- * Execute a function with a timeout
218
- *
219
- * @param ms - Timeout in milliseconds
220
- * @param fn - Function to execute
221
- * @returns Promise<T>
222
- * @throws {ScriptTimeoutError} if timeout is exceeded
223
- */
224
- withTimeout(ms, fn) {
225
- let timeoutHandle;
226
- const timeoutPromise = new Promise((_, reject) => {
227
- timeoutHandle = setTimeout(() => reject(new ScriptTimeoutError('script', ms)), ms);
228
- });
229
- return Promise.race([fn(), timeoutPromise]).then((result) => {
230
- if (timeoutHandle)
231
- clearTimeout(timeoutHandle);
232
- return result;
233
- }, (error) => {
234
- if (timeoutHandle)
235
- clearTimeout(timeoutHandle);
236
- throw error;
237
- });
238
- }
239
- /**
240
- * Check if a script is a TypeScript file
241
- */
242
- isTypeScriptScript(script) {
243
- return typeof script !== 'string' && 'script' in script;
244
- }
245
- /**
246
- * Check if a script is a workflow YAML
247
- */
248
- isWorkflowScript(script) {
249
- return typeof script !== 'string' && 'workflow' in script;
250
- }
251
- /**
252
- * Check if a script is a shell command
253
- */
254
- isShellCommand(script) {
255
- return typeof script === 'string' || (typeof script !== 'string' && 'command' in script);
256
- }
257
- }
258
- //# sourceMappingURL=runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/script/runner.ts"],"names":[],"mappings":"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"}
@@ -1,155 +0,0 @@
1
- import {
2
- McpConnectionError,
3
- McpToolError
4
- } from "./chunk-ZU4UU65A.js";
5
-
6
- // src/mcp/sdk-client.ts
7
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8
- import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
9
- var SdkMcpClient = class {
10
- constructor(serverName, config) {
11
- this.serverName = serverName;
12
- this.config = config;
13
- }
14
- client = null;
15
- transport = null;
16
- initialized = false;
17
- /**
18
- * Connect to the MCP server and initialize
19
- */
20
- async connect() {
21
- if (!this.config.command) {
22
- throw new McpConnectionError(this.serverName, new Error("No command specified for MCP server"));
23
- }
24
- try {
25
- this.transport = new StdioClientTransport({
26
- command: this.config.command,
27
- args: this.config.args || [],
28
- env: this.config.env
29
- });
30
- this.client = new Client(
31
- {
32
- name: `polka-codes-${this.serverName}`,
33
- version: "1.0.0"
34
- },
35
- {
36
- capabilities: {}
37
- }
38
- );
39
- await this.client.connect(this.transport);
40
- this.initialized = true;
41
- } catch (error) {
42
- throw new McpConnectionError(this.serverName, error instanceof Error ? error : new Error(String(error)));
43
- }
44
- }
45
- /**
46
- * Check if connected
47
- */
48
- isConnected() {
49
- return this.initialized && this.client !== null;
50
- }
51
- /**
52
- * Disconnect from the server
53
- */
54
- async disconnect() {
55
- if (this.client) {
56
- await this.client.close();
57
- this.client = null;
58
- }
59
- this.transport = null;
60
- this.initialized = false;
61
- }
62
- /**
63
- * List available tools from the server
64
- */
65
- async listTools() {
66
- if (!this.client || !this.isConnected()) {
67
- throw new McpConnectionError(this.serverName, new Error("Client not connected"));
68
- }
69
- try {
70
- const response = await this.client.listTools({});
71
- return response.tools.map((tool) => ({
72
- name: tool.name,
73
- description: tool.description || "",
74
- inputSchema: tool.inputSchema
75
- }));
76
- } catch (error) {
77
- throw new McpConnectionError(this.serverName, error instanceof Error ? error : new Error(String(error)));
78
- }
79
- }
80
- /**
81
- * Call a tool on the server
82
- */
83
- async callTool(name, args) {
84
- if (!this.client || !this.isConnected()) {
85
- throw new McpConnectionError(this.serverName, new Error("Client not connected"));
86
- }
87
- try {
88
- const response = await this.client.callTool({
89
- name,
90
- arguments: args
91
- });
92
- const content = "content" in response ? response.content : [];
93
- const textParts = content.filter((c) => c.type === "text").map((c) => c.text);
94
- const text = textParts.length > 0 ? textParts.join("\n") : JSON.stringify(response, null, 2);
95
- return {
96
- content: [
97
- {
98
- type: "text",
99
- text
100
- }
101
- ],
102
- isError: "isError" in response ? response.isError : void 0
103
- };
104
- } catch (error) {
105
- if (error instanceof McpToolError) {
106
- throw error;
107
- }
108
- const errorMessage = error instanceof Error ? `Failed to call tool '${name}': ${error.message}` : `Failed to call tool '${name}': ${String(error)}`;
109
- throw new McpConnectionError(this.serverName, new Error(errorMessage));
110
- }
111
- }
112
- /**
113
- * List available resources from the server
114
- */
115
- async listResources() {
116
- if (!this.client || !this.isConnected()) {
117
- throw new McpConnectionError(this.serverName, new Error("Client not connected"));
118
- }
119
- try {
120
- const response = await this.client.listResources({});
121
- return response.resources.map((resource) => ({
122
- uri: resource.uri,
123
- name: resource.name,
124
- description: resource.description,
125
- mimeType: resource.mimeType
126
- }));
127
- } catch (error) {
128
- throw new McpConnectionError(this.serverName, error instanceof Error ? error : new Error(String(error)));
129
- }
130
- }
131
- /**
132
- * Read a resource from the server
133
- */
134
- async readResource(uri) {
135
- if (!this.client || !this.isConnected()) {
136
- throw new McpConnectionError(this.serverName, new Error("Client not connected"));
137
- }
138
- try {
139
- const response = await this.client.readResource({ uri });
140
- const textParts = response.contents?.filter((c) => "text" in c).map((c) => c.text) || [];
141
- return textParts.length > 0 ? textParts.join("\n") : JSON.stringify(response, null, 2);
142
- } catch (error) {
143
- throw new McpConnectionError(this.serverName, error instanceof Error ? error : new Error(String(error)));
144
- }
145
- }
146
- /**
147
- * Get the server name
148
- */
149
- getServerName() {
150
- return this.serverName;
151
- }
152
- };
153
- export {
154
- SdkMcpClient
155
- };
@@ -1,46 +0,0 @@
1
- /**
2
- * Skill integration utilities
3
- *
4
- * Provides functionality to integrate Agent Skills with the agent workflow:
5
- * - Generate system prompts with skill metadata
6
- * - Create skill context for agent execution
7
- * - Manage skill loading during agent operations
8
- *
9
- * Generated by polka.codes
10
- */
11
- import { SkillDiscoveryService, SOURCE_ICONS } from '@polka-codes/core';
12
- /**
13
- * Generate a system prompt section describing available skills
14
- */
15
- export function generateSkillsSystemPrompt(skills) {
16
- if (skills.length === 0) {
17
- return '';
18
- }
19
- let prompt = '\n## Available Skills\n\n';
20
- prompt += 'You have access to the following Agent Skills that provide specialized capabilities:\n\n';
21
- for (const skill of skills) {
22
- const icon = SOURCE_ICONS[skill.source];
23
- const sourceLabel = `${icon} ${skill.source.charAt(0).toUpperCase() + skill.source.slice(1)}`;
24
- prompt += `### ${skill.metadata.name}\n`;
25
- prompt += `${sourceLabel} - ${skill.metadata.description}\n\n`;
26
- if (skill.metadata.allowedTools && skill.metadata.allowedTools.length > 0) {
27
- prompt += `**Allowed Tools:** ${skill.metadata.allowedTools.join(', ')}\n\n`;
28
- }
29
- }
30
- prompt += `**Using Skills:**
31
- - Use the \`loadSkill\` tool to access a skill's detailed instructions and supporting files
32
- - When a skill is loaded, follow its instructions carefully to complete specialized tasks
33
- - Skills provide domain-specific guidance for tasks like testing, deployment, or framework-specific operations
34
- - Use the \`listSkills\` tool to discover available skills matching your current task
35
-
36
- `;
37
- return prompt;
38
- }
39
- /**
40
- * Create an initial skill context for agent execution
41
- */
42
- export async function createSkillContext(cwd) {
43
- const service = new SkillDiscoveryService({ cwd: cwd || process.cwd() });
44
- return await service.createContext();
45
- }
46
- //# sourceMappingURL=skillIntegration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skillIntegration.js","sourceRoot":"","sources":["../src/skillIntegration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEvE;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAwB;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,MAAM,GAAG,2BAA2B,CAAA;IACxC,MAAM,IAAI,0FAA0F,CAAA;IAEpG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7F,MAAM,IAAI,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;QACxC,MAAM,IAAI,GAAG,WAAW,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,MAAM,CAAA;QAE9D,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,sBAAsB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;QAC9E,CAAC;IACH,CAAC;IAED,MAAM,IAAI;;;;;;CAMX,CAAA;IAEC,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY;IACnD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACxE,OAAO,MAAM,OAAO,CAAC,aAAa,EAAE,CAAA;AACtC,CAAC"}
@@ -1,128 +0,0 @@
1
- // generated by polka.codes
2
- import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
3
- import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { createSkillContext, generateSkillsSystemPrompt } from './skillIntegration';
7
- describe('skillIntegration', () => {
8
- const testDir = join(tmpdir(), `polka-test-skill-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
9
- const skillsDir = join(testDir, '.claude', 'skills');
10
- beforeEach(() => {
11
- mkdirSync(skillsDir, { recursive: true });
12
- });
13
- afterEach(() => {
14
- rmSync(testDir, { recursive: true, force: true });
15
- });
16
- function createTestSkill(name, description, content) {
17
- const skillDir = join(skillsDir, name);
18
- mkdirSync(skillDir, { recursive: true });
19
- const fullContent = `---
20
- name: ${name}
21
- description: ${description}
22
- ---
23
-
24
- ${content || '# Test Skill'}
25
- `;
26
- writeFileSync(join(skillDir, 'SKILL.md'), fullContent);
27
- return skillDir;
28
- }
29
- describe('generateSkillsSystemPrompt', () => {
30
- function createMockSkill(name, description, source, allowedTools) {
31
- return {
32
- metadata: { name, description, allowedTools },
33
- source,
34
- content: '# Test',
35
- files: new Map(),
36
- path: '/test',
37
- };
38
- }
39
- it('should return empty string when no skills provided', () => {
40
- const result = generateSkillsSystemPrompt([]);
41
- expect(result).toBe('');
42
- });
43
- it('should generate prompt with project skills', () => {
44
- const skills = [createMockSkill('test-skill', 'A test skill', 'project')];
45
- const result = generateSkillsSystemPrompt(skills);
46
- expect(result).toContain('## Available Skills');
47
- expect(result).toContain('### test-skill');
48
- expect(result).toContain('📁 Project');
49
- expect(result).toContain('A test skill');
50
- });
51
- it('should generate prompt with personal skills', () => {
52
- const skills = [createMockSkill('personal-skill', 'A personal skill', 'personal')];
53
- const result = generateSkillsSystemPrompt(skills);
54
- expect(result).toContain('🏠 Personal');
55
- expect(result).toContain('personal-skill');
56
- });
57
- it('should generate prompt with plugin skills', () => {
58
- const skills = [createMockSkill('plugin-skill', 'A plugin skill', 'plugin')];
59
- const result = generateSkillsSystemPrompt(skills);
60
- expect(result).toContain('🔌 Plugin');
61
- expect(result).toContain('plugin-skill');
62
- });
63
- it('should include allowed tools in prompt', () => {
64
- const skills = [createMockSkill('test-skill', 'A test skill', 'project', ['readFile', 'writeToFile'])];
65
- const result = generateSkillsSystemPrompt(skills);
66
- expect(result).toContain('**Allowed Tools:**');
67
- expect(result).toContain('readFile, writeToFile');
68
- });
69
- it('should include multiple skills', () => {
70
- const skills = [createMockSkill('skill-one', 'First skill', 'project'), createMockSkill('skill-two', 'Second skill', 'personal')];
71
- const result = generateSkillsSystemPrompt(skills);
72
- expect(result).toContain('### skill-one');
73
- expect(result).toContain('### skill-two');
74
- expect(result).toContain('First skill');
75
- expect(result).toContain('Second skill');
76
- });
77
- it('should include usage instructions', () => {
78
- const skills = [createMockSkill('test-skill', 'A test skill', 'project')];
79
- const result = generateSkillsSystemPrompt(skills);
80
- expect(result).toContain('**Using Skills:**');
81
- expect(result).toContain('`loadSkill`');
82
- expect(result).toContain('`listSkills`');
83
- });
84
- });
85
- describe('createSkillContext', () => {
86
- it('should create context with discovered skills', async () => {
87
- createTestSkill('skill-one', 'First skill');
88
- createTestSkill('skill-two', 'Second skill');
89
- const context = await createSkillContext(testDir);
90
- // Check that our test skills are included (may also include personal/plugin skills)
91
- const skillNames = context.availableSkills.map((s) => s.metadata.name);
92
- expect(skillNames).toContain('skill-one');
93
- expect(skillNames).toContain('skill-two');
94
- // Verify test skills are from project source
95
- const testSkills = context.availableSkills.filter((s) => s.metadata.name === 'skill-one' || s.metadata.name === 'skill-two');
96
- expect(testSkills).toHaveLength(2);
97
- expect(testSkills.every((s) => s.source === 'project')).toBe(true);
98
- });
99
- it('should create context with empty skills when none exist', async () => {
100
- const context = await createSkillContext(testDir);
101
- // Should not have any project skills (may still have personal/plugin skills)
102
- const projectSkills = context.availableSkills.filter((s) => s.source === 'project');
103
- expect(projectSkills).toHaveLength(0);
104
- expect(context.activeSkill).toBeNull();
105
- });
106
- it('should use process.cwd() when no cwd provided', async () => {
107
- createTestSkill('test-skill', 'A test skill');
108
- // This will discover skills in the actual test directory
109
- const context = await createSkillContext();
110
- // Just verify it returns a valid context structure
111
- expect(context).toBeDefined();
112
- expect(context.availableSkills).toBeArray();
113
- expect(context.activeSkill).toBeNull();
114
- expect(context.skillLoadingHistory).toBeArray();
115
- });
116
- it('should initialize with null active skill', async () => {
117
- createTestSkill('test-skill', 'A test skill');
118
- const context = await createSkillContext(testDir);
119
- expect(context.activeSkill).toBeNull();
120
- });
121
- it('should initialize with empty loading history', async () => {
122
- createTestSkill('test-skill', 'A test skill');
123
- const context = await createSkillContext(testDir);
124
- expect(context.skillLoadingHistory).toHaveLength(0);
125
- });
126
- });
127
- });
128
- //# sourceMappingURL=skillIntegration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skillIntegration.test.js","sourceRoot":"","sources":["../src/skillIntegration.test.ts"],"names":[],"mappings":"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"}