diff --git a/plugins/kyberforge/skills/marketplace-author/README.md b/plugins/kyberforge/skills/marketplace-author/README.md index 7941c8c..a7f3326 100644 --- a/plugins/kyberforge/skills/marketplace-author/README.md +++ b/plugins/kyberforge/skills/marketplace-author/README.md @@ -26,7 +26,6 @@ No manual script. This skill is purely agentic — it reads, edits, and writes t | `references/manifest-fields.md` | Full field reference for top-level and per-entry `marketplace.json` fields, all four source type shapes with examples, and why both files must stay identical | | `references/sources.md` | Research provenance — sources that informed this skill | | `references/README.md` | Directory meta-documentation for references/ | -| `tests/README.md` | Notes on test coverage for this skill | ## Marketplace files managed diff --git a/plugins/kyberforge/skills/marketplace-author/SKILL.md b/plugins/kyberforge/skills/marketplace-author/SKILL.md index 317e0a4..ee2ea74 100644 --- a/plugins/kyberforge/skills/marketplace-author/SKILL.md +++ b/plugins/kyberforge/skills/marketplace-author/SKILL.md @@ -26,15 +26,7 @@ metadata: - Both marketplace files must be identical after every operation — never update one without the other in the same edit pass. - `source` for local plugins is a relative path from the marketplace root, not the plugin directory name alone (e.g. `"./plugins/kyberforge"`, not `"kyberforge"`). -- `claude plugin validate .` must be run from the repo root, not from the plugin directory or the `.claude-plugin/` directory. - The `{ "source": "github", ... }` object form is only for GitHub. For GitLab, Gitea, or any other git host, use `{ "source": "git", "url": "https://..." }` with a full URL. -- Removing an entry from the marketplace does NOT delete the plugin files — it only removes the catalog listing. -- `version` in a marketplace entry is optional for git-sourced plugins; Claude Code derives version from git tags automatically. Include it when the source is npm or when the user explicitly wants a pinned version visible in the catalog. -- `name` must be kebab-case. Reserved prefixes (`anthropic-*`, `claude-*`, `agent-skills`, `official-claude-plugins`) are rejected by the validator. -- The `plugins[]` array order is not semantically significant, but maintain it consistently — add new entries at the end. -- For Copilot CLI, the canonical marketplace.json location is `.github/plugin/marketplace.json`. Claude Code also reads `.claude-plugin/marketplace.json`. Both are equivalent; this repo maintains both files in sync. -- Copilot CLI places top-level `description` and `version` under a `metadata` object (`metadata.description`, `metadata.version`). Claude Code accepts them at the top level. For dual-tool repos, use the `metadata` form — it is valid in both tools. -- Set `"strict": false` on a plugin entry to allow relaxed schema validation for that entry. This is the right choice for plugins distributed as `.claude-plugin/` directories that also serve Claude Code — it prevents Copilot CLI from failing on CC-specific fields that are not in the Copilot schema. ## Route @@ -105,7 +97,7 @@ Run this flow when a plugin name does not yet exist in `plugins[]` and the inten ### Prerequisites Confirm you have: -- [ ] Plugin name (kebab-case) +- [ ] Plugin name (kebab-case; reserved prefixes `anthropic-*`, `claude-*`, `agent-skills`, `official-claude-plugins` are rejected by the validator) - [ ] Plugin description - [ ] Source type and source value (see source type branching below) - [ ] Version (optional; omit for git-sourced plugins) @@ -114,13 +106,7 @@ If you need details on a specific source type shape or per-entry optional fields ### Source type branching -If the user has not specified a source type, ask: - -> "Which source type does this plugin use? -> 1. **Local path** — plugin lives in this repo (e.g. `./plugins/`) -> 2. **GitHub** — separate GitHub repo (e.g. `owner/repo`) -> 3. **Git URL** — any git host via full URL (e.g. `https://gitlab.com/org/repo.git`) -> 4. **npm** — distributed on npm (e.g. `@scope/package`)" +If the user has not specified a source type, assume local path (the most common case for in-repo plugins). Only ask if the user's intent is unclear: "I'll treat this as a local path plugin — is that right, or does it live on GitHub, a git URL, or npm?" Source shapes per type: @@ -169,7 +155,7 @@ Read `.claude-plugin/marketplace.json` and `.github/plugin/marketplace.json`. Ve ### Step 2 — Add the entry -Append the new entry to the `plugins[]` array in `.claude-plugin/marketplace.json`. +Append the new entry to the end of the `plugins[]` array in `.claude-plugin/marketplace.json`. Array order is not semantically significant, but always add at the end for consistency. ### Step 3 — Mirror @@ -233,7 +219,7 @@ Follow the **VALIDATE** flow. ## VALIDATE -Run `claude plugin validate .` from the repo root: +Run from the repo root (not from the plugin directory or `.claude-plugin/`): ```bash claude plugin validate . @@ -242,5 +228,3 @@ claude plugin validate . Add `--strict` to promote warnings to errors — recommended in CI. Report the output. If validation fails, describe the specific error and what needs to be fixed. Do not attempt to auto-fix validation errors unless the fix is unambiguous (e.g. a trailing comma that violates JSON syntax); otherwise, describe the fix and ask the user to confirm. - -Validation checks include: `marketplace.json` schema compliance, duplicate plugin names, source path traversal, and version mismatches. diff --git a/plugins/kyberforge/skills/marketplace-author/tests/README.md b/plugins/kyberforge/skills/marketplace-author/tests/README.md deleted file mode 100644 index 183d268..0000000 --- a/plugins/kyberforge/skills/marketplace-author/tests/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# tests/ - -Test files for scripts bundled with this skill. - -## When to add tests - -Add tests here when the skill has scripts in `scripts/` that are complex enough -to break silently — validators, parsers, generators, anything with branching -logic or edge cases. Test infrastructure (`.bats`, `*_test.*`, `test_*.sh`) -belongs here, not in `scripts/`. - -## Current state - -`marketplace-author` has no `scripts/` directory — all operations are performed -directly by the agent using Read/Edit/Write tools. No test infrastructure is -needed. - -If a script is added in the future, add bats tests here. Dependencies: - -```bash -git clone https://github.com/bats-core/bats-support tests/test_helper/bats-support -git clone https://github.com/bats-core/bats-assert tests/test_helper/bats-assert -``` - -Run tests from the repo root: - -```bash -bats plugins/kyberforge/skills/marketplace-author/tests/ -``` diff --git a/plugins/kyberforge/skills/plugin-author/SKILL.md b/plugins/kyberforge/skills/plugin-author/SKILL.md index 8b6f2c1..60c0c28 100644 --- a/plugins/kyberforge/skills/plugin-author/SKILL.md +++ b/plugins/kyberforge/skills/plugin-author/SKILL.md @@ -7,8 +7,8 @@ description: > ("release", "tag", "publish"). Manages both Claude Code (.claude-plugin/plugin.json) and Copilot CLI (plugin.json) manifests in one pass. Do not use when the request is about plugin content (skills, agents, - hooks, MCP servers) or marketplace.json entries — use /marketplace-author - for those. + hooks, or MCP servers inside those directories). Do not use for + marketplace.json entries — use /marketplace-author for that. allowed-tools: Bash Read Write Edit metadata: category: factory @@ -104,6 +104,7 @@ Check: - [ ] `version` identical in both manifests (version parity — ADR-0016) - [ ] `author.name` identical in both manifests - [ ] `license` identical in both manifests +- [ ] `keywords` identical in both manifests - [ ] No `FILL_IN_*` placeholders remain - [ ] `displayName` present in CC manifest only - [ ] `author.url` in CC manifest, `author.email` in Copilot manifest