Skip to content

Extension loader does not follow symlinks in .github/extensions/ #868

@cedricvidal

Description

@cedricvidal

Summary

The extension loader does not detect extensions that are symlinked into .github/extensions/. Only real (copied) directories are discovered.

Steps to Reproduce

  1. Have a canvas extension in a repo directory (e.g. extensions/marp-viewer/) with dependencies installed (node_modules present) — see cedricvidal/copilot-extensions for the Marp Viewer canvas extension used to reproduce this
  2. Create a symlink: ln -s ../../extensions/marp-viewer .github/extensions/marp-viewer
  3. Reload extensions → 0 extensions found
  4. Copy the same directory instead: cp -r extensions/marp-viewer .github/extensions/marp-viewer
  5. Reload extensions → 1 extension found and running

Expected Behavior

Symlinked extension directories in .github/extensions/ (and ~/.copilot/extensions/) should be followed and loaded like regular directories.

Why This Matters

  • Development workflow: Symlinks are useful when the extension source lives elsewhere in the repo (or in a monorepo) and you don't want to duplicate files. The current behavior forces a copy, which makes iterating on extensions harder.
  • Third-party extension management: Supporting symlinks would enable tooling similar to npx skills to manage extensions by symlinking them into the extensions directory, rather than copying or inlining them.

Environment

  • macOS (Darwin)
  • GitHub Copilot App (technical preview)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions