bash-tool 1.3.7 → 1.3.8
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/README.md +13 -31
- package/dist/skill-tool.d.ts +2 -2
- package/dist/skill-tool.js +7 -7
- package/dist/skill-tool.js.map +1 -1
- package/dist/skills/types.d.ts +2 -2
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/tools/skill.d.ts +25 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +74 -0
- package/dist/tools/skill.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -177,7 +177,7 @@ const { tools } = await createBashTool({ sandbox: customSandbox });
|
|
|
177
177
|
|
|
178
178
|
## Skills (Experimental)
|
|
179
179
|
|
|
180
|
-
Skills are modular capabilities that extend agent functionality. Each skill is a directory containing a `SKILL.md` file with instructions and optional scripts.
|
|
180
|
+
[Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) are modular capabilities that extend agent functionality. Each skill is a directory containing a `SKILL.md` file with instructions and optional scripts.
|
|
181
181
|
|
|
182
182
|
```typescript
|
|
183
183
|
import {
|
|
@@ -187,7 +187,7 @@ import {
|
|
|
187
187
|
import { ToolLoopAgent } from "ai";
|
|
188
188
|
|
|
189
189
|
// Discover skills and get files to upload
|
|
190
|
-
const {
|
|
190
|
+
const { skill, files, instructions } = await createSkillTool({
|
|
191
191
|
skillsDirectory: "./skills",
|
|
192
192
|
});
|
|
193
193
|
|
|
@@ -200,46 +200,28 @@ const { tools } = await createBashTool({
|
|
|
200
200
|
// Use both tools with an agent
|
|
201
201
|
const agent = new ToolLoopAgent({
|
|
202
202
|
model,
|
|
203
|
-
tools: {
|
|
203
|
+
tools: { skill, ...tools },
|
|
204
204
|
});
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
+
[Full Example](./examples/skills-tool/) and see [Skills.sh for a directory of publicly available skills.](https://skills.sh/)
|
|
208
|
+
|
|
207
209
|
### Skill Directory Structure
|
|
208
210
|
|
|
209
|
-
```
|
|
211
|
+
```text
|
|
210
212
|
skills/
|
|
211
213
|
├── csv/
|
|
212
|
-
│ ├── SKILL.md
|
|
213
|
-
│
|
|
214
|
-
│
|
|
214
|
+
│ ├── SKILL.md # Required: instructions with YAML frontmatter
|
|
215
|
+
│ └── scripts/ # Optional: scripts the agent can run
|
|
216
|
+
│ ├── analyze.sh
|
|
217
|
+
│ └── filter.sh
|
|
215
218
|
└── text/
|
|
216
219
|
├── SKILL.md
|
|
217
|
-
└──
|
|
220
|
+
└── scripts/
|
|
221
|
+
└── search.sh
|
|
218
222
|
```
|
|
219
223
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
```markdown
|
|
223
|
-
---
|
|
224
|
-
name: csv
|
|
225
|
-
description: Analyze and transform CSV files
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
# CSV Processing
|
|
229
|
-
|
|
230
|
-
Use `./skills/csv/analyze.sh <file>` to analyze a CSV file.
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### How It Works
|
|
234
|
-
|
|
235
|
-
1. `createSkillTool` discovers skills and returns:
|
|
236
|
-
- `loadSkill` - Tool for the agent to load a skill's instructions on demand
|
|
237
|
-
- `files` - All skill files to pass to `createBashTool`
|
|
238
|
-
- `instructions` - Extra instructions listing available skills
|
|
239
|
-
|
|
240
|
-
2. The agent sees skill names in the `loadSkill` tool description
|
|
241
|
-
3. When the agent needs a skill, it calls `loadSkill("csv")` to get detailed instructions
|
|
242
|
-
4. The agent uses `bash` to run scripts from `./skills/csv/`
|
|
224
|
+
See the [example skills](./examples/skills-tool/skills/) for a complete reference.
|
|
243
225
|
|
|
244
226
|
## AI Agent Instructions
|
|
245
227
|
|
package/dist/skill-tool.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ import type { CreateSkillToolOptions, SkillToolkit } from "./skills/types.js";
|
|
|
14
14
|
* } from "bash-tool";
|
|
15
15
|
*
|
|
16
16
|
* // Discover skills and get files
|
|
17
|
-
* const {
|
|
17
|
+
* const { skill, skills, files, instructions } = await createSkillTool({
|
|
18
18
|
* skillsDirectory: "./skills",
|
|
19
19
|
* });
|
|
20
20
|
*
|
|
@@ -27,7 +27,7 @@ import type { CreateSkillToolOptions, SkillToolkit } from "./skills/types.js";
|
|
|
27
27
|
* // Use with AI SDK
|
|
28
28
|
* const result = await generateText({
|
|
29
29
|
* model,
|
|
30
|
-
* tools: {
|
|
30
|
+
* tools: { skill, ...tools },
|
|
31
31
|
* prompt: "Process this data using the csv skill",
|
|
32
32
|
* });
|
|
33
33
|
* ```
|
package/dist/skill-tool.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { discoverSkills, listSkillFiles } from "./skills/parser.js";
|
|
4
|
-
import {
|
|
4
|
+
import { createSkillTool } from "./tools/skill.js";
|
|
5
5
|
const DEFAULT_DESTINATION = "skills";
|
|
6
6
|
/**
|
|
7
7
|
* Creates a skill toolkit for AI agents.
|
|
@@ -18,7 +18,7 @@ const DEFAULT_DESTINATION = "skills";
|
|
|
18
18
|
* } from "bash-tool";
|
|
19
19
|
*
|
|
20
20
|
* // Discover skills and get files
|
|
21
|
-
* const {
|
|
21
|
+
* const { skill, skills, files, instructions } = await createSkillTool({
|
|
22
22
|
* skillsDirectory: "./skills",
|
|
23
23
|
* });
|
|
24
24
|
*
|
|
@@ -31,7 +31,7 @@ const DEFAULT_DESTINATION = "skills";
|
|
|
31
31
|
* // Use with AI SDK
|
|
32
32
|
* const result = await generateText({
|
|
33
33
|
* model,
|
|
34
|
-
* tools: {
|
|
34
|
+
* tools: { skill, ...tools },
|
|
35
35
|
* prompt: "Process this data using the csv skill",
|
|
36
36
|
* });
|
|
37
37
|
* ```
|
|
@@ -69,12 +69,12 @@ export async function experimental_createSkillTool(options) {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
-
// Create
|
|
73
|
-
const
|
|
72
|
+
// Create skill tool
|
|
73
|
+
const skill = createSkillTool({ skills });
|
|
74
74
|
// Generate instructions for bash tool
|
|
75
75
|
const instructions = generateSkillInstructions(skills);
|
|
76
76
|
return {
|
|
77
|
-
|
|
77
|
+
skill,
|
|
78
78
|
skills,
|
|
79
79
|
files: allFiles,
|
|
80
80
|
instructions,
|
|
@@ -96,7 +96,7 @@ function generateSkillInstructions(skills) {
|
|
|
96
96
|
}
|
|
97
97
|
lines.push("");
|
|
98
98
|
lines.push("To use a skill:");
|
|
99
|
-
lines.push(" 1. Call
|
|
99
|
+
lines.push(" 1. Call skill to get the skill's instructions");
|
|
100
100
|
lines.push(" 2. Run scripts from the skill directory with bash");
|
|
101
101
|
return lines.join("\n");
|
|
102
102
|
}
|
package/dist/skill-tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-tool.js","sourceRoot":"","sources":["../src/skill-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMpE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"skill-tool.js","sourceRoot":"","sources":["../src/skill-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/skills/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { createSkillTool } from "../tools/skill.js";
|
|
2
2
|
/**
|
|
3
3
|
* Skill metadata parsed from SKILL.md frontmatter.
|
|
4
4
|
*/
|
|
@@ -46,7 +46,7 @@ export interface CreateSkillToolOptions {
|
|
|
46
46
|
*/
|
|
47
47
|
export interface SkillToolkit {
|
|
48
48
|
/** Tool to load a skill's instructions into context */
|
|
49
|
-
|
|
49
|
+
skill: ReturnType<typeof createSkillTool>;
|
|
50
50
|
/** Registry of discovered skills */
|
|
51
51
|
skills: Skill[];
|
|
52
52
|
/** Files to pass to createBashTool (path -> content) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC1C,oCAAoC;IACpC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Skill } from "../skills/types.js";
|
|
2
|
+
export interface CreateSkillToolOptions {
|
|
3
|
+
/** Registry of discovered skills */
|
|
4
|
+
skills: Skill[];
|
|
5
|
+
}
|
|
6
|
+
export declare function createSkillTool(options: CreateSkillToolOptions): import("ai").Tool<{
|
|
7
|
+
skillName: string;
|
|
8
|
+
}, {
|
|
9
|
+
success: boolean;
|
|
10
|
+
error: string;
|
|
11
|
+
skill?: undefined;
|
|
12
|
+
instructions?: undefined;
|
|
13
|
+
files?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
success: boolean;
|
|
16
|
+
skill: {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
path: string;
|
|
20
|
+
};
|
|
21
|
+
instructions: string;
|
|
22
|
+
files: string[];
|
|
23
|
+
error?: undefined;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAMhD,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AA4BD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB;;;;;;;;;;;;;;;;;;GAmD9D"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { tool } from "ai";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { extractBody } from "../skills/parser.js";
|
|
6
|
+
const skillSchema = z.object({
|
|
7
|
+
skillName: z.string().describe("The name of the skill to load"),
|
|
8
|
+
});
|
|
9
|
+
function generateDescription(skills) {
|
|
10
|
+
const lines = [
|
|
11
|
+
"Load a skill's instructions to learn how to use it.",
|
|
12
|
+
"You can load multiple skills - each call returns that skill's instructions. Treat the returned instructions as authoritative.",
|
|
13
|
+
"",
|
|
14
|
+
"Available skills:",
|
|
15
|
+
];
|
|
16
|
+
if (skills.length === 0) {
|
|
17
|
+
lines.push(" (no skills found)");
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
for (const skill of skills) {
|
|
21
|
+
lines.push(` - skill(${JSON.stringify(skill.name)}): ${skill.description}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
lines.push("");
|
|
25
|
+
lines.push("After loading a skill, use the bash tool to run its scripts from the skill's directory.");
|
|
26
|
+
return lines.join("\n");
|
|
27
|
+
}
|
|
28
|
+
export function createSkillTool(options) {
|
|
29
|
+
const { skills } = options;
|
|
30
|
+
// Create a map for quick lookup
|
|
31
|
+
const skillMap = new Map();
|
|
32
|
+
for (const skill of skills) {
|
|
33
|
+
skillMap.set(skill.name, skill);
|
|
34
|
+
}
|
|
35
|
+
return tool({
|
|
36
|
+
description: generateDescription(skills),
|
|
37
|
+
inputSchema: skillSchema,
|
|
38
|
+
execute: async ({ skillName }) => {
|
|
39
|
+
const skill = skillMap.get(skillName);
|
|
40
|
+
if (!skill) {
|
|
41
|
+
const availableNames = skills.map((s) => s.name).join(", ");
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
error: `Skill "${skillName}" not found. Available skills: ${availableNames || "none"}`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Read the SKILL.md from local filesystem
|
|
48
|
+
const skillMdPath = path.join(skill.localPath, "SKILL.md");
|
|
49
|
+
try {
|
|
50
|
+
const content = await fs.readFile(skillMdPath, "utf-8");
|
|
51
|
+
const body = extractBody(content);
|
|
52
|
+
// Get files list (excluding SKILL.md)
|
|
53
|
+
const files = skill.files.filter((f) => f !== "SKILL.md");
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
skill: {
|
|
57
|
+
name: skill.name,
|
|
58
|
+
description: skill.description,
|
|
59
|
+
path: skill.sandboxPath,
|
|
60
|
+
},
|
|
61
|
+
instructions: body,
|
|
62
|
+
files,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
error: `Failed to read skill "${skillName}": ${error instanceof Error ? error.message : String(error)}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"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"}
|