Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/agents/definitions/cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ const cursor: AgentDefinition = {
id: "cursor",
displayName: "Cursor",
configDir: ".cursor",
skillsParentDir: ".cursor",
userSkillsParentDirs: [join(homedir(), ".cursor")],
skillsParentDir: ".claude",
userSkillsParentDirs: [join(homedir(), ".claude")],
mcp: {
filePath: ".cursor/mcp.json",
rootKey: "mcpServers",
Expand Down
6 changes: 3 additions & 3 deletions src/agents/paths.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ describe("skill discovery paths", () => {
expect(agent.userSkillsParentDirs).toEqual([join(home, ".claude")]);
});

it("cursor needs project and user symlinks", () => {
it("cursor shares .claude skills symlink", () => {
const agent = getAgent("cursor")!;
expect(agent.skillsParentDir).toBe(".cursor");
expect(agent.userSkillsParentDirs).toEqual([join(home, ".cursor")]);
expect(agent.skillsParentDir).toBe(".claude");
expect(agent.userSkillsParentDirs).toEqual([join(home, ".claude")]);
});

// Agents that DO read .agents/skills/ natively need no symlinks
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/init.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,13 @@ describe("runInit", () => {
expect(config.agents).toEqual(["claude", "cursor"]);
});

it("creates agent-specific symlinks when --agents is provided", async () => {
it("creates agent-specific symlinks when --agents is provided (cursor shares .claude)", async () => {
await runInit({ scope: resolveScope("project", dir), agents: ["claude", "cursor"] });

const claudeStat = await lstat(join(dir, ".claude", "skills"));
expect(claudeStat.isSymbolicLink()).toBe(true);
const cursorStat = await lstat(join(dir, ".cursor", "skills"));
expect(cursorStat.isSymbolicLink()).toBe(true);
// Cursor shares .claude/skills — no .cursor/skills symlink created
await expect(lstat(join(dir, ".cursor", "skills"))).rejects.toThrow();
});

it("rejects unknown agent IDs", async () => {
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/install.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ describe("runInstall", () => {
expect(result.installed).toContain("pdf");
});

it("creates agent-specific symlinks", async () => {
it("creates agent-specific symlinks (cursor shares .claude)", async () => {
await writeFile(
join(projectRoot, "agents.toml"),
`version = 1\nagents = ["claude", "cursor"]\n\n[[skills]]\nname = "pdf"\nsource = "git:${repoDir}"\n`,
Expand All @@ -182,11 +182,11 @@ describe("runInstall", () => {
const scope = resolveScope("project", projectRoot);
await runInstall({ scope });

const { lstat } = await import("node:fs/promises");
const { lstat, access } = await import("node:fs/promises");
const claudeStat = await lstat(join(projectRoot, ".claude", "skills"));
expect(claudeStat.isSymbolicLink()).toBe(true);
const cursorStat = await lstat(join(projectRoot, ".cursor", "skills"));
expect(cursorStat.isSymbolicLink()).toBe(true);
// Cursor shares .claude/skills — no .cursor/skills symlink created
await expect(access(join(projectRoot, ".cursor", "skills"))).rejects.toThrow();
});

it("writes MCP configs for declared agents", async () => {
Expand Down