@mohanscodex/spectra-agent 0.4.9 → 0.5.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/__tests__/skill-store.test.d.ts +2 -0
- package/dist/__tests__/skill-store.test.d.ts.map +1 -0
- package/dist/__tests__/skill-store.test.js +156 -0
- package/dist/__tests__/skill-store.test.js.map +1 -0
- package/dist/__tests__/skill.test.d.ts +2 -0
- package/dist/__tests__/skill.test.d.ts.map +1 -0
- package/dist/__tests__/skill.test.js +129 -0
- package/dist/__tests__/skill.test.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/skill-store.d.ts +26 -0
- package/dist/skill-store.d.ts.map +1 -0
- package/dist/skill-store.js +132 -0
- package/dist/skill-store.js.map +1 -0
- package/dist/skill-synth.d.ts +24 -0
- package/dist/skill-synth.d.ts.map +1 -0
- package/dist/skill-synth.js +130 -0
- package/dist/skill-synth.js.map +1 -0
- package/dist/skill.d.ts +46 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +379 -0
- package/dist/skill.js.map +1 -0
- package/dist/tool/skill.d.ts +5 -0
- package/dist/tool/skill.d.ts.map +1 -0
- package/dist/tool/skill.js +120 -0
- package/dist/tool/skill.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { loadSkillContent, getSkillDescription, formatSkillCatalogEntry, buildIndex, matchSkills } from '../skill.js';
|
|
2
|
+
import { incrementUseCount } from '../skill-store.js';
|
|
3
|
+
export function createSkillTool(skills) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'skill',
|
|
6
|
+
description: `Load a specialized skill by name. Use find_skills first to discover available skills, then call this to load the full instructions. The skill name must match one listed by find_skills.`,
|
|
7
|
+
parameters: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
name: {
|
|
11
|
+
type: 'string',
|
|
12
|
+
description: 'The exact skill name (as listed by find_skills)',
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Optional arguments to pass to the skill ($ARGUMENTS substitution)',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
required: ['name'],
|
|
20
|
+
},
|
|
21
|
+
execute: async (_toolCallId, args) => {
|
|
22
|
+
const name = args.name;
|
|
23
|
+
const skillArgs = args.args ?? '';
|
|
24
|
+
const skill = skills.get(name);
|
|
25
|
+
if (!skill) {
|
|
26
|
+
const available = Array.from(skills.keys()).join(', ');
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: 'text', text: `Skill "${name}" not found. Available skills: ${available}` }],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const content = await loadSkillContent(skill, skillArgs);
|
|
33
|
+
// Track usage for evolving skills (fire and forget)
|
|
34
|
+
incrementUseCount(skill.name).catch(() => { });
|
|
35
|
+
const fileList = skill.files.length > 0
|
|
36
|
+
? `\n\n<skill_files>\n${skill.files.map((f) => `<file>${f}</file>`).join('\n')}\n</skill_files>`
|
|
37
|
+
: '';
|
|
38
|
+
return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `<skill_content name="${skill.name}">\n# Skill: ${skill.name}\n\n${content}\n\nBase directory for this skill: file://${skill.location}\nRelative paths in this skill (e.g., scripts/, references/) are relative to this base directory.${fileList}\n</skill_content>`,
|
|
42
|
+
}],
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function createFindSkillsTool(skills) {
|
|
48
|
+
let cachedIndex = null;
|
|
49
|
+
function getIndex() {
|
|
50
|
+
if (!cachedIndex) {
|
|
51
|
+
cachedIndex = buildIndex([...skills.values()]);
|
|
52
|
+
}
|
|
53
|
+
return cachedIndex;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
name: 'find_skills',
|
|
57
|
+
description: `Discover available skills. Pass a query to search by topic/task, or set all=true to browse the full catalog. Use this before loading a skill with the skill tool.`,
|
|
58
|
+
parameters: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
query: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
description: 'Search query (e.g. "deploy vercel", "debug typescript", "write tests")',
|
|
64
|
+
},
|
|
65
|
+
all: {
|
|
66
|
+
type: 'boolean',
|
|
67
|
+
description: 'Set true to list ALL available skills (fallback when query returns nothing)',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
execute: async (_toolCallId, args) => {
|
|
72
|
+
const query = args.query ?? '';
|
|
73
|
+
const showAll = args.all ?? false;
|
|
74
|
+
if (skills.size === 0) {
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: 'text', text: 'No skills available. Skills are loaded from .claude/skills/, .agents/skills/, ~/.claude/skills/, and ~/.agents/skills/.' }],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// All mode: return full catalog
|
|
80
|
+
if (showAll) {
|
|
81
|
+
const lines = Array.from(skills.values()).map((s) => formatSkillCatalogEntry(s));
|
|
82
|
+
return {
|
|
83
|
+
content: [{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: `<skill_catalog count="${skills.size}">\nAvailable skills. Load one with the skill tool:\n\n${lines.join('\n')}\n</skill_catalog>`,
|
|
86
|
+
}],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Query mode: TF-IDF search
|
|
90
|
+
if (!query) {
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: 'text', text: 'Provide a query string to search skills, or set all=true to list everything.' }],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const index = getIndex();
|
|
96
|
+
const matches = matchSkills(query, index, { topK: 10, threshold: 0.03 });
|
|
97
|
+
if (matches.length === 0) {
|
|
98
|
+
const lines = Array.from(skills.values()).map((s) => formatSkillCatalogEntry(s));
|
|
99
|
+
return {
|
|
100
|
+
content: [{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: `No skills matched "${query}". Here are all available skills:\n\n<skill_catalog count="${skills.size}">\n${lines.join('\n')}\n</skill_catalog>`,
|
|
103
|
+
}],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const resultLines = matches.map((m) => {
|
|
107
|
+
const desc = getSkillDescription(m.skill);
|
|
108
|
+
const tags = m.skill.tags.length > 0 ? ` [${m.skill.tags.slice(0, 5).join(', ')}]` : '';
|
|
109
|
+
return `- ${m.skill.name} — ${desc}${tags} (score: ${m.score.toFixed(3)})`;
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
content: [{
|
|
113
|
+
type: 'text',
|
|
114
|
+
text: `<skill_matches query="${query}" count="${matches.length}">\n${resultLines.join('\n')}\n</skill_matches>`,
|
|
115
|
+
}],
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tool/skill.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mohanscodex/spectra-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Spectra Agent — agent loop, tool dispatch, state management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"lint": "tsc --noEmit"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@mohanscodex/spectra-ai": "^0.
|
|
24
|
+
"@mohanscodex/spectra-ai": "^0.5.0",
|
|
25
25
|
"zod": "^3.25.0",
|
|
26
26
|
"zod-to-json-schema": "^3.24.0"
|
|
27
27
|
},
|