Thank you for your interest in contributing! This project is maintained by JFrog and licensed under the Apache License 2.0.
All contributors must sign the JFrog CLA before contributions can be merged. A CLA check runs automatically on every pull request — follow the prompts to sign if you haven't already.
- Fork the repository and create a feature branch from
main. - Make your changes, ensuring they follow the existing code style and project conventions.
- Validate locally:
npm test # unit tests for the manifest/skill validator
npm run validate # lint the plugin manifests + skill frontmatter- Test by loading your clone as the plugin. The repo root is the marketplace root (
.agents/plugins/marketplace.jsonregisters thejfrogplugin):
codex plugin marketplace add /path/to/codex-plugin
codex plugin add jfrog@codex-pluginExercise the skills you changed, then browse installed plugins in the Codex TUI with /plugins.
- Commit with a clear, descriptive message.
- Open a pull request against
mainwith a summary of what changed and why.
The skills/ tree is vendored from jfrog/jfrog-skills and committed to main — see VENDOR.md for the full flow. To regenerate the tree locally against the pin in scripts/sync-skills-vendor.json:
node scripts/sync-skills.mjsThis downloads the pinned upstream tarball and replaces the contents of skills/. Commit the result alongside the pin bump and the matching version bump (see Releasing).
-
npm testandnpm run validatepass. -
versionbumped and identical in both.codex-plugin/plugin.jsonandpackage.json(CI enforces the match). - No secrets, credentials, or API keys committed.
- If the skill tree changed:
pininscripts/sync-skills-vendor.jsonmatches the upstream tag the new tree was generated from, and the README Prerequisites link points at that tag. - Smoke-test: install locally with
codex plugin marketplace add /path/to/codex-plugin && codex plugin add jfrog@codex-plugin.
To cut a release:
- In your PR, bump
versionin both.codex-plugin/plugin.jsonandpackage.jsonto the same, not-yet-released value.plugin.jsonis canonical;package.jsoncarries its own copy, and the two are cross-checked. - Merge to
mainwith[major],[minor], or[patch]in the commit subject — the first line. A marker elsewhere in the body is ignored on purpose.
The marker only decides whether to release; the version comes from the manifests either way, so the bump is reviewed in the PR that makes it. Merging a marker without bumping the manifests fails the release rather than re-tagging a shipped version.
.github/workflows/release.yml reads the version from .codex-plugin/plugin.json (cross-checked against package.json), refuses to continue if that version is already tagged, re-runs the same validation as the PR workflow, packages the tracked files at HEAD (minus .github/) into release.zip, and creates the vX.Y.Z tag as part of publishing the GitHub Release.
A PR without a marker (docs, chores, or fixes that don't ship a new plugin version) merges normally and cuts no release.
Open a GitHub issue with:
- A clear title and description of the problem.
- Steps to reproduce (if applicable).
- Expected vs. actual behavior.
- Keep changes focused — one logical change per PR.
- Follow existing patterns and naming conventions in the codebase.
- Do not commit secrets, credentials, or API keys.
Be respectful and constructive. We are committed to providing a welcoming and inclusive experience for everyone.
For questions about this project's OSS status or licensing, contact ossgov@jfrog.com.