authorgravatar for lucenz@proton.meSimone <lucenz@proton.me> 2026-09-04 01:17:57+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-03 16:17:57-07:00
log0aae1e2ad7ab174004f39746eb4c72b905de932d
treefc075fbd5959a73717a3bde40a4ea682b5f19a57
parent80b53730d1e821563e5c348fdf4f5fc7616a49f7
signature Signed by PGP key B5690EEEBB952194

fix(antigravity): discover legacy workspace skills (#9410)

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>

3 files changed, 28 insertions(+), 1 deletions(-)

apps/server/src/provider/Drivers/AntigravitySkills.test.ts+23-1
......@@ -28,7 +28,7 @@ const makeWorkspace = Effect.fn("makeWorkspace")(function* () {
2828});
2929
3030it.layer(NodeServices.layer)("discoverAntigravitySkills", (it) => {
31 it.effect("reads skill names, descriptions and paths from all four native roots", () =>
31 it.effect("reads skill names, descriptions and paths from the current native roots", () =>
3232 Effect.gen(function* () {
3333 const path = yield* Path.Path;
3434 const input = yield* makeWorkspace();
......@@ -63,6 +63,27 @@ it.layer(NodeServices.layer)("discoverAntigravitySkills", (it) => {
6363 }),
6464 );
6565
66 it.effect("discovers skills from the legacy workspace root", () =>
67 Effect.gen(function* () {
68 const path = yield* Path.Path;
69 const input = yield* makeWorkspace();
70 const skillPath = yield* writeSkill(
71 path.join(input.cwd, ".agent", "skills", "review"),
72 "---\nname: review\ndescription: Review changes.\n---\n",
73 );
74
75 assert.deepEqual(yield* discoverAntigravitySkills(input), [
76 {
77 name: "review",
78 description: "Review changes.",
79 path: skillPath,
80 scope: "project",
81 enabled: true,
82 },
83 ]);
84 }),
85 );
86
6687 it.effect("uses native root order for duplicate names", () =>
6788 Effect.gen(function* () {
6889 const fileSystem = yield* FileSystem.FileSystem;
......@@ -73,6 +94,7 @@ it.layer(NodeServices.layer)("discoverAntigravitySkills", (it) => {
7394 path.join(input.cwd, ".gemini", "skills"),
7495 path.join(input.profileDirectory, "antigravity-cli", "skills"),
7596 path.join(input.cwd, ".agents", "skills"),
97 path.join(input.cwd, ".agent", "skills"),
7698 ];
7799 for (const [index, root] of roots.entries()) {
78100 yield* writeSkill(
apps/server/src/provider/Drivers/AntigravitySkills.ts+1
......@@ -134,6 +134,7 @@ export const discoverAntigravitySkills = Effect.fn("discoverAntigravitySkills")(
134134 scope: "user",
135135 },
136136 { directory: path.resolve(input.cwd, ".agents", "skills"), scope: "project" },
137 { directory: path.resolve(input.cwd, ".agent", "skills"), scope: "project" },
137138 ];
138139 const budget: ScanBudget = {
139140 remainingBytes: MAX_SCAN_BYTES,
docs/user/providers-antigravity.md+4
......@@ -117,6 +117,10 @@ T3 Code asks you to select an available model instead of silently changing it.
117117Use Antigravity's native `/plan` command to request a plan. T3 Code's separate Plan mode control
118118is not available for this provider.
119119
120Project skills should use `.agents/skills`. T3 Code also discovers `.gemini/skills` and the legacy
121`.agent/skills` location. When multiple locations define the same skill name, `.gemini/skills`
122takes precedence, followed by `.agents/skills` and then `.agent/skills`.
123
120124Antigravity reads and edits workspace files through T3 Code. Each write shows up as a file
121125change approval with the content, so **Supervised** and **Auto-accept edits** behave the same way
122126they do for other providers. Attach images, PDFs, text files, or audio clips to a message and