@studio-foundation/runner 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/bundled-assets.d.ts +1 -1
- package/dist/generated/bundled-assets.js +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder.d.ts +1 -1
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/runner.d.ts +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/script-executor.d.ts +3 -1
- package/dist/script-executor.d.ts.map +1 -1
- package/dist/script-executor.js +7 -2
- package/dist/script-executor.js.map +1 -1
- package/package.json +3 -3
- package/dist/tools/skills/skill-loader.d.ts +0 -23
- package/dist/tools/skills/skill-loader.d.ts.map +0 -1
- package/dist/tools/skills/skill-loader.js +0 -58
- package/dist/tools/skills/skill-loader.js.map +0 -1
- package/dist/tools/skills/skill-loader.test.d.ts +0 -2
- package/dist/tools/skills/skill-loader.test.d.ts.map +0 -1
- package/dist/tools/skills/skill-loader.test.js +0 -92
- package/dist/tools/skills/skill-loader.test.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const PACKAGE_VERSION = "0.
|
|
1
|
+
export declare const PACKAGE_VERSION = "0.19.0";
|
|
2
2
|
/** Contents of runner/templates/, keyed by path relative to that directory. */
|
|
3
3
|
export declare const BUNDLED_ASSETS: Record<string, string>;
|
|
4
4
|
//# sourceMappingURL=bundled-assets.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Generated by scripts/gen-bundled-assets.mjs — do not edit.
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.BUNDLED_ASSETS = exports.PACKAGE_VERSION = void 0;
|
|
5
|
-
exports.PACKAGE_VERSION = "0.
|
|
5
|
+
exports.PACKAGE_VERSION = "0.19.0";
|
|
6
6
|
/** Contents of runner/templates/, keyed by path relative to that directory. */
|
|
7
7
|
exports.BUNDLED_ASSETS = {
|
|
8
8
|
"tools/repo-manager.tool.yaml": "name: repo_manager\ndescription: Read and write files in the workspace\nversion: 1\n\ncommands:\n - name: repo_manager-read_file\n description: Read a file from the workspace\n parameters:\n path:\n type: string\n required: true\n description: File path relative to the workspace root\n execute:\n type: builtin\n parse_output: json\n\n - name: repo_manager-write_file\n description: Write or create a file in the workspace\n parameters:\n path:\n type: string\n required: true\n description: File path relative to the workspace root\n content:\n type: string\n required: true\n description: Full content to write to the file\n execute:\n type: builtin\n parse_output: json\n\n - name: repo_manager-list_files\n description: List files in the workspace\n parameters:\n path:\n type: string\n required: false\n description: Directory to list (default is workspace root)\n recursive:\n type: boolean\n required: false\n description: Whether to list recursively\n execute:\n type: builtin\n parse_output: json\n\n - name: repo_manager-apply_patch\n description: Apply a unified diff patch to a file\n parameters:\n path:\n type: string\n required: true\n description: File path to patch\n patch:\n type: string\n required: true\n description: Unified diff patch content\n execute:\n type: builtin\n parse_output: json\n\nprompt_snippet: |\n You have access to file management tools. Read files before modifying them.\n Use repo_manager-write_file to create or update files — provide the full file content.\n",
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { runAgent } from './runner.js';
|
|
5
5
|
export type { RunAgentConfig, AgentRunResult } from './runner.js';
|
|
6
|
-
export { runScript } from './script-executor.js';
|
|
6
|
+
export { runScript, resolveRuntime } from './script-executor.js';
|
|
7
7
|
export type { ScriptExecutorConfig } from './script-executor.js';
|
|
8
8
|
export { buildPrompt } from './prompt-builder.js';
|
|
9
9
|
export type { TaskInput, AgentContext, GroupFeedbackContext, ExecutionContext, PromptBuildConfig } from './prompt-builder.js';
|
|
@@ -34,6 +34,4 @@ export { AnonymizationMiddleware } from './middleware/anonymization.js';
|
|
|
34
34
|
export type { AnonymizerOptions } from '@studio-foundation/anonymizer';
|
|
35
35
|
export { loadPlugins, MCPClient, StudioOAuthProvider } from './plugins/index.js';
|
|
36
36
|
export type { PluginManifest, MCPServerDef, SkillContent } from './plugins/index.js';
|
|
37
|
-
export { loadSkills, loadSkill, validateSkillManifest } from './tools/skills/skill-loader.js';
|
|
38
|
-
export type { SkillManifest } from './tools/skills/skill-loader.js';
|
|
39
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE/F,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACpI,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* @studio/runner - Multi-provider LLM agent runner with tool execution
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.StudioOAuthProvider = exports.MCPClient = exports.loadPlugins = exports.AnonymizationMiddleware = exports.BUILTIN_TOOL_NAMES = exports.getBundledToolTemplate = exports.listAvailableToolTemplates = exports.loadProjectTools = exports.STUDIO_RUN_PROMPT_SNIPPET = exports.createStudioRunTool = exports.createPatchTools = exports.createShellTools = exports.createRepoManagerTools = exports.ToolExecutor = exports.ToolRegistry = exports.MockProvider = exports.DEFAULT_FLUSH_AFTER_MS = exports.DEFAULT_MAX_BATCH_SIZE = exports.BatchingProviderRegistry = exports.BatchWindow = exports.CUSTOM_ID_PATTERN = exports.assertValidBatch = exports.isBatchProvider = exports.createDefaultRegistry = exports.ProviderRegistry = exports.ClaudeCodeProvider = exports.OllamaProvider = exports.AnthropicProvider = exports.OpenAIResponsesProvider = exports.OpenAIProvider = exports.isAgentLoopProvider = exports.buildPrompt = exports.resolveRuntime = exports.runScript = exports.runAgent = void 0;
|
|
7
7
|
// Main runner function
|
|
8
8
|
var runner_js_1 = require("./runner.js");
|
|
9
9
|
Object.defineProperty(exports, "runAgent", { enumerable: true, get: function () { return runner_js_1.runAgent; } });
|
|
10
10
|
// Script executor
|
|
11
11
|
var script_executor_js_1 = require("./script-executor.js");
|
|
12
12
|
Object.defineProperty(exports, "runScript", { enumerable: true, get: function () { return script_executor_js_1.runScript; } });
|
|
13
|
+
Object.defineProperty(exports, "resolveRuntime", { enumerable: true, get: function () { return script_executor_js_1.resolveRuntime; } });
|
|
13
14
|
// Prompt builder
|
|
14
15
|
var prompt_builder_js_1 = require("./prompt-builder.js");
|
|
15
16
|
Object.defineProperty(exports, "buildPrompt", { enumerable: true, get: function () { return prompt_builder_js_1.buildPrompt; } });
|
|
@@ -68,8 +69,4 @@ Object.defineProperty(exports, "loadPlugins", { enumerable: true, get: function
|
|
|
68
69
|
Object.defineProperty(exports, "MCPClient", { enumerable: true, get: function () { return index_js_1.MCPClient; } });
|
|
69
70
|
Object.defineProperty(exports, "StudioOAuthProvider", { enumerable: true, get: function () { return index_js_1.StudioOAuthProvider; } });
|
|
70
71
|
// Skill loader
|
|
71
|
-
var skill_loader_js_1 = require("./tools/skills/skill-loader.js");
|
|
72
|
-
Object.defineProperty(exports, "loadSkills", { enumerable: true, get: function () { return skill_loader_js_1.loadSkills; } });
|
|
73
|
-
Object.defineProperty(exports, "loadSkill", { enumerable: true, get: function () { return skill_loader_js_1.loadSkill; } });
|
|
74
|
-
Object.defineProperty(exports, "validateSkillManifest", { enumerable: true, get: function () { return skill_loader_js_1.validateSkillManifest; } });
|
|
75
72
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uBAAuB;AACvB,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAGjB,kBAAkB;AAClB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uBAAuB;AACvB,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAGjB,kBAAkB;AAClB,2DAAiE;AAAxD,+GAAA,SAAS,OAAA;AAAE,oHAAA,cAAc,OAAA;AAGlC,iBAAiB;AACjB,yDAAkD;AAAzC,gHAAA,WAAW,OAAA;AAWpB,uDAA8D;AAArD,kHAAA,mBAAmB,OAAA;AAC5B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,uEAA0E;AAAjE,8HAAA,uBAAuB,OAAA;AAChC,yDAA6D;AAApD,iHAAA,iBAAiB,OAAA;AAC1B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,6DAAgE;AAAvD,oHAAA,kBAAkB,OAAA;AAC3B,uDAAkF;AAAzE,+GAAA,gBAAgB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAChD,iDAA4F;AAAnF,2GAAA,eAAe,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAQ7D,+DAKqC;AAJnC,8GAAA,WAAW,OAAA;AACX,2HAAA,wBAAwB,OAAA;AACxB,yHAAA,sBAAsB,OAAA;AACtB,yHAAA,sBAAsB,OAAA;AAQxB,+CAAmD;AAA1C,uGAAA,YAAY,OAAA;AAGrB,QAAQ;AACR,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AACrB,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AAGrB,gBAAgB;AAChB,mEAAyE;AAAhE,yHAAA,sBAAsB,OAAA;AAC/B,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,+DAA+F;AAAtF,oHAAA,mBAAmB,OAAA;AAAE,0HAAA,yBAAyB,OAAA;AAEvD,6DAAoI;AAA3H,oHAAA,gBAAgB,OAAA;AAAE,8HAAA,0BAA0B,OAAA;AAAE,0HAAA,sBAAsB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAGjG,2BAA2B;AAC3B,kEAAwE;AAA/D,2HAAA,uBAAuB,OAAA;AAGhC,mDAAmD;AACnD,+CAAiF;AAAxE,uGAAA,WAAW,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAGpD,eAAe"}
|
package/dist/prompt-builder.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Prompt builder - constructs messages for LLM with retry escalation
|
|
3
3
|
*/
|
|
4
4
|
import type { Message, AgentConfig, OutputContract, ResolvedContextPack, ToolCall, TaskInput } from '@studio-foundation/contracts';
|
|
5
|
-
import type { SkillContent } from './
|
|
5
|
+
import type { SkillContent } from './plugins/plugin-loader.js';
|
|
6
6
|
export type { TaskInput } from '@studio-foundation/contracts';
|
|
7
7
|
/**
|
|
8
8
|
* Whether a task is in structured (field) mode rather than flat-description mode.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACnI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACnI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAK/D,YAAY,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAElD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,KAAK,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAwJhE"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { type TaskInput, type AgentContext, type ExecutionContext } from './prom
|
|
|
6
6
|
import type { ToolRegistry } from './tools/tool-registry.js';
|
|
7
7
|
import type { ProviderRegistry } from './providers/registry.js';
|
|
8
8
|
import type { AnonymizationMiddleware } from './middleware/anonymization.js';
|
|
9
|
-
import type { SkillContent } from './
|
|
9
|
+
import type { SkillContent } from './plugins/plugin-loader.js';
|
|
10
10
|
/** Prefix used to identify unauthorized tool calls in error messages. */
|
|
11
11
|
export declare const UNAUTHORIZED_TOOL_ERROR_PREFIX = "Unauthorized tool call:";
|
|
12
12
|
export interface RunAgentConfig {
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAW,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAErJ,OAAO,EAA0B,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAW,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAErJ,OAAO,EAA0B,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,yEAAyE;AACzE,eAAO,MAAM,8BAA8B,4BAA4B,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;mFAC+E;IAC/E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,sHAAsH;IACtH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAqX9E"}
|
|
@@ -6,8 +6,10 @@ export interface ScriptExecutorConfig {
|
|
|
6
6
|
context: AgentContext;
|
|
7
7
|
cwd?: string;
|
|
8
8
|
timeoutMs?: number;
|
|
9
|
+
/** Interpreters the project declared in `.studio/config.yaml`, keyed by runtime. */
|
|
10
|
+
runtimes?: Record<string, string>;
|
|
9
11
|
}
|
|
10
|
-
export declare function resolveRuntime(runtime: string, cwd: string): {
|
|
12
|
+
export declare function resolveRuntime(runtime: string, cwd: string, runtimes?: Record<string, string>): {
|
|
11
13
|
command: string;
|
|
12
14
|
env: Record<string, string>;
|
|
13
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-executor.d.ts","sourceRoot":"","sources":["../src/script-executor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"script-executor.d.ts","sourceRoot":"","sources":["../src/script-executor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAwBD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAsBlD;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgFrF"}
|
package/dist/script-executor.js
CHANGED
|
@@ -27,8 +27,13 @@ function resolvePythonVenv(env, cwd) {
|
|
|
27
27
|
return (0, node_path_1.join)(cwd, '.venv');
|
|
28
28
|
return null;
|
|
29
29
|
}
|
|
30
|
-
function resolveRuntime(runtime, cwd) {
|
|
30
|
+
function resolveRuntime(runtime, cwd, runtimes) {
|
|
31
31
|
const env = { ...process.env };
|
|
32
|
+
// An unset `${VAR}` interpolates to '', which must fall through rather than
|
|
33
|
+
// resolve to an empty command.
|
|
34
|
+
const declared = runtimes?.[runtime];
|
|
35
|
+
if (declared)
|
|
36
|
+
return { command: declared, env };
|
|
32
37
|
const override = env[overrideVar(runtime)];
|
|
33
38
|
if (override)
|
|
34
39
|
return { command: override, env };
|
|
@@ -47,7 +52,7 @@ async function runScript(config) {
|
|
|
47
52
|
const startTime = Date.now();
|
|
48
53
|
const cwd = config.cwd ?? process.cwd();
|
|
49
54
|
const timeoutMs = config.timeoutMs ?? 30_000;
|
|
50
|
-
const { command: cmd, env } = resolveRuntime(config.runtime, cwd);
|
|
55
|
+
const { command: cmd, env } = resolveRuntime(config.runtime, cwd, config.runtimes);
|
|
51
56
|
const stdin = JSON.stringify(config.context);
|
|
52
57
|
return new Promise((resolve) => {
|
|
53
58
|
const proc = (0, node_child_process_1.spawn)(cmd, [config.scriptPath], {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-executor.js","sourceRoot":"","sources":["../src/script-executor.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"script-executor.js","sourceRoot":"","sources":["../src/script-executor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@studio-foundation/runner",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Multi-provider LLM agent runner with tool plugin execution (Anthropic, OpenAI, mock). Used by Studio.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
25
25
|
"js-yaml": "^4.1.0",
|
|
26
26
|
"openai": "^4.77.0",
|
|
27
|
-
"@studio-foundation/
|
|
28
|
-
"@studio-foundation/
|
|
27
|
+
"@studio-foundation/anonymizer": "0.19.0",
|
|
28
|
+
"@studio-foundation/contracts": "0.19.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/js-yaml": "^4.0.9",
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { SkillContent } from '../../plugins/plugin-loader.js';
|
|
2
|
-
export type { SkillContent };
|
|
3
|
-
/** Minimal structure required for a valid skill manifest */
|
|
4
|
-
export interface SkillManifest {
|
|
5
|
-
name: string;
|
|
6
|
-
content: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Load multiple `.skill.md` files by name from `.studio/skills/`.
|
|
10
|
-
* Missing files are skipped with a warning (non-fatal).
|
|
11
|
-
*/
|
|
12
|
-
export declare function loadSkills(skillNames: string[], studioDir: string): Promise<SkillContent[]>;
|
|
13
|
-
/**
|
|
14
|
-
* Load a single `.skill.md` file by name from `<studioDir>/skills/`.
|
|
15
|
-
* Returns null if the file does not exist.
|
|
16
|
-
*/
|
|
17
|
-
export declare function loadSkill(name: string, studioDir: string): Promise<SkillContent | null>;
|
|
18
|
-
/**
|
|
19
|
-
* Validate that a skill manifest has the required structure.
|
|
20
|
-
* Throws a descriptive error if invalid.
|
|
21
|
-
*/
|
|
22
|
-
export declare function validateSkillManifest(manifest: unknown): boolean;
|
|
23
|
-
//# sourceMappingURL=skill-loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../../src/tools/skills/skill-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAOjG;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAa7F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAYhE"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadSkills = loadSkills;
|
|
4
|
-
exports.loadSkill = loadSkill;
|
|
5
|
-
exports.validateSkillManifest = validateSkillManifest;
|
|
6
|
-
const promises_1 = require("node:fs/promises");
|
|
7
|
-
const node_fs_1 = require("node:fs");
|
|
8
|
-
const node_path_1 = require("node:path");
|
|
9
|
-
/**
|
|
10
|
-
* Load multiple `.skill.md` files by name from `.studio/skills/`.
|
|
11
|
-
* Missing files are skipped with a warning (non-fatal).
|
|
12
|
-
*/
|
|
13
|
-
async function loadSkills(skillNames, studioDir) {
|
|
14
|
-
const results = [];
|
|
15
|
-
for (const name of skillNames) {
|
|
16
|
-
const skill = await loadSkill(name, studioDir);
|
|
17
|
-
if (skill)
|
|
18
|
-
results.push(skill);
|
|
19
|
-
}
|
|
20
|
-
return results;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Load a single `.skill.md` file by name from `<studioDir>/skills/`.
|
|
24
|
-
* Returns null if the file does not exist.
|
|
25
|
-
*/
|
|
26
|
-
async function loadSkill(name, studioDir) {
|
|
27
|
-
const filePath = (0, node_path_1.join)(studioDir, 'skills', `${name}.skill.md`);
|
|
28
|
-
if (!(0, node_fs_1.existsSync)(filePath)) {
|
|
29
|
-
console.warn(`[studio] Skill '${name}' not found at ${filePath} — skipping.`);
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
const content = await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
34
|
-
return { name, content };
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
console.warn(`[studio] Failed to load skill '${name}' — skipping.`);
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Validate that a skill manifest has the required structure.
|
|
43
|
-
* Throws a descriptive error if invalid.
|
|
44
|
-
*/
|
|
45
|
-
function validateSkillManifest(manifest) {
|
|
46
|
-
if (!manifest || typeof manifest !== 'object') {
|
|
47
|
-
throw new Error('Skill manifest must be an object');
|
|
48
|
-
}
|
|
49
|
-
const m = manifest;
|
|
50
|
-
if (typeof m.name !== 'string') {
|
|
51
|
-
throw new Error('Skill manifest must have a string "name" field');
|
|
52
|
-
}
|
|
53
|
-
if (typeof m.content !== 'string') {
|
|
54
|
-
throw new Error('Skill manifest must have a string "content" field');
|
|
55
|
-
}
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=skill-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../../src/tools/skills/skill-loader.ts"],"names":[],"mappings":";;AAiBA,gCAOC;AAMD,8BAaC;AAMD,sDAYC;AA7DD,+CAA4C;AAC5C,qCAAqC;AACrC,yCAAiC;AAWjC;;;GAGG;AACI,KAAK,UAAU,UAAU,CAAC,UAAoB,EAAE,SAAiB;IACtE,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiB;IAC7D,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,kBAAkB,QAAQ,cAAc,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,kCAAkC,IAAI,eAAe,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,QAAiB;IACrD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,QAAmC,CAAC;IAC9C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.test.d.ts","sourceRoot":"","sources":["../../../src/tools/skills/skill-loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const promises_1 = require("node:fs/promises");
|
|
5
|
-
const node_path_1 = require("node:path");
|
|
6
|
-
const skill_loader_js_1 = require("./skill-loader.js");
|
|
7
|
-
const TMP = (0, node_path_1.join)('/tmp', '.studio-runner-skill-loader-test-' + Date.now());
|
|
8
|
-
const SKILLS_DIR = (0, node_path_1.join)(TMP, 'skills');
|
|
9
|
-
(0, vitest_1.describe)('loadSkill', () => {
|
|
10
|
-
(0, vitest_1.beforeAll)(async () => {
|
|
11
|
-
await (0, promises_1.mkdir)(SKILLS_DIR, { recursive: true });
|
|
12
|
-
await (0, promises_1.writeFile)((0, node_path_1.join)(SKILLS_DIR, 'commit-conventions.skill.md'), '# Commit Conventions\n\nUse conventional commits.');
|
|
13
|
-
await (0, promises_1.writeFile)((0, node_path_1.join)(SKILLS_DIR, 'react-patterns.skill.md'), '# React Patterns\n\nPrefer hooks.');
|
|
14
|
-
});
|
|
15
|
-
(0, vitest_1.afterAll)(async () => {
|
|
16
|
-
await (0, promises_1.rm)(TMP, { recursive: true, force: true });
|
|
17
|
-
});
|
|
18
|
-
(0, vitest_1.it)('returns SkillContent for an existing skill file', async () => {
|
|
19
|
-
const skill = await (0, skill_loader_js_1.loadSkill)('commit-conventions', TMP);
|
|
20
|
-
(0, vitest_1.expect)(skill).toEqual({
|
|
21
|
-
name: 'commit-conventions',
|
|
22
|
-
content: '# Commit Conventions\n\nUse conventional commits.',
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
(0, vitest_1.it)('returns null and warns for a missing skill file', async () => {
|
|
26
|
-
const warnSpy = vitest_1.vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
27
|
-
const skill = await (0, skill_loader_js_1.loadSkill)('nonexistent', TMP);
|
|
28
|
-
(0, vitest_1.expect)(skill).toBeNull();
|
|
29
|
-
(0, vitest_1.expect)(warnSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('nonexistent'));
|
|
30
|
-
warnSpy.mockRestore();
|
|
31
|
-
});
|
|
32
|
-
(0, vitest_1.it)('returns null when studioDir has no skills/ subdirectory', async () => {
|
|
33
|
-
const warnSpy = vitest_1.vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
34
|
-
const skill = await (0, skill_loader_js_1.loadSkill)('commit-conventions', '/tmp/nonexistent-studio-dir-xyz');
|
|
35
|
-
(0, vitest_1.expect)(skill).toBeNull();
|
|
36
|
-
warnSpy.mockRestore();
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
(0, vitest_1.describe)('loadSkills', () => {
|
|
40
|
-
(0, vitest_1.beforeAll)(async () => {
|
|
41
|
-
await (0, promises_1.mkdir)(SKILLS_DIR, { recursive: true }).catch(() => { });
|
|
42
|
-
await (0, promises_1.writeFile)((0, node_path_1.join)(SKILLS_DIR, 'commit-conventions.skill.md'), '# Commit Conventions\n\nUse conventional commits.').catch(() => { });
|
|
43
|
-
await (0, promises_1.writeFile)((0, node_path_1.join)(SKILLS_DIR, 'react-patterns.skill.md'), '# React Patterns\n\nPrefer hooks.').catch(() => { });
|
|
44
|
-
});
|
|
45
|
-
(0, vitest_1.it)('loads all named skills from .studio/skills/', async () => {
|
|
46
|
-
const skills = await (0, skill_loader_js_1.loadSkills)(['commit-conventions', 'react-patterns'], TMP);
|
|
47
|
-
(0, vitest_1.expect)(skills).toHaveLength(2);
|
|
48
|
-
(0, vitest_1.expect)(skills[0]).toEqual({ name: 'commit-conventions', content: '# Commit Conventions\n\nUse conventional commits.' });
|
|
49
|
-
(0, vitest_1.expect)(skills[1]).toEqual({ name: 'react-patterns', content: '# React Patterns\n\nPrefer hooks.' });
|
|
50
|
-
});
|
|
51
|
-
(0, vitest_1.it)('skips missing skills and returns the ones that exist', async () => {
|
|
52
|
-
const warnSpy = vitest_1.vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
53
|
-
const skills = await (0, skill_loader_js_1.loadSkills)(['commit-conventions', 'missing-skill'], TMP);
|
|
54
|
-
(0, vitest_1.expect)(skills).toHaveLength(1);
|
|
55
|
-
(0, vitest_1.expect)(skills[0].name).toBe('commit-conventions');
|
|
56
|
-
(0, vitest_1.expect)(warnSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('missing-skill'));
|
|
57
|
-
warnSpy.mockRestore();
|
|
58
|
-
});
|
|
59
|
-
(0, vitest_1.it)('returns empty array when names list is empty', async () => {
|
|
60
|
-
const skills = await (0, skill_loader_js_1.loadSkills)([], TMP);
|
|
61
|
-
(0, vitest_1.expect)(skills).toHaveLength(0);
|
|
62
|
-
});
|
|
63
|
-
(0, vitest_1.it)('returns empty array when studioDir has no skills/ directory', async () => {
|
|
64
|
-
const warnSpy = vitest_1.vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
65
|
-
const skills = await (0, skill_loader_js_1.loadSkills)(['commit-conventions'], '/tmp/nonexistent-studio-xyz');
|
|
66
|
-
(0, vitest_1.expect)(skills).toHaveLength(0);
|
|
67
|
-
warnSpy.mockRestore();
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
(0, vitest_1.describe)('validateSkillManifest', () => {
|
|
71
|
-
(0, vitest_1.it)('returns true for a valid skill manifest', () => {
|
|
72
|
-
(0, vitest_1.expect)((0, skill_loader_js_1.validateSkillManifest)({ name: 'my-skill', content: '# My Skill\n\nContent here.' })).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
(0, vitest_1.it)('throws when manifest is missing name', () => {
|
|
75
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)({ content: 'some content' })).toThrow();
|
|
76
|
-
});
|
|
77
|
-
(0, vitest_1.it)('throws when manifest is missing content', () => {
|
|
78
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)({ name: 'my-skill' })).toThrow();
|
|
79
|
-
});
|
|
80
|
-
(0, vitest_1.it)('throws when manifest is not an object', () => {
|
|
81
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)(null)).toThrow();
|
|
82
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)('string')).toThrow();
|
|
83
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)(42)).toThrow();
|
|
84
|
-
});
|
|
85
|
-
(0, vitest_1.it)('throws when name is not a string', () => {
|
|
86
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)({ name: 123, content: 'content' })).toThrow();
|
|
87
|
-
});
|
|
88
|
-
(0, vitest_1.it)('throws when content is not a string', () => {
|
|
89
|
-
(0, vitest_1.expect)(() => (0, skill_loader_js_1.validateSkillManifest)({ name: 'skill', content: [] })).toThrow();
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
//# sourceMappingURL=skill-loader.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.test.js","sourceRoot":"","sources":["../../../src/tools/skills/skill-loader.test.ts"],"names":[],"mappings":"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"}
|