@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.
- package/dist/index.js +3990 -353
- package/package.json +4 -4
- package/dist/ApiProviderConfig.js +0 -57
- package/dist/ApiProviderConfig.js.map +0 -1
- package/dist/ApiProviderConfig.test.js +0 -278
- package/dist/ApiProviderConfig.test.js.map +0 -1
- package/dist/agent/advanced-discovery.js +0 -604
- package/dist/agent/advanced-discovery.js.map +0 -1
- package/dist/agent/config.js +0 -139
- package/dist/agent/config.js.map +0 -1
- package/dist/agent/config.test.js +0 -140
- package/dist/agent/config.test.js.map +0 -1
- package/dist/agent/constants.js +0 -172
- package/dist/agent/constants.js.map +0 -1
- package/dist/agent/constants.test.js +0 -132
- package/dist/agent/constants.test.js.map +0 -1
- package/dist/agent/debug-logger.js +0 -281
- package/dist/agent/debug-logger.js.map +0 -1
- package/dist/agent/debug-logger.test.js +0 -294
- package/dist/agent/debug-logger.test.js.map +0 -1
- package/dist/agent/error-handling.js +0 -114
- package/dist/agent/error-handling.js.map +0 -1
- package/dist/agent/error-handling.test.js +0 -191
- package/dist/agent/error-handling.test.js.map +0 -1
- package/dist/agent/errors.js +0 -301
- package/dist/agent/errors.js.map +0 -1
- package/dist/agent/executor.js +0 -206
- package/dist/agent/executor.js.map +0 -1
- package/dist/agent/executor.test.js +0 -228
- package/dist/agent/executor.test.js.map +0 -1
- package/dist/agent/goal-decomposer.js +0 -281
- package/dist/agent/goal-decomposer.js.map +0 -1
- package/dist/agent/goal-decomposer.test.js +0 -225
- package/dist/agent/goal-decomposer.test.js.map +0 -1
- package/dist/agent/health-monitor.js +0 -89
- package/dist/agent/health-monitor.js.map +0 -1
- package/dist/agent/improvement-loop.js +0 -177
- package/dist/agent/improvement-loop.js.map +0 -1
- package/dist/agent/index.js +0 -38
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/metrics.js +0 -158
- package/dist/agent/metrics.js.map +0 -1
- package/dist/agent/metrics.test.js +0 -311
- package/dist/agent/metrics.test.js.map +0 -1
- package/dist/agent/orchestrator.js +0 -438
- package/dist/agent/orchestrator.js.map +0 -1
- package/dist/agent/planner.js +0 -199
- package/dist/agent/planner.js.map +0 -1
- package/dist/agent/planner.test.js +0 -135
- package/dist/agent/planner.test.js.map +0 -1
- package/dist/agent/progress.js +0 -298
- package/dist/agent/progress.js.map +0 -1
- package/dist/agent/progress.test.js +0 -255
- package/dist/agent/progress.test.js.map +0 -1
- package/dist/agent/resource-monitor.js +0 -114
- package/dist/agent/resource-monitor.js.map +0 -1
- package/dist/agent/safety/approval.js +0 -178
- package/dist/agent/safety/approval.js.map +0 -1
- package/dist/agent/safety/approval.test.js +0 -142
- package/dist/agent/safety/approval.test.js.map +0 -1
- package/dist/agent/safety/checks.js +0 -152
- package/dist/agent/safety/checks.js.map +0 -1
- package/dist/agent/safety/checks.test.js +0 -89
- package/dist/agent/safety/checks.test.js.map +0 -1
- package/dist/agent/safety/interrupt.js +0 -92
- package/dist/agent/safety/interrupt.js.map +0 -1
- package/dist/agent/safety/interrupt.test.js +0 -53
- package/dist/agent/safety/interrupt.test.js.map +0 -1
- package/dist/agent/session.js +0 -117
- package/dist/agent/session.js.map +0 -1
- package/dist/agent/session.test.js +0 -213
- package/dist/agent/session.test.js.map +0 -1
- package/dist/agent/state-manager.js +0 -287
- package/dist/agent/state-manager.js.map +0 -1
- package/dist/agent/task-discovery.js +0 -433
- package/dist/agent/task-discovery.js.map +0 -1
- package/dist/agent/task-discovery.test.js +0 -40
- package/dist/agent/task-discovery.test.js.map +0 -1
- package/dist/agent/task-history.js +0 -128
- package/dist/agent/task-history.js.map +0 -1
- package/dist/agent/task-prioritizer.js +0 -286
- package/dist/agent/task-prioritizer.js.map +0 -1
- package/dist/agent/test-fixtures.js +0 -112
- package/dist/agent/test-fixtures.js.map +0 -1
- package/dist/agent/types.js +0 -15
- package/dist/agent/types.js.map +0 -1
- package/dist/agent/workflow-adapter.js +0 -219
- package/dist/agent/workflow-adapter.js.map +0 -1
- package/dist/agent/workflow-adapter.test.js +0 -11
- package/dist/agent/workflow-adapter.test.js.map +0 -1
- package/dist/agent/working-dir-discovery.js +0 -54
- package/dist/agent/working-dir-discovery.js.map +0 -1
- package/dist/agent/working-space.js +0 -484
- package/dist/agent/working-space.js.map +0 -1
- package/dist/agent/working-space.test.js +0 -436
- package/dist/agent/working-space.test.js.map +0 -1
- package/dist/api.js +0 -279
- package/dist/api.js.map +0 -1
- package/dist/builtin-commands.js +0 -20
- package/dist/builtin-commands.js.map +0 -1
- package/dist/chunk-2LRQ2QH6.js +0 -1353
- package/dist/chunk-FSNPWI3C.js +0 -128
- package/dist/chunk-HB7PTE3H.js +0 -176
- package/dist/chunk-LLMPMGV3.js +0 -140
- package/dist/chunk-NRDSZGMF.js +0 -675
- package/dist/chunk-UEEU3SCC.js +0 -390
- package/dist/chunk-YPUL66UK.js +0 -277
- package/dist/chunk-ZS4K5RFU.js +0 -176
- package/dist/chunk-ZU4UU65A.js +0 -40
- package/dist/code.workflow-5TAWK2DE.js +0 -10
- package/dist/commandSummarizer.js +0 -96
- package/dist/commandSummarizer.js.map +0 -1
- package/dist/commands/__tests__/command-detection.integration.test.js +0 -238
- package/dist/commands/__tests__/command-detection.integration.test.js.map +0 -1
- package/dist/commands/__tests__/script-generator.integration.test.js +0 -271
- package/dist/commands/__tests__/script-generator.integration.test.js.map +0 -1
- package/dist/commands/agent.js +0 -218
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/code.js +0 -102
- package/dist/commands/code.js.map +0 -1
- package/dist/commands/command.constants.js +0 -13
- package/dist/commands/command.constants.js.map +0 -1
- package/dist/commands/commit.js +0 -17
- package/dist/commands/commit.js.map +0 -1
- package/dist/commands/fix.js +0 -17
- package/dist/commands/fix.js.map +0 -1
- package/dist/commands/init.js +0 -501
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp-server.js +0 -122
- package/dist/commands/mcp-server.js.map +0 -1
- package/dist/commands/memory.js +0 -410
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/memory.test.js +0 -453
- package/dist/commands/memory.test.js.map +0 -1
- package/dist/commands/meta.js +0 -142
- package/dist/commands/meta.js.map +0 -1
- package/dist/commands/plan.js +0 -39
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/pr.js +0 -14
- package/dist/commands/pr.js.map +0 -1
- package/dist/commands/review-json.test.js +0 -33
- package/dist/commands/review-json.test.js.map +0 -1
- package/dist/commands/review.js +0 -137
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/review.usage.test.js +0 -41
- package/dist/commands/review.usage.test.js.map +0 -1
- package/dist/commands/run.js +0 -107
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/skills.js +0 -175
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/task.js +0 -34
- package/dist/commands/task.js.map +0 -1
- package/dist/commands/workflow.js +0 -117
- package/dist/commands/workflow.js.map +0 -1
- package/dist/commit.workflow-Z64PNSTS.js +0 -9
- package/dist/configPrompt.js +0 -39
- package/dist/configPrompt.js.map +0 -1
- package/dist/env.js +0 -22
- package/dist/env.js.map +0 -1
- package/dist/errors.js +0 -132
- package/dist/errors.js.map +0 -1
- package/dist/errors.test.js +0 -21
- package/dist/errors.test.js.map +0 -1
- package/dist/file-attachments.js +0 -77
- package/dist/file-attachments.js.map +0 -1
- package/dist/file-attachments.test.js +0 -214
- package/dist/file-attachments.test.js.map +0 -1
- package/dist/fix.workflow-KLHJU5Z6.js +0 -7
- package/dist/getModel.js +0 -229
- package/dist/getModel.js.map +0 -1
- package/dist/getModel.test.js +0 -67
- package/dist/getModel.test.js.map +0 -1
- package/dist/getProviderOptions.js +0 -58
- package/dist/getProviderOptions.js.map +0 -1
- package/dist/git-operations.js +0 -363
- package/dist/git-operations.js.map +0 -1
- package/dist/git-operations.test.js +0 -81
- package/dist/git-operations.test.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.js +0 -41
- package/dist/logger.js.map +0 -1
- package/dist/mcp/client.js +0 -11
- package/dist/mcp/client.js.map +0 -1
- package/dist/mcp/error-scenarios.test.js +0 -206
- package/dist/mcp/error-scenarios.test.js.map +0 -1
- package/dist/mcp/errors.js +0 -63
- package/dist/mcp/errors.js.map +0 -1
- package/dist/mcp/index.js +0 -9
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/manager.js +0 -231
- package/dist/mcp/manager.js.map +0 -1
- package/dist/mcp/manager.test.js +0 -40
- package/dist/mcp/manager.test.js.map +0 -1
- package/dist/mcp/sdk-client.js +0 -166
- package/dist/mcp/sdk-client.js.map +0 -1
- package/dist/mcp/shared-types.js +0 -3
- package/dist/mcp/shared-types.js.map +0 -1
- package/dist/mcp/tools-integration.test.js +0 -198
- package/dist/mcp/tools-integration.test.js.map +0 -1
- package/dist/mcp/tools.js +0 -60
- package/dist/mcp/tools.js.map +0 -1
- package/dist/mcp/transport.js +0 -257
- package/dist/mcp/transport.js.map +0 -1
- package/dist/mcp/types.js +0 -3
- package/dist/mcp/types.js.map +0 -1
- package/dist/mcp-server/index.js +0 -5
- package/dist/mcp-server/index.js.map +0 -1
- package/dist/mcp-server/plan-formatting.test.js +0 -74
- package/dist/mcp-server/plan-formatting.test.js.map +0 -1
- package/dist/mcp-server/sdk-server.js +0 -102
- package/dist/mcp-server/sdk-server.js.map +0 -1
- package/dist/mcp-server/sdk-server.test.js +0 -363
- package/dist/mcp-server/sdk-server.test.js.map +0 -1
- package/dist/mcp-server/tools.js +0 -785
- package/dist/mcp-server/tools.js.map +0 -1
- package/dist/mcp-server/types.js +0 -3
- package/dist/mcp-server/types.js.map +0 -1
- package/dist/options.js +0 -85
- package/dist/options.js.map +0 -1
- package/dist/options.test.js +0 -177
- package/dist/options.test.js.map +0 -1
- package/dist/plan.workflow-P2Y6W4FA.js +0 -8
- package/dist/prices.js +0 -61
- package/dist/prices.js.map +0 -1
- package/dist/prices.test.js +0 -148
- package/dist/prices.test.js.map +0 -1
- package/dist/review.workflow-I7RHWKU7.js +0 -8
- package/dist/runWorkflow.js +0 -313
- package/dist/runWorkflow.js.map +0 -1
- package/dist/script/__tests__/execution.integration.test.js +0 -274
- package/dist/script/__tests__/execution.integration.test.js.map +0 -1
- package/dist/script/__tests__/runner.test.js +0 -176
- package/dist/script/__tests__/runner.test.js.map +0 -1
- package/dist/script/__tests__/validator.test.js +0 -180
- package/dist/script/__tests__/validator.test.js.map +0 -1
- package/dist/script/executor.js +0 -127
- package/dist/script/executor.js.map +0 -1
- package/dist/script/index.js +0 -4
- package/dist/script/index.js.map +0 -1
- package/dist/script/runner.js +0 -258
- package/dist/script/runner.js.map +0 -1
- package/dist/sdk-client-KBYJRPEG.js +0 -155
- package/dist/skillIntegration.js +0 -46
- package/dist/skillIntegration.js.map +0 -1
- package/dist/skillIntegration.test.js +0 -128
- package/dist/skillIntegration.test.js.map +0 -1
- package/dist/test/utils.js +0 -200
- package/dist/test/utils.js.map +0 -1
- package/dist/test/workflow-fixtures.js +0 -120
- package/dist/test/workflow-fixtures.js.map +0 -1
- package/dist/tool-implementations.js +0 -521
- package/dist/tool-implementations.js.map +0 -1
- package/dist/tool-implementations.skill-tools.test.js +0 -106
- package/dist/tool-implementations.skill-tools.test.js.map +0 -1
- package/dist/tools/getTodoItem.js +0 -33
- package/dist/tools/getTodoItem.js.map +0 -1
- package/dist/tools/gitDiff.js +0 -108
- package/dist/tools/gitDiff.js.map +0 -1
- package/dist/tools/index.js +0 -8
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/listMemoryTopics.js +0 -24
- package/dist/tools/listMemoryTopics.js.map +0 -1
- package/dist/tools/listTodoItems.js +0 -35
- package/dist/tools/listTodoItems.js.map +0 -1
- package/dist/tools/listTodoItems.test.js +0 -89
- package/dist/tools/listTodoItems.test.js.map +0 -1
- package/dist/tools/readMemory.js +0 -33
- package/dist/tools/readMemory.js.map +0 -1
- package/dist/tools/updateMemory.js +0 -62
- package/dist/tools/updateMemory.js.map +0 -1
- package/dist/tools/updateMemory.test.js +0 -109
- package/dist/tools/updateMemory.test.js.map +0 -1
- package/dist/tools/updateTodoItem.js +0 -31
- package/dist/tools/updateTodoItem.js.map +0 -1
- package/dist/tools/utils/diffLineNumbers.js +0 -178
- package/dist/tools/utils/diffLineNumbers.js.map +0 -1
- package/dist/utils/cacheControl.js +0 -59
- package/dist/utils/cacheControl.js.map +0 -1
- package/dist/utils/cacheControl.test.js +0 -128
- package/dist/utils/cacheControl.test.js.map +0 -1
- package/dist/utils/command.js +0 -50
- package/dist/utils/command.js.map +0 -1
- package/dist/utils/shell.js +0 -56
- package/dist/utils/shell.js.map +0 -1
- package/dist/utils/userInput.js +0 -47
- package/dist/utils/userInput.js.map +0 -1
- package/dist/workflow-tools.js +0 -21
- package/dist/workflow-tools.js.map +0 -1
- package/dist/workflows/agent-builder.js +0 -90
- package/dist/workflows/agent-builder.js.map +0 -1
- package/dist/workflows/agent-builder.test.js +0 -115
- package/dist/workflows/agent-builder.test.js.map +0 -1
- package/dist/workflows/code.workflow.js +0 -145
- package/dist/workflows/code.workflow.js.map +0 -1
- package/dist/workflows/commit.workflow.js +0 -111
- package/dist/workflows/commit.workflow.js.map +0 -1
- package/dist/workflows/commit.workflow.test.js +0 -141
- package/dist/workflows/commit.workflow.test.js.map +0 -1
- package/dist/workflows/fix.workflow.js +0 -172
- package/dist/workflows/fix.workflow.js.map +0 -1
- package/dist/workflows/fix.workflow.test.js +0 -137
- package/dist/workflows/fix.workflow.test.js.map +0 -1
- package/dist/workflows/git-file-tools.js +0 -408
- package/dist/workflows/git-file-tools.js.map +0 -1
- package/dist/workflows/index.js +0 -12
- package/dist/workflows/index.js.map +0 -1
- package/dist/workflows/init-interactive.workflow.js +0 -198
- package/dist/workflows/init-interactive.workflow.js.map +0 -1
- package/dist/workflows/init.workflow.js +0 -41
- package/dist/workflows/init.workflow.js.map +0 -1
- package/dist/workflows/meta.workflow.js +0 -107
- package/dist/workflows/meta.workflow.js.map +0 -1
- package/dist/workflows/plan.workflow.js +0 -275
- package/dist/workflows/plan.workflow.js.map +0 -1
- package/dist/workflows/plan.workflow.test.js +0 -419
- package/dist/workflows/plan.workflow.test.js.map +0 -1
- package/dist/workflows/pr.workflow.js +0 -54
- package/dist/workflows/pr.workflow.js.map +0 -1
- package/dist/workflows/pr.workflow.test.js +0 -98
- package/dist/workflows/pr.workflow.test.js.map +0 -1
- package/dist/workflows/prompts/coder.js +0 -85
- package/dist/workflows/prompts/coder.js.map +0 -1
- package/dist/workflows/prompts/commit.js +0 -16
- package/dist/workflows/prompts/commit.js.map +0 -1
- package/dist/workflows/prompts/fix.js +0 -44
- package/dist/workflows/prompts/fix.js.map +0 -1
- package/dist/workflows/prompts/index.js +0 -10
- package/dist/workflows/prompts/index.js.map +0 -1
- package/dist/workflows/prompts/init.js +0 -48
- package/dist/workflows/prompts/init.js.map +0 -1
- package/dist/workflows/prompts/meta.js +0 -17
- package/dist/workflows/prompts/meta.js.map +0 -1
- package/dist/workflows/prompts/plan.js +0 -212
- package/dist/workflows/prompts/plan.js.map +0 -1
- package/dist/workflows/prompts/pr.js +0 -15
- package/dist/workflows/prompts/pr.js.map +0 -1
- package/dist/workflows/prompts/review.js +0 -145
- package/dist/workflows/prompts/review.js.map +0 -1
- package/dist/workflows/prompts/shared.js +0 -93
- package/dist/workflows/prompts/shared.js.map +0 -1
- package/dist/workflows/review.workflow.js +0 -357
- package/dist/workflows/review.workflow.js.map +0 -1
- package/dist/workflows/task.workflow.js +0 -47
- package/dist/workflows/task.workflow.js.map +0 -1
- package/dist/workflows/testing/helper.js +0 -41
- package/dist/workflows/testing/helper.js.map +0 -1
- package/dist/workflows/workflow.utils.js +0 -351
- package/dist/workflows/workflow.utils.js.map +0 -1
- package/dist/workflows/workflow.utils.test.js +0 -45
- package/dist/workflows/workflow.utils.test.js.map +0 -1
package/dist/script/runner.js
DELETED
|
@@ -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
|
-
};
|
package/dist/skillIntegration.js
DELETED
|
@@ -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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"}
|