@polka-codes/cli 0.10.23 → 0.10.25

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 (343) hide show
  1. package/dist/bin.cjs +143854 -0
  2. package/dist/bin.d.ts +2 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +9201 -9195
  7. package/dist/program.d.ts +3 -0
  8. package/dist/program.d.ts.map +1 -0
  9. package/package.json +6 -7
  10. package/cli.mjs +0 -2
  11. package/dist/ApiProviderConfig.js +0 -57
  12. package/dist/ApiProviderConfig.js.map +0 -1
  13. package/dist/ApiProviderConfig.test.js +0 -278
  14. package/dist/ApiProviderConfig.test.js.map +0 -1
  15. package/dist/agent/advanced-discovery.js +0 -604
  16. package/dist/agent/advanced-discovery.js.map +0 -1
  17. package/dist/agent/config.js +0 -139
  18. package/dist/agent/config.js.map +0 -1
  19. package/dist/agent/config.test.js +0 -140
  20. package/dist/agent/config.test.js.map +0 -1
  21. package/dist/agent/constants.js +0 -172
  22. package/dist/agent/constants.js.map +0 -1
  23. package/dist/agent/constants.test.js +0 -132
  24. package/dist/agent/constants.test.js.map +0 -1
  25. package/dist/agent/debug-logger.js +0 -281
  26. package/dist/agent/debug-logger.js.map +0 -1
  27. package/dist/agent/debug-logger.test.js +0 -294
  28. package/dist/agent/debug-logger.test.js.map +0 -1
  29. package/dist/agent/error-handling.js +0 -114
  30. package/dist/agent/error-handling.js.map +0 -1
  31. package/dist/agent/error-handling.test.js +0 -191
  32. package/dist/agent/error-handling.test.js.map +0 -1
  33. package/dist/agent/errors.js +0 -301
  34. package/dist/agent/errors.js.map +0 -1
  35. package/dist/agent/executor.js +0 -206
  36. package/dist/agent/executor.js.map +0 -1
  37. package/dist/agent/executor.test.js +0 -228
  38. package/dist/agent/executor.test.js.map +0 -1
  39. package/dist/agent/goal-decomposer.js +0 -281
  40. package/dist/agent/goal-decomposer.js.map +0 -1
  41. package/dist/agent/goal-decomposer.test.js +0 -225
  42. package/dist/agent/goal-decomposer.test.js.map +0 -1
  43. package/dist/agent/health-monitor.js +0 -89
  44. package/dist/agent/health-monitor.js.map +0 -1
  45. package/dist/agent/improvement-loop.js +0 -177
  46. package/dist/agent/improvement-loop.js.map +0 -1
  47. package/dist/agent/index.js +0 -38
  48. package/dist/agent/index.js.map +0 -1
  49. package/dist/agent/metrics.js +0 -158
  50. package/dist/agent/metrics.js.map +0 -1
  51. package/dist/agent/metrics.test.js +0 -311
  52. package/dist/agent/metrics.test.js.map +0 -1
  53. package/dist/agent/orchestrator.js +0 -438
  54. package/dist/agent/orchestrator.js.map +0 -1
  55. package/dist/agent/planner.js +0 -199
  56. package/dist/agent/planner.js.map +0 -1
  57. package/dist/agent/planner.test.js +0 -135
  58. package/dist/agent/planner.test.js.map +0 -1
  59. package/dist/agent/progress.js +0 -298
  60. package/dist/agent/progress.js.map +0 -1
  61. package/dist/agent/progress.test.js +0 -255
  62. package/dist/agent/progress.test.js.map +0 -1
  63. package/dist/agent/resource-monitor.js +0 -114
  64. package/dist/agent/resource-monitor.js.map +0 -1
  65. package/dist/agent/safety/approval.js +0 -178
  66. package/dist/agent/safety/approval.js.map +0 -1
  67. package/dist/agent/safety/approval.test.js +0 -142
  68. package/dist/agent/safety/approval.test.js.map +0 -1
  69. package/dist/agent/safety/checks.js +0 -152
  70. package/dist/agent/safety/checks.js.map +0 -1
  71. package/dist/agent/safety/checks.test.js +0 -89
  72. package/dist/agent/safety/checks.test.js.map +0 -1
  73. package/dist/agent/safety/interrupt.js +0 -92
  74. package/dist/agent/safety/interrupt.js.map +0 -1
  75. package/dist/agent/safety/interrupt.test.js +0 -53
  76. package/dist/agent/safety/interrupt.test.js.map +0 -1
  77. package/dist/agent/session.js +0 -117
  78. package/dist/agent/session.js.map +0 -1
  79. package/dist/agent/session.test.js +0 -213
  80. package/dist/agent/session.test.js.map +0 -1
  81. package/dist/agent/state-manager.js +0 -287
  82. package/dist/agent/state-manager.js.map +0 -1
  83. package/dist/agent/task-discovery.js +0 -433
  84. package/dist/agent/task-discovery.js.map +0 -1
  85. package/dist/agent/task-discovery.test.js +0 -40
  86. package/dist/agent/task-discovery.test.js.map +0 -1
  87. package/dist/agent/task-history.js +0 -128
  88. package/dist/agent/task-history.js.map +0 -1
  89. package/dist/agent/task-prioritizer.js +0 -286
  90. package/dist/agent/task-prioritizer.js.map +0 -1
  91. package/dist/agent/test-fixtures.js +0 -112
  92. package/dist/agent/test-fixtures.js.map +0 -1
  93. package/dist/agent/types.js +0 -15
  94. package/dist/agent/types.js.map +0 -1
  95. package/dist/agent/workflow-adapter.js +0 -219
  96. package/dist/agent/workflow-adapter.js.map +0 -1
  97. package/dist/agent/workflow-adapter.test.js +0 -11
  98. package/dist/agent/workflow-adapter.test.js.map +0 -1
  99. package/dist/agent/working-dir-discovery.js +0 -54
  100. package/dist/agent/working-dir-discovery.js.map +0 -1
  101. package/dist/agent/working-space.js +0 -484
  102. package/dist/agent/working-space.js.map +0 -1
  103. package/dist/agent/working-space.test.js +0 -436
  104. package/dist/agent/working-space.test.js.map +0 -1
  105. package/dist/api.js +0 -279
  106. package/dist/api.js.map +0 -1
  107. package/dist/builtin-commands.js +0 -20
  108. package/dist/builtin-commands.js.map +0 -1
  109. package/dist/commandSummarizer.js +0 -96
  110. package/dist/commandSummarizer.js.map +0 -1
  111. package/dist/commands/__tests__/command-detection.integration.test.js +0 -238
  112. package/dist/commands/__tests__/command-detection.integration.test.js.map +0 -1
  113. package/dist/commands/__tests__/script-generator.integration.test.js +0 -271
  114. package/dist/commands/__tests__/script-generator.integration.test.js.map +0 -1
  115. package/dist/commands/agent.js +0 -218
  116. package/dist/commands/agent.js.map +0 -1
  117. package/dist/commands/code.js +0 -102
  118. package/dist/commands/code.js.map +0 -1
  119. package/dist/commands/command.constants.js +0 -13
  120. package/dist/commands/command.constants.js.map +0 -1
  121. package/dist/commands/commit.js +0 -17
  122. package/dist/commands/commit.js.map +0 -1
  123. package/dist/commands/fix.js +0 -17
  124. package/dist/commands/fix.js.map +0 -1
  125. package/dist/commands/init.js +0 -501
  126. package/dist/commands/init.js.map +0 -1
  127. package/dist/commands/mcp-server.js +0 -122
  128. package/dist/commands/mcp-server.js.map +0 -1
  129. package/dist/commands/memory.js +0 -410
  130. package/dist/commands/memory.js.map +0 -1
  131. package/dist/commands/memory.test.js +0 -453
  132. package/dist/commands/memory.test.js.map +0 -1
  133. package/dist/commands/meta.js +0 -142
  134. package/dist/commands/meta.js.map +0 -1
  135. package/dist/commands/plan.js +0 -39
  136. package/dist/commands/plan.js.map +0 -1
  137. package/dist/commands/pr.js +0 -14
  138. package/dist/commands/pr.js.map +0 -1
  139. package/dist/commands/review-json.test.js +0 -33
  140. package/dist/commands/review-json.test.js.map +0 -1
  141. package/dist/commands/review.js +0 -137
  142. package/dist/commands/review.js.map +0 -1
  143. package/dist/commands/review.usage.test.js +0 -41
  144. package/dist/commands/review.usage.test.js.map +0 -1
  145. package/dist/commands/run.js +0 -107
  146. package/dist/commands/run.js.map +0 -1
  147. package/dist/commands/skills.js +0 -175
  148. package/dist/commands/skills.js.map +0 -1
  149. package/dist/commands/task.js +0 -34
  150. package/dist/commands/task.js.map +0 -1
  151. package/dist/commands/workflow.js +0 -117
  152. package/dist/commands/workflow.js.map +0 -1
  153. package/dist/configPrompt.js +0 -39
  154. package/dist/configPrompt.js.map +0 -1
  155. package/dist/env.js +0 -22
  156. package/dist/env.js.map +0 -1
  157. package/dist/errors.js +0 -132
  158. package/dist/errors.js.map +0 -1
  159. package/dist/errors.test.js +0 -21
  160. package/dist/errors.test.js.map +0 -1
  161. package/dist/file-attachments.js +0 -77
  162. package/dist/file-attachments.js.map +0 -1
  163. package/dist/file-attachments.test.js +0 -214
  164. package/dist/file-attachments.test.js.map +0 -1
  165. package/dist/getModel.js +0 -229
  166. package/dist/getModel.js.map +0 -1
  167. package/dist/getModel.test.js +0 -67
  168. package/dist/getModel.test.js.map +0 -1
  169. package/dist/getProviderOptions.js +0 -58
  170. package/dist/getProviderOptions.js.map +0 -1
  171. package/dist/git-operations.js +0 -363
  172. package/dist/git-operations.js.map +0 -1
  173. package/dist/git-operations.test.js +0 -81
  174. package/dist/git-operations.test.js.map +0 -1
  175. package/dist/index.js.map +0 -1
  176. package/dist/logger.js +0 -41
  177. package/dist/logger.js.map +0 -1
  178. package/dist/mcp/client.js +0 -11
  179. package/dist/mcp/client.js.map +0 -1
  180. package/dist/mcp/error-scenarios.test.js +0 -206
  181. package/dist/mcp/error-scenarios.test.js.map +0 -1
  182. package/dist/mcp/errors.js +0 -63
  183. package/dist/mcp/errors.js.map +0 -1
  184. package/dist/mcp/index.js +0 -9
  185. package/dist/mcp/index.js.map +0 -1
  186. package/dist/mcp/manager.js +0 -231
  187. package/dist/mcp/manager.js.map +0 -1
  188. package/dist/mcp/manager.test.js +0 -40
  189. package/dist/mcp/manager.test.js.map +0 -1
  190. package/dist/mcp/sdk-client.js +0 -166
  191. package/dist/mcp/sdk-client.js.map +0 -1
  192. package/dist/mcp/shared-types.js +0 -3
  193. package/dist/mcp/shared-types.js.map +0 -1
  194. package/dist/mcp/tools-integration.test.js +0 -198
  195. package/dist/mcp/tools-integration.test.js.map +0 -1
  196. package/dist/mcp/tools.js +0 -60
  197. package/dist/mcp/tools.js.map +0 -1
  198. package/dist/mcp/transport.js +0 -257
  199. package/dist/mcp/transport.js.map +0 -1
  200. package/dist/mcp/types.js +0 -3
  201. package/dist/mcp/types.js.map +0 -1
  202. package/dist/mcp-server/index.js +0 -5
  203. package/dist/mcp-server/index.js.map +0 -1
  204. package/dist/mcp-server/plan-formatting.test.js +0 -74
  205. package/dist/mcp-server/plan-formatting.test.js.map +0 -1
  206. package/dist/mcp-server/sdk-server.js +0 -102
  207. package/dist/mcp-server/sdk-server.js.map +0 -1
  208. package/dist/mcp-server/sdk-server.test.js +0 -363
  209. package/dist/mcp-server/sdk-server.test.js.map +0 -1
  210. package/dist/mcp-server/tools.js +0 -785
  211. package/dist/mcp-server/tools.js.map +0 -1
  212. package/dist/mcp-server/types.js +0 -3
  213. package/dist/mcp-server/types.js.map +0 -1
  214. package/dist/options.js +0 -85
  215. package/dist/options.js.map +0 -1
  216. package/dist/options.test.js +0 -177
  217. package/dist/options.test.js.map +0 -1
  218. package/dist/prices.js +0 -61
  219. package/dist/prices.js.map +0 -1
  220. package/dist/prices.test.js +0 -148
  221. package/dist/prices.test.js.map +0 -1
  222. package/dist/runWorkflow.js +0 -313
  223. package/dist/runWorkflow.js.map +0 -1
  224. package/dist/script/__tests__/execution.integration.test.js +0 -274
  225. package/dist/script/__tests__/execution.integration.test.js.map +0 -1
  226. package/dist/script/__tests__/runner.test.js +0 -176
  227. package/dist/script/__tests__/runner.test.js.map +0 -1
  228. package/dist/script/__tests__/validator.test.js +0 -180
  229. package/dist/script/__tests__/validator.test.js.map +0 -1
  230. package/dist/script/executor.js +0 -127
  231. package/dist/script/executor.js.map +0 -1
  232. package/dist/script/index.js +0 -4
  233. package/dist/script/index.js.map +0 -1
  234. package/dist/script/runner.js +0 -258
  235. package/dist/script/runner.js.map +0 -1
  236. package/dist/skillIntegration.js +0 -46
  237. package/dist/skillIntegration.js.map +0 -1
  238. package/dist/skillIntegration.test.js +0 -128
  239. package/dist/skillIntegration.test.js.map +0 -1
  240. package/dist/test/utils.js +0 -200
  241. package/dist/test/utils.js.map +0 -1
  242. package/dist/test/workflow-fixtures.js +0 -120
  243. package/dist/test/workflow-fixtures.js.map +0 -1
  244. package/dist/tool-implementations.js +0 -521
  245. package/dist/tool-implementations.js.map +0 -1
  246. package/dist/tool-implementations.skill-tools.test.js +0 -106
  247. package/dist/tool-implementations.skill-tools.test.js.map +0 -1
  248. package/dist/tools/getTodoItem.js +0 -33
  249. package/dist/tools/getTodoItem.js.map +0 -1
  250. package/dist/tools/gitDiff.js +0 -108
  251. package/dist/tools/gitDiff.js.map +0 -1
  252. package/dist/tools/index.js +0 -8
  253. package/dist/tools/index.js.map +0 -1
  254. package/dist/tools/listMemoryTopics.js +0 -24
  255. package/dist/tools/listMemoryTopics.js.map +0 -1
  256. package/dist/tools/listTodoItems.js +0 -35
  257. package/dist/tools/listTodoItems.js.map +0 -1
  258. package/dist/tools/listTodoItems.test.js +0 -89
  259. package/dist/tools/listTodoItems.test.js.map +0 -1
  260. package/dist/tools/readMemory.js +0 -33
  261. package/dist/tools/readMemory.js.map +0 -1
  262. package/dist/tools/updateMemory.js +0 -62
  263. package/dist/tools/updateMemory.js.map +0 -1
  264. package/dist/tools/updateMemory.test.js +0 -109
  265. package/dist/tools/updateMemory.test.js.map +0 -1
  266. package/dist/tools/updateTodoItem.js +0 -31
  267. package/dist/tools/updateTodoItem.js.map +0 -1
  268. package/dist/tools/utils/diffLineNumbers.js +0 -178
  269. package/dist/tools/utils/diffLineNumbers.js.map +0 -1
  270. package/dist/utils/cacheControl.js +0 -59
  271. package/dist/utils/cacheControl.js.map +0 -1
  272. package/dist/utils/cacheControl.test.js +0 -128
  273. package/dist/utils/cacheControl.test.js.map +0 -1
  274. package/dist/utils/command.js +0 -50
  275. package/dist/utils/command.js.map +0 -1
  276. package/dist/utils/shell.js +0 -56
  277. package/dist/utils/shell.js.map +0 -1
  278. package/dist/utils/userInput.js +0 -47
  279. package/dist/utils/userInput.js.map +0 -1
  280. package/dist/workflow-tools.js +0 -21
  281. package/dist/workflow-tools.js.map +0 -1
  282. package/dist/workflows/agent-builder.js +0 -90
  283. package/dist/workflows/agent-builder.js.map +0 -1
  284. package/dist/workflows/agent-builder.test.js +0 -115
  285. package/dist/workflows/agent-builder.test.js.map +0 -1
  286. package/dist/workflows/code.workflow.js +0 -145
  287. package/dist/workflows/code.workflow.js.map +0 -1
  288. package/dist/workflows/commit.workflow.js +0 -111
  289. package/dist/workflows/commit.workflow.js.map +0 -1
  290. package/dist/workflows/commit.workflow.test.js +0 -141
  291. package/dist/workflows/commit.workflow.test.js.map +0 -1
  292. package/dist/workflows/fix.workflow.js +0 -172
  293. package/dist/workflows/fix.workflow.js.map +0 -1
  294. package/dist/workflows/fix.workflow.test.js +0 -137
  295. package/dist/workflows/fix.workflow.test.js.map +0 -1
  296. package/dist/workflows/git-file-tools.js +0 -408
  297. package/dist/workflows/git-file-tools.js.map +0 -1
  298. package/dist/workflows/index.js +0 -12
  299. package/dist/workflows/index.js.map +0 -1
  300. package/dist/workflows/init-interactive.workflow.js +0 -198
  301. package/dist/workflows/init-interactive.workflow.js.map +0 -1
  302. package/dist/workflows/init.workflow.js +0 -41
  303. package/dist/workflows/init.workflow.js.map +0 -1
  304. package/dist/workflows/meta.workflow.js +0 -107
  305. package/dist/workflows/meta.workflow.js.map +0 -1
  306. package/dist/workflows/plan.workflow.js +0 -275
  307. package/dist/workflows/plan.workflow.js.map +0 -1
  308. package/dist/workflows/plan.workflow.test.js +0 -419
  309. package/dist/workflows/plan.workflow.test.js.map +0 -1
  310. package/dist/workflows/pr.workflow.js +0 -54
  311. package/dist/workflows/pr.workflow.js.map +0 -1
  312. package/dist/workflows/pr.workflow.test.js +0 -98
  313. package/dist/workflows/pr.workflow.test.js.map +0 -1
  314. package/dist/workflows/prompts/coder.js +0 -85
  315. package/dist/workflows/prompts/coder.js.map +0 -1
  316. package/dist/workflows/prompts/commit.js +0 -16
  317. package/dist/workflows/prompts/commit.js.map +0 -1
  318. package/dist/workflows/prompts/fix.js +0 -44
  319. package/dist/workflows/prompts/fix.js.map +0 -1
  320. package/dist/workflows/prompts/index.js +0 -10
  321. package/dist/workflows/prompts/index.js.map +0 -1
  322. package/dist/workflows/prompts/init.js +0 -48
  323. package/dist/workflows/prompts/init.js.map +0 -1
  324. package/dist/workflows/prompts/meta.js +0 -17
  325. package/dist/workflows/prompts/meta.js.map +0 -1
  326. package/dist/workflows/prompts/plan.js +0 -212
  327. package/dist/workflows/prompts/plan.js.map +0 -1
  328. package/dist/workflows/prompts/pr.js +0 -15
  329. package/dist/workflows/prompts/pr.js.map +0 -1
  330. package/dist/workflows/prompts/review.js +0 -145
  331. package/dist/workflows/prompts/review.js.map +0 -1
  332. package/dist/workflows/prompts/shared.js +0 -93
  333. package/dist/workflows/prompts/shared.js.map +0 -1
  334. package/dist/workflows/review.workflow.js +0 -357
  335. package/dist/workflows/review.workflow.js.map +0 -1
  336. package/dist/workflows/task.workflow.js +0 -47
  337. package/dist/workflows/task.workflow.js.map +0 -1
  338. package/dist/workflows/testing/helper.js +0 -41
  339. package/dist/workflows/testing/helper.js.map +0 -1
  340. package/dist/workflows/workflow.utils.js +0 -351
  341. package/dist/workflows/workflow.utils.js.map +0 -1
  342. package/dist/workflows/workflow.utils.test.js +0 -45
  343. 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":"AAAA,2BAA2B;AAE3B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CACnD,uBAAuB,EACvB,CAAC,CAAC,OAAO,CAAW,EAAE,EAAE,CAAC,6BAA6B,OAAO,EAAE,CAChE,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAChD,oBAAoB,EACpB,CAAC,CAAC,UAAU,EAAE,OAAO,CAAmB,EAAE,EAAE,CAAC,6BAA6B,UAAU,aAAa,OAAO,IAAI,CAC7G,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,sBAAsB,EAAE,CAAC,IAAW,EAAE,EAAE,CAAC,4BAA4B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAyEpI;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,cAAsB,OAAO,CAAC,GAAG,EAAE;IACxF,0CAA0C;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IAEzD,qEAAqE;IACrE,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;IAE/D,iFAAiF;IACjF,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,qBAAqB,CAAC,gBAAgB,UAAU,gCAAgC,CAAC,CAAA;IAC7F,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,qBAAqB,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,2DAA2D;IAC3D,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACtD,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAEvF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,qBAAqB,CAAC,kDAAkD,UAAU,EAAE,CAAC,CAAA;IACjG,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAoB,EAAE,MAA4C;IAC1G,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;QAC9E,2CAA2C;QAC3C,OAAM;IACR,CAAC;IAED,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC7C,+CAA+C;QAC/C,MAAM,EAAE,IAAI,CAAC,4FAA4F,CAAC,CAAA;QAE1G,6BAA6B;QAC7B,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,WAAW,CAAA;QAEtD,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,qBAAqB,CAAC,0BAA0B,EAAE,sCAAsC,CAAC,CAAA;QACrG,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1D,MAAM,IAAI,qBAAqB,CAAC,mDAAmD,CAAC,CAAA;QACtF,CAAC;QAED,IAAI,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAChE,MAAM,IAAI,qBAAqB,CAAC,sDAAsD,CAAC,CAAA;QACzF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QAEvE,uBAAuB;QACvB,kBAAkB,CAAC,UAAU,CAAC,CAAA;QAE9B,sBAAsB;QACtB,MAAM,CAAC,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAA;QAC/C,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAA;QAErC,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBAC7D,yEAAyE;gBACzE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;gBACxD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;gBAErD,+DAA+D;gBAC/D,2EAA2E;gBAC3E,0EAA0E;gBAC1E,yEAAyE;gBACzE,8EAA8E;gBAC9E,2EAA2E;gBAC3E,iEAAiE;gBACjE,MAAM,YAAY,GAAG,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;gBAE1E,sCAAsC;gBACtC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;gBAE/C,0CAA0C;gBAC1C,IAAI,OAAO,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5C,MAAM,IAAI,oBAAoB,CAC5B,UAAU,EACV,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAC1F,CAAA;gBACH,CAAC;gBAED,oDAAoD;gBACpD,MAAM,aAAa,GAAkB;oBACnC,MAAM;oBACN,WAAW;oBACX,GAAG,OAAO,EAAE,2CAA2C;iBACxD,CAAA;gBAED,kDAAkD;gBAClD,OAAO,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;YACrD,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAA;YAE5D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,WAAW;aACZ,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAEhF,0BAA0B;YAC1B,IAAI,cAAc,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACjD,MAAM,cAAc,CAAA;YACtB,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAA;YACtD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YAEpC,iCAAiC;YACjC,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;gBAC5B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;YACpC,CAAC;YAED,kCAAkC;YAClC,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;YAE5D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;aACtB,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,WAAW,CAAI,EAAU,EAAE,EAAoB;QACrD,IAAI,aAAwD,CAAA;QAC5D,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACpF,CAAC,CAAC,CAAA;QAEF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAC9C,CAAC,MAAM,EAAE,EAAE;YACT,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAA;YAC9C,OAAO,MAAM,CAAA;QACf,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAA;YAC9C,MAAM,KAAK,CAAA;QACb,CAAC,CACF,CAAA;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,MAAoB;QACrC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAoB;QACnC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,UAAU,IAAI,MAAM,CAAA;IAC3D,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAoB;QACjC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,CAAC,CAAA;IAC1F,CAAC;CACF"}
