Skip to content

copilot plugin install does not load joinSession() extensions from installed-plugins/ #3023

@vidhartbhatia

Description

@vidhartbhatia

Describe the bug

Plugins cannot package or distribute Copilot CLI \�xtension.mjs\ / \joinSession()\ extensions. The official plugin schema (\plugin.json) does not include an \�xtensions\ field, and \copilot plugin install\ stores files under \installed-plugins/\ which does not appear to participate in extension discovery.

Extensions are only discovered from ~/.copilot/extensions//extension.mjs\ and .github/extensions//extension.mjs, per the SDK docs.

This means plugin authors who build \joinSession()\ extensions (with tools, hooks, lifecycle events) cannot distribute them through the plugin system — users must manually copy files to the extensions directory.

Affected version

1.0.37 (also tested on 1.0.26)

Steps to reproduce the behavior

  1. Create a plugin with a \plugin.json\ and an \�xtension.mjs\ that exports \joinSession()\ from @github/copilot-sdk/extension\
  2. Install via \copilot plugin install /\
  3. Plugin installs successfully — files copied to ~/.copilot/installed-plugins/\
  4. Start a new Copilot CLI session (restart terminal)
  5. Tools registered by the extension do not appear
  6. Hooks (e.g., \onSessionStart) do not fire

Expected behavior

Either:

  • \copilot plugin install\ should discover and load \�xtension.mjs\ from installed plugins, OR
  • The \plugin.json\ schema should support an \�xtensions\ field for declaring extensions, OR
  • The docs should clarify that extensions are not distributable via the plugin system

Additional context

  • OS: Windows 11, also tested on macOS
  • Shell: PowerShell 7, zsh
  • Workaround: Manually copy extension to ~/.copilot/extensions//extension.mjs\

Real-world example: copilot-brag-sheet is a \joinSession()\ extension that auto-tracks coding sessions into a structured work log. It registers tools (\save_to_brag_sheet,
eview_brag_sheet, \generate_work_log) and hooks (\onSessionStart, \onPostToolUse, \onSessionEnd). Currently users must install manually because the plugin system can't distribute it.

Context: This was flagged by an awesome-copilot maintainer during skill PR review: github/awesome-copilot#1428

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:pluginsPlugin system, marketplace, hooks, skills, extensions, and custom agents

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions