Skip to content

Commit 68bb876

Browse files
committed
address 3 comments from copilot
1 parent 7edf5b5 commit 68bb876

5 files changed

Lines changed: 40 additions & 23 deletions

File tree

src/specify_cli/commands/init.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -501,10 +501,13 @@ def init(
501501
_legacy_commands = bool(
502502
(integration_parsed_options or {}).get("legacy_commands")
503503
)
504-
if (
504+
_skills_mode_attr = getattr(resolved_integration, "_skills_mode", None)
505+
_is_skills = (
505506
isinstance(resolved_integration, _SkillsPersist)
506-
or getattr(resolved_integration, "_skills_mode", False)
507-
) and not _legacy_commands:
507+
or (callable(_skills_mode_attr) and _skills_mode_attr(integration_parsed_options))
508+
or (not callable(_skills_mode_attr) and bool(_skills_mode_attr))
509+
)
510+
if _is_skills and not _legacy_commands:
508511
init_opts["ai_skills"] = True
509512
save_init_options(project_path, init_opts)
510513

@@ -648,9 +651,12 @@ def init(
648651

649652
from ..integrations.base import SkillsIntegration as _SkillsInt
650653

651-
_is_skills_integration = isinstance(
652-
resolved_integration, _SkillsInt
653-
) or getattr(resolved_integration, "_skills_mode", False)
654+
_skills_mode_attr = getattr(resolved_integration, "_skills_mode", None)
655+
_is_skills_integration = (
656+
isinstance(resolved_integration, _SkillsInt)
657+
or (callable(_skills_mode_attr) and _skills_mode_attr(integration_parsed_options))
658+
or (not callable(_skills_mode_attr) and bool(_skills_mode_attr))
659+
)
654660

655661
codex_skill_mode = selected_ai == "codex" and _is_skills_integration
656662
zcode_skill_mode = selected_ai == "zcode" and _is_skills_integration

src/specify_cli/integrations/_helpers.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ def _update_init_options_for_integration(
252252
project_root: Path,
253253
integration: Any,
254254
script_type: str | None = None,
255+
parsed_options: dict[str, Any] | None = None,
255256
) -> None:
256257
"""Update init-options.json to reflect *integration* as the active one.
257258
@@ -270,7 +271,12 @@ def _update_init_options_for_integration(
270271
opts["speckit_version"] = _get_speckit_version()
271272
if script_type:
272273
opts["script"] = script_type
273-
if isinstance(integration, SkillsIntegration) or getattr(integration, "_skills_mode", False):
274+
_skills_mode_attr = getattr(integration, "_skills_mode", None)
275+
if callable(_skills_mode_attr):
276+
is_skills = _skills_mode_attr(parsed_options)
277+
else:
278+
is_skills = bool(_skills_mode_attr) or isinstance(integration, SkillsIntegration)
279+
if is_skills:
274280
opts["ai_skills"] = True
275281
else:
276282
opts.pop("ai_skills", None)
@@ -326,7 +332,9 @@ def _set_default_integration(
326332
) from exc
327333

328334
_write_integration_json(project_root, key, installed_keys, settings)
329-
_update_init_options_for_integration(project_root, integration, script_type=resolved_script)
335+
_update_init_options_for_integration(
336+
project_root, integration, script_type=resolved_script, parsed_options=parsed_options
337+
)
330338

331339

332340
def _set_default_integration_or_exit(*args: Any, **kwargs: Any) -> None:

src/specify_cli/integrations/_install_commands.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ def integration_install(
158158
)
159159
_write_integration_json(project_root, new_default, new_installed, settings)
160160
if new_default == integration.key:
161-
_update_init_options_for_integration(project_root, integration, script_type=selected_script)
161+
_update_init_options_for_integration(
162+
project_root, integration, script_type=selected_script, parsed_options=parsed_options
163+
)
162164
else:
163165
_refresh_init_options_speckit_version(project_root)
164166

src/specify_cli/integrations/_migrate_commands.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,9 @@ def integration_upgrade(
463463
new_manifest.save()
464464
_write_integration_json(project_root, installed_key, installed_keys, settings)
465465
if installed_key == key:
466-
_update_init_options_for_integration(project_root, integration, script_type=selected_script)
466+
_update_init_options_for_integration(
467+
project_root, integration, script_type=selected_script, parsed_options=parsed_options
468+
)
467469
else:
468470
_refresh_init_options_speckit_version(project_root)
469471
except Exception as exc:

src/specify_cli/integrations/bob/__init__.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ class _BobSkillsHelper(SkillsIntegration):
7777
"extension": "/SKILL.md",
7878
}
7979

80+
def post_process_skill_content(self, content: str) -> str:
81+
"""Bob skills are intent-activated; no slash-command note is needed."""
82+
return content
83+
8084

8185
class BobIntegration(IntegrationBase):
8286
"""Integration for IBM Bob IDE.
@@ -121,17 +125,16 @@ def effective_invoke_separator(
121125
"extension": "/SKILL.md",
122126
}
123127

124-
@property
125-
def _skills_mode(self) -> bool:
128+
def _skills_mode(self, parsed_options: dict[str, Any] | None = None) -> bool:
126129
"""True when the instance is configured in skills (default) mode.
127130
128-
Derived from the current ``registrar_config`` so that the value
129-
reflects whichever mode ``setup()`` last activated, without relying
130-
on mutable instance state that is unavailable in a fresh process
131-
(e.g. ``specify integration use bob`` or ``_set_default_integration``).
131+
Derived from *parsed_options* so that the value is correct both
132+
during ``setup()`` and in fresh-process contexts where ``setup()``
133+
has not been called (e.g. ``specify integration use bob``).
132134
"""
133-
rc = self.registrar_config or {}
134-
return rc.get("extension") == "/SKILL.md"
135+
if parsed_options is None:
136+
parsed_options = {}
137+
return not parsed_options.get("legacy_commands", False)
135138

136139
@classmethod
137140
def options(cls) -> list[IntegrationOption]:
@@ -163,13 +166,9 @@ def setup(
163166
"""
164167
parsed_options = parsed_options or {}
165168
if parsed_options.get("legacy_commands"):
166-
self.registrar_config = dict(_BobMarkdownHelper.registrar_config)
167169
_warn_legacy_commands_deprecated()
168170
return self._setup_legacy(project_root, manifest, parsed_options, **opts)
169-
self.registrar_config = dict(_BobSkillsHelper.registrar_config)
170-
return SkillsIntegration.setup(
171-
_BobSkillsHelper(), project_root, manifest, parsed_options, **opts
172-
)
171+
return _BobSkillsHelper().setup(project_root, manifest, parsed_options, **opts)
173172

174173
def _setup_legacy(
175174
self,

0 commit comments

Comments
 (0)