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

> Discover how Ponytail organizes per-host plugin manifests in dedicated dot-prefixed directories for Claude Code, Codex, and GitHub Copilot, sharing core logic through common hook files.

- Repository: [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail)
- Tags: internals
- Published: 2026-09-11

---

**Ponytail uses dedicated dot-prefixed directories for each supported AI host (Claude Code, Codex, GitHub Copilot, etc.), each containing a host-specific [`plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main//.claude-plugin/plugin.json) contains:

```json
{
  "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`](https://github.com/DietrichGebert/ponytail/blob/main/.claude-plugin/plugin.json), [`.codex-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main/.codex-plugin/plugin.json)). Using separate directories satisfies these hardcoded expectations without requiring conditional routing logic.
- **Extensibility** – Host-specific metadata (such as [`marketplace.json`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main//.claude-plugin/plugin.json):

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

```

**Codex** reads from [`/.codex-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.codex-plugin/plugin.json):

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

```

**Qoder** uses the manifest at [`/.qoder-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.qoder-plugin/plugin.json):

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

```

## Key File Reference

The complete organization of per-host plugin manifests includes:

- **Claude Code**: [`/.claude-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.claude-plugin/plugin.json) (references [`hooks/claude-codex-hooks.json`](https://github.com/DietrichGebert/ponytail/blob/main/hooks/claude-codex-hooks.json))
- **Codex**: [`/.codex-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.codex-plugin/plugin.json) (references shared hooks)
- **GitHub Copilot CLI**: [`/.github/plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.github/plugin/plugin.json) (uses nested `plugin` subdirectory)
- **Qoder**: [`/.qoder-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.qoder-plugin/plugin.json)
- **Devin CLI**: [`/.devin-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.devin-plugin/plugin.json)
- **Grok Build**: [`/.grok-plugin/plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main//.grok-plugin/plugin.json) plus optional [`/.grok-plugin/marketplace.json`](https://github.com/DietrichGebert/ponytail/blob/main//.grok-plugin/marketplace.json)
- **Common Hooks**: [`/hooks/claude-codex-hooks.json`](https://github.com/DietrichGebert/ponytail/blob/main//hooks/claude-codex-hooks.json) (shared across Claude Code, Codex, and compatible platforms)
- **Skills Directory**: `/skills/` (top-level shared implementation)

## 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`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main/.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`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main/./hooks/claude-codex-hooks.json) path from within their respective [`plugin.json`](https://github.com/DietrichGebert/ponytail/blob/main/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`](https://github.com/DietrichGebert/ponytail/blob/main//.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.