From ed8caa3c331a0ecf3e49f594da33e93bd4680820 Mon Sep 17 00:00:00 2001 From: BachVQ <47909357+baveku@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:07:31 +0700 Subject: [PATCH 1/9] refactor(agy): update storage directory from .agent to .agents --- src/specify_cli/integrations/agy/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/specify_cli/integrations/agy/__init__.py b/src/specify_cli/integrations/agy/__init__.py index 9cd522745e..065d642596 100644 --- a/src/specify_cli/integrations/agy/__init__.py +++ b/src/specify_cli/integrations/agy/__init__.py @@ -16,13 +16,13 @@ class AgyIntegration(SkillsIntegration): key = "agy" config = { "name": "Antigravity", - "folder": ".agent/", + "folder": ".agents/", "commands_subdir": "skills", "install_url": None, "requires_cli": False, } registrar_config = { - "dir": ".agent/skills", + "dir": ".agents/skills", "format": "markdown", "args": "$ARGUMENTS", "extension": "/SKILL.md", @@ -36,6 +36,6 @@ def options(cls) -> list[IntegrationOption]: "--skills", is_flag=True, default=True, - help="Install as agent skills (default for Antigravity since v1.20.5)", + help="Install as agent skills (default for Antigravity since v1.23.2)", ), ] From 2f623143fe1d9f1c7a9e6f684af41768c37a43ea Mon Sep 17 00:00:00 2001 From: jbach Date: Mon, 20 Apr 2026 22:20:12 +0700 Subject: [PATCH 2/9] feat: update Antigravity integration to use .agents/ directory layout and add version compatibility warnings --- src/specify_cli/integrations/agy/__init__.py | 30 ++++++++++++++++++-- tests/integrations/test_integration_agy.py | 18 ++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/specify_cli/integrations/agy/__init__.py b/src/specify_cli/integrations/agy/__init__.py index 065d642596..e9ad17971a 100644 --- a/src/specify_cli/integrations/agy/__init__.py +++ b/src/specify_cli/integrations/agy/__init__.py @@ -1,14 +1,21 @@ """Antigravity (agy) integration — skills-based agent. -Antigravity uses ``.agent/skills/speckit-/SKILL.md`` layout. +Antigravity uses ``.agents/skills/speckit-/SKILL.md`` layout. Explicit command support was deprecated in version 1.20.5; -``--skills`` defaults to ``True``. +``--skills`` defaults to ``True``. The ``.agents/`` path replaces ``.agent/`` starting in v1.19.5. """ from __future__ import annotations +from pathlib import Path +from typing import TYPE_CHECKING, Any + from ..base import IntegrationOption, SkillsIntegration +if TYPE_CHECKING: + from ..manifest import IntegrationManifest + + class AgyIntegration(SkillsIntegration): """Integration for Antigravity IDE.""" @@ -36,6 +43,23 @@ def options(cls) -> list[IntegrationOption]: "--skills", is_flag=True, default=True, - help="Install as agent skills (default for Antigravity since v1.23.2)", + help="Install as agent skills (default for Antigravity since v1.19.5)", ), ] + + def setup( + self, + project_root: Path, + manifest: IntegrationManifest, + parsed_options: dict[str, Any] | None = None, + **opts: Any, + ) -> list[Path]: + import click + + click.secho( + "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer. " + "Please ensure your agy installation is up to date.", + fg="yellow", + err=True, + ) + return super().setup(project_root, manifest, parsed_options=parsed_options, **opts) diff --git a/tests/integrations/test_integration_agy.py b/tests/integrations/test_integration_agy.py index 21cb1d832e..3b5bb2d48e 100644 --- a/tests/integrations/test_integration_agy.py +++ b/tests/integrations/test_integration_agy.py @@ -5,9 +5,9 @@ class TestAgyIntegration(SkillsIntegrationTests): KEY = "agy" - FOLDER = ".agent/" + FOLDER = ".agents/" COMMANDS_SUBDIR = "skills" - REGISTRAR_DIR = ".agent/skills" + REGISTRAR_DIR = ".agents/skills" CONTEXT_FILE = "AGENTS.md" @@ -24,4 +24,16 @@ def test_ai_agy_without_ai_skills_auto_promotes(self, tmp_path): result = runner.invoke(app, ["init", str(target), "--ai", "agy", "--no-git", "--script", "sh"]) assert result.exit_code == 0, f"init --ai agy failed: {result.output}" - assert (target / ".agent" / "skills" / "speckit-plan" / "SKILL.md").exists() + assert (target / ".agents" / "skills" / "speckit-plan" / "SKILL.md").exists() + + def test_agy_setup_warning(self, tmp_path): + """Agy integration should print a warning about v1.19.5 requirement during setup.""" + from typer.testing import CliRunner + from specify_cli import app + + runner = CliRunner() + target = tmp_path / "test-proj2" + result = runner.invoke(app, ["init", str(target), "--ai", "agy", "--no-git", "--script", "sh"]) + + assert result.exit_code == 0 + assert "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer" in result.output From ad6cdb241451e5a47a666ceacc0ee0527c96b29b Mon Sep 17 00:00:00 2001 From: BachVQ <47909357+baveku@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:39:25 +0700 Subject: [PATCH 3/9] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/integrations/test_integration_agy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/test_integration_agy.py b/tests/integrations/test_integration_agy.py index 3b5bb2d48e..ef1039ab92 100644 --- a/tests/integrations/test_integration_agy.py +++ b/tests/integrations/test_integration_agy.py @@ -36,4 +36,4 @@ def test_agy_setup_warning(self, tmp_path): result = runner.invoke(app, ["init", str(target), "--ai", "agy", "--no-git", "--script", "sh"]) assert result.exit_code == 0 - assert "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer" in result.output + assert "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer" in result.stderr From 0aafaf93db48668c5e8f4f976d129e6363fac1b6 Mon Sep 17 00:00:00 2001 From: jbach Date: Mon, 20 Apr 2026 22:42:30 +0700 Subject: [PATCH 4/9] refactor: remove deprecated --skills flag from AgyIntegration and update related test assertions --- src/specify_cli/integrations/agy/__init__.py | 16 ++-------------- tests/integrations/test_integration_agy.py | 10 +++++++++- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/specify_cli/integrations/agy/__init__.py b/src/specify_cli/integrations/agy/__init__.py index e9ad17971a..c7dd16c26b 100644 --- a/src/specify_cli/integrations/agy/__init__.py +++ b/src/specify_cli/integrations/agy/__init__.py @@ -1,8 +1,7 @@ """Antigravity (agy) integration — skills-based agent. -Antigravity uses ``.agents/skills/speckit-/SKILL.md`` layout. -Explicit command support was deprecated in version 1.20.5; -``--skills`` defaults to ``True``. The ``.agents/`` path replaces ``.agent/`` starting in v1.19.5. +Antigravity uses ``.agents/skills/speckit-/SKILL.md`` layout (starting in v1.19.5). +Explicit command support was deprecated in version 1.20.5. """ from __future__ import annotations @@ -36,17 +35,6 @@ class AgyIntegration(SkillsIntegration): } context_file = "AGENTS.md" - @classmethod - def options(cls) -> list[IntegrationOption]: - return [ - IntegrationOption( - "--skills", - is_flag=True, - default=True, - help="Install as agent skills (default for Antigravity since v1.19.5)", - ), - ] - def setup( self, project_root: Path, diff --git a/tests/integrations/test_integration_agy.py b/tests/integrations/test_integration_agy.py index 3b5bb2d48e..7216994d20 100644 --- a/tests/integrations/test_integration_agy.py +++ b/tests/integrations/test_integration_agy.py @@ -10,6 +10,13 @@ class TestAgyIntegration(SkillsIntegrationTests): REGISTRAR_DIR = ".agents/skills" CONTEXT_FILE = "AGENTS.md" + def test_options_include_skills_flag(self): + """AgyIntegration no longer supports the --skills flag (it's the only layout).""" + from specify_cli.integrations import get_integration + i = get_integration(self.KEY) + skills_opts = [o for o in i.options() if o.name == "--skills"] + assert len(skills_opts) == 0 + class TestAgyAutoPromote: """--ai agy auto-promotes to integration path.""" @@ -36,4 +43,5 @@ def test_agy_setup_warning(self, tmp_path): result = runner.invoke(app, ["init", str(target), "--ai", "agy", "--no-git", "--script", "sh"]) assert result.exit_code == 0 - assert "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer" in result.output + output = result.stderr if getattr(result, "stderr", None) is not None else result.output + assert "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer" in output From e262d582273c38b16f8c888d6502fc60e746683c Mon Sep 17 00:00:00 2001 From: BachVQ <47909357+baveku@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:54:12 +0700 Subject: [PATCH 5/9] Update src/specify_cli/integrations/agy/__init__.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/specify_cli/integrations/agy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/specify_cli/integrations/agy/__init__.py b/src/specify_cli/integrations/agy/__init__.py index c7dd16c26b..bf2523e7a8 100644 --- a/src/specify_cli/integrations/agy/__init__.py +++ b/src/specify_cli/integrations/agy/__init__.py @@ -9,7 +9,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from ..base import IntegrationOption, SkillsIntegration +from ..base import SkillsIntegration if TYPE_CHECKING: from ..manifest import IntegrationManifest From 8ab0c555e0cf79347055366b100b8cabd6330f21 Mon Sep 17 00:00:00 2001 From: jbach Date: Mon, 20 Apr 2026 22:56:32 +0700 Subject: [PATCH 6/9] refactor: update Antigravity integration requirement to v1.20.5 and remove obsolete tests --- src/specify_cli/integrations/agy/__init__.py | 5 ++--- tests/integrations/test_integration_agy.py | 9 +++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/specify_cli/integrations/agy/__init__.py b/src/specify_cli/integrations/agy/__init__.py index c7dd16c26b..6cfa17228d 100644 --- a/src/specify_cli/integrations/agy/__init__.py +++ b/src/specify_cli/integrations/agy/__init__.py @@ -1,7 +1,6 @@ """Antigravity (agy) integration — skills-based agent. -Antigravity uses ``.agents/skills/speckit-/SKILL.md`` layout (starting in v1.19.5). -Explicit command support was deprecated in version 1.20.5. +Antigravity uses ``.agents/skills/speckit-/SKILL.md`` layout (enforced since v1.20.5). """ from __future__ import annotations @@ -45,7 +44,7 @@ def setup( import click click.secho( - "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer. " + "Warning: The .agents/ layout requires Antigravity v1.20.5 or newer. " "Please ensure your agy installation is up to date.", fg="yellow", err=True, diff --git a/tests/integrations/test_integration_agy.py b/tests/integrations/test_integration_agy.py index ecb64c1b5e..d68ca1498e 100644 --- a/tests/integrations/test_integration_agy.py +++ b/tests/integrations/test_integration_agy.py @@ -11,6 +11,10 @@ class TestAgyIntegration(SkillsIntegrationTests): CONTEXT_FILE = "AGENTS.md" def test_options_include_skills_flag(self): + """Override inherited test: AgyIntegration no longer supports the --skills flag.""" + pass + + def test_options_exclude_skills_flag(self): """AgyIntegration no longer supports the --skills flag (it's the only layout).""" from specify_cli.integrations import get_integration i = get_integration(self.KEY) @@ -34,13 +38,14 @@ def test_ai_agy_without_ai_skills_auto_promotes(self, tmp_path): assert (target / ".agents" / "skills" / "speckit-plan" / "SKILL.md").exists() def test_agy_setup_warning(self, tmp_path): - """Agy integration should print a warning about v1.19.5 requirement during setup.""" + """Agy integration should print a warning about v1.20.5 requirement during setup.""" from typer.testing import CliRunner from specify_cli import app + # Click >= 8.2 separates stdout and stderr natively, mix_stderr is removed runner = CliRunner() target = tmp_path / "test-proj2" result = runner.invoke(app, ["init", str(target), "--ai", "agy", "--no-git", "--script", "sh"]) assert result.exit_code == 0 - assert "Warning: The .agents/ layout requires Antigravity v1.19.5 or newer" in result.stderr + assert "Warning: The .agents/ layout requires Antigravity v1.20.5 or newer" in result.stderr From 6a86ebe601387865e7fcd7fc0d02082091725fb1 Mon Sep 17 00:00:00 2001 From: jbach Date: Mon, 20 Apr 2026 23:09:38 +0700 Subject: [PATCH 7/9] test: update skills directory path from .agent to .agents in preset restoration test --- tests/test_presets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_presets.py b/tests/test_presets.py index 35c19bdd7f..60322b99a1 100644 --- a/tests/test_presets.py +++ b/tests/test_presets.py @@ -2447,7 +2447,7 @@ def test_kimi_preset_skill_override_resolves_script_placeholders(self, project_d def test_agy_skill_restored_on_preset_remove(self, project_dir, temp_dir): """Agy preset removal should restore native skills instead of deleting them.""" self._write_init_options(project_dir, ai="agy", ai_skills=True) - skills_dir = project_dir / ".agent" / "skills" + skills_dir = project_dir / ".agents" / "skills" self._create_skill(skills_dir, "speckit-specify", body="before override") core_command = project_dir / ".specify" / "templates" / "commands" / "specify.md" From 34fd3b9cf15667e44e2176363d68c5bcdffd6e07 Mon Sep 17 00:00:00 2001 From: BachVQ <47909357+baveku@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:20:05 +0700 Subject: [PATCH 8/9] Update tests/integrations/test_integration_agy.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/integrations/test_integration_agy.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/integrations/test_integration_agy.py b/tests/integrations/test_integration_agy.py index d68ca1498e..6d7854162b 100644 --- a/tests/integrations/test_integration_agy.py +++ b/tests/integrations/test_integration_agy.py @@ -12,7 +12,10 @@ class TestAgyIntegration(SkillsIntegrationTests): def test_options_include_skills_flag(self): """Override inherited test: AgyIntegration no longer supports the --skills flag.""" - pass + from specify_cli.integrations import get_integration + i = get_integration(self.KEY) + skills_opts = [o for o in i.options() if o.name == "--skills"] + assert len(skills_opts) == 0 def test_options_exclude_skills_flag(self): """AgyIntegration no longer supports the --skills flag (it's the only layout).""" From d1c57ef82c009dad9e553778537394ff6948c6b7 Mon Sep 17 00:00:00 2001 From: BachVQ <47909357+baveku@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:32:14 +0700 Subject: [PATCH 9/9] Update tests/integrations/test_integration_agy.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/integrations/test_integration_agy.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/integrations/test_integration_agy.py b/tests/integrations/test_integration_agy.py index 6d7854162b..b95caf3bee 100644 --- a/tests/integrations/test_integration_agy.py +++ b/tests/integrations/test_integration_agy.py @@ -11,20 +11,11 @@ class TestAgyIntegration(SkillsIntegrationTests): CONTEXT_FILE = "AGENTS.md" def test_options_include_skills_flag(self): - """Override inherited test: AgyIntegration no longer supports the --skills flag.""" + """Override inherited test: AgyIntegration should not expose a --skills flag because .agents/ is its only layout.""" from specify_cli.integrations import get_integration i = get_integration(self.KEY) skills_opts = [o for o in i.options() if o.name == "--skills"] assert len(skills_opts) == 0 - - def test_options_exclude_skills_flag(self): - """AgyIntegration no longer supports the --skills flag (it's the only layout).""" - from specify_cli.integrations import get_integration - i = get_integration(self.KEY) - skills_opts = [o for o in i.options() if o.name == "--skills"] - assert len(skills_opts) == 0 - - class TestAgyAutoPromote: """--ai agy auto-promotes to integration path."""