fix: add displayName, description, and icon to marketplace entries#93
Conversation
- Add displayName from README plugin names to marketplace entries - Add description from README entries (with manifest shortDescription fallback) - Add icon path extracted from plugin manifest's interface.composerIcon/logo - Ensure icons are correctly resolved relative to marketplace.json - Fixes issue where all plugin titles showed as 'awesome-codex-plugins' - Fixes missing images and descriptions in Codex marketplace view
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8c5126a77c
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Some plugins declare composerIcon/logo paths in their manifest but the corresponding files are not present in the repo (e.g., placeholder values or missing assets). The marketplace now verifies the file exists before including the icon reference, avoiding broken image links in Codex.
…lter missing assets marketplace.json entries now include icon only when the declared asset file actually exists in the mirrored plugin directory. This prevents broken image references for plugins that have placeholder values or missing files.
There was a problem hiding this comment.
Code Review
This pull request updates the marketplace plugin generation logic to include 'displayName', 'description', and 'icon' fields in 'marketplace.json'. The reviewer identified a potential logic flaw in the construction of the 'icon_path' and suggested adding validation to prevent invalid paths, such as those containing placeholders, from being included in the generated output.
I am having trouble creating individual review comments. Click here to see my feedback.
scripts/generate_plugins_json.py (249)
The logic for constructing the icon_path is brittle. The check rel.startswith(marketplace_path) is flawed because marketplace_path starts with "./", which will likely cause the check to fail incorrectly for paths that are already relative to the repository root. This can lead to duplicated path segments and incorrect icon URLs.
icon_path = f"{marketplace_path}/{rel}" if not rel.startswith(marketplace_path.lstrip("./")) else f"./{rel}"
.agents/plugins/marketplace.json (464)
This icon path contains a [TODO: ...] placeholder, which is not a valid file path. While the root cause is likely in the source plugin's manifest, the generation script should be made more robust to filter out such invalid values to prevent broken image links in the marketplace.
scripts/generate_plugins_json.py (245)
The script processes icon paths from manifests without validation. This can lead to invalid paths (e.g., containing [TODO: ...]) being included in the generated marketplace.json. To improve robustness against such data quality issues, you should add a check to filter out values that are clearly not valid paths.
if isinstance(composer_icon, str) and composer_icon.strip() and '[' not in composer_icon:
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4356daad6c
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
…ore mirroring - Thread 1 fix: reject placeholder icon values like "[TODO: ./assets/icon.png]" by checking for bracketed TODO/PLACEHOLDER patterns before including icon - Thread 2 fix: clear destination_root in mirror_plugin_bundle() to avoid stale files from previous runs causing false-positive icon existence checks Both changes address chatgpt-codex-connector review feedback.
Update mirrored plugin bundles to reflect current upstream selections; clean stale files from previous runs. This resolves the "Sync marketplace artifacts with README" CI failure by ensuring working tree matches generator output after the rmtree fix.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c79403f7d9
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
normalize_relative_path() previously used lstack("./") which stripped all
leading '.' and '/' characters, mangling dotfile paths like ".mcp.json"
into "mcp.json". This caused required dot-prefixed manifest files to be
omitted from mirrored plugin bundles when the destination was cleaned.
The function now only strips a literal leading "./" or "/" prefix, keeping
dotfiles intact. The manifest path is also normalized the same way when
computing the icon file path to ensure consistency.
Fixes chatgpt-codex-connector P1 review thread at line 221.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 25669ee64d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
…ok configs chatgpt-codex-connector P1: mirror_plugin_bundle with rmtree now relies on collect_selected_paths to fully reconstruct the plugin. The hooks field from the manifest was not being copied, causing installed plugins to lose their hook workflows. Added "hooks" to the manifest keys processed by collect_selected_paths. Restores: - plugins/Kanevry/session-orchestrator/hooks/hooks-codex.json - plugins/BestLemoon/codex-seo/hooks/hooks.json - plugins/sendbird/cc-plugin-codex/hooks/hooks.json
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3e42620344
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| # Clear destination to avoid stale files from previous runs (Thread 2 fix) | ||
| if destination_root.exists(): | ||
| shutil.rmtree(destination_root) |
There was a problem hiding this comment.
Keep transitive runtime files when pruning plugin directories
Deleting each mirrored plugin directory before copy makes the output depend entirely on selected_paths, but that set only includes manifest-declared top-level paths and not files referenced inside copied configs. In this commit, plugins/Kanevry/session-orchestrator/.mcp.json still launches scripts/mcp-server.sh, while plugins/Kanevry/session-orchestrator/scripts/mcp-server.sh is deleted, so the plugin installs with an MCP command that fails at runtime. Please either include transitive config dependencies (e.g., scripts referenced by .mcp.json/hook configs) or avoid destructive pruning.
Useful? React with 👍 / 👎.
…and CI workflow guard The previous commits included regenerated artifacts but missed committing the script changes that produced them. This caused CI to run the old (buggy) script against the new artifacts, detecting a mismatch. Script fixes: - normalize_relative_path: use startswith checks instead of lstrip to preserve dot-prefixed paths like .mcp.json - collect_selected_paths: include 'hooks' manifest key - icon path: use startswith checks instead of lstrip for consistent prefix stripping Workflow fix: - Skip git push on pull_request events (detached HEAD checkout) - Auto-commit/push only on push to main
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7a4941947e
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| else | ||
| echo "::notice::skipping push on ${{ github.event_name }} (detached HEAD on PR merge ref)" | ||
| fi |
There was a problem hiding this comment.
Fail PR runs when regenerated artifacts differ
In .github/workflows/validate-plugins.yml, the pull_request path now only logs a notice when git diff detects out-of-sync generated artifacts and then exits successfully, because the else branch at lines 47-49 does not exit 1. This means PR checks can pass with stale plugins.json, .agents/plugins/marketplace.json, or mirrored plugins/** content, so reviewers may merge unvalidated generated state and only discover drift after merge on push events.
Useful? React with 👍 / 👎.
Previously, the Codex marketplace entries lacked proper display metadata, causing two issues:
Root cause: build_marketplace_entry() in scripts/generate_plugins_json.py only emitted name, source, policy, and category. It never included displayName, description, or icon fields from each plugin's manifest.
Fix:
.marketplace.json now properly provides the metadata Codex needs to render each plugin correctly.