Summary
When a spec-kit project uses "skills_source": "marketplace" in .specify/integration.json AND has "ai_skills": false in .specify/init-options.json, installing a preset that provides type: "command" entries (e.g. specify preset add jira) does not write the corresponding .claude/skills/<skill-name>/SKILL.md override file. The preset appears installed (registry updated, files in .specify/presets/) but the local skill override that should shadow the marketplace plugin skill is silently skipped.
Root cause
Two places in src/specify_cli/presets.py:
-
_get_skills_dir() has an early-return guard: if not ai_skills_enabled and agent != "kimi": return None — this causes the method to return None for marketplace projects, so _register_skills() is never reached.
-
_register_skills() computes create_missing_skills = ai_skills_enabled and agent_config.get("extension") != "/SKILL.md" — when ai_skills: false this is always False, so no skill directory is created even when the preset command override would require one.
Expected behaviour
Running specify preset add <preset> in a skills_source: marketplace project should write .claude/skills/<skill-name>/SKILL.md for each command the preset overrides, so that the local skill shadows the marketplace plugin skill.
Steps to reproduce
- Initialise a project with
specify init --here --integration claude --ai claude (sets ai_skills: false by default with marketplace source)
- Install a preset:
specify preset add jira --from https://github.com/luno/spec-kit-preset-jira/archive/refs/heads/main.zip
- Observe:
.specify/presets/jira/ exists and registry shows registered_skills: ["speckit-taskstoissues"], but .claude/skills/speckit-taskstoissues/SKILL.md is never created
Fix
A fix is already in PR #2905. Reference: #2905
Summary
When a spec-kit project uses
"skills_source": "marketplace"in.specify/integration.jsonAND has"ai_skills": falsein.specify/init-options.json, installing a preset that providestype: "command"entries (e.g.specify preset add jira) does not write the corresponding.claude/skills/<skill-name>/SKILL.mdoverride file. The preset appears installed (registry updated, files in.specify/presets/) but the local skill override that should shadow the marketplace plugin skill is silently skipped.Root cause
Two places in
src/specify_cli/presets.py:_get_skills_dir()has an early-return guard:if not ai_skills_enabled and agent != "kimi": return None— this causes the method to returnNonefor marketplace projects, so_register_skills()is never reached._register_skills()computescreate_missing_skills = ai_skills_enabled and agent_config.get("extension") != "/SKILL.md"— whenai_skills: falsethis is alwaysFalse, so no skill directory is created even when the preset command override would require one.Expected behaviour
Running
specify preset add <preset>in askills_source: marketplaceproject should write.claude/skills/<skill-name>/SKILL.mdfor each command the preset overrides, so that the local skill shadows the marketplace plugin skill.Steps to reproduce
specify init --here --integration claude --ai claude(setsai_skills: falseby default with marketplace source)specify preset add jira --from https://github.com/luno/spec-kit-preset-jira/archive/refs/heads/main.zip.specify/presets/jira/exists and registry showsregistered_skills: ["speckit-taskstoissues"], but.claude/skills/speckit-taskstoissues/SKILL.mdis never createdFix
A fix is already in PR #2905. Reference: #2905