## Summary
- add barebones Clay, Calendly, Rox, and HG Insights app-backed plugins
- add repo marketplace entries for the new plugins
- add focused Otter.ai metadata cleanup while preserving existing
interface copy and prompts
## Validation
- validated Clay, Calendly, Rox, HG Insights, and Otter.ai manifests
with the plugin-creator validator
- verified marketplace JSON parses and diffs have no whitespace errors
- smoke tested Clay, Calendly, and Rox against installed test accounts
This PR adds the Deepnote plugin, including marketplace metadata, app
configuration, branding, README, and dedicated skills.
It enables OpenAI/Codex to connect to Deepnote workspaces, search
projects and integrations, inspect and edit notebooks, run notebooks,
fetch run outputs, read Deepnote docs, and generate workspace-aware
links.
Based on #251, with an additional fix for the Datadog icon path.
The plugin metadata references `./assets/app-icon.png` for both `logo`
and `composerIcon`, so this branch keeps that asset at the plugin root,
matching the layout used by the other plugins. It also removes the
duplicate `.codex-plugin/assets` copy.
Validation:
- Confirmed `plugin.json` resolves `logo` and `composerIcon` to an
existing file.
- Confirmed the local `shwin_plugins` copy has the same fixed asset
path.
---------
Co-authored-by: Cameron Yick <cameron.yick@datadoghq.com>
## Summary
Adds app-backed plugin bundles for the connector conversion batch,
excluding Datadog, Zoom, and Ramp as requested.
Included new plugin bundles:
- Similarweb
- LSEG
- S&P
- Datasite
- FactSet
- ZoomInfo
- Docusign
- Mixpanel
- Aiera
- Close
- Apollo
- Meticulate
- ThoughtSpot
- Midpage
Not included:
- Intercom (no released app)
- Zoho (can't connect)
Also updates the existing Quartr plugin manifest with the extracted
brand color and three default prompts.
## Implementation
Each new plugin includes:
- `.codex-plugin/plugin.json` with display metadata, brand color, icon
references, and three default prompts
- `.app.json` pointing to the connector/app ID
- local logo assets pulled from the submitted URLs and referenced by
`composerIcon` / `logo`
- a marketplace entry in `.agents/plugins/marketplace.json`
Categories were audited against comparable existing plugins. Similarweb,
Mixpanel, Meticulate, and ThoughtSpot are categorized as `Productivity`;
financial, market transcript, and legal research tools remain
`Research`.
## Validation
- Parsed all touched plugin manifests and `.app.json` files as JSON
- Verified referenced logo assets exist and parse as PNG/SVG images
- Parsed generated SVG icons as XML
- Parsed `.agents/plugins/marketplace.json` as JSON
- Ran `git diff --check`
## Summary
- guide Box text reads to use representation signals before uncertain
`get_file_content` and Deep Research `fetch` reads
- stop retrying Box text reads after the selected file reports no
markdown or extracted-text representation
- carry known file `size` into preview selection so `get_file_preview`
is avoided for files already known to exceed Box's 3 MB limit
- bump the Box plugin version for the skill update
## Validation
- `git diff --check -- plugins/box`
- `node plugins/plugin-eval/scripts/plugin-eval.js analyze plugins/box
--format markdown` (reports existing Box plugin budget/structure
warnings; no failures)
## Summary
- normalize the Build iOS Apps plugin starter prompt to the current
plugin prompt-array contract
- shorten the plugin-level prompt on both metadata surfaces so it stays
under the starter-prompt budget
- tighten all eight Build iOS skill trigger descriptions while
preserving routing terms such as App Intents, ETTrace, memgraphs,
XcodeBuildMCP, Liquid Glass, and Observation
## Why
Build iOS Apps was tripping prompt-length warnings in Codex. Its
manifest starter prompt was also a string while the current plugin
surface expects starter prompts as an array capped at three entries and
128 characters per entry.
The skill descriptions were still large enough for `plugin-eval` to fail
the plugin trigger-cost budget after the starter prompt fix, so this PR
keeps the trigger metadata compact without moving any skill behavior out
of the skill bodies.
## Impact
The plugin keeps the same skill inventory and workflows, but its
discovery text is smaller and the starter prompt is a short
Simulator-oriented prompt.
## plugin-eval report progression
The same local report command was used throughout:
```sh
cd plugins/plugin-eval
node ./scripts/plugin-eval.js analyze ../build-ios-apps --format markdown
```
Before the manifest prompt was normalized, `plugin-eval` could not emit
a scored report because the string-shaped `defaultPrompt` hit:
```text
((intermediate value) || []).join is not a function
```
| State | Score | Risk | Checks | Trigger | Invoke | Deferred | Active |
Total |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| First scored report after starter-prompt normalization | 59 / D | high
| 1 fail, 6 warn, 2 info | 754 | 11829 | 37211 | 12583 | 49794 |
| After explicit `Use when` trigger wording | 68 / D | high | 1 fail, 4
warn, 2 info | 753 | 11829 | 37212 | 12582 | 49794 |
| Final after compacting all Build iOS skill descriptions | 77 / C |
medium | 0 fail, 5 warn, 2 info | 354 | 11431 | 37212 | 11785 | 48997 |
The final report clears the failing trigger-cost check. Remaining
warnings are static budget warnings for trigger/invoke/deferred text
plus existing Python helper complexity and missing Python tests.
## Validation
- `node ./scripts/plugin-eval.js analyze ../build-ios-apps --format
markdown`
- `git diff --check`
## Summary
- normalize the Build macOS Apps plugin starter prompt to the current
plugin prompt-array contract
- shorten the plugin-level prompt and all macOS skill trigger
descriptions so discovery metadata stays compact
- defer detailed sidebar/split-view and window modifier examples into
references while keeping skill entrypoints focused
## Why
`build-macos-apps` could not be scored by `plugin-eval` while its
manifest starter prompt was still a string. After that prompt shape was
normalized, the static report showed both trigger and invocation budget
failures driven by long skill trigger metadata and detailed examples in
always-loaded `SKILL.md` entrypoints.
This PR keeps the same macOS skill inventory and routing terms, but
moves detailed examples out of the entrypoint path where they can be
loaded only when the task needs them.
## Impact
Build macOS Apps keeps its existing workflows while its starter prompt
metadata matches the current plugin contract, trigger descriptions are
smaller, and high-detail SwiftUI/window examples live in references
instead of always-loaded skill bodies.
## plugin-eval report progression
The same local report command was used throughout:
```sh
cd plugins/plugin-eval
node ./scripts/plugin-eval.js analyze ../build-macos-apps --format markdown
```
Before the manifest prompt was normalized, `plugin-eval` could not emit
a scored report because the string-shaped `defaultPrompt` hit:
```text
((intermediate value) || []).join is not a function
```
| State | Score | Risk | Checks | Trigger | Invoke | Deferred | Active |
Total |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| First scored report after starter-prompt shape normalization | 67 / D
| high | 2 fail, 1 warn, 2 info | 899 | 15529 | 7722 | 16428 | 24150 |
| After compacting all Build macOS skill descriptions | 77 / C | high |
1 fail, 2 warn, 2 info | 464 | 15092 | 7722 | 15556 | 23278 |
| Final after deferring sidebar/split and window API examples | 86 / B |
medium | 0 fail, 3 warn, 2 info | 464 | 14291 | 8507 | 14755 | 23262 |
The final report clears the trigger and invocation budget failures.
Remaining warnings are static budget warnings for trigger, invoke, and
deferred text.
## Validation
- `node ./scripts/plugin-eval.js analyze ../build-macos-apps --format
markdown`
- `git diff --check`
## Summary
Adds **Build Web Data Visualization**, a Codex plugin for designing,
building, testing, and exporting web-based data visualizations. It
routes requests to the right workflow for charts, dashboards, maps,
WebGL/Three.js scenes, D3/SVG, Gantt charts, diagrams, reports, PDFs,
and slide exports.
The plugin uses a compact implicit router with explicit specialist
skills, keeping common visualization requests lightweight while
preserving deeper guidance when needed.
Also updates **Plugin Eval** so token budget scoring accounts for
explicit-only skills separately from implicit active context.
## Summary
- Port the connector-native simple Google Doc creation boundary from
openai/openai#950198 into the Google Drive plugin.
- Add the native-create direct reference for simple Docs that only need
text, headings, bullets, links, and light formatting.
- Keep DOCX-first creation as the default for polished or
layout-sensitive deliverables, and bump the Google Drive plugin version
to 0.1.1.
## Validation
- `git diff --check`
- `python -c "import json;
json.load(open('plugins/google-drive/.codex-plugin/plugin.json'));
print('plugin json ok')"`
- `python -c "import pathlib,re;
root=pathlib.Path('plugins/google-drive/skills/google-docs');
refs=set(re.findall(r'references/[-A-Za-z0-9_]+\\.md',
(root/'SKILL.md').read_text())); missing=[r for r in refs if not
(root/r).exists()]; print('checked', len(refs), 'refs'); raise
SystemExit('missing refs: '+str(missing) if missing else 0)"`
- `rg -n "google-drive-codex|Google Drive
Codex|plugins/google-drive-codex"
plugins/google-drive/skills/google-docs
plugins/google-drive/.codex-plugin/plugin.json`
## Summary
- Port the Google Docs direct request workflow from openai/openai#947695
into the Google Drive plugin.
- Add direct batchUpdate request composition guidance, meeting-notes
fast path guidance, smart chip/building block notes, and PDF export
visual QA reference material.
- Keep the existing DOCX-first path for polished net-new Docs while
improving connector-first editing guidance.
## Validation
- `git diff --check`
- `python -c "import json;
json.load(open('plugins/google-drive/.codex-plugin/plugin.json'));
print('plugin json ok')"`
- `python -c "import pathlib,re;
root=pathlib.Path('plugins/google-drive/skills/google-docs');
refs=set(re.findall(r'references/[-A-Za-z0-9_]+\\.md',
(root/'SKILL.md').read_text())); missing=[r for r in refs if not
(root/r).exists()]; print('checked', len(refs), 'refs'); raise
SystemExit('missing refs: '+str(missing) if missing else 0)"`
## Why
Net-new Google Docs and Google Slides artifacts have a higher quality
bar when they are authored locally with the dedicated
document/presentation artifact workflows first, then converted into
native Google Workspace files. Those authoring paths provide the local
rendering and QA loops needed for layout, polish, and content
verification before handoff. Directly creating a blank Google Doc or
Slides deck through Google APIs is still possible, but it should be an
explicit user override rather than the default path.
## What changed
- Updated the Google Drive router so new Google Docs and Google Slides
requests route to the specialized Docs/Slides skills, which own the
required local-file-to-native-import workflow.
- Updated the Google Docs skill to require local `.docx` creation
through `[@documents](plugin://documents@openai-primary-runtime)`,
followed by `mcp__codex_apps__google_drive_import_document` with
`upload_mode: "native_google_docs"`.
- Updated the Google Docs import reference to document the native import
action, install/reinstall handling, conversion verification, and
source-file preservation mode.
- Updated the Google Slides skill to require local `.pptx` creation
through
`[@presentations](plugin://presentations@openai-primary-runtime)`,
followed by `mcp__codex_apps__google_drive_import_presentation` with
`upload_mode: "native_google_slides"`.
- Updated the Google Slides import reference to document import-action
availability checks, native conversion verification, direct-to-Slides
anti-patterns, and PowerPoint preservation mode.
## Validation
- `git diff --check`
- `/home/dev-user/.virtualenvs/openai/bin/python
/home/dev-user/code/openai/skills/lint_skills.py
/home/dev-user/code/openai-plugins/plugins/google-drive/skills/google-docs`
- `/home/dev-user/.virtualenvs/openai/bin/python
/home/dev-user/code/openai/skills/lint_skills.py
/home/dev-user/code/openai-plugins/plugins/google-drive/skills/google-slides`
- `/home/dev-user/.virtualenvs/openai/bin/python
/home/dev-user/code/openai/skills/lint_skills.py
/home/dev-user/code/openai-plugins/plugins/google-drive/skills/google-drive`
Related source changes:
- https://github.com/openai/openai/pull/919518
- https://github.com/openai/openai/pull/919139
---------
Co-authored-by: Codex <noreply@openai.com>
## Summary
- Add Slack skill guidance for bucketed per-minute RPM limits.
- Tell agents to avoid immediate same-bucket retries on 429s, respect
explicit wait hints, and back off on repeated 429s.
- Clarify that useful work can continue through other Slack tool buckets
while one bucket is cooling down.
## Why
Slack tools share quotas by bucket rather than by individual tool.
Without bucket-aware retry guidance, agents can amplify rate-limit
pressure by retrying equivalent tools immediately or by serially
exhausting the same quota bucket.
## Validation
- Ran `git diff --check`.
- Markdown-only skill update; no automated test suite run.
## Summary
- Import Zoom combined plugin content from zoom/zoom-plugin-codex commit
6f30034c94b4594daaf814cd9bf4cf972b90a323 into the existing app-backed
Zoom plugin.
- Add Zoom developer commands, reviewer agents, and 53 developer skills
under plugins/zoom while preserving the Zoom app connector mapping and
marketplace identity.
- Mark only the imported developer skills explicit-only with adjacent
agents/openai.yaml files using policy.allow_implicit_invocation: false;
the regular Zoom app/plugin surface remains implicitly invokable.
## Validation
- jq empty plugins/zoom/.codex-plugin/plugin.json plugins/zoom/.app.json
.agents/plugins/marketplace.json
- Ruby validation for all Zoom SKILL.md frontmatters and 53 skill-level
Zoom agents/openai.yaml policy files, plus confirmation that
plugins/zoom/agents/openai.yaml does not disable implicit invocation
- git diff --check HEAD^ HEAD -- plugins/zoom
- node plugins/plugin-eval/scripts/plugin-eval.js analyze plugins/zoom
--format json completed; it reports high static token budget because the
upstream Zoom reference library is large.
## Summary
- tighten Notion skill guidance around the deployed app contract
- repair invalid or misleading tool-call examples across the four
curated Notion skills
- switch database-creation references from REST-style objects to the SQL
DDL form exposed by the live app
## Root cause
Several deployed plugin examples had drifted from the live Apps SDK /
Notion MCP surface. They either omitted connector-required fields, used
unsupported command names, or showed payload shapes that fail connector
validation before they ever reach Notion.
## What changed
- require explicit `filters: {}` in search examples and remove
pseudo-boolean query syntax such as `or` / `+`
- make fetch examples concrete and reinforce that only Notion URLs / IDs
should be fetched
- make create-page examples include explicit `parent` + `pages`
- fix `notion-query-data-sources` to use the top-level `data` wrapper
and collection URLs as SQL table names
- replace invalid `insert_content_after` examples with `update_content`
search-and-replace payloads
- document the deployed `update-page` quirk that requires both
`properties` and `content_updates` top-level fields
- fix `notion-create-comment` examples to use `page_id`
- update database-creation references to the live SQL DDL schema format
## Validation
- live Notion connector probes on 2026-05-19:
- `search` succeeds with `filters: {}` and fails connector validation
when `filters` is omitted
- `query-data-sources` succeeds with the `data` wrapper and fails
connector validation without it
- `create-pages` and `create-database` reject omitted `parent`;
explicit-parent payloads get past schema validation
- `update-page(update_content)` requires `properties: {}`;
`update-page(update_properties)` requires `content_updates: []`
- `create-comment` with object-style `rich_text` passes connector
validation
Sync the Figma plugin skill bundle with
`figma/mcp-server-guide@a742f0a700a7772ff5ed85f7c9fc1dad5afa9fcc`
(`v2.2.12`).
This pulls in Figma's latest guidance updates across the `figma-use`,
FigJam, Slides, design-generation, and library-generation skill
surfaces. The imported changes sharpen the runtime guidance that came up
in recent threads, including editor-context boundaries, text/font
handling, and more efficient Plugin API traversal patterns, while
keeping the local plugin layout unchanged.
Context:
https://openai.slack.com/archives/C09CKPM5UKT/p1779133790898629?thread_ts=1778698066.370709&cid=C09CKPM5UKT
## Summary
- Add a Slack skill write-safety guardrail requiring fresh
channel/thread reads before acting on relative message targets like
"last message".
- Call out reactions, replies, edits, and other writes so stale cached
reads are not reused for message actions.
## Why
The reported issue was that "last message" stayed bound to an older read
result, so a reaction was applied to an hour-old message until the agent
was told to recheck. The skill should force a fresh resolution
immediately before acting on recency-based targets.
## Validation
- Ran `git diff --check`.
- Verified the diff is limited to one insertion in
`plugins/slack/skills/slack/SKILL.md`.
## Summary
- Register the existing Asana plugin in
`.agents/plugins/marketplace.json`.
- Point the marketplace entry at `./plugins/asana` with the standard
available/on-install policy and Productivity category.
## Validation
- Parsed `.agents/plugins/marketplace.json`,
`plugins/asana/.codex-plugin/plugin.json`, and `plugins/asana/.app.json`
with `jq`.
- Checked the marketplace for duplicate plugin names.
- Verified the appended Asana entry shape with `jq`.
## Summary
Plugin Creator now documents the shorter local-plugin handoff URL that
the app can interpret directly.
[#237](https://github.com/openai/plugins/pull/237) teaches the skill to
end marketplace-backed creation flows with named View and Share links;
this follow-up updates those examples so the skill only emits the
normalized plugin name, the absolute marketplace path, and optional
share mode.
The documented shape is:
```txt
codex://plugins/<normalized-plugin-name>?marketplacePath=<absolute-marketplace-json-path>
codex://plugins/<normalized-plugin-name>?marketplacePath=<absolute-marketplace-json-path>&mode=share
```
The skill text now states exactly where the normalized plugin name
belongs, exactly where the absolute marketplace path belongs, and that
it should not add `pluginName` or `hostId` query parameters.
## Testing
Tests: plugin-creator skill validation.
## Summary
Plugin creation now defaults to the personal marketplace path that Codex
can render and share directly.
Before this change, the curated `plugin-creator` skill centered
repo-local plugin scaffolds and repo-root marketplace updates. That made
the common personal-plugin path less explicit, and the public skill copy
did not include the final deeplink handoff back into Codex after
marketplace-backed creation.
This PR makes personal plugins the default flow. Marketplace-backed
scaffolds now default to `~/plugins/<plugin-name>` plus
`~/.agents/plugins/marketplace.json`. If the current Git repo already
has `.agents/plugins/marketplace.json` and the user has not said whether
the plugin is personal or team-shared, the skill asks which marketplace
to update. The skill also ends marketplace-backed creation with named
`View <plugin-name>` and `Share <plugin-name>` deeplinks.
## What changed
- default scaffold and marketplace paths to the personal plugin location
- document the explicit repo/team override path for shared codebases
- ask for user intent only in the ambiguous existing-repo-marketplace
case
- add the final named Codex deeplink handoff after marketplace-backed
creation
- refresh the marketplace reference sample to the `policy.installation`
and `policy.authentication` shape
## Design decisions
- Personal plugins are the default because they are the path users can
create, open, and share without first deciding to commit plugin code
into a team repo.
- Existing repo marketplaces are the one ambiguous case worth
interrupting for. They can mean “add this to the codebase” rather than
“make something for me personally.”
- The deeplink labels include the plugin name so the assistant can
present readable links instead of raw `codex://...` URLs.
## Testing
Tests: skill validation, Python compile checks, personal-default
scaffold smoke, repo-override scaffold smoke, and whitespace checks.
## Summary
- restore the HeyGen plugin under plugins/heygen
- add the plugin to .agents/plugins/marketplace.json so it appears in
the public catalog
- wire the plugin through .app.json and update the bundled skill docs to
match the app-backed flow
## Notes
- this is a fresh branch from origin/main, not a continuation of the
prior reverted branch
Why: the OpenAI Developers plugin is now the OpenAI-owned Codex plugin
for developer workflows, so ChatGPT Apps guidance should live there
instead of requiring developers to discover and install a separate
ChatGPT Apps plugin.
This merges the ChatGPT Apps build and submission skills into
`plugins/openai-developers`. The OpenAI Developers manifest and README
now describe ChatGPT Apps support alongside OpenAI API keys and Agents
SDK workflows, the plugin declares read/write capability because the
moved submission skill inspects local app code, and the plugin version
is bumped to `1.1.0` for the new workflow surface.
The standalone `chatgpt-apps` plugin is removed from the marketplace and
its skill files are moved under OpenAI Developers, so developers get the
ChatGPT Apps SDK scaffolding and `chatgpt-app-submission.json`
generation flows from one plugin.
I checked the OpenAI Developers node tests and JSON parsing locally. The
README's distribution validation command points at a script path that is
not present in this repository clone, so I could not run that
validation.
## Why
ChatGPT app developers can generate `chatgpt-app-submission.json` even
when their MCP tools omit the optional `outputSchema` field. That should
stay non-blocking, but the generated handoff should still point out
missing output schemas because they give models more structure for using
tool results.
## What changed
The `chatgpt-app-submission` skill now records tools whose descriptors
or source definitions omit `outputSchema` or set it to `null`. The
generated JSON remains unchanged, and the skill reports a concise
final-response warning with the affected tool names and a link to the
MCP tool spec.
The `chatgpt-apps` plugin manifest version is bumped from `0.1.0` to
`0.1.1` because the packaged skill content changed.
Co-authored-by: Codex <noreply@openai.com>
## Summary
- Add OpenAI skill interface metadata for all OpenAI Developers skills
so UI copy stays concise.
- Set the Agents SDK display name explicitly while keeping the skill ID
as hyphen-case `agents-sdk` for validator compatibility.
- Shorten API troubleshooting and API key skill descriptions for UI
surfaces.
## Tests
- `yq . plugins/openai-developers/skills/agents-sdk/agents/openai.yaml
plugins/openai-developers/skills/openai-api-troubleshooting/agents/openai.yaml
plugins/openai-developers/skills/openai-platform-api-key/agents/openai.yaml`
- `python3
/Users/mifan/.codex/skills/.system/skill-creator/scripts/quick_validate.py
plugins/openai-developers/skills/openai-api-troubleshooting`
- `python3
/Users/mifan/.codex/skills/.system/skill-creator/scripts/quick_validate.py
plugins/openai-developers/skills/openai-platform-api-key`
- `python3
/Users/mifan/.codex/skills/.system/skill-creator/scripts/quick_validate.py
plugins/openai-developers/skills/agents-sdk`
- `oaipkg run cloud_plugins_import plugin validate
/private/tmp/openai-plugins-publication-master/plugins/openai-developers`
- `node --test
plugins/openai-developers/tests/openai-platform-api-key.test.mjs`
## Summary
Adds the OpenAI Developers plugin under `plugins/openai-developers` with
its plugin manifest, OpenAI Platform app connector manifest, assets,
skills, helper script, README, tests, and eval references.
Registers `openai-developers` in the curated marketplace manifest so it
can be discovered from the public plugin catalog.
Updates the plugin repository metadata to point at
`https://github.com/openai/plugins/tree/main/plugins/openai-developers`
and keeps the production OpenAI Platform connector id in `.app.json`.
Incorporates the OpenAI Developers pieces from openai/openai#890108 by
adding the Agents SDK lifecycle skill, documenting it in the README, and
updating the plugin metadata for Agents SDK usage.
## Validation
- `jq . .agents/plugins/marketplace.json`
- `jq . plugins/openai-developers/.codex-plugin/plugin.json
plugins/openai-developers/.app.json`
- `python3
/Users/mifan/.codex/skills/.system/skill-creator/scripts/quick_validate.py
plugins/openai-developers/skills/agents-sdk`
- `git diff --check`
- `node --test
plugins/openai-developers/tests/openai-platform-api-key.test.mjs`: 21
passed, 2 skipped because the skipped checks depend on monorepo-only
fixture paths that are not present in `openai/plugins`.
## Summary
- Coordinate `frontend-app-builder` with other installed skills when an
app needs provider-backed capabilities.
- Clarify that provider setup should not block Image Gen concepting,
static UI work, or design review that does not exercise provider-backed
behavior.
- Require `openai-developers:openai-platform-api-key` for
AI/model-generated output when available, instead of fake keys,
placeholder env vars, or manual API-key setup instructions.
Adds Zotero to the Codex official plugin marketplace so customers can
install it from the curated plugin list.
Zotero provides a local-library workflow for searching a user’s Zotero
Desktop library, exporting BibTeX, inserting citation keys, reading
indexed full text, and importing BibTeX/RIS records through the local
Zotero connector server.
The plugin entry is registered in the marketplace catalog with the
Research category and includes the plugin manifest, skill instructions,
local API reference, CLI helper, and icon asset.
## Summary
- add a Salesforce app-only Codex plugin backed by the canonical
Salesforce connector
- add Salesforce to the curated plugin marketplace so it can appear in
the Codex plugins directory
- include a minimal local icon asset
## Testing
- python3 -m json.tool plugins/salesforce/.app.json
- python3 -m json.tool plugins/salesforce/.codex-plugin/plugin.json
- python3 -m json.tool .agents/plugins/marketplace.json
- git diff --check
No secrets added.