From 1c8fabd293f27b2faf20ed2b6ac0dc6d16ae8b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=B4=E5=A5=B9=E5=91=BD=40?= <908280968@qq.com> Date: Tue, 28 Jul 2026 04:12:22 +0800 Subject: [PATCH] fix(server): discover Codex project skills from cwd (#2423) --- .../providers/codex-app-server-agent.test.ts | 28 +++++++++++++++++-- .../agent/providers/codex-app-server-agent.ts | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts index 50c3baaae..2a4783534 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts @@ -271,14 +271,19 @@ async function listCommandsFromFakeCodex(skills: unknown[]): Promise { const message = JSON.parse(line); if (typeof message.id !== "number") continue; try { - process.stdout.write(JSON.stringify({ id: message.id, result: resultFor(message.method) }) + "\\n"); + process.stdout.write(JSON.stringify({ id: message.id, result: resultFor(message.method, message.params) }) + "\\n"); } catch (error) { process.stdout.write(JSON.stringify({ id: message.id, error: { message: error.message } }) + "\\n"); } @@ -1498,6 +1503,23 @@ describe("Codex app-server provider", () => { ); }); + test("lists project skill commands when app-server receives the project cwd in cwds", async () => { + const commands = await listCommandsFromFakeCodex([ + { + name: "project-skill-discovery-regression", + description: "A skill discovered from this project.", + path: "/tmp/codex-question-test/.agents/skills/project-skill-discovery-regression/SKILL.md", + }, + ]); + + expect(commands).toContainEqual({ + name: "project-skill-discovery-regression", + description: "A skill discovered from this project.", + argumentHint: "", + kind: "skill", + }); + }); + test("deduplicates Codex skill slash commands returned from multiple skill roots", async () => { const commands = await listCommandsFromFakeCodex([ { diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.ts index 19f691106..fc26e7a47 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.ts @@ -3306,7 +3306,7 @@ export class CodexAppServerAgentSession implements AgentSession { try { const response = toObjectRecord( await this.client.request("skills/list", { - cwd: [this.config.cwd], + cwds: [this.config.cwd], }), ); const entries = Array.isArray(response?.data) ? response.data : [];