cc-plugin-to-codex 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cc_plugin_to_codex-0.1.0/.gitignore +40 -0
- cc_plugin_to_codex-0.1.0/CHANGELOG.md +24 -0
- cc_plugin_to_codex-0.1.0/LICENSE +21 -0
- cc_plugin_to_codex-0.1.0/PKG-INFO +226 -0
- cc_plugin_to_codex-0.1.0/README.md +189 -0
- cc_plugin_to_codex-0.1.0/pyproject.toml +99 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/__init__.py +7 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/__main__.py +4 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/agent_convert.py +95 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/bridge.py +137 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/cli.py +554 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/interactive.py +146 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/log.py +42 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/marketplace.py +79 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/py.typed +0 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/registry.py +49 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/scopes.py +46 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/sources.py +155 -0
- cc_plugin_to_codex-0.1.0/src/cc_plugin_to_codex/sync.py +399 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
.venv/
|
|
3
|
+
venv/
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.pyc
|
|
6
|
+
*.pyo
|
|
7
|
+
*.pyd
|
|
8
|
+
.coverage
|
|
9
|
+
htmlcov/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
dist/
|
|
12
|
+
build/
|
|
13
|
+
wheels/
|
|
14
|
+
|
|
15
|
+
# Testing
|
|
16
|
+
.pytest_cache/
|
|
17
|
+
.tox/
|
|
18
|
+
.nox/
|
|
19
|
+
|
|
20
|
+
# Type checking
|
|
21
|
+
.mypy_cache/
|
|
22
|
+
.pyre/
|
|
23
|
+
.pytype/
|
|
24
|
+
|
|
25
|
+
# IDE
|
|
26
|
+
.vscode/
|
|
27
|
+
.idea/
|
|
28
|
+
*.swp
|
|
29
|
+
*.swo
|
|
30
|
+
|
|
31
|
+
# OS
|
|
32
|
+
.DS_Store
|
|
33
|
+
Thumbs.db
|
|
34
|
+
|
|
35
|
+
# Environments
|
|
36
|
+
.env
|
|
37
|
+
.envrc
|
|
38
|
+
|
|
39
|
+
# Local planning artifacts (specs, plans from brainstorming sessions)
|
|
40
|
+
docs/superpowers/
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2026-04-16
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Initial release.
|
|
15
|
+
- `plugin-browse`: list plugins exposed by a Claude Code marketplace (Git URL or local checkout).
|
|
16
|
+
- `plugin-sync`: install a bridge plugin into Codex with atomic stage + rename semantics.
|
|
17
|
+
- `plugin-list`: show installed bridges across `global` / `project` scopes.
|
|
18
|
+
- `plugin-update`: re-sync a bridge from the source recorded in its `x-cc-bridge` marker.
|
|
19
|
+
- `plugin-uninstall`: remove bridge plugin directory, associated agent TOMLs, and registry entry.
|
|
20
|
+
- Automatic CC agent (`.md` with YAML frontmatter) → Codex agent (`.toml`) conversion.
|
|
21
|
+
- Stale agent cleanup on re-sync.
|
|
22
|
+
- Dual mode: interactive (`questionary`) + strict (AI/CI friendly, all flags required).
|
|
23
|
+
- `--json` output for all commands.
|
|
24
|
+
- Conflict protection via `x-cc-bridge` marker — user-authored files never overwritten unless `--force`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fangzzzjjj
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cc-plugin-to-codex
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Bridge Claude Code marketplace plugins into Codex (skills + subagents)
|
|
5
|
+
Project-URL: Homepage, https://github.com/ProAlexUSC/cc-plugin-to-codex
|
|
6
|
+
Project-URL: Repository, https://github.com/ProAlexUSC/cc-plugin-to-codex
|
|
7
|
+
Project-URL: Issues, https://github.com/ProAlexUSC/cc-plugin-to-codex/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/ProAlexUSC/cc-plugin-to-codex/blob/main/CHANGELOG.md
|
|
9
|
+
Author-email: fangzzzjjj <fangzzzjjj@gmail.com>
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: bridge,claude-code,cli,codex,marketplace,plugin
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
23
|
+
Requires-Python: >=3.11
|
|
24
|
+
Requires-Dist: pyyaml<7.0,>=6.0
|
|
25
|
+
Requires-Dist: questionary<3.0,>=2.0
|
|
26
|
+
Requires-Dist: rich<16.0,>=13.0
|
|
27
|
+
Requires-Dist: tomli-w<2.0,>=1.0
|
|
28
|
+
Requires-Dist: typer<1.0,>=0.12
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: mypy<2.0,>=1.10; extra == 'dev'
|
|
31
|
+
Requires-Dist: pre-commit<5.0,>=3.7; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov<8.0,>=5.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest<10.0,>=8.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff<1.0,>=0.6; extra == 'dev'
|
|
35
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# cc-plugin-to-codex
|
|
39
|
+
|
|
40
|
+
[](https://github.com/ProAlexUSC/cc-plugin-to-codex/actions/workflows/ci.yml)
|
|
41
|
+
[](https://codecov.io/gh/ProAlexUSC/cc-plugin-to-codex)
|
|
42
|
+
[](https://pypi.org/project/cc-plugin-to-codex/)
|
|
43
|
+
[](https://pypi.org/project/cc-plugin-to-codex/)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
46
|
+
Bridge [Claude Code](https://docs.claude.com/en/docs/claude-code) marketplace
|
|
47
|
+
plugins into [Codex](https://developers.openai.com/codex). Every source plugin
|
|
48
|
+
becomes a `cc-<name>` Codex bridge, CC agent Markdown files are converted into
|
|
49
|
+
Codex TOML agents, and everything is marked with an `x-cc-bridge` tag so `list`,
|
|
50
|
+
`update`, and `uninstall` can cleanly manage them later.
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
- **Multi-source**: accept a Git URL or a local marketplace checkout; interactive
|
|
55
|
+
mode can also scan `~/.claude/plugins/marketplaces/` for every local market.
|
|
56
|
+
- **Dual scope**: install either globally (`~/.codex/`, `~/.agents/`) or per
|
|
57
|
+
project (`$PWD/.codex/`, `$PWD/.agents/`).
|
|
58
|
+
- **Atomic swap**: each plugin is staged in a sibling temp directory and swapped
|
|
59
|
+
in with a POSIX rename, so a crash mid-sync leaves no half-written state.
|
|
60
|
+
- **Dual-mode CLI**:
|
|
61
|
+
- TTY: `questionary`-driven selectors for source, plugins, scope, bridges.
|
|
62
|
+
- Non-TTY / `--yes` / `--json` / `--non-interactive`: strict mode — missing
|
|
63
|
+
required flags fail loudly instead of hanging.
|
|
64
|
+
- **Safe re-sync**: stale agents removed automatically; switching source on the
|
|
65
|
+
same bridge is refused unless `--force`.
|
|
66
|
+
- **Hands-off marker**: user-authored plugins / agents without `x-cc-bridge` are
|
|
67
|
+
never touched.
|
|
68
|
+
|
|
69
|
+
## Installation
|
|
70
|
+
|
|
71
|
+
### `uvx` (recommended, zero install)
|
|
72
|
+
|
|
73
|
+
[`uv`](https://docs.astral.sh/uv/) ships with a one-shot runner:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
uvx --from cc-plugin-to-codex cc2codex --help
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Every invocation grabs the latest released version from PyPI. Add a shell alias
|
|
80
|
+
if you use it often:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
alias cc2codex='uvx --from cc-plugin-to-codex cc2codex'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### `uv tool install` (persistent)
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
uv tool install cc-plugin-to-codex
|
|
90
|
+
cc2codex --help
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Upgrade later with:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
uv tool upgrade cc-plugin-to-codex
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Plain pip
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
pip install cc-plugin-to-codex
|
|
103
|
+
cc2codex --help
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Commands
|
|
107
|
+
|
|
108
|
+
| Command | Purpose |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `cc2codex plugin-browse` | List plugins exposed by a source marketplace. Read-only. |
|
|
111
|
+
| `cc2codex plugin-sync` | Install bridge plugins (skills + subagents) into Codex. |
|
|
112
|
+
| `cc2codex plugin-list` | Show installed bridges and their scope paths. |
|
|
113
|
+
| `cc2codex plugin-update` | Re-sync a bridge from the source recorded in its marker. |
|
|
114
|
+
| `cc2codex plugin-uninstall` | Remove bridge plugins by `x-cc-bridge` marker. |
|
|
115
|
+
|
|
116
|
+
Each command supports `--help` for the full flag reference.
|
|
117
|
+
|
|
118
|
+
## Asking an AI to drive `cc2codex`
|
|
119
|
+
|
|
120
|
+
A ready-made, agent-optimized skill file lives at
|
|
121
|
+
[`skills/cc2codex/SKILL.md`](https://github.com/ProAlexUSC/cc-plugin-to-codex/blob/main/skills/cc2codex/SKILL.md).
|
|
122
|
+
It is written in the format Claude / Codex agents consume (frontmatter
|
|
123
|
+
trigger + full flag / schema reference / strict-mode rules / pitfalls).
|
|
124
|
+
|
|
125
|
+
If you want an AI assistant — inside Claude Code, Codex, or any chat
|
|
126
|
+
tool that can read a URL — to operate cc2codex for you, paste the raw
|
|
127
|
+
URL above into the conversation and tell it "read this before you
|
|
128
|
+
run any cc2codex command". The assistant will then know which flags
|
|
129
|
+
are mandatory in non-interactive mode, how the `x-cc-bridge` marker
|
|
130
|
+
semantics work, and the post-install Codex restart step users
|
|
131
|
+
frequently forget.
|
|
132
|
+
|
|
133
|
+
## Quick start
|
|
134
|
+
|
|
135
|
+
Browse a marketplace:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
cc2codex plugin-browse --source https://github.com/your-org/your-cc-marketplace.git
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Sync specific plugins to the global Codex scope:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
cc2codex plugin-sync \
|
|
145
|
+
--source https://github.com/your-org/your-cc-marketplace.git \
|
|
146
|
+
--plugin ios-dev --plugin base \
|
|
147
|
+
--scope global \
|
|
148
|
+
--yes
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Sync every plugin to the current project:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
cc2codex plugin-sync \
|
|
155
|
+
--source /path/to/local/cc-marketplace \
|
|
156
|
+
--all-plugins --scope project \
|
|
157
|
+
--yes
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
AI / scripting flow — full JSON output, no prompts:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
cc2codex plugin-sync \
|
|
164
|
+
--source <url> --all-plugins --scope global \
|
|
165
|
+
--non-interactive --json
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
List, update, remove:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
cc2codex plugin-list
|
|
172
|
+
cc2codex plugin-update --all --scope global --yes
|
|
173
|
+
cc2codex plugin-uninstall cc-ios-dev --scope global --yes
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
> **Codex needs one manual step after `plugin-sync`**
|
|
177
|
+
>
|
|
178
|
+
> Codex does not hot-reload `~/.agents/plugins/marketplace.json`. After the
|
|
179
|
+
> first `plugin-sync`, restart Codex (or open a new session) and run
|
|
180
|
+
> `/plugins` to install the bridge from the "CC Bridged Plugins" marketplace.
|
|
181
|
+
> Until then Codex will not load the skills and agents.
|
|
182
|
+
|
|
183
|
+
## How it works
|
|
184
|
+
|
|
185
|
+
For each selected plugin, `plugin-sync`:
|
|
186
|
+
|
|
187
|
+
1. Resolves the source (Git clone into `/tmp`, or reads the local path).
|
|
188
|
+
2. Copies the plugin directory to `cc-<name>/`, blacklisting CC-only mechanisms
|
|
189
|
+
(`hooks/`, `commands/`, `agents/`, `.claude-plugin/`) and VCS/build noise
|
|
190
|
+
(`__pycache__`, `.git`, `.DS_Store`, …). Skills, scripts, assets, and docs
|
|
191
|
+
survive.
|
|
192
|
+
3. Writes `.codex-plugin/plugin.json` with the `x-cc-bridge` marker (source URL,
|
|
193
|
+
ref, commit SHA, synced timestamp, agent list, …).
|
|
194
|
+
4. Converts every `agents/*.md` to a `cc_<plugin>_<agent>.toml` under
|
|
195
|
+
`~/.codex/agents/`, prefixing each file with a `# x-cc-bridge: {…}` comment
|
|
196
|
+
so later runs recognise them as tool-generated.
|
|
197
|
+
5. Upserts the entry into `marketplace.json` with
|
|
198
|
+
`policy.installation = INSTALLED_BY_DEFAULT`.
|
|
199
|
+
|
|
200
|
+
Re-syncing the same source compares the old marker's `agents` list with the new
|
|
201
|
+
one and unlinks stale bridge agents; hand-authored TOMLs never match the marker
|
|
202
|
+
and are kept.
|
|
203
|
+
|
|
204
|
+
## Development
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
git clone https://github.com/ProAlexUSC/cc-plugin-to-codex
|
|
208
|
+
cd cc-plugin-to-codex
|
|
209
|
+
uv sync --extra dev
|
|
210
|
+
uv run pytest -v
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
CI runs the same `pytest` across Python 3.11 / 3.12 / 3.13 on Ubuntu and macOS.
|
|
214
|
+
|
|
215
|
+
## Releasing
|
|
216
|
+
|
|
217
|
+
1. Bump `version` in `pyproject.toml` and update `CHANGELOG.md`.
|
|
218
|
+
2. Commit and tag: `git tag v0.X.Y && git push origin v0.X.Y`.
|
|
219
|
+
3. The `Publish to PyPI` workflow builds the wheel + sdist and uploads them via
|
|
220
|
+
[PyPI Trusted Publishing](https://docs.pypi.org/trusted-publishers/).
|
|
221
|
+
Configure the trusted publisher once on PyPI with `workflow = publish.yml`
|
|
222
|
+
and `environment = pypi`.
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
[MIT](LICENSE).
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# cc-plugin-to-codex
|
|
2
|
+
|
|
3
|
+
[](https://github.com/ProAlexUSC/cc-plugin-to-codex/actions/workflows/ci.yml)
|
|
4
|
+
[](https://codecov.io/gh/ProAlexUSC/cc-plugin-to-codex)
|
|
5
|
+
[](https://pypi.org/project/cc-plugin-to-codex/)
|
|
6
|
+
[](https://pypi.org/project/cc-plugin-to-codex/)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
Bridge [Claude Code](https://docs.claude.com/en/docs/claude-code) marketplace
|
|
10
|
+
plugins into [Codex](https://developers.openai.com/codex). Every source plugin
|
|
11
|
+
becomes a `cc-<name>` Codex bridge, CC agent Markdown files are converted into
|
|
12
|
+
Codex TOML agents, and everything is marked with an `x-cc-bridge` tag so `list`,
|
|
13
|
+
`update`, and `uninstall` can cleanly manage them later.
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- **Multi-source**: accept a Git URL or a local marketplace checkout; interactive
|
|
18
|
+
mode can also scan `~/.claude/plugins/marketplaces/` for every local market.
|
|
19
|
+
- **Dual scope**: install either globally (`~/.codex/`, `~/.agents/`) or per
|
|
20
|
+
project (`$PWD/.codex/`, `$PWD/.agents/`).
|
|
21
|
+
- **Atomic swap**: each plugin is staged in a sibling temp directory and swapped
|
|
22
|
+
in with a POSIX rename, so a crash mid-sync leaves no half-written state.
|
|
23
|
+
- **Dual-mode CLI**:
|
|
24
|
+
- TTY: `questionary`-driven selectors for source, plugins, scope, bridges.
|
|
25
|
+
- Non-TTY / `--yes` / `--json` / `--non-interactive`: strict mode — missing
|
|
26
|
+
required flags fail loudly instead of hanging.
|
|
27
|
+
- **Safe re-sync**: stale agents removed automatically; switching source on the
|
|
28
|
+
same bridge is refused unless `--force`.
|
|
29
|
+
- **Hands-off marker**: user-authored plugins / agents without `x-cc-bridge` are
|
|
30
|
+
never touched.
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
### `uvx` (recommended, zero install)
|
|
35
|
+
|
|
36
|
+
[`uv`](https://docs.astral.sh/uv/) ships with a one-shot runner:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
uvx --from cc-plugin-to-codex cc2codex --help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Every invocation grabs the latest released version from PyPI. Add a shell alias
|
|
43
|
+
if you use it often:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
alias cc2codex='uvx --from cc-plugin-to-codex cc2codex'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### `uv tool install` (persistent)
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
uv tool install cc-plugin-to-codex
|
|
53
|
+
cc2codex --help
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Upgrade later with:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
uv tool upgrade cc-plugin-to-codex
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Plain pip
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pip install cc-plugin-to-codex
|
|
66
|
+
cc2codex --help
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Commands
|
|
70
|
+
|
|
71
|
+
| Command | Purpose |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `cc2codex plugin-browse` | List plugins exposed by a source marketplace. Read-only. |
|
|
74
|
+
| `cc2codex plugin-sync` | Install bridge plugins (skills + subagents) into Codex. |
|
|
75
|
+
| `cc2codex plugin-list` | Show installed bridges and their scope paths. |
|
|
76
|
+
| `cc2codex plugin-update` | Re-sync a bridge from the source recorded in its marker. |
|
|
77
|
+
| `cc2codex plugin-uninstall` | Remove bridge plugins by `x-cc-bridge` marker. |
|
|
78
|
+
|
|
79
|
+
Each command supports `--help` for the full flag reference.
|
|
80
|
+
|
|
81
|
+
## Asking an AI to drive `cc2codex`
|
|
82
|
+
|
|
83
|
+
A ready-made, agent-optimized skill file lives at
|
|
84
|
+
[`skills/cc2codex/SKILL.md`](https://github.com/ProAlexUSC/cc-plugin-to-codex/blob/main/skills/cc2codex/SKILL.md).
|
|
85
|
+
It is written in the format Claude / Codex agents consume (frontmatter
|
|
86
|
+
trigger + full flag / schema reference / strict-mode rules / pitfalls).
|
|
87
|
+
|
|
88
|
+
If you want an AI assistant — inside Claude Code, Codex, or any chat
|
|
89
|
+
tool that can read a URL — to operate cc2codex for you, paste the raw
|
|
90
|
+
URL above into the conversation and tell it "read this before you
|
|
91
|
+
run any cc2codex command". The assistant will then know which flags
|
|
92
|
+
are mandatory in non-interactive mode, how the `x-cc-bridge` marker
|
|
93
|
+
semantics work, and the post-install Codex restart step users
|
|
94
|
+
frequently forget.
|
|
95
|
+
|
|
96
|
+
## Quick start
|
|
97
|
+
|
|
98
|
+
Browse a marketplace:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cc2codex plugin-browse --source https://github.com/your-org/your-cc-marketplace.git
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Sync specific plugins to the global Codex scope:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
cc2codex plugin-sync \
|
|
108
|
+
--source https://github.com/your-org/your-cc-marketplace.git \
|
|
109
|
+
--plugin ios-dev --plugin base \
|
|
110
|
+
--scope global \
|
|
111
|
+
--yes
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Sync every plugin to the current project:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
cc2codex plugin-sync \
|
|
118
|
+
--source /path/to/local/cc-marketplace \
|
|
119
|
+
--all-plugins --scope project \
|
|
120
|
+
--yes
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
AI / scripting flow — full JSON output, no prompts:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
cc2codex plugin-sync \
|
|
127
|
+
--source <url> --all-plugins --scope global \
|
|
128
|
+
--non-interactive --json
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
List, update, remove:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
cc2codex plugin-list
|
|
135
|
+
cc2codex plugin-update --all --scope global --yes
|
|
136
|
+
cc2codex plugin-uninstall cc-ios-dev --scope global --yes
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
> **Codex needs one manual step after `plugin-sync`**
|
|
140
|
+
>
|
|
141
|
+
> Codex does not hot-reload `~/.agents/plugins/marketplace.json`. After the
|
|
142
|
+
> first `plugin-sync`, restart Codex (or open a new session) and run
|
|
143
|
+
> `/plugins` to install the bridge from the "CC Bridged Plugins" marketplace.
|
|
144
|
+
> Until then Codex will not load the skills and agents.
|
|
145
|
+
|
|
146
|
+
## How it works
|
|
147
|
+
|
|
148
|
+
For each selected plugin, `plugin-sync`:
|
|
149
|
+
|
|
150
|
+
1. Resolves the source (Git clone into `/tmp`, or reads the local path).
|
|
151
|
+
2. Copies the plugin directory to `cc-<name>/`, blacklisting CC-only mechanisms
|
|
152
|
+
(`hooks/`, `commands/`, `agents/`, `.claude-plugin/`) and VCS/build noise
|
|
153
|
+
(`__pycache__`, `.git`, `.DS_Store`, …). Skills, scripts, assets, and docs
|
|
154
|
+
survive.
|
|
155
|
+
3. Writes `.codex-plugin/plugin.json` with the `x-cc-bridge` marker (source URL,
|
|
156
|
+
ref, commit SHA, synced timestamp, agent list, …).
|
|
157
|
+
4. Converts every `agents/*.md` to a `cc_<plugin>_<agent>.toml` under
|
|
158
|
+
`~/.codex/agents/`, prefixing each file with a `# x-cc-bridge: {…}` comment
|
|
159
|
+
so later runs recognise them as tool-generated.
|
|
160
|
+
5. Upserts the entry into `marketplace.json` with
|
|
161
|
+
`policy.installation = INSTALLED_BY_DEFAULT`.
|
|
162
|
+
|
|
163
|
+
Re-syncing the same source compares the old marker's `agents` list with the new
|
|
164
|
+
one and unlinks stale bridge agents; hand-authored TOMLs never match the marker
|
|
165
|
+
and are kept.
|
|
166
|
+
|
|
167
|
+
## Development
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
git clone https://github.com/ProAlexUSC/cc-plugin-to-codex
|
|
171
|
+
cd cc-plugin-to-codex
|
|
172
|
+
uv sync --extra dev
|
|
173
|
+
uv run pytest -v
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
CI runs the same `pytest` across Python 3.11 / 3.12 / 3.13 on Ubuntu and macOS.
|
|
177
|
+
|
|
178
|
+
## Releasing
|
|
179
|
+
|
|
180
|
+
1. Bump `version` in `pyproject.toml` and update `CHANGELOG.md`.
|
|
181
|
+
2. Commit and tag: `git tag v0.X.Y && git push origin v0.X.Y`.
|
|
182
|
+
3. The `Publish to PyPI` workflow builds the wheel + sdist and uploads them via
|
|
183
|
+
[PyPI Trusted Publishing](https://docs.pypi.org/trusted-publishers/).
|
|
184
|
+
Configure the trusted publisher once on PyPI with `workflow = publish.yml`
|
|
185
|
+
and `environment = pypi`.
|
|
186
|
+
|
|
187
|
+
## License
|
|
188
|
+
|
|
189
|
+
[MIT](LICENSE).
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "cc-plugin-to-codex"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Bridge Claude Code marketplace plugins into Codex (skills + subagents)"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
|
+
license = {text = "MIT"}
|
|
8
|
+
authors = [{name = "fangzzzjjj", email = "fangzzzjjj@gmail.com"}]
|
|
9
|
+
keywords = ["codex", "claude-code", "plugin", "cli", "bridge", "marketplace"]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 4 - Beta",
|
|
12
|
+
"Environment :: Console",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"License :: OSI Approved :: MIT License",
|
|
15
|
+
"Operating System :: OS Independent",
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Topic :: Software Development :: Build Tools",
|
|
21
|
+
]
|
|
22
|
+
dependencies = [
|
|
23
|
+
"typer>=0.12,<1.0",
|
|
24
|
+
"questionary>=2.0,<3.0",
|
|
25
|
+
"pyyaml>=6.0,<7.0",
|
|
26
|
+
"tomli-w>=1.0,<2.0",
|
|
27
|
+
"rich>=13.0,<16.0",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.optional-dependencies]
|
|
31
|
+
dev = [
|
|
32
|
+
"pytest>=8.0,<10.0",
|
|
33
|
+
"pytest-cov>=5.0,<8.0",
|
|
34
|
+
"ruff>=0.6,<1.0",
|
|
35
|
+
"mypy>=1.10,<2.0",
|
|
36
|
+
"types-PyYAML>=6.0",
|
|
37
|
+
"pre-commit>=3.7,<5.0",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[project.urls]
|
|
41
|
+
Homepage = "https://github.com/ProAlexUSC/cc-plugin-to-codex"
|
|
42
|
+
Repository = "https://github.com/ProAlexUSC/cc-plugin-to-codex"
|
|
43
|
+
Issues = "https://github.com/ProAlexUSC/cc-plugin-to-codex/issues"
|
|
44
|
+
Changelog = "https://github.com/ProAlexUSC/cc-plugin-to-codex/blob/main/CHANGELOG.md"
|
|
45
|
+
|
|
46
|
+
[project.scripts]
|
|
47
|
+
cc2codex = "cc_plugin_to_codex.cli:app"
|
|
48
|
+
|
|
49
|
+
[build-system]
|
|
50
|
+
requires = ["hatchling"]
|
|
51
|
+
build-backend = "hatchling.build"
|
|
52
|
+
|
|
53
|
+
[tool.hatch.build.targets.wheel]
|
|
54
|
+
packages = ["src/cc_plugin_to_codex"]
|
|
55
|
+
|
|
56
|
+
[tool.hatch.build.targets.sdist]
|
|
57
|
+
include = ["src/cc_plugin_to_codex", "README.md", "LICENSE", "CHANGELOG.md", "pyproject.toml"]
|
|
58
|
+
|
|
59
|
+
[tool.pytest.ini_options]
|
|
60
|
+
testpaths = ["tests"]
|
|
61
|
+
|
|
62
|
+
# Pin the index to public PyPI so `uv lock` produces a lockfile that
|
|
63
|
+
# CI and external contributors can resolve. Without this, a developer's
|
|
64
|
+
# local user config pointing at an internal mirror would bake unreachable
|
|
65
|
+
# URLs into uv.lock.
|
|
66
|
+
[[tool.uv.index]]
|
|
67
|
+
url = "https://pypi.org/simple"
|
|
68
|
+
default = true
|
|
69
|
+
|
|
70
|
+
[tool.ruff]
|
|
71
|
+
line-length = 100
|
|
72
|
+
target-version = "py311"
|
|
73
|
+
src = ["src", "tests"]
|
|
74
|
+
|
|
75
|
+
[tool.ruff.lint]
|
|
76
|
+
select = ["E", "F", "I", "UP", "B", "SIM", "RUF", "PTH"]
|
|
77
|
+
ignore = [
|
|
78
|
+
"E501", # line length is enforced by formatter, not linter
|
|
79
|
+
"RUF001", # ambiguous char in string (× used intentionally in CLI output)
|
|
80
|
+
"RUF002", # ambiguous char in docstring
|
|
81
|
+
"RUF003", # ambiguous char in comment (en-dash used in comments/docstrings)
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
[tool.ruff.lint.per-file-ignores]
|
|
85
|
+
"tests/*" = ["B", "SIM"] # tests can use looser style
|
|
86
|
+
"tests/fixtures/build_bare_marketplace.py" = ["PTH"] # subprocess args want str paths
|
|
87
|
+
|
|
88
|
+
[tool.ruff.format]
|
|
89
|
+
quote-style = "double"
|
|
90
|
+
indent-style = "space"
|
|
91
|
+
|
|
92
|
+
[tool.mypy]
|
|
93
|
+
python_version = "3.11"
|
|
94
|
+
files = ["src/cc_plugin_to_codex"]
|
|
95
|
+
disallow_untyped_defs = true
|
|
96
|
+
warn_unused_ignores = true
|
|
97
|
+
strict_equality = true
|
|
98
|
+
warn_redundant_casts = true
|
|
99
|
+
ignore_missing_imports = true
|