diff --git a/src/specify_cli/_invocation_style.py b/src/specify_cli/_invocation_style.py index 2b5f189488..5390010142 100644 --- a/src/specify_cli/_invocation_style.py +++ b/src/specify_cli/_invocation_style.py @@ -12,7 +12,7 @@ DOLLAR_SKILLS_AGENTS: frozenset[str] = frozenset({"codex", "zcode"}) # Agents that always render /speckit-, regardless of ai_skills. -ALWAYS_SLASH_AGENTS: frozenset[str] = frozenset({"devin", "grok", "trae", "zed"}) +ALWAYS_SLASH_AGENTS: frozenset[str] = frozenset({"devin", "droid", "grok", "trae", "zed"}) # Agents that render /speckit- only when ai_skills is enabled. CONDITIONAL_SLASH_AGENTS: frozenset[str] = frozenset( diff --git a/tests/integrations/test_integration_droid.py b/tests/integrations/test_integration_droid.py index 851a80c5aa..09848af930 100644 --- a/tests/integrations/test_integration_droid.py +++ b/tests/integrations/test_integration_droid.py @@ -43,6 +43,20 @@ def test_multi_install_safe_is_true(self): i = get_integration(self.KEY) assert i.multi_install_safe is True + def test_is_slash_skills_agent(self): + """Droid is an always-skills agent whose commands install as + /speckit-, so is_slash_skills_agent must report True — otherwise + hook invocations and the init next-steps panel render the dotted + /speckit. form Droid never registers (mirrors grok/trae/zed/devin).""" + from specify_cli._invocation_style import is_slash_skills_agent + + # True in BOTH the enabled and disabled cases: Droid is *always* slash, + # not conditional. The disabled case is what distinguishes an + # ALWAYS_SLASH agent from a CONDITIONAL_SLASH one (which would be False + # when ai_skills is disabled). + assert is_slash_skills_agent("droid", True) is True + assert is_slash_skills_agent("droid", False) is True + def test_install_url_points_to_factory(self): i = get_integration(self.KEY) url = i.config.get("install_url")