@openharness/core 0.3.1 → 0.3.2
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/agent.d.ts +10 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +13 -2
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/skills.d.ts +29 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +134 -0
- package/dist/skills.js.map +1 -0
- package/dist/tools/skill.d.ts +12 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +61 -0
- package/dist/tools/skill.js.map +1 -0
- package/package.json +1 -1
package/dist/agent.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type LanguageModel, type ToolSet, type ModelMessage } from "ai";
|
|
2
2
|
import { type MCPServerConfig } from "./mcp.js";
|
|
3
|
+
import { type SkillsConfig } from "./skills.js";
|
|
3
4
|
export interface TokenUsage {
|
|
4
5
|
inputTokens: number | undefined;
|
|
5
6
|
outputTokens: number | undefined;
|
|
@@ -86,6 +87,9 @@ export declare class Agent {
|
|
|
86
87
|
/** MCP server configs — connected lazily on first run. */
|
|
87
88
|
private mcpServerConfigs?;
|
|
88
89
|
private mcpConnection;
|
|
90
|
+
/** Skills config — discovered lazily on first run. */
|
|
91
|
+
private skillsConfig?;
|
|
92
|
+
private cachedSkills;
|
|
89
93
|
private cachedInstructions;
|
|
90
94
|
constructor(options: {
|
|
91
95
|
name: string;
|
|
@@ -121,6 +125,12 @@ export declare class Agent {
|
|
|
121
125
|
* Keys are server names (used to namespace tools when multiple servers are configured).
|
|
122
126
|
*/
|
|
123
127
|
mcpServers?: Record<string, MCPServerConfig>;
|
|
128
|
+
/**
|
|
129
|
+
* Skills configuration. Skills are markdown instruction packages (SKILL.md files)
|
|
130
|
+
* that the LLM can load on demand via an auto-generated `skill` tool.
|
|
131
|
+
* Discovered lazily on first run.
|
|
132
|
+
*/
|
|
133
|
+
skills?: SkillsConfig;
|
|
124
134
|
});
|
|
125
135
|
/**
|
|
126
136
|
* Close all MCP server connections. Call this when the agent is no longer needed.
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,YAAY,EAElB,MAAM,IAAI,CAAC;AAGZ,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,YAAY,EAElB,MAAM,IAAI,CAAC;AAGZ,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAID,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC/B;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACvD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAIN,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAI1E,qBAAa,KAAK;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAE3C,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;IAE7B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB,0DAA0D;IAC1D,OAAO,CAAC,gBAAgB,CAAC,CAAkC;IAC3D,OAAO,CAAC,aAAa,CAA8B;IAEnD,sDAAsD;IACtD,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,YAAY,CAA4B;IAEhD,OAAO,CAAC,kBAAkB,CAAmC;gBAEjD,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,+FAA+F;QAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,aAAa,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,+EAA+E;QAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB;;;WAGG;QACH,OAAO,CAAC,EAAE,SAAS,CAAC;QACpB,wEAAwE;QACxE,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;QACpB;;;;WAIG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,4EAA4E;QAC5E,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC;;;;;WAKG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC7C;;;;WAIG;QACH,MAAM,CAAC,EAAE,YAAY,CAAC;KACvB;IA2BD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,GAAG,CACR,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,EAC9B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjC,cAAc,CAAC,UAAU,CAAC;CAuK9B;AA8GD,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,QAAQ,EAAE,MAAM;CAI7B"}
|
package/dist/agent.js
CHANGED
|
@@ -2,6 +2,8 @@ import { tool, streamText, stepCountIs, } from "ai";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { loadInstructions } from "./instructions.js";
|
|
4
4
|
import { connectMCPServers, closeMCPClients, } from "./mcp.js";
|
|
5
|
+
import { discoverSkills } from "./skills.js";
|
|
6
|
+
import { createSkillTool } from "./tools/skill.js";
|
|
5
7
|
// ── Agent ────────────────────────────────────────────────────────────
|
|
6
8
|
export class Agent {
|
|
7
9
|
name;
|
|
@@ -22,6 +24,9 @@ export class Agent {
|
|
|
22
24
|
/** MCP server configs — connected lazily on first run. */
|
|
23
25
|
mcpServerConfigs;
|
|
24
26
|
mcpConnection = null;
|
|
27
|
+
/** Skills config — discovered lazily on first run. */
|
|
28
|
+
skillsConfig;
|
|
29
|
+
cachedSkills = null; // null = not loaded yet
|
|
25
30
|
cachedInstructions = null; // null = not loaded yet
|
|
26
31
|
constructor(options) {
|
|
27
32
|
this.name = options.name;
|
|
@@ -37,6 +42,7 @@ export class Agent {
|
|
|
37
42
|
this.onSubagentEvent = options.onSubagentEvent;
|
|
38
43
|
this.subagents = options.subagents;
|
|
39
44
|
this.mcpServerConfigs = options.mcpServers;
|
|
45
|
+
this.skillsConfig = options.skills;
|
|
40
46
|
// Merge the task tool into the toolset when subagents are provided and depth > 0
|
|
41
47
|
if (options.subagents?.length && this.maxSubagentDepth > 0) {
|
|
42
48
|
this.tools = {
|
|
@@ -74,12 +80,17 @@ export class Agent {
|
|
|
74
80
|
if (this.mcpServerConfigs && !this.mcpConnection) {
|
|
75
81
|
this.mcpConnection = await connectMCPServers(this.mcpServerConfigs);
|
|
76
82
|
}
|
|
83
|
+
// Discover skills once per agent lifetime
|
|
84
|
+
if (this.skillsConfig && this.cachedSkills === null) {
|
|
85
|
+
this.cachedSkills = await discoverSkills(this.skillsConfig);
|
|
86
|
+
}
|
|
77
87
|
const systemParts = [this.systemPrompt, this.cachedInstructions].filter(Boolean);
|
|
78
88
|
const system = systemParts.length > 0 ? systemParts.join("\n\n") : undefined;
|
|
79
|
-
// Merge static tools with MCP tools
|
|
89
|
+
// Merge static tools with MCP tools and skill tool
|
|
80
90
|
const allTools = {
|
|
81
|
-
...(this.
|
|
91
|
+
...(this.cachedSkills?.length ? { skill: createSkillTool(this.cachedSkills) } : {}),
|
|
82
92
|
...(this.mcpConnection?.tools ?? {}),
|
|
93
|
+
...(this.tools ?? {}),
|
|
83
94
|
};
|
|
84
95
|
const tools = this.approve && Object.keys(allTools).length > 0
|
|
85
96
|
? wrapToolsWithApproval(allTools, this.approve)
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,GAKZ,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,eAAe,GAGhB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { Agent, ToolDeniedError, type AgentEvent, type TokenUsage, type ToolCallInfo, type ApproveFn, type SubagentEventFn, } from "./agent.js";
|
|
2
2
|
export { connectMCPServers, closeMCPClients, type MCPServerConfig, type MCPConnection, type StdioMCPServer, type HttpMCPServer, type SseMCPServer, } from "./mcp.js";
|
|
3
3
|
export { Session, DefaultCompactionStrategy, type SessionEvent, type SessionLifecycleEvent, type SessionOptions, type CompactionStrategy, type CompactionContext, type CompactionResult, type RetryConfig, type SessionHooks, type TurnInfo, type SessionStore, type CompactionCheckInfo, } from "./session.js";
|
|
4
|
+
export { discoverSkills, scanSkillFiles, type SkillInfo, type SkillsConfig, } from "./skills.js";
|
|
5
|
+
export { createSkillTool } from "./tools/skill.js";
|
|
4
6
|
export { findInstructions, loadInstructions } from "./instructions.js";
|
|
5
7
|
export { type OHDataTypes, type OHMetadata, type OHUIMessage, } from "./types/ui-message.js";
|
|
6
8
|
export { type OHDataPart, type OHSubagentPart, type OHCompactionPart, type OHRetryPart, type OHSessionLifecyclePart, isOHDataPart, isSubagentEvent, isCompactionEvent, isRetryEvent, isSessionLifecycleEvent, formatSSE, formatTextDelta, formatReasoningDelta, formatDataPart, formatToolStart, formatToolResult, formatToolError, formatStepStart, formatStepFinish, formatFinishMessage, formatDone, } from "./types/stream-parts.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAG3B,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EAGvB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,cAAc,EACd,cAAc,EACd,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAG3B,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EAGvB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,9 @@ export { Agent, ToolDeniedError, } from "./agent.js";
|
|
|
4
4
|
export { connectMCPServers, closeMCPClients, } from "./mcp.js";
|
|
5
5
|
// ── Session ─────────────────────────────────────────────────────────
|
|
6
6
|
export { Session, DefaultCompactionStrategy, } from "./session.js";
|
|
7
|
+
// ── Skills ──────────────────────────────────────────────────────────
|
|
8
|
+
export { discoverSkills, scanSkillFiles, } from "./skills.js";
|
|
9
|
+
export { createSkillTool } from "./tools/skill.js";
|
|
7
10
|
// ── Instructions ────────────────────────────────────────────────────
|
|
8
11
|
export { findInstructions, loadInstructions } from "./instructions.js";
|
|
9
12
|
// ── Stream Parts ────────────────────────────────────────────────────
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,uEAAuE;AAEvE,OAAO;AAQL,cAAc;AACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB;AAEvB,iBAAiB;AACjB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,uEAAuE;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EACL,cAAc,EACd,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,uEAAuE;AAEvE,OAAO;AAQL,cAAc;AACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB;AAEvB,iBAAiB;AACjB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,uEAAuE;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface SkillInfo {
|
|
2
|
+
/** Unique skill identifier (lowercase, hyphenated). */
|
|
3
|
+
name: string;
|
|
4
|
+
/** Short description of what the skill does. */
|
|
5
|
+
description: string;
|
|
6
|
+
/** Absolute path to the SKILL.md file. */
|
|
7
|
+
location: string;
|
|
8
|
+
/** Markdown body (after frontmatter). */
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SkillsConfig {
|
|
12
|
+
/**
|
|
13
|
+
* Directories to scan for `** /SKILL.md` files.
|
|
14
|
+
* Supports absolute paths, relative paths (resolved from cwd), and `~/…` paths.
|
|
15
|
+
* Later paths take precedence — a skill with the same name overwrites an earlier one.
|
|
16
|
+
*/
|
|
17
|
+
paths?: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Scan configured paths for `SKILL.md` files and return parsed skill info.
|
|
21
|
+
* Later paths overwrite earlier ones when names collide.
|
|
22
|
+
*/
|
|
23
|
+
export declare function discoverSkills(config: SkillsConfig): Promise<SkillInfo[]>;
|
|
24
|
+
/**
|
|
25
|
+
* List auxiliary files in a skill directory (everything except SKILL.md).
|
|
26
|
+
* Returns up to `limit` absolute paths.
|
|
27
|
+
*/
|
|
28
|
+
export declare function scanSkillFiles(dir: string, limit?: number): Promise<string[]>;
|
|
29
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAgB/E;AA0GD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB/E"}
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
// ── Discovery ─────────────────────────────────────────────────────────
|
|
5
|
+
const SKILL_NAME_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
6
|
+
/**
|
|
7
|
+
* Scan configured paths for `SKILL.md` files and return parsed skill info.
|
|
8
|
+
* Later paths overwrite earlier ones when names collide.
|
|
9
|
+
*/
|
|
10
|
+
export async function discoverSkills(config) {
|
|
11
|
+
const skills = new Map();
|
|
12
|
+
for (const raw of config.paths ?? []) {
|
|
13
|
+
const resolved = resolvePath(raw);
|
|
14
|
+
const matches = await findSkillFiles(resolved);
|
|
15
|
+
for (const match of matches) {
|
|
16
|
+
const info = await parseSkillFile(match);
|
|
17
|
+
if (info) {
|
|
18
|
+
skills.set(info.name, info);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return Array.from(skills.values());
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Minimal YAML frontmatter parser. Handles the simple `key: value` format
|
|
26
|
+
* used by SKILL.md files without requiring an external dependency.
|
|
27
|
+
*/
|
|
28
|
+
function parseFrontmatter(raw) {
|
|
29
|
+
const trimmed = raw.trimStart();
|
|
30
|
+
if (!trimmed.startsWith("---"))
|
|
31
|
+
return null;
|
|
32
|
+
const endIndex = trimmed.indexOf("\n---", 3);
|
|
33
|
+
if (endIndex === -1)
|
|
34
|
+
return null;
|
|
35
|
+
const yamlBlock = trimmed.slice(3, endIndex).trim();
|
|
36
|
+
const content = trimmed.slice(endIndex + 4).trim();
|
|
37
|
+
const data = {};
|
|
38
|
+
for (const line of yamlBlock.split("\n")) {
|
|
39
|
+
const colonIndex = line.indexOf(":");
|
|
40
|
+
if (colonIndex === -1)
|
|
41
|
+
continue;
|
|
42
|
+
const key = line.slice(0, colonIndex).trim();
|
|
43
|
+
// Take everything after the first colon so values containing colons are preserved
|
|
44
|
+
const value = line.slice(colonIndex + 1).trim();
|
|
45
|
+
if (key && value) {
|
|
46
|
+
data[key] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { data, content };
|
|
50
|
+
}
|
|
51
|
+
async function parseSkillFile(filePath) {
|
|
52
|
+
let raw;
|
|
53
|
+
try {
|
|
54
|
+
raw = await fs.readFile(filePath, "utf-8");
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const parsed = parseFrontmatter(raw);
|
|
60
|
+
if (!parsed) {
|
|
61
|
+
console.warn(`[skills] Could not parse frontmatter: ${filePath}`);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const { name, description } = parsed.data;
|
|
65
|
+
if (!name || !description) {
|
|
66
|
+
console.warn(`[skills] Missing name or description in frontmatter: ${filePath}`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (!SKILL_NAME_RE.test(name)) {
|
|
70
|
+
console.warn(`[skills] Invalid skill name "${name}" in ${filePath}. ` +
|
|
71
|
+
`Must be lowercase alphanumeric with single hyphens.`);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
name,
|
|
76
|
+
description,
|
|
77
|
+
location: filePath,
|
|
78
|
+
content: parsed.content,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// ── File system helpers ───────────────────────────────────────────────
|
|
82
|
+
function resolvePath(raw) {
|
|
83
|
+
if (raw.startsWith("~/")) {
|
|
84
|
+
return path.join(os.homedir(), raw.slice(2));
|
|
85
|
+
}
|
|
86
|
+
return path.resolve(raw);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Recursively find all `SKILL.md` files under `dir`.
|
|
90
|
+
*/
|
|
91
|
+
async function findSkillFiles(dir) {
|
|
92
|
+
let entries;
|
|
93
|
+
try {
|
|
94
|
+
entries = await fs.readdir(dir, { withFileTypes: true, recursive: true });
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Directory doesn't exist or isn't readable — silently skip
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
const results = [];
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
if (entry.name === "SKILL.md" && !entry.isDirectory()) {
|
|
103
|
+
const parent = entry.parentPath ?? entry.path ?? dir;
|
|
104
|
+
results.push(path.join(parent, entry.name));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List auxiliary files in a skill directory (everything except SKILL.md).
|
|
111
|
+
* Returns up to `limit` absolute paths.
|
|
112
|
+
*/
|
|
113
|
+
export async function scanSkillFiles(dir, limit = 10) {
|
|
114
|
+
let entries;
|
|
115
|
+
try {
|
|
116
|
+
entries = await fs.readdir(dir, { withFileTypes: true, recursive: true });
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const files = [];
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
if (entry.isDirectory())
|
|
124
|
+
continue;
|
|
125
|
+
if (entry.name === "SKILL.md")
|
|
126
|
+
continue;
|
|
127
|
+
const parent = entry.parentPath ?? entry.path ?? dir;
|
|
128
|
+
files.push(path.join(parent, entry.name));
|
|
129
|
+
if (files.length >= limit)
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
return files;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type SkillInfo } from "../skills.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create a `skill` tool that lets the LLM load skill instructions into the conversation.
|
|
4
|
+
*
|
|
5
|
+
* The tool description includes an XML listing of available skills so the model
|
|
6
|
+
* knows what it can invoke. When called, it returns the skill's markdown body
|
|
7
|
+
* along with a list of auxiliary files in the skill directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createSkillTool(skills: SkillInfo[]): import("ai").Tool<{
|
|
10
|
+
name: string;
|
|
11
|
+
}, string>;
|
|
12
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,cAAc,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE;;WAwDlD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { tool } from "ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { scanSkillFiles } from "../skills.js";
|
|
5
|
+
/**
|
|
6
|
+
* Create a `skill` tool that lets the LLM load skill instructions into the conversation.
|
|
7
|
+
*
|
|
8
|
+
* The tool description includes an XML listing of available skills so the model
|
|
9
|
+
* knows what it can invoke. When called, it returns the skill's markdown body
|
|
10
|
+
* along with a list of auxiliary files in the skill directory.
|
|
11
|
+
*/
|
|
12
|
+
export function createSkillTool(skills) {
|
|
13
|
+
const byName = new Map(skills.map((s) => [s.name, s]));
|
|
14
|
+
const listing = skills
|
|
15
|
+
.map((s) => ` <skill><name>${s.name}</name><description>${s.description}</description></skill>`)
|
|
16
|
+
.join("\n");
|
|
17
|
+
const examples = skills
|
|
18
|
+
.slice(0, 3)
|
|
19
|
+
.map((s) => `'${s.name}'`)
|
|
20
|
+
.join(", ");
|
|
21
|
+
return tool({
|
|
22
|
+
description: [
|
|
23
|
+
"Load a skill to get specialized instructions for a task.",
|
|
24
|
+
"",
|
|
25
|
+
"<available_skills>",
|
|
26
|
+
listing,
|
|
27
|
+
"</available_skills>",
|
|
28
|
+
].join("\n"),
|
|
29
|
+
inputSchema: z.object({
|
|
30
|
+
name: z.string().describe(`The skill name to load (e.g., ${examples})`),
|
|
31
|
+
}),
|
|
32
|
+
execute: async ({ name }) => {
|
|
33
|
+
const skill = byName.get(name);
|
|
34
|
+
if (!skill) {
|
|
35
|
+
const available = skills.map((s) => s.name).join(", ");
|
|
36
|
+
throw new Error(`Skill "${name}" not found. Available skills: ${available}`);
|
|
37
|
+
}
|
|
38
|
+
const dir = path.dirname(skill.location);
|
|
39
|
+
const files = await scanSkillFiles(dir);
|
|
40
|
+
const parts = [
|
|
41
|
+
`<skill_content name="${skill.name}">`,
|
|
42
|
+
`# Skill: ${skill.name}`,
|
|
43
|
+
"",
|
|
44
|
+
skill.content.trim(),
|
|
45
|
+
"",
|
|
46
|
+
`Base directory for this skill: ${dir}`,
|
|
47
|
+
"Relative paths in this skill are relative to this base directory.",
|
|
48
|
+
];
|
|
49
|
+
if (files.length > 0) {
|
|
50
|
+
parts.push("", "<skill_files>");
|
|
51
|
+
for (const f of files) {
|
|
52
|
+
parts.push(`<file>${f}</file>`);
|
|
53
|
+
}
|
|
54
|
+
parts.push("</skill_files>");
|
|
55
|
+
}
|
|
56
|
+
parts.push("</skill_content>");
|
|
57
|
+
return parts.join("\n");
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAkB,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,uBAAuB,CAAC,CAAC,WAAW,wBAAwB,CAAC;SAChG,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,MAAM;SACpB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;SACzB,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,IAAI,CAAC;QACV,WAAW,EAAE;YACX,0DAA0D;YAC1D,EAAE;YACF,oBAAoB;YACpB,OAAO;YACP,qBAAqB;SACtB,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,QAAQ,GAAG,CAAC;SACxE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAoB,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,kCAAkC,SAAS,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG;gBACZ,wBAAwB,KAAK,CAAC,IAAI,IAAI;gBACtC,YAAY,KAAK,CAAC,IAAI,EAAE;gBACxB,EAAE;gBACF,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;gBACpB,EAAE;gBACF,kCAAkC,GAAG,EAAE;gBACvC,mEAAmE;aACpE,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;gBAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAE/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|