Skip to content
Open
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
2 changes: 1 addition & 1 deletion src/specify_cli/_invocation_style.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
DOLLAR_SKILLS_AGENTS: frozenset[str] = frozenset({"codex", "zcode"})

# Agents that always render /speckit-<name>, 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-<name> only when ai_skills is enabled.
CONDITIONAL_SLASH_AGENTS: frozenset[str] = frozenset(
Expand Down
14 changes: 14 additions & 0 deletions tests/integrations/test_integration_droid.py
Original file line number Diff line number Diff line change
Expand Up @@ -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-<name>, so is_slash_skills_agent must report True — otherwise
hook invocations and the init next-steps panel render the dotted
/speckit.<name> 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")
Expand Down