You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Status: Proposal Effort: Low–Medium (≈90% assembly of existing primitives) Priority: High — closes the emit↔ingest loop and makes Spec Kit the portable hub for the skills ecosystem
Summary
Ship a skill-importer bundle that lets a user point Spec Kit at a directory, repo, or URL full of skills — each a SKILL.md together with the scripts, references, assets, and templates it bundles in its enclosing directory — and expose them all as native Spec Kit commands, automatically distributed to whichever of the 41 supported coding agents they use.
The unit of import is the whole skill directory, not just the markdown. A SKILL.md typically references sibling files (scripts/, references/, assets/, templates); the importer must carry those along, and — because bundled scripts are executable content — treat them as a first-class part of the trust surface (see Trust & Compliance).
The capability is mostly assembly of primitives that already exist:
Extensify (a community-catalog extension) already converts a single skill — a SKILL.mdplus every file/subdirectory in its enclosing directory (scripts/, references/, assets/, templates) — into a Spec Kit extension (create-extension-from-skill), and already generates a catalog.json from a directory of extensions (create-catalog), with validate-extension / validate-catalog as QA.
Core already renders commands → SKILL.md in skills mode (agents.py:render_skill_command, _invocation_style.py) and distributes to all agents via CommandRegistrar.
Bundles already support provides: {extensions, presets, steps, workflows} (bundler/models/manifest.py: COMPONENT_KINDS).
The only genuinely new work is a bulk discovery step and a workflow that orchestrates the existing commands, packaged as a bundle.
Problem Statement
I'm frustrated that widely-used community agent-skills live as raw SKILL.md files spread across separate, independently-maintained repositories, each locked to one or two agents, with no one-step way to bring them into my project and my coding agent. To use them today I copy/fork files by hand, they don't compose with each other, they carry no org context, no versioning, and no quality gate — and the moment upstream changes, my copy drifts.
The deeper motivation is not just "import a file" — it's what a skill becomes once it's a Spec Kit command. Spec Kit already has the composition, distribution, and governance machinery; a raw skill has none of it. Absorbing a SKILL.md into Spec Kit upgrades it from a static, single-agent prompt into a first-class, governed capability:
Multi-agent portability — rendered to all 41 supported agents via skills mode, not locked to Claude Code.
Workflow orchestration — the skill becomes a step that can be chained, gated, fanned-out, and sequenced in a Spec Kit workflow.
Preset layering — org standards, compliance, and conventions overlay the skill via the preset composition algebra (prepend/append/wrap/replace over a named target) — without forking upstream.
Catalog hosting & distribution — installable via specify extension add, discoverable, shareable through public or private catalogs.
Governance — organizations vet and host approved skills in private/internal catalogs, with review gates and recorded license + provenance in each extension.yml.
Versioning — skills become versioned extensions with update/rollback semantics, instead of a floating upstream file that silently drifts.
Validation / quality gate — validate-extension/validate-catalog enforce a quality bar the raw skill never had.
Lifecycle-hook activation — skills can be wired to SDD phases (before/after specify, plan, tasks, implement, …) for phase-aware, on-demand activation.
Reproducibility — tag-pinned, bounded, offline-installable — no dependence on a moving remote file.
Stable, named contract — the skill becomes a /speckit-<name> command with deterministic invocation and (with the artifact/--json work) introspectable metadata.
This is the "absorb, don't delegate" thesis: Spec Kit doesn't merely coordinate with a skill — it has the skill, wrapped in orchestration, composition, distribution, and governance. That's the value the importer unlocks; the ingest step is just the on-ramp.
Motivation
Demand is proven at the very top of GitHub
Cross-referencing GitHub's top-100 most-starred repositories (stars:>114000, assessed 2026-09-10) against confirmed SKILL.md presence and license shows that several of the most-starred repositories on GitHub are now SKILL.md skill collections — instantly-citable, license-clean ingest sources:
The importer must reject NONE/copyleft sources by default and surface the SPDX id, or it ships a legal liability.
Format diversity (SKILL.md-first)
Not all skill content is SKILL.md: f/prompts.chat (prompts/CSV), multica-ai/andrej-karpathy-skills (CLAUDE.md), VoltAgent/awesome-design-md (DESIGN.md), msitarzewski/agency-agents (agent files). SKILL.md is the dominant, canonical format — ship that first; a normalization layer opens the door to others later.
Net-new code shrinks to: a discovery step, a fetch/license-check step, and a workflow — everything else is reuse.
Proposed Solution
1. The workflow (skills-to-catalog)
The workflow is the bulk layer — fan_out/fan_in provide "for every skill" natively, so no new bulk command is required. (Field names below are illustrative, not the final schema.)
workflow:
id: skills-to-catalogsteps:
- id: gathertype: init# inputs: source (dir|repo|url), catalog_url, output_dir
- id: fetchtype: shell # remote clone/download — gated by shell-step opt-in (#2440/#2443)when: "{{ source.is_remote }}"# provenance: tag-pinned ref only (see #4185); bounded read
- id: license_gatetype: gate# reject NONE / copyleft SPDX ids unless --allow-license explicitly set
- id: discovertype: shell # NEW: list every SKILL.md under the source tree# emits: skills[] — each entry = the SKILL.md AND its enclosing directory (scripts/refs/assets)
- id: converttype: fan_outover: "{{ discover.skills }}"steps:
- type: command # Extensify create-extension-from-skill (per skill)
- type: command # Extensify validate-extension
- type: gate # drop skills that fail validation
- id: assembletype: fan_insteps:
- type: command # Extensify create-catalog over generated dirs
- type: command # Extensify validate-catalog
- id: reporttype: gate# summary: N imported / M skipped (invalid) / K blocked (license); default output = LOCAL catalog for review
2. The bundle (skill-importer)
# bundle.ymlbundle:
id: skill-importername: "Skill Importer"provides:
extensions: [extensify] # the convert/catalog/validate commandsworkflows: [skills-to-catalog] # the orchestration abovesteps: [discover-skills] # the new custom discovery step (if not inlined as shell)presets: [skill-import-defaults] # optional: strict-validate, output paths, license policy
One specify bundle add skill-importer installs the whole capability.
3. User story
"Here's a repo full of skills — expose them all to Spec Kit and to the agent I use."
specify bundle add skill-importer
specify workflow run skills-to-catalog --source https://github.com/obra/superpowers@<tag>
# → validates + imports the MIT skills, writes a local catalog for review
specify extension catalog add ./catalog.json
specify extension add <skill> # rendered to Copilot/Claude/Cursor/… via --skills
Trust & Compliance Model (the crux)
License gate (hard requirement). Read the source repo's SPDX license; reject NONE and copyleft (GPL/AGPL) by default. Surface the license in the import report. Require an explicit --allow-license <spdx> override to proceed. Record provenance + license in each generated extension.yml.
Validate-as-gate.validate-extension / validate-catalog run as mandatorygate steps; invalid/loose-frontmatter skills are flagged and skipped, never silently shipped. Bulk amplifies the loose-format problem, so this gate is essential.
Bundled executable content. A skill is imported with its enclosing directory (scripts/, references/, assets/, templates) — which can include executable scripts. Import copies and records these but never runs them; they are size-bounded, surfaced in the import report, and left for explicit review before any use. This is the largest reason the import is a trust boundary, not a plain file copy.
Local-first, no auto-install. Default output is a local catalog.json the user reviews; installing to the agent is a separate, explicit step.
Attribution. Preserve upstream author/source/license in the generated extension metadata.
Fidelity & Limitations
SKILL.md is a loose format; frontmatter conventions differ across ecosystems (Anthropic, Composio, etc.). The importer normalizes frontmatter but is lossy for execution-harness skills that assume a specific runtime — it imports procedural/prompt content cleanly, harness-coupled skills partially.
The import unit is the whole skill directory: bundled scripts/, references/, assets/, and templates are carried into the generated extension (and mapped to provides.scripts/provides.templates where applicable). Skills whose scripts assume a specific host/runtime may need manual adjustment after import.
Bulk conversion of hundreds of skills (e.g. ECC's 856) will surface quality variance — the validate gate + a per-import report set expectations.
Non-SKILL.md formats (CLAUDE.md, DESIGN.md, agents, prompt CSVs) are out of scope for v1; the normalization layer is the future extension point.
Delivery / Phasing
Phase 1 (v1): discovery step + skills-to-catalog workflow + license/provenance gate, packaged as a community bundle (proving ground, like sicario-spec/specassay). Local-catalog output only.
Phase 3: promote to first-party bundled (shipped by default, still modular).
Decomposition into Sub-Issues
This is best filed as an umbrella / tracking issue, then delivered through a set of small, tightly-scoped, independently-reviewable sub-issues (and PRs) — consistent with the project's small-PR / mega-PR-breakup norms and the per-filer throttle. Each sub-issue should stand on its own with its own acceptance criteria; none should depend on the whole landing at once. Candidate slices:
Bulk skill discovery — a step/utility that lists every SKILL.md under a local tree (no fetch, no convert).
skills-to-catalog workflow — orchestrate the existing Extensify commands (fan_out convert → validate gate → fan_in catalog), local sources only.
License/compliance gate — read source SPDX, block NONE/copyleft by default, explicit override + recorded acknowledgment; stamp license/provenance into generated extension.yml.
Remote fetch with provenance — tag-pinned clone/download as an opt-in shell step, bounded reads.
Import report — summarize imported / skipped-invalid / blocked-by-license, default output = local catalog.json for review.
Docs + example corpus — golden-path (obra/superpowers) and bulk (affaan-m/ECC / garrytan/gstack) walkthroughs; cross-platform.
First-party promotion — move from community bundle to shipped-by-default (separate, later).
(Stretch) format plugins — normalization for CLAUDE.md / agent-file / prompt sources.
Scoping this way keeps each change reviewable, lets the security-sensitive slices (3, 4) get focused review, and allows the low-risk pieces (1, 2, 6, 7) to land independently.
Acceptance Criteria
specify bundle add skill-importer installs the Extensify extension + the skills-to-catalog workflow (and any custom step/preset it ships).
Running the workflow against a local source discovers every SKILL.md in the tree and converts each skill directory (the SKILL.md + its bundled scripts//references//assets//templates) to a Spec Kit extension, then validates them.
Bundled scripts are copied and recorded but never executed during import; they're size-bounded and surfaced in the import report for review.
Skills that fail validation (loose/invalid frontmatter) are reported and skipped, never written into the catalog.
Remote sources are fetched only by tag-pinned ref (no floating/latest); bounded reads throughout.
License gate: unlicensed (NONE) and copyleft sources are blocked by default; proceeding requires an explicit override with a recorded acknowledgment. The source SPDX id and provenance are recorded in each generated extension.yml.
Default output is a local catalog.json for review — no automatic install to the agent.
Imported skills render to all supported agents via skills mode (--skills / CommandRegistrar).
Fetch/discover run as opt-in shell steps (inherit the workflow shell-step gate); no silent code execution.
Documentation updated; works cross-platform (bash + PowerShell).
Open Questions
Should the discovery step be a first-class custom step type (reusable) or an inline shell step in the workflow?
Do we want a thin convenience command (specify skills import <source>) that wraps the workflow, or keep it workflow-only?
License policy default: hard-block copyleft, or allow with a prominent warning + recorded acknowledgment?
Alternatives Considered
Per-source bridge extensions (the current community pattern). The community catalog already ships bridge extensions that each delegate to one upstream skill source — e.g. superb (Superpowers Bridge), speckit-superpowers-bridge (Superpowers Implementation Bridge), and squad (Squad Bridge). They work, but each couples Spec Kit to a specific upstream tool and must be authored and maintained per source; any source without a bespoke bridge is unreachable. A single generic importer absorbs anySKILL.md source into first-class Spec Kit extensions, so no per-source bridge is needed.
Manual copy/fork (today's default). Copying skill files by hand gives none of the composition, versioning, validation, or multi-agent distribution above, and drifts from upstream.
A dedicated bulk specify command instead of a workflow. Rejected for v1: the workflow's fan_out/fan_in already provide the bulk loop, so no new command surface is required (a thin convenience wrapper remains an open question).
AI Assistance Disclosure
This issue was researched and drafted with AI assistance — GitHub Copilot (model: Claude Opus 4.8) — and was directed, reviewed, and edited by @mnriem, who understands and endorses the proposal. AI was used for the full initial draft and the supporting research (the top-100 star/license analysis and capability verification); all design decisions and final wording were reviewed by the human maintainer.
Status: Proposal
Effort: Low–Medium (≈90% assembly of existing primitives)
Priority: High — closes the emit↔ingest loop and makes Spec Kit the portable hub for the skills ecosystem
Summary
Ship a skill-importer bundle that lets a user point Spec Kit at a directory, repo, or URL full of skills — each a
SKILL.mdtogether with the scripts, references, assets, and templates it bundles in its enclosing directory — and expose them all as native Spec Kit commands, automatically distributed to whichever of the 41 supported coding agents they use.The capability is mostly assembly of primitives that already exist:
SKILL.mdplus every file/subdirectory in its enclosing directory (scripts/,references/,assets/, templates) — into a Spec Kit extension (create-extension-from-skill), and already generates acatalog.jsonfrom a directory of extensions (create-catalog), withvalidate-extension/validate-catalogas QA.SKILL.mdin skills mode (agents.py:render_skill_command,_invocation_style.py) and distributes to all agents viaCommandRegistrar.provides: {extensions, presets, steps, workflows}(bundler/models/manifest.py: COMPONENT_KINDS).The only genuinely new work is a bulk discovery step and a workflow that orchestrates the existing commands, packaged as a bundle.
Problem Statement
I'm frustrated that widely-used community agent-skills live as raw
SKILL.mdfiles spread across separate, independently-maintained repositories, each locked to one or two agents, with no one-step way to bring them into my project and my coding agent. To use them today I copy/fork files by hand, they don't compose with each other, they carry no org context, no versioning, and no quality gate — and the moment upstream changes, my copy drifts.The deeper motivation is not just "import a file" — it's what a skill becomes once it's a Spec Kit command. Spec Kit already has the composition, distribution, and governance machinery; a raw skill has none of it. Absorbing a
SKILL.mdinto Spec Kit upgrades it from a static, single-agent prompt into a first-class, governed capability:specify extension add, discoverable, shareable through public or private catalogs.extension.yml.validate-extension/validate-catalogenforce a quality bar the raw skill never had./speckit-<name>command with deterministic invocation and (with the artifact/--jsonwork) introspectable metadata.This is the "absorb, don't delegate" thesis: Spec Kit doesn't merely coordinate with a skill — it has the skill, wrapped in orchestration, composition, distribution, and governance. That's the value the importer unlocks; the ingest step is just the on-ramp.
Motivation
Demand is proven at the very top of GitHub
Cross-referencing GitHub's top-100 most-starred repositories (
stars:>114000, assessed 2026-09-10) against confirmedSKILL.mdpresence and license shows that several of the most-starred repositories on GitHub are nowSKILL.mdskill collections — instantly-citable, license-clean ingest sources:SKILL.mdobra/superpowersmattpocock/skillsaffaan-m/ECCShubhamsaboo/awesome-llm-appsgarrytan/gstacknextlevelbuilder/ui-ux-pro-max-skillBelow the top-100 but strong:
Fission-AI/OpenSpec(67K, MIT, 16).License gating is non-negotiable
Two of the highest-profile skill repos cannot be legally ingested/redistributed — the single most important design constraint:
SKILL.mdanthropics/skillsComposioHQ/awesome-claude-skillsThe importer must reject
NONE/copyleft sources by default and surface the SPDX id, or it ships a legal liability.Format diversity (SKILL.md-first)
Not all skill content is
SKILL.md:f/prompts.chat(prompts/CSV),multica-ai/andrej-karpathy-skills(CLAUDE.md),VoltAgent/awesome-design-md(DESIGN.md),msitarzewski/agency-agents(agent files).SKILL.mdis the dominant, canonical format — ship that first; a normalization layer opens the door to others later.What already exists vs. what's new
SKILL.md(single) → Spec Kit extension/commandcreate-extension-from-skillcatalog.jsoncreate-catalogvalidate-extension/validate-catalogSKILL.md, render to 41 agentsCommandRegistrar, skills modeCOMPONENT_KINDSSKILL.mdin a treeNet-new code shrinks to: a discovery step, a fetch/license-check step, and a workflow — everything else is reuse.
Proposed Solution
1. The workflow (
skills-to-catalog)The workflow is the bulk layer —
fan_out/fan_inprovide "for every skill" natively, so no new bulk command is required. (Field names below are illustrative, not the final schema.)2. The bundle (
skill-importer)One
specify bundle add skill-importerinstalls the whole capability.3. User story
Trust & Compliance Model (the crux)
NONEand copyleft (GPL/AGPL) by default. Surface the license in the import report. Require an explicit--allow-license <spdx>override to proceed. Record provenance + license in each generatedextension.yml.download_urltag-pin policy, Community catalog workflows: make tag-pinned download_url a MUST and rejectreleases/latest/#4185); nolatest/floating refs. Bounded reads throughout.validate-extension/validate-catalogrun as mandatorygatesteps; invalid/loose-frontmatter skills are flagged and skipped, never silently shipped. Bulk amplifies the loose-format problem, so this gate is essential.scripts/,references/,assets/, templates) — which can include executable scripts. Import copies and records these but never runs them; they are size-bounded, surfaced in the import report, and left for explicit review before any use. This is the largest reason the import is a trust boundary, not a plain file copy.catalog.jsonthe user reviews; installing to the agent is a separate, explicit step.Fidelity & Limitations
SKILL.mdis a loose format; frontmatter conventions differ across ecosystems (Anthropic, Composio, etc.). The importer normalizes frontmatter but is lossy for execution-harness skills that assume a specific runtime — it imports procedural/prompt content cleanly, harness-coupled skills partially.scripts/,references/,assets/, and templates are carried into the generated extension (and mapped toprovides.scripts/provides.templateswhere applicable). Skills whose scripts assume a specific host/runtime may need manual adjustment after import.SKILL.mdformats (CLAUDE.md,DESIGN.md, agents, prompt CSVs) are out of scope for v1; the normalization layer is the future extension point.Delivery / Phasing
skills-to-catalogworkflow + license/provenance gate, packaged as a community bundle (proving ground, likesicario-spec/specassay). Local-catalog output only.Decomposition into Sub-Issues
This is best filed as an umbrella / tracking issue, then delivered through a set of small, tightly-scoped, independently-reviewable sub-issues (and PRs) — consistent with the project's small-PR / mega-PR-breakup norms and the per-filer throttle. Each sub-issue should stand on its own with its own acceptance criteria; none should depend on the whole landing at once. Candidate slices:
SKILL.mdunder a local tree (no fetch, no convert).skills-to-catalogworkflow — orchestrate the existing Extensify commands (fan_outconvert →validategate →fan_incatalog), local sources only.NONE/copyleft by default, explicit override + recorded acknowledgment; stamp license/provenance into generatedextension.yml.catalog.jsonfor review.skill-importerbundle — thebundle.ymlpackaging (extension + workflow + optional step/preset).obra/superpowers) and bulk (affaan-m/ECC/garrytan/gstack) walkthroughs; cross-platform.CLAUDE.md/ agent-file / prompt sources.Scoping this way keeps each change reviewable, lets the security-sensitive slices (3, 4) get focused review, and allows the low-risk pieces (1, 2, 6, 7) to land independently.
Acceptance Criteria
specify bundle add skill-importerinstalls the Extensify extension + theskills-to-catalogworkflow (and any custom step/preset it ships).SKILL.mdin the tree and converts each skill directory (theSKILL.md+ its bundledscripts//references//assets//templates) to a Spec Kit extension, then validates them.latest); bounded reads throughout.NONE) and copyleft sources are blocked by default; proceeding requires an explicit override with a recorded acknowledgment. The source SPDX id and provenance are recorded in each generatedextension.yml.catalog.jsonfor review — no automatic install to the agent.--skills/CommandRegistrar).Open Questions
shellstep in the workflow?specify skills import <source>) that wraps the workflow, or keep it workflow-only?Alternatives Considered
superb(Superpowers Bridge),speckit-superpowers-bridge(Superpowers Implementation Bridge), andsquad(Squad Bridge). They work, but each couples Spec Kit to a specific upstream tool and must be authored and maintained per source; any source without a bespoke bridge is unreachable. A single generic importer absorbs anySKILL.mdsource into first-class Spec Kit extensions, so no per-source bridge is needed.specifycommand instead of a workflow. Rejected for v1: the workflow'sfan_out/fan_inalready provide the bulk loop, so no new command surface is required (a thin convenience wrapper remains an open question).AI Assistance Disclosure
This issue was researched and drafted with AI assistance — GitHub Copilot (model: Claude Opus 4.8) — and was directed, reviewed, and edited by @mnriem, who understands and endorses the proposal. AI was used for the full initial draft and the supporting research (the top-100 star/license analysis and capability verification); all design decisions and final wording were reviewed by the human maintainer.