fix(integrations): dispatch bob commands via bob run - #4492
Conversation
`BobIntegration` never overrode `build_exec_args()`, so it inherited the `IntegrationBase` no-op returning `None`. Callers read `None` as "this CLI is unavailable", so every workflow command/prompt step targeting Bob reported `CLI not found or not installed` even with `bob` on PATH. `build_command_invocation()` was inherited too, rendering `/speckit.specify` where skills-mode projects install `.bob/skills/speckit-specify/`.
There was a problem hiding this comment.
🟡 Changes recommended
Legacy-mode and dotted extension commands currently produce incorrect invocations.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Enables Bob workflow dispatch through its headless bob run interface.
Changes:
- Adds Bob CLI argument and command-invocation construction.
- Adds regression tests for dispatch formats and IDE-first configuration.
File summaries
| File | Description |
|---|---|
src/specify_cli/integrations/bob/__init__.py |
Implements Bob headless dispatch. |
tests/integrations/test_integration_bob.py |
Tests Bob dispatch behavior. |
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 2
- Review effort level: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| stem = command_name | ||
| if stem.startswith("speckit."): | ||
| stem = stem[len("speckit."):] | ||
| sep = self.effective_invoke_separator() |
| if stem.startswith("speckit."): | ||
| stem = stem[len("speckit."):] | ||
| sep = self.effective_invoke_separator() | ||
| invocation = f"/speckit{sep}{stem}" |
|
Thanks — the |
Description
Fixes #4491.
BobIntegrationnever overrodebuild_exec_args(), so it inherited theIntegrationBaseno-op returningNone. Every workflowcommand:/prompt:step targeting Bob failed with "CLI not found or not installed" even with
bobon PATH. Bob Shell has a headless entry point (
bob run), so this dispatchesthrough it.
Also overrides
build_command_invocation(), which was inherited fromIntegrationBasewith a hardcoded.and rendered/speckit.specifywhereskills-mode projects install
.bob/skills/speckit-specify/. The class alreadycomputes the right separator in
effective_invoke_separator().requires_clistaysFalse— dispatch is opt-in by overriding the method,mirroring
CursorAgentIntegration. Same fix shape as #2631.Testing
uv run specify --helpuv sync && uv run pytestAdded 6 tests to
tests/integrations/test_integration_bob.py(62 pass in thatfile);
tests/test_agent_config_consistency.pypasses.Verified end-to-end against Bob Shell 2.0.1: a workspace skill at
.bob/skills/speckit-marker/was reached throughdispatch_command → build_exec_args → bob run, returningstatus: successwith one
UseSkillToolcall.Note: the full suite shows 11 failures in the bash/Python parity tests. They are
identical on
mainwithout this change — 11 failed / 7702 passed onmain,11 failed / 7708 passed here, same test set — and pass when run in isolation.
AI Disclosure
Investigation, patch and tests written with Claude; reviewed and verified by me.