Skip to content

Bug: preset skill overrides not written when skills_source is marketplace and ai_skills is false #2906

Description

@echarrod

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:

  1. _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.

  2. _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

  1. Initialise a project with specify init --here --integration claude --ai claude (sets ai_skills: false by default with marketplace source)
  2. Install a preset: specify preset add jira --from https://github.com/luno/spec-kit-preset-jira/archive/refs/heads/main.zip
  3. 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

Activity

  1. echarrod commented on Jun 11, 2026

    @echarrod
    ContributorAuthor

    Closing - this isn't an upstream bug. The skills_source: "marketplace" state it describes is written by our downstream install tooling: we distribute the spec-kit skills through a private Claude Code plugin marketplace, so ai_skills is false and skills come from the plugin rather than being materialised locally. That field doesn't exist anywhere in upstream spec-kit.

    Native Claude Code plugin support was requested upstream in #804 but closed as not-planned, so rather than carry a consumer-side guard with no upstream producer, the preset-override behaviour will be handled in our own install tooling. The consumer-side fix in #2905 has been closed for the same reason.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions