How Per-Host Plugin Manifests Are Organized in the Ponytail Repository

Ponytail uses dedicated dot-prefixed directories for each supported AI host (Claude Code, Codex, GitHub Copilot, etc.), each containing a host-specific plugin.json manifest while sharing core implementation logic through common hook files.

The DietrichGebert/ponytail repository implements a modular architecture to support multiple AI development environments simultaneously. Understanding how per-host plugin manifests are organized reveals a design that balances strict host-specific compatibility requirements with efficient code reuse across platforms.

Dot-Prefixed Directory Structure for Host Compatibility

Ponytail places each per-host plugin manifest inside a directory prefixed with a dot and named after the target host. These directories reside directly at the repository root:

  • /.claude-plugin/ → Claude Code
  • /.codex-plugin/ → Codex
  • /.github/plugin/ → GitHub Copilot CLI
  • /.qoder-plugin/ → Qoder
  • /.devin-plugin/ → Devin CLI
  • /.grok-plugin/ → Grok Build

Inside each host-specific folder, the plugin.json file defines the manifest metadata. While keys like name, version, description, and author remain consistent across hosts, the file can reference host-specific resources such as lifecycle hooks. According to the DietrichGebert/ponytail source code, the Claude Code manifest at /.claude-plugin/plugin.json contains:

{
  "name": "ponytail",
  "version": "4.9.0",
  "description": "...",
  "author": { "name": "Dietrich Gebert", "url": "https://github.com/DietrichGebert" },
  "hooks": "./hooks/claude-codex-hooks.json"
}

Shared Implementation vs. Host-Specific Metadata

Despite separate manifest directories, Ponytail avoids code duplication by sharing core functionality. All hosts reference the same activation logic stored in the top-level hooks/ directory rather than maintaining individual copies.

This architecture serves two strategic purposes:

  • Compatibility layer – Each AI host expects its manifest at a specific conventional path (e.g., .claude-plugin/plugin.json, .codex-plugin/plugin.json). Using separate directories satisfies these hardcoded expectations without requiring conditional routing logic.
  • Extensibility – Host-specific metadata (such as marketplace.json for Grok Build registration) can be added to individual directories without affecting the manifest schema or files used by other platforms.

The file hooks/claude-codex-hooks.json contains the shared activation logic utilized by Claude Code, Codex, and other compatible hosts.

Installation Commands by Host

Different hosts automatically load their respective manifests from these predetermined paths during the installation process.

Claude Code discovers the plugin at /.claude-plugin/plugin.json:

/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail

Codex reads from /.codex-plugin/plugin.json:

codex plugin marketplace add DietrichGebert/ponytail
codex plugin add ponytail@ponytail

Qoder uses the manifest at /.qoder-plugin/plugin.json:

qoder plugin marketplace add DietrichGebert/ponytail
qoder plugin install ponytail@ponytail

Key File Reference

The complete organization of per-host plugin manifests includes:

Summary

  • Ponytail organizes per-host plugin manifests into dot-prefixed directories at the repository root (e.g., /.claude-plugin/, /.codex-plugin/).
  • Each directory contains a plugin.json file satisfying the specific path expectations of Claude Code, Codex, GitHub Copilot, Qoder, Devin CLI, and Grok Build.
  • Hosts share core functionality through common files like hooks/claude-codex-hooks.json rather than duplicating logic.
  • This architecture provides a compatibility layer for host-specific requirements while maintaining extensibility for platform-specific metadata.

Frequently Asked Questions

Why does Ponytail use separate directories for each host instead of a single manifest file?

Individual dot-prefixed directories act as a compatibility layer because each AI host hardcodes specific manifest paths (e.g., .claude-plugin/plugin.json). Using separate directories satisfies these discovery mechanisms without requiring conditional logic or path remapping within the repository.

What is the purpose of the marketplace.json file in some host directories?

The marketplace.json file contains host-specific metadata required for commercial marketplace registration. Found in directories like /.grok-plugin/, it allows Ponytail to store platform-specific distribution data without affecting the shared plugin.json schema used by Claude Code, Codex, and other hosts.

Do I need to modify the hooks path in plugin.json for different hosts?

No. All supported hosts reference the same ./hooks/claude-codex-hooks.json path from within their respective plugin.json files. The activation logic is identical across Claude Code, Codex, and compatible platforms, so the hooks file is shared from the top-level hooks/ directory.

Where does GitHub Copilot CLI expect to find the plugin manifest?

GitHub Copilot CLI looks for the manifest at /.github/plugin/plugin.json, using a nested plugin subdirectory inside /.github/. This differs from the flat structure used by other hosts and follows the specific directory conventions required by the GitHub Copilot CLI plugin system.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →