Skip to content

Commit 4053676

Browse files
committed
feat: improve the Agent Skills scan hierarchy and priority
1 parent 36b108b commit 4053676

6 files changed

Lines changed: 69 additions & 33 deletions

File tree

README-en.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,14 @@ For complete configuration details (multi-level priority, environment variables,
5454
### **Skills**
5555
Deep Code CLI supports agent skills that allow you to extend the assistant's capabilities:
5656

57-
- **User-level Skills**: discovered and activated from `~/.agents/skills/`.
58-
- **Project-level Skills**: loaded from `./.agents/skills/` for project-specific workflows, with legacy `./.deepcode/skills/` compatibility.
57+
Skills are discovered from these locations, in priority order:
58+
59+
| Scope | Path | Purpose |
60+
| :------ | :-------------------- | :---------------------------- |
61+
| Project | `./.deepcode/skills/` | Deep Code's native location |
62+
| Project | `./.agents/skills/` | Cross-client interoperability |
63+
| User | `~/.deepcode/skills/` | Deep Code's native location |
64+
| User | `~/.agents/skills/` | Cross-client interoperability |
5965

6066
### **Optimized for DeepSeek**
6167
- Specifically tuned for DeepSeek model performance.
@@ -200,4 +206,4 @@ If you find this tool helpful, please consider supporting us by:
200206
[github-issues-pr-link]: https://github.com/lessweb/deepcode-cli/pulls
201207
[github-issues-pr-shield]: https://img.shields.io/github/issues-pr/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800
202208
[github-license-link]: https://github.com/lessweb/deepcode-cli/blob/main/LICENSE
203-
[github-license-shield]: https://img.shields.io/github/license/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800
209+
[github-license-shield]: https://img.shields.io/github/license/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800

README-zh_CN.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,14 @@ npm install -g @vegamo/deepcode-cli
5353
### **Skills**
5454
Deep Code CLI 支持 agent skills,允许您扩展助手的能力:
5555

56-
- **User-level Skills**:从 `~/.agents/skills/` 目录中发现并激活 skills。
57-
- **Project-level Skills**:从 `./.agents/skills/` 目录中加载项目专属 skills,并兼容旧的 `./.deepcode/skills/` 目录。
56+
Skills 会按以下优先级扫描:
57+
58+
| Scope | Path | Purpose |
59+
| :------ | :-------------------- | :---------------------------- |
60+
| Project | `./.deepcode/skills/` | Deep Code 原生位置 |
61+
| Project | `./.agents/skills/` | 跨客户端互操作 |
62+
| User | `~/.deepcode/skills/` | Deep Code 原生位置 |
63+
| User | `~/.agents/skills/` | 跨客户端互操作 |
5864

5965
### **为 DeepSeek 优化**
6066
- 专门为 DeepSeek 模型性能调优。
@@ -199,4 +205,4 @@ npm link
199205
[github-issues-pr-link]: https://github.com/lessweb/deepcode-cli/pulls
200206
[github-issues-pr-shield]: https://img.shields.io/github/issues-pr/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800
201207
[github-license-link]: https://github.com/lessweb/deepcode-cli/blob/main/LICENSE
202-
[github-license-shield]: https://img.shields.io/github/license/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800
208+
[github-license-shield]: https://img.shields.io/github/license/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,14 @@ npm install -g @vegamo/deepcode-cli
5353
### **Skills**
5454
Deep Code CLI 支持 agent skills,允许您扩展助手的能力:
5555

56-
- **User-level Skills**:从 `~/.agents/skills/` 目录中发现并激活 skills。
57-
- **Project-level Skills**:从 `./.agents/skills/` 目录中加载项目专属 skills,并兼容旧的 `./.deepcode/skills/` 目录。
56+
Skills 会按以下优先级扫描:
57+
58+
| Scope | Path | Purpose |
59+
| :------ | :-------------------- | :---------------------------- |
60+
| Project | `./.deepcode/skills/` | Deep Code 原生位置 |
61+
| Project | `./.agents/skills/` | 跨客户端互操作 |
62+
| User | `~/.deepcode/skills/` | Deep Code 原生位置 |
63+
| User | `~/.agents/skills/` | 跨客户端互操作 |
5864

5965
### **为 DeepSeek 优化**
6066
- 专门为 DeepSeek 模型性能调优。
@@ -199,4 +205,4 @@ npm link
199205
[github-issues-pr-link]: https://github.com/lessweb/deepcode-cli/pulls
200206
[github-issues-pr-shield]: https://img.shields.io/github/issues-pr/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800
201207
[github-license-link]: https://github.com/lessweb/deepcode-cli/blob/main/LICENSE
202-
[github-license-shield]: https://img.shields.io/github/license/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800
208+
[github-license-shield]: https://img.shields.io/github/license/lessweb/deepcode-cli?color=4d6BFE&labelColor=black&style=flat-square&cacheSeconds=1800

src/cli.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ if (args.includes("--help") || args.includes("-h")) {
2727
"Configuration:",
2828
" ~/.deepcode/settings.json User-level API key, model, base URL",
2929
" ./.deepcode/settings.json Project-level settings",
30-
" ~/.agents/skills/*/SKILL.md User-level skills",
31-
" ./.agents/skills/*/SKILL.md Project-level skills",
32-
" ./.deepcode/skills/*/SKILL.md Legacy project-level skills",
30+
" ./.deepcode/skills/*/SKILL.md Project-level native skills",
31+
" ./.agents/skills/*/SKILL.md Project-level interoperable skills",
32+
" ~/.deepcode/skills/*/SKILL.md User-level native skills",
33+
" ~/.agents/skills/*/SKILL.md User-level interoperable skills",
3334
"",
3435
"Inside the TUI:",
3536
" enter Send the prompt",

src/session.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -787,9 +787,12 @@ The candidate skills are as follows:\n\n`;
787787

788788
async listSkills(sessionId?: string): Promise<SkillInfo[]> {
789789
const homeDir = os.homedir();
790-
const agentsRoot = path.join(homeDir, ".agents", "skills");
791-
const legacyProjectSkillsRoot = path.join(this.projectRoot, ".deepcode", "skills");
792-
const projectAgentsSkillsRoot = path.join(this.projectRoot, ".agents", "skills");
790+
const skillRoots = [
791+
{ root: path.join(this.projectRoot, ".deepcode", "skills"), displayRoot: "./.deepcode/skills" },
792+
{ root: path.join(this.projectRoot, ".agents", "skills"), displayRoot: "./.agents/skills" },
793+
{ root: path.join(homeDir, ".deepcode", "skills"), displayRoot: "~/.deepcode/skills" },
794+
{ root: path.join(homeDir, ".agents", "skills"), displayRoot: "~/.agents/skills" },
795+
];
793796
const skillsByName = new Map<string, SkillInfo>();
794797

795798
const collectSkills = (root: string, displayRoot: string): SkillInfo[] => {
@@ -826,14 +829,12 @@ The candidate skills are as follows:\n\n`;
826829
return results;
827830
};
828831

829-
for (const skill of collectSkills(agentsRoot, "~/.agents/skills")) {
830-
skillsByName.set(skill.name, skill);
831-
}
832-
for (const skill of collectSkills(legacyProjectSkillsRoot, "./.deepcode/skills")) {
833-
skillsByName.set(skill.name, skill);
834-
}
835-
for (const skill of collectSkills(projectAgentsSkillsRoot, "./.agents/skills")) {
836-
skillsByName.set(skill.name, skill);
832+
for (const { root, displayRoot } of skillRoots) {
833+
for (const skill of collectSkills(root, displayRoot)) {
834+
if (!skillsByName.has(skill.name)) {
835+
skillsByName.set(skill.name, skill);
836+
}
837+
}
837838
}
838839

839840
if (sessionId) {

src/tests/session.test.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ test("SessionManager marks skills loaded from existing session messages", async
415415
assert.equal(loadedSkill?.isLoaded, true);
416416
});
417417

418-
test("SessionManager lists project skills from .agents with legacy .deepcode compatibility", async () => {
418+
test("SessionManager lists skills from Deep Code and .agents roots by priority", async () => {
419419
const workspace = createTempDir("deepcode-project-skills-workspace-");
420420
const home = createTempDir("deepcode-project-skills-home-");
421421
setHomeDir(home);
@@ -428,11 +428,19 @@ test("SessionManager lists project skills from .agents with legacy .deepcode com
428428
"utf8"
429429
);
430430

431-
const legacyProjectSkillDir = path.join(workspace, ".deepcode", "skills", "legacy");
432-
fs.mkdirSync(legacyProjectSkillDir, { recursive: true });
431+
const userNativeSkillDir = path.join(home, ".deepcode", "skills", "native-user");
432+
fs.mkdirSync(userNativeSkillDir, { recursive: true });
433433
fs.writeFileSync(
434-
path.join(legacyProjectSkillDir, "SKILL.md"),
435-
"---\nname: legacy\ndescription: Legacy project skill\n---\n# Legacy\n",
434+
path.join(userNativeSkillDir, "SKILL.md"),
435+
"---\nname: native-user\ndescription: User .deepcode skill\n---\n# Native User\n",
436+
"utf8"
437+
);
438+
439+
const userNativeSharedSkillDir = path.join(home, ".deepcode", "skills", "shared");
440+
fs.mkdirSync(userNativeSharedSkillDir, { recursive: true });
441+
fs.writeFileSync(
442+
path.join(userNativeSharedSkillDir, "SKILL.md"),
443+
"---\nname: shared\ndescription: User .deepcode skill\n---\n# Shared\n",
436444
"utf8"
437445
);
438446

@@ -444,15 +452,23 @@ test("SessionManager lists project skills from .agents with legacy .deepcode com
444452
"utf8"
445453
);
446454

455+
const projectNativeSkillDir = path.join(workspace, ".deepcode", "skills", "shared");
456+
fs.mkdirSync(projectNativeSkillDir, { recursive: true });
457+
fs.writeFileSync(
458+
path.join(projectNativeSkillDir, "SKILL.md"),
459+
"---\nname: shared\ndescription: Project .deepcode skill\n---\n# Shared\n",
460+
"utf8"
461+
);
462+
447463
const manager = createSessionManager(workspace, "machine-id-project-skills");
448464
const skills = await manager.listSkills();
449-
const legacySkill = skills.find((skill) => skill.name === "legacy");
465+
const nativeUserSkill = skills.find((skill) => skill.name === "native-user");
450466
const sharedSkill = skills.find((skill) => skill.name === "shared");
451467

452-
assert.equal(legacySkill?.path, "./.deepcode/skills/legacy/SKILL.md");
453-
assert.equal(legacySkill?.description, "Legacy project skill");
454-
assert.equal(sharedSkill?.path, "./.agents/skills/shared/SKILL.md");
455-
assert.equal(sharedSkill?.description, "Project .agents skill");
468+
assert.equal(nativeUserSkill?.path, "~/.deepcode/skills/native-user/SKILL.md");
469+
assert.equal(nativeUserSkill?.description, "User .deepcode skill");
470+
assert.equal(sharedSkill?.path, "./.deepcode/skills/shared/SKILL.md");
471+
assert.equal(sharedSkill?.description, "Project .deepcode skill");
456472
});
457473

458474
test("SessionManager dispose disconnects MCP servers", async () => {

0 commit comments

Comments
 (0)