Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,21 @@
"category": "Development & Workflow",
"description": "MCP server exposing reasoning, code, anti-deception, and memory harness tools for Codex."
},
{
"name": "eoc",
"displayName": "Everything OpenAI Codex",
"source": {
"source": "local",
"path": "./plugins/mturac/everything-openai-codex"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
Comment on lines +276 to +277

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Mark metadata-only mirror as not installable

This entry advertises installation: "AVAILABLE", but the mirrored bundle in this commit is explicitly metadata-only and has no executable plugin surface, so installing eoc from this curated marketplace gives users an effectively empty plugin instead of the described workflow system. Fresh evidence: plugins/mturac/everything-openai-codex/.codex-plugin/plugin.json in this commit now has no skills/commands sections and an empty mcpServers object, while the mirror README states that skills and install profiles remain upstream.

Useful? React with 👍 / 👎.

},
"category": "Development & Workflow",
"description": "EOC is an open-source operating system for Codex workflows with 200+ skills, agents, hooks, rules, memory, safety gates, install profiles, and cross-harness adapters.",
"icon": "./plugins/mturac/everything-openai-codex/assets/icon.svg"
},
{
"name": "frappe-agent",
"displayName": "Frappe Agent",
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ Third-party plugins built by the community. [PRs welcome](#contributing)!
- [Development Skills](https://github.com/reidemeister94/development-skills) - Three-tier triage (PASS_THROUGH / LIGHT / FULL 4-phase) development workflow for Codex and Claude Code with language auto-detection (Python, Java, TypeScript, Swift, frontend) and a staff-reviewer subagent for fresh-eyes review on every change.
- [ejentum-mcp](https://github.com/ejentum/ejentum-mcp) - MCP server exposing reasoning, code, anti-deception, and memory harness tools for Codex.
- [Env Lint](./plugins/mturac/env-lint) - `.env` vs `.env.example` key parity — never prints values.
- [Everything OpenAI Codex](https://github.com/mturac/everything-openai-codex) - EOC is an open-source operating system for Codex workflows with 200+ skills, agents, hooks, rules, memory, safety gates, install profiles, and cross-harness adapters.
- [Flaky Detector](./plugins/mturac/flaky-detector) - Run a test command N times, report per-test flakiness %.
- [Frappe Agent](https://github.com/Dkm0315/frappe-agent) - Frappe and ERPNext coding, customization, bench, and review intelligence for Codex.
- [GrayMatter](https://github.com/ValkyrLabs/GrayMatter) - Durable memory and shared graph state for Codex and OpenClaw agents, with live ValkyrAI schema awareness.
Expand Down
10 changes: 10 additions & 0 deletions plugins.json
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,16 @@
"source": "awesome-codex-plugins",
"install_url": "https://raw.githubusercontent.com/ejentum/ejentum-mcp/HEAD/.codex-plugin/plugin.json"
},
{
"name": "Everything OpenAI Codex",
"url": "https://github.com/mturac/everything-openai-codex",
"owner": "mturac",
"repo": "everything-openai-codex",
"description": "EOC is an open-source operating system for Codex workflows with 200+ skills, agents, hooks, rules, memory, safety gates, install profiles, and cross-harness adapters.",
"category": "Development & Workflow",
"source": "awesome-codex-plugins",
"install_url": "https://raw.githubusercontent.com/mturac/everything-openai-codex/HEAD/.codex-plugin/plugin.json"
},
{
"name": "Frappe Agent",
"url": "https://github.com/Dkm0315/frappe-agent",
Expand Down
31 changes: 31 additions & 0 deletions plugins/mturac/everything-openai-codex/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "eoc",
"version": "2.0.0-rc.1",
"description": "Open-source Codex workflow collection with install profiles, repo conventions, validation checks, and documentation.",
"author": {
"name": "Mehmet Turac",
"url": "https://github.com/mturac"
},
"homepage": "https://github.com/mturac/everything-openai-codex",
"repository": "https://github.com/mturac/everything-openai-codex",
"license": "MIT",
"keywords": [
"codex",
"workflow",
"documentation"
],
"mcpServers": {},
"interface": {
"displayName": "Everything OpenAI Codex",
"shortDescription": "Codex workflow collection with install profiles, repo conventions, validation checks, and documentation.",
"longDescription": "Everything OpenAI Codex (EOC) is a community-maintained Codex workflow collection. The upstream repository contains the full documentation, install profiles, skills, commands, and validation material.",
"developerName": "Mehmet Turac",
"composerIcon": "./assets/icon.svg",
"category": "Coding",
"capabilities": [
"Read",
"Write"
],
"websiteURL": "https://github.com/mturac/everything-openai-codex"
}
}
11 changes: 11 additions & 0 deletions plugins/mturac/everything-openai-codex/.codexignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
node_modules/
dist/
build/
.next/
coverage/
tmp/
logs/
.opencode/dist/
*.log
*.pyc
__pycache__/
21 changes: 21 additions & 0 deletions plugins/mturac/everything-openai-codex/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Mehmet Turac

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
1 change: 1 addition & 0 deletions plugins/mturac/everything-openai-codex/assets/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
86 changes: 83 additions & 3 deletions scripts/generate_plugins_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@
"yarn.lock",
".codexignore",
)
METADATA_ONLY_MIRROR_REPOS = {
# EOC's repo-root Codex plugin references a large skills/commands catalog.
# Keep the directory mirror installable as marketplace metadata without
# copying the full upstream repository or leaving broken local references.
"mturac/everything-openai-codex",
}


def normalize_relative_path(value: str) -> str:
Expand Down Expand Up @@ -208,6 +214,68 @@ def collect_selected_paths(
return selected


def is_metadata_only_mirror(plugin: dict[str, str]) -> bool:
return f"{plugin['owner']}/{plugin['repo']}" in METADATA_ONLY_MIRROR_REPOS


def collect_metadata_only_paths(
manifest: dict[str, object],
all_names: set[str],
plugin_root: PurePosixPath,
) -> set[str]:
selected = {".codex-plugin/plugin.json"}

for optional_name in ("LICENSE", "LICENSE.md", "LICENSE.txt", ".codexignore"):
candidate = plugin_root.joinpath(optional_name).as_posix()
if candidate in all_names:
selected.add(optional_name)

interface = manifest.get("interface")
if isinstance(interface, dict):
for key in ("composerIcon", "logo"):
value = interface.get(key)
if isinstance(value, str):
add_recursive_selection(selected, all_names, plugin_root, value)

return selected


def sanitize_metadata_only_manifest(manifest: dict[str, object], plugin: dict[str, str]) -> dict[str, object]:
sanitized = json.loads(json.dumps(manifest))

for key in ("skills", "commands", "hooks", "apps", "app", "appConfig"):
sanitized.pop(key, None)

if f"{plugin['owner']}/{plugin['repo']}" == "mturac/everything-openai-codex":
repo_url = "https://github.com/mturac/everything-openai-codex"
sanitized["description"] = (
"Open-source Codex workflow collection with install profiles, repo "
"conventions, validation checks, and documentation."
)
sanitized["author"] = {
"name": "Mehmet Turac",
"url": "https://github.com/mturac",
}
sanitized["homepage"] = repo_url

interface = sanitized.setdefault("interface", {})
if isinstance(interface, dict):
interface["shortDescription"] = (
"Codex workflow collection with install profiles, repo conventions, "
"validation checks, and documentation."
)
interface["longDescription"] = (
"Everything OpenAI Codex (EOC) is a community-maintained Codex "
"workflow collection. The upstream repository contains the full "
"documentation, install profiles, skills, commands, and validation material."
)
interface["developerName"] = "Mehmet Turac"
interface["category"] = "Coding"
interface["websiteURL"] = repo_url

return sanitized


def mirror_plugin_bundle(plugin: dict[str, str]) -> tuple[dict[str, object], str, str]:
owner_repo = f"{plugin['owner']}/{plugin['repo']}"
try:
Expand All @@ -220,7 +288,13 @@ def mirror_plugin_bundle(plugin: dict[str, str]) -> tuple[dict[str, object], str
except ValueError:
raise ValueError(f"Archive for {owner_repo} does not contain .codex-plugin/plugin.json") from None
manifest = load_manifest(archive, plugin_root)
selected_paths = collect_selected_paths(manifest, names, plugin_root)
metadata_only = is_metadata_only_mirror(plugin)
selected_paths = (
collect_metadata_only_paths(manifest, names, plugin_root)
if metadata_only
else collect_selected_paths(manifest, names, plugin_root)
)
mirrored_manifest = sanitize_metadata_only_manifest(manifest, plugin) if metadata_only else manifest

destination_root = PLUGINS_ROOT / plugin["owner"] / plugin["repo"]
# Clear destination to avoid stale files from previous runs (Thread 2 fix)
Expand All @@ -232,9 +306,15 @@ def mirror_plugin_bundle(plugin: dict[str, str]) -> tuple[dict[str, object], str
archive_name = plugin_root.joinpath(PurePosixPath(relative_path)).as_posix()
destination_path = destination_root / PurePosixPath(relative_path)
destination_path.parent.mkdir(parents=True, exist_ok=True)
destination_path.write_bytes(archive.read(archive_name))
if relative_path == ".codex-plugin/plugin.json":
destination_path.write_text(
json.dumps(mirrored_manifest, indent=2, ensure_ascii=False) + "\n",
encoding="utf-8",
)
else:
destination_path.write_bytes(archive.read(archive_name))

return manifest, f"./plugins/{plugin['owner']}/{plugin['repo']}", plugin_root_relative_path(plugin_root)
return mirrored_manifest, f"./plugins/{plugin['owner']}/{plugin['repo']}", plugin_root_relative_path(plugin_root)


def build_marketplace_entry(
Expand Down
Loading