Skip to content

Commit 72d710e

Browse files
committed
feat: update default skill loading so enabledSkills can skip the built-in skills
1 parent 66cc098 commit 72d710e

6 files changed

Lines changed: 57 additions & 405 deletions

File tree

src/prompt.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ type PromptToolOptions = {
100100
webSearchEnabled?: boolean;
101101
};
102102

103+
type DefaultSkillPromptOptions = {
104+
enabledSkills?: Record<string, boolean>;
105+
};
106+
103107
const DEFAULT_SKILL_TEMPLATES = ["karpathy-guidelines.md"];
104108
const DEFAULT_SKILL_RESOURCE_FILE_LIMIT = 50;
105109
const SKILL_RESOURCE_EXCLUDED_DIRS = new Set([
@@ -153,13 +157,20 @@ function readToolDocs(extensionRoot: string, options: PromptToolOptions = {}): s
153157
return docs.join("\n\n");
154158
}
155159

156-
function readDefaultSkillDocs(extensionRoot: string): Array<{ name: string; content: string }> {
160+
function readDefaultSkillDocs(
161+
extensionRoot: string,
162+
enabledSkills: Record<string, boolean> = {}
163+
): Array<{ name: string; content: string }> {
157164
const skillsDir = path.join(extensionRoot, "templates", "skills");
158165
return DEFAULT_SKILL_TEMPLATES.map((entry) => {
159166
const fullPath = path.join(skillsDir, entry);
167+
const name = path.basename(entry, ".md");
168+
if (enabledSkills[name] === false) {
169+
return null;
170+
}
160171
try {
161172
return {
162-
name: path.basename(entry, ".md"),
173+
name,
163174
content: fs.readFileSync(fullPath, "utf8").trim(),
164175
};
165176
} catch {
@@ -168,8 +179,8 @@ function readDefaultSkillDocs(extensionRoot: string): Array<{ name: string; cont
168179
}).filter((skill): skill is { name: string; content: string } => Boolean(skill?.content));
169180
}
170181

171-
export function getDefaultSkillPrompt(): string {
172-
const skillDocs = readDefaultSkillDocs(getExtensionRoot());
182+
export function getDefaultSkillPrompt(options: DefaultSkillPromptOptions = {}): string {
183+
const skillDocs = readDefaultSkillDocs(getExtensionRoot(), options.enabledSkills);
173184
if (skillDocs.length === 0) {
174185
return "";
175186
}

src/session.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ ${agentInstructions}
11421142
const systemMessage = this.buildSystemMessage(sessionId, systemPrompt);
11431143
this.appendSessionMessage(sessionId, systemMessage);
11441144

1145-
const defaultSkillPrompt = getDefaultSkillPrompt();
1145+
const defaultSkillPrompt = getDefaultSkillPrompt({ enabledSkills: this.getResolvedSettings().enabledSkills });
11461146
if (defaultSkillPrompt) {
11471147
const defaultSkillMessage = this.buildSystemMessage(sessionId, defaultSkillPrompt);
11481148
this.appendSessionMessage(sessionId, defaultSkillMessage);

src/tests/prompt.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ test("getDefaultSkillPrompt loads the default skill template", () => {
8888
assert.equal(prompt.includes('path="templates/skills/'), false);
8989
});
9090

91+
test("getDefaultSkillPrompt skips disabled default skills", () => {
92+
const prompt = getDefaultSkillPrompt({ enabledSkills: { "karpathy-guidelines": false } });
93+
94+
assert.equal(prompt, "");
95+
});
96+
9197
test("buildSkillDocumentsPrompt excludes SKILL.md frontmatter metadata", () => {
9298
const prompt = buildSkillDocumentsPrompt([
9399
{
@@ -200,8 +206,7 @@ test("runtime prompt assets live under templates", () => {
200206
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "tools", "web-search.md")), true);
201207
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "tools", "read.md.ejs")), true);
202208
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "prompts", "init_command.md.ejs")), true);
203-
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "skills", "agent-drift-guard.md")), true);
204-
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "skills", "plan-and-execute.md")), true);
209+
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "skills", "karpathy-guidelines.md")), true);
205210
assert.equal(fs.existsSync(path.join(repoRoot, "templates", "tools", "read.md")), false);
206211
assert.equal(fs.existsSync(path.join(repoRoot, "docs", "tools")), false);
207212
assert.equal(fs.existsSync(path.join(repoRoot, "docs", "prompts")), false);

src/tests/session.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,6 +1138,40 @@ test("createSession appends default system prompts in prefix-cache-friendly orde
11381138
assert.equal(systemContents[3], "root project instructions");
11391139
});
11401140

1141+
test("createSession skips disabled default skills", async () => {
1142+
const workspace = createTempDir("deepcode-disabled-default-skill-workspace-");
1143+
const home = createTempDir("deepcode-disabled-default-skill-home-");
1144+
setHomeDir(home);
1145+
1146+
const manager = new SessionManager({
1147+
projectRoot: workspace,
1148+
createOpenAIClient: () => ({
1149+
client: null,
1150+
model: "test-model",
1151+
baseURL: "https://api.deepseek.com",
1152+
thinkingEnabled: false,
1153+
machineId: "machine-id-disabled-default-skill",
1154+
}),
1155+
getResolvedSettings: () => ({
1156+
model: "test-model",
1157+
enabledSkills: { "karpathy-guidelines": false },
1158+
}),
1159+
renderMarkdown: (text) => text,
1160+
onAssistantMessage: () => {},
1161+
});
1162+
1163+
const sessionId = await manager.createSession({ text: "hello" });
1164+
const systemContents = manager
1165+
.listSessionMessages(sessionId)
1166+
.filter((message) => message.role === "system")
1167+
.map((message) => message.content ?? "");
1168+
1169+
assert.equal(systemContents.length, 2);
1170+
assert.match(systemContents[0] ?? "", /# Available Tools/);
1171+
assert.doesNotMatch(systemContents.join("\n"), /<karpathy-guidelines-skill>/);
1172+
assert.match(systemContents[1] ?? "", /# Local Workspace Environment/);
1173+
});
1174+
11411175
test("createSession includes agent instructions in the skill matching system prompt", async () => {
11421176
const workspace = createTempDir("deepcode-skill-match-create-workspace-");
11431177
const home = createTempDir("deepcode-skill-match-create-home-");

templates/skills/agent-drift-guard.md

Lines changed: 0 additions & 152 deletions
This file was deleted.

0 commit comments

Comments
 (0)