Skip to content

fix(alquimia): render /speckit-<name> invocations for the skills-only Alquimia agent - #4137

Open
jawwad-ali wants to merge 1 commit into
github:mainfrom
jawwad-ali:fix/alquimia-slash-skills-invocation
Open

fix(alquimia): render /speckit-<name> invocations for the skills-only Alquimia agent#4137
jawwad-ali wants to merge 1 commit into
github:mainfrom
jawwad-ali:fix/alquimia-slash-skills-invocation

Conversation

@jawwad-ali

Copy link
Copy Markdown
Contributor

Problem

alquimia is the only one of the 19 SkillsIntegration subclasses absent from every set in _invocation_style.py (ALWAYS_SLASH_AGENTS / CONDITIONAL_SLASH_AGENTS / DOLLAR_SKILLS_AGENTS / SKILL_COLON_AGENTS).

I checked that programmatically rather than by eye:

SkillsIntegration subclasses NOT in any invocation set: ['alquimia']
total in sets: 18

It installs .alquimia/skills/speckit-<name>/SKILL.md, and its own inherited build_command_invocation() already returns /speckit-plan. But is_slash_skills_agent("alquimia", True) returned False, so the two callers that consult the helper fell through to the dotted form Alquimia never registers:

  • HookExecutor._render_hook_invocation (extensions/__init__.py) → /speckit.plan
  • specify init's Next Steps panel (commands/init.py) → /speckit.plan

So the integration's own renderer and the shared helper disagreed for the same on-disk layout.

Reproduction on current main (bf88c9f)

Real specify init --here --integration <agent> --script sh --ignore-agent-tools:

BEFORE
  alquimia -> 2.1 /speckit.constitution      <-- wrong
  droid    -> 2.1 /speckit-constitution

AFTER
  alquimia -> 2.1 /speckit-constitution
  droid    -> 2.1 /speckit-constitution

Both agents produce an identical .../skills/speckit-*/SKILL.md layout, so there is no basis for the difference.

Which set — a judgment call, stated plainly

I put it in CONDITIONAL_SLASH_AGENTS, not ALWAYS_SLASH_AGENTS, and I want to be explicit that this is a choice rather than something the code forces:

  • Every ALWAYS_SLASH member has commands_subdir: "skills" — but so does claude, which is CONDITIONAL, so that field is not the discriminator.
  • Neither alquimia nor droid nor claude declares an options() mode toggle, so that isn't either.
  • specify init writes ai_skills: true for alquimia (verified), so CONDITIONAL fixes the real path.

CONDITIONAL is the conservative option: it renders the hyphenated form only when skills are actually enabled, so it stays correct if alquimia ever gains a commands mode. If you'd rather it be ALWAYS alongside the other skills-only agents, that's a one-word change and I'm happy to make it.

Note on scope

The third consumer, _resolve_command_ref_tokens, already falls back to integration.build_command_invocation() and was therefore always correct — this changes nothing there.

Verification

  • Fail-before / pass-after: 2 new-vs-baseline failures with the source reverted → 38 passed with the fix.
  • After the change, no SkillsIntegration subclass is unmapped: SkillsIntegration subclasses still missing: NONE.
  • Scoped regression over tests/integrations: no new failures vs a clean-main baseline captured on bf88c9f9 (18 pre-existing in scope, all Windows symlink-privilege).
  • uvx ruff@0.15.0 check src tests → clean

Tests mirror test_integration_droid.py::TestDroidIntegration::test_is_slash_skills_agent, including the disabled case that distinguishes conditional from always.


Written with assistance from Claude Code. Bug found, reproduced, and verified by me on current main.

… agent

`alquimia` was the only one of the 19 SkillsIntegration subclasses absent
from every set in _invocation_style.py. It installs
`.alquimia/skills/speckit-<name>/SKILL.md` and its own
`build_command_invocation()` already returns `/speckit-plan`, but
`is_slash_skills_agent("alquimia", True)` returned False, so the two
callers that consult it emitted the dotted form Alquimia never registers:

* HookExecutor._render_hook_invocation -> `/speckit.plan`
* `specify init`'s Next Steps panel    -> `/speckit.plan`

Measured before, for an identical on-disk layout:

  alquimia -> 2.1 /speckit.constitution      <-- wrong
  droid    -> 2.1 /speckit-constitution

and after:

  alquimia -> 2.1 /speckit-constitution
  droid    -> 2.1 /speckit-constitution

Added to CONDITIONAL_SLASH_AGENTS rather than ALWAYS_SLASH_AGENTS: it is
the conservative choice, matching `claude`, which shares alquimia's
`commands_subdir: "skills"`. `specify init` writes `ai_skills: true` for
alquimia, so this covers the real path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jawwad-ali
jawwad-ali requested a review from mnriem as a code owner August 15, 2026 14:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant