Description
Files under the root/ directory in a package are correctly installed when the package is installed from a local path, but are silently skipped when the same package is installed from a GitHub URL.
Reproduction
Package structure
The package at plugins/qmd in this repo has a standard openpackage structure with a root/ directory:
plugins/qmd/
├── openpackage.yml
├── skills/
│ └── qmd/
│ └── SKILL.md
└── root/
└── .opencode/
└── plugins/
└── qmd-hooks.ts
The openpackage.yml is a standard manifest:
name: qmd
version: 0.1.0
description: Local markdown search engine
keywords: [search, markdown, qmd]
author: PDCOE
license: proprietary
Steps to reproduce
1. Install from local path (works correctly):
mkdir -p /tmp/test-local/.opencode
cd /tmp/test-local
opkg install /path/to/plugins/qmd --platforms opencode
Output:
✓ Installed qmd@0.1.0
✓ Installed files: 1
└── .opencode/skills/qmd/SKILL.md
✓ Root files: 1 file(s)
└── .opencode/plugins/qmd-hooks.ts (created)
Both the skill and the root file are installed. The generated openpackage.index.yml includes:
packages:
qmd:
files:
root/.opencode/plugins/qmd-hooks.ts:
- .opencode/plugins/qmd-hooks.ts
skills/qmd/SKILL.md:
- .opencode/skills/qmd/SKILL.md
2. Install from GitHub URL (root file missing):
mkdir -p /tmp/test-github/.opencode
cd /tmp/test-github
opkg install https://github.com/AA-PDCOE/claude-plugins/tree/main/plugins/qmd --platforms opencode
Output:
✓ Installed gh@aa-pdcoe/claude-plugins/plugins/qmd@0.1.0
✓ Installed files: 1
└── .opencode/skills/qmd/SKILL.md
Only the skill is installed. No "Root files" line appears. The generated openpackage.index.yml does not include the root file:
packages:
gh@aa-pdcoe/claude-plugins/plugins/qmd:
files:
skills/qmd/SKILL.md:
- .opencode/skills/qmd/SKILL.md
path: ~/.openpackage/cache/git/a5ca109a936c/bcf58c8/plugins/qmd
version: 0.1.0
3. Verified the file exists in opkg's git cache:
ls ~/.openpackage/cache/git/a5ca109a936c/bcf58c8/plugins/qmd/root/.opencode/plugins/
# qmd-hooks.ts <-- file IS present in the cache
The file is correctly cloned — it's just not being processed during installation.
Additional data point
This is not specific to the qmd package. In the same repo, the obsidian-markdown plugin has an identical root/ structure. When installed locally it tracks the root file; when installed from GitHub it does not:
# Local install — root file tracked:
obsidian-markdown:
files:
root/.opencode/plugins/obsidian-markdown-hooks.ts:
- .opencode/plugins/obsidian-markdown-hooks.ts
# GitHub install — root file NOT tracked:
gh@aa-pdcoe/claude-plugins/plugins/obsidian-markdown:
files:
skills/obsidian-markdown/SKILL.md:
- .opencode/skills/obsidian-markdown/SKILL.md
Expected behavior
Files under root/ in a package should be installed to the workspace root (with the root/ prefix stripped) regardless of whether the package is installed from a local path or a GitHub URL.
Actual behavior
Files under root/ are silently skipped when installing from a GitHub URL. No error or warning is shown.
Environment
- opkg version: 0.10.0 (also reproduced on 0.9.0)
- Node.js: v25.7.0
- OS: macOS (Darwin)
Notes
opkg view <github-url> does list the root file as an "other" resource, so the file is recognized during package analysis — it's just not installed.
- The repo contains a
.claude-plugin/marketplace.json at the root. It's possible that the GitHub URL install path is detecting the repo as a Claude Code plugin marketplace and using the claude-plugin export flows (which have a **/* -> **/* passthrough catch-all) instead of the standard openpackage flows (which have root/**/* -> **/*). But this is speculative.
Description
Files under the
root/directory in a package are correctly installed when the package is installed from a local path, but are silently skipped when the same package is installed from a GitHub URL.Reproduction
Package structure
The package at
plugins/qmdin this repo has a standard openpackage structure with aroot/directory:The
openpackage.ymlis a standard manifest:Steps to reproduce
1. Install from local path (works correctly):
mkdir -p /tmp/test-local/.opencode cd /tmp/test-local opkg install /path/to/plugins/qmd --platforms opencodeOutput:
Both the skill and the root file are installed. The generated
openpackage.index.ymlincludes:2. Install from GitHub URL (root file missing):
mkdir -p /tmp/test-github/.opencode cd /tmp/test-github opkg install https://github.com/AA-PDCOE/claude-plugins/tree/main/plugins/qmd --platforms opencodeOutput:
Only the skill is installed. No "Root files" line appears. The generated
openpackage.index.ymldoes not include the root file:3. Verified the file exists in opkg's git cache:
The file is correctly cloned — it's just not being processed during installation.
Additional data point
This is not specific to the
qmdpackage. In the same repo, theobsidian-markdownplugin has an identicalroot/structure. When installed locally it tracks the root file; when installed from GitHub it does not:Expected behavior
Files under
root/in a package should be installed to the workspace root (with theroot/prefix stripped) regardless of whether the package is installed from a local path or a GitHub URL.Actual behavior
Files under
root/are silently skipped when installing from a GitHub URL. No error or warning is shown.Environment
Notes
opkg view <github-url>does list the root file as an "other" resource, so the file is recognized during package analysis — it's just not installed..claude-plugin/marketplace.jsonat the root. It's possible that the GitHub URL install path is detecting the repo as a Claude Code plugin marketplace and using theclaude-pluginexport flows (which have a**/* -> **/*passthrough catch-all) instead of the standard openpackage flows (which haveroot/**/* -> **/*). But this is speculative.