@@ -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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"}
@@ -1,200 +0,0 @@
1
- /**
2
- * Testing Utilities and Fixtures
3
- *
4
- * Provides reusable test fixtures and utilities to reduce duplication
5
- * and improve test maintainability across the codebase.
6
- */
7
- import { mock } from 'bun:test';
8
- import { randomUUID } from 'node:crypto';
9
- import { mkdtempSync, rmSync } from 'node:fs';
10
- import { tmpdir } from 'node:os';
11
- import { join } from 'node:path';
12
- /**
13
- * Temporary directory fixture for isolated test environments
14
- *
15
- * Creates a unique temp directory for each test and ensures proper cleanup.
16
- *
17
- * @example
18
- * ```ts
19
- * describe('MyTest', () => {
20
- * let fixture: TempDirectoryFixture
21
- *
22
- * beforeEach(async () => {
23
- * fixture = new TempDirectoryFixture()
24
- * const dir = await fixture.setup()
25
- * })
26
- *
27
- * afterEach(async () => {
28
- * await fixture.teardown()
29
- * })
30
- * })
31
- * ```
32
- */
33
- export class TempDirectoryFixture {
34
- dir = null;
35
- /**
36
- * Create a unique temporary directory
37
- * @returns Path to the created directory
38
- */
39
- async setup() {
40
- this.dir = mkdtempSync(join(tmpdir(), 'test-'));
41
- return this.dir;
42
- }
43
- /**
44
- * Clean up the temporary directory
45
- * Logs cleanup failures for debugging
46
- */
47
- async teardown() {
48
- if (this.dir) {
49
- try {
50
- rmSync(this.dir, { recursive: true, force: true });
51
- }
52
- catch (error) {
53
- console.error(`[TempDirectoryFixture] Failed to cleanup: ${this.dir}`, error);
54
- }
55
- this.dir = null;
56
- }
57
- }
58
- /**
59
- * Get a path within the temp directory
60
- * @param segments - Path segments to join
61
- * @returns Full path to the file/directory
62
- * @throws Error if setup() hasn't been called
63
- */
64
- getPath(...segments) {
65
- if (!this.dir) {
66
- throw new Error('TempDirectoryFixture not initialized. Call setup() first.');
67
- }
68
- return join(this.dir, ...segments);
69
- }
70
- /**
71
- * Check if the fixture has been initialized
72
- */
73
- isInitialized() {
74
- return this.dir !== null;
75
- }
76
- }
77
- /**
78
- * Mock helpers for creating typed mocks
79
- *
80
- * These helpers reduce the need for 'any' type assertions in tests
81
- */
82
- /**
83
- * Create a mock function with proper type safety
84
- * @returns A mock function that can be configured
85
- */
86
- export function createMockFunction(implementation) {
87
- const mockFn = mock(implementation);
88
- return mockFn;
89
- }
90
- /**
91
- * Helper to create a partial mock (only mock specific methods)
92
- * @param obj - Object to create partial mock of
93
- * @param mockedMethods - Methods to mock
94
- * @returns Partial mock with specified methods mocked
95
- */
96
- export function createPartialMock(obj, mockedMethods) {
97
- const result = {};
98
- for (const key in obj) {
99
- if (mockedMethods.includes(key)) {
100
- result[key] = mock();
101
- }
102
- else {
103
- result[key] = obj[key];
104
- }
105
- }
106
- return result;
107
- }
108
- /**
109
- * Snapshot testing helpers
110
- */
111
- /**
112
- * Fields that should be redacted from snapshots
113
- * These are typically unstable or environment-specific
114
- */
115
- export const SNAPSHOT_REDACT_FIELDS = [
116
- 'id',
117
- 'timestamp',
118
- 'date',
119
- 'created_at',
120
- 'updated_at',
121
- 'last_accessed',
122
- 'filePath',
123
- 'absolutePath',
124
- ];
125
- /**
126
- * Redact unstable fields from an object for snapshot testing
127
- * @param obj - Object to redact fields from
128
- * @param fields - Fields to redact (defaults to SNAPSHOT_REDACT_FIELDS)
129
- * @returns Object with unstable fields replaced with matchers
130
- */
131
- export function redactUnstableFields(obj, fields = SNAPSHOT_REDACT_FIELDS) {
132
- const result = { ...obj };
133
- for (const field of fields) {
134
- if (field in result) {
135
- // Use a placeholder for unstable fields - actual replacement done in tests
136
- result[field] = '[REDACTED]';
137
- }
138
- }
139
- return result;
140
- }
141
- /**
142
- * Async test helpers
143
- */
144
- /**
145
- * Run an async test with timeout
146
- * @param fn - Test function to run
147
- * @param timeoutMs - Timeout in milliseconds (default: 5000)
148
- * @returns Promise that rejects if timeout
149
- */
150
- export function withTimeout(fn, timeoutMs = 5000) {
151
- const timeoutPromise = new Promise((_, reject) => {
152
- setTimeout(() => reject(new Error(`Test timed out after ${timeoutMs}ms`)), timeoutMs);
153
- });
154
- return Promise.race([fn(), timeoutPromise]);
155
- }
156
- /**
157
- * Database test helpers
158
- */
159
- /**
160
- * Generate a unique database name for testing
161
- * @returns Unique database name
162
- */
163
- export function generateTestDbName() {
164
- return `test-${randomUUID().slice(0, 8)}.sqlite`;
165
- }
166
- /**
167
- * Memory test helpers
168
- */
169
- /**
170
- * Create a test memory entry with required fields
171
- * @param overrides - Fields to override from defaults
172
- * @returns Test memory entry
173
- */
174
- export function createTestMemoryEntry(overrides = {}) {
175
- const now = Date.now();
176
- return {
177
- name: `test-entry-${randomUUID().slice(0, 8)}`,
178
- content: 'Test content',
179
- entry_type: 'note',
180
- status: 'active',
181
- priority: 'medium',
182
- tags: '',
183
- created_at: now,
184
- updated_at: now,
185
- last_accessed: now,
186
- ...overrides,
187
- };
188
- }
189
- /**
190
- * Assert helpers (deprecated - use expect() directly in tests)
191
- */
192
- // Note: These helper functions are not used. Use expect() directly in tests.
193
- // export function expectToRejectWithMessage(fn: () => Promise<any>, errorMessage: string): Promise<void> {
194
- // return expect(fn()).rejects.toThrow(errorMessage)
195
- // }
196
- //
197
- // export function expectToThrowWithType<T extends Error>(fn: () => any, errorType: new (...args: any[]) => T): Promise<void> {
198
- // return expect(fn()).toThrow(errorType)
199
- // }
200
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"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"}