Skip to content

Commit 697e0d6

Browse files
authored
feat(plugins): add codex plugin support
* feat(plugins): add codex plugin support Add Codex plugin manifests beside the existing Claude plugin manifests for every plugin directory. Create a Codex marketplace and wrapper skills for Claude command/agent-heavy workflows. Expand validation and docs so Claude and Codex metadata stay in sync. * fix(ci): unblock plugin support pr checks Suppress intentional ShellCheck warnings in existing helper scripts and fix the empty-file redirection. Make PR automation tolerate missing optional labels so labeling does not fail the workflow. * fix(plugins): address codex metadata review Restore Claude skill-array validation, harden marketplace error reporting, and avoid KeyError paths in validation. Refresh Codex marketplace display text and plugin count documentation. * fix(plugins): resolve pr review feedback Move Codex metadata docs out of the install block and normalize Codex manifest display metadata. Harden validation for Codex-only directories, missing marketplace files, and duplicate marketplace entries.
1 parent b98ab7a commit 697e0d6

34 files changed

Lines changed: 935 additions & 75 deletions

File tree

.agents/plugins/marketplace.json

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
{
2+
"name": "duyet-claude-plugins",
3+
"interface": {
4+
"displayName": "Duyet Claude and Codex Plugins"
5+
},
6+
"plugins": [
7+
{
8+
"name": "team-agents",
9+
"source": {
10+
"source": "local",
11+
"path": "./team-agents"
12+
},
13+
"policy": {
14+
"installation": "AVAILABLE",
15+
"authentication": "ON_INSTALL"
16+
},
17+
"category": "Agents"
18+
},
19+
{
20+
"name": "commit",
21+
"source": {
22+
"source": "local",
23+
"path": "./commit"
24+
},
25+
"policy": {
26+
"installation": "AVAILABLE",
27+
"authentication": "ON_INSTALL"
28+
},
29+
"category": "Git"
30+
},
31+
{
32+
"name": "frontend-design",
33+
"source": {
34+
"source": "local",
35+
"path": "./frontend-design"
36+
},
37+
"policy": {
38+
"installation": "AVAILABLE",
39+
"authentication": "ON_INSTALL"
40+
},
41+
"category": "Design"
42+
},
43+
{
44+
"name": "interview",
45+
"source": {
46+
"source": "local",
47+
"path": "./interview"
48+
},
49+
"policy": {
50+
"installation": "AVAILABLE",
51+
"authentication": "ON_INSTALL"
52+
},
53+
"category": "Productivity"
54+
},
55+
{
56+
"name": "statusline",
57+
"source": {
58+
"source": "local",
59+
"path": "./statusline"
60+
},
61+
"policy": {
62+
"installation": "AVAILABLE",
63+
"authentication": "ON_INSTALL"
64+
},
65+
"category": "UI"
66+
},
67+
{
68+
"name": "orchestration",
69+
"source": {
70+
"source": "local",
71+
"path": "./orchestration"
72+
},
73+
"policy": {
74+
"installation": "AVAILABLE",
75+
"authentication": "ON_INSTALL"
76+
},
77+
"category": "Agents"
78+
},
79+
{
80+
"name": "duyetbot",
81+
"source": {
82+
"source": "local",
83+
"path": "./duyetbot"
84+
},
85+
"policy": {
86+
"installation": "AVAILABLE",
87+
"authentication": "ON_INSTALL"
88+
},
89+
"category": "Productivity"
90+
},
91+
{
92+
"name": "docs-generator",
93+
"source": {
94+
"source": "local",
95+
"path": "./docs-generator"
96+
},
97+
"policy": {
98+
"installation": "AVAILABLE",
99+
"authentication": "ON_INSTALL"
100+
},
101+
"category": "Docs"
102+
},
103+
{
104+
"name": "github",
105+
"source": {
106+
"source": "local",
107+
"path": "./github"
108+
},
109+
"policy": {
110+
"installation": "AVAILABLE",
111+
"authentication": "ON_INSTALL"
112+
},
113+
"category": "Git"
114+
},
115+
{
116+
"name": "fix",
117+
"source": {
118+
"source": "local",
119+
"path": "./fix"
120+
},
121+
"policy": {
122+
"installation": "AVAILABLE",
123+
"authentication": "ON_INSTALL"
124+
},
125+
"category": "Productivity"
126+
},
127+
{
128+
"name": "clickhouse",
129+
"source": {
130+
"source": "local",
131+
"path": "./clickhouse"
132+
},
133+
"policy": {
134+
"installation": "AVAILABLE",
135+
"authentication": "ON_INSTALL"
136+
},
137+
"category": "Database"
138+
},
139+
{
140+
"name": "prompt-engineering",
141+
"source": {
142+
"source": "local",
143+
"path": "./prompt-engineering"
144+
},
145+
"policy": {
146+
"installation": "AVAILABLE",
147+
"authentication": "ON_INSTALL"
148+
},
149+
"category": "Productivity"
150+
},
151+
{
152+
"name": "clickhouse-monitoring",
153+
"source": {
154+
"source": "local",
155+
"path": "./clickhouse-monitoring"
156+
},
157+
"policy": {
158+
"installation": "AVAILABLE",
159+
"authentication": "ON_INSTALL"
160+
},
161+
"category": "Monitoring"
162+
},
163+
{
164+
"name": "unsloth-training",
165+
"source": {
166+
"source": "local",
167+
"path": "./unsloth-training"
168+
},
169+
"policy": {
170+
"installation": "AVAILABLE",
171+
"authentication": "ON_INSTALL"
172+
},
173+
"category": "ML"
174+
}
175+
]
176+
}

.github/workflows/pr-automation.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,36 +34,36 @@ jobs:
3434
3535
# Area labels based on file paths
3636
if echo "$FILES" | grep -q "^src/api/\|^api/"; then
37-
gh pr edit "$PR_NUMBER" --add-label "area:api"
37+
gh pr edit "$PR_NUMBER" --add-label "area:api" || true
3838
fi
3939
4040
if echo "$FILES" | grep -q "^src/frontend/\|^components/\|^ui/"; then
41-
gh pr edit "$PR_NUMBER" --add-label "area:frontend"
41+
gh pr edit "$PR_NUMBER" --add-label "area:frontend" || true
4242
fi
4343
4444
if echo "$FILES" | grep -q "^src/backend/\|^server/"; then
45-
gh pr edit "$PR_NUMBER" --add-label "area:backend"
45+
gh pr edit "$PR_NUMBER" --add-label "area:backend" || true
4646
fi
4747
4848
if echo "$FILES" | grep -q "^docs/\|\.md$"; then
49-
gh pr edit "$PR_NUMBER" --add-label "area:docs"
49+
gh pr edit "$PR_NUMBER" --add-label "area:docs" || true
5050
fi
5151
5252
if echo "$FILES" | grep -q "^tests/\|^test/"; then
53-
gh pr edit "$PR_NUMBER" --add-label "area:tests"
53+
gh pr edit "$PR_NUMBER" --add-label "area:tests" || true
5454
fi
5555
5656
# Check for breaking changes in commits
5757
COMMITS=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/commits --jq '.[].commit.message' | grep -i "BREAKING CHANGE" || true)
5858
if [ -n "$COMMITS" ]; then
59-
gh pr edit "$PR_NUMBER" --add-label "type:breaking"
59+
gh pr edit "$PR_NUMBER" --add-label "type:breaking" || true
6060
fi
6161
6262
# Documentation only
6363
if echo "$FILES" | grep -v "^docs/\|\.md$" | grep -q .; then
6464
:
6565
else
66-
gh pr edit "$PR_NUMBER" --add-label "documentation"
66+
gh pr edit "$PR_NUMBER" --add-label "documentation" || true
6767
fi
6868
env:
6969
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -101,7 +101,7 @@ jobs:
101101
PR_COUNT=$(gh pr list --author "$AUTHOR" --state all --limit 1 --json number --jq 'length')
102102
103103
if [ "$PR_COUNT" -eq 1 ]; then
104-
gh pr edit "$PR_NUMBER" --add-label "first-time-contributor"
104+
gh pr edit "$PR_NUMBER" --add-label "first-time-contributor" || true
105105
106106
gh pr comment "$PR_NUMBER" --body '## Welcome! 👋
107107

.github/workflows/validate-plugins.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,20 @@ on:
66
branches: [main, master, "claude/**"]
77
paths:
88
- "**/.claude-plugin/plugin.json"
9+
- "**/.codex-plugin/plugin.json"
10+
- ".agents/plugins/marketplace.json"
11+
- ".claude-plugin/marketplace.json"
12+
- "marketplace.json"
913
- "scripts/validate-plugins.sh"
1014
- ".github/workflows/validate-plugins.yml"
1115
pull_request:
1216
branches: [main, master]
1317
paths:
1418
- "**/.claude-plugin/plugin.json"
19+
- "**/.codex-plugin/plugin.json"
20+
- ".agents/plugins/marketplace.json"
21+
- ".claude-plugin/marketplace.json"
22+
- "marketplace.json"
1523
- "scripts/validate-plugins.sh"
1624
- ".github/workflows/validate-plugins.yml"
1725

CLAUDE.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99

1010
Alternative: `npx skills add duyet/claude-plugins` ([skills.sh](https://skills.sh))
1111

12+
## Plugin Metadata
13+
14+
Codex plugin metadata is maintained beside Claude metadata in each plugin:
15+
16+
- Claude manifest: `.claude-plugin/plugin.json`
17+
- Codex manifest: `.codex-plugin/plugin.json`
18+
- Claude marketplace: `marketplace.json` and `.claude-plugin/marketplace.json`
19+
- Codex marketplace: `.agents/plugins/marketplace.json`
20+
1221
## Versioning
1322

1423
Follow semantic versioning (semver) for all plugins:
@@ -33,13 +42,17 @@ Always update `plugin.json` version when making changes.
3342
plugin-name/
3443
├── .claude-plugin/
3544
│ └── plugin.json # Manifest (name, version, description)
45+
├── .codex-plugin/
46+
│ └── plugin.json # Codex manifest and interface metadata
3647
├── agents/ # Sub-agent definitions
3748
├── commands/ # Slash commands
3849
├── skills/ # Reusable knowledge/procedures
3950
├── hooks/ # Hook configurations
4051
└── README.md # Documentation
4152
```
4253

54+
When changing plugin metadata, keep Claude and Codex manifests in sync and run `bash scripts/validate-plugins.sh`.
55+
4356
## Commit Convention
4457

4558
Use semantic commits with plugin scope:

CONTRIBUTING.md

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Contributing
22

3-
Thanks for your interest in contributing to the Claude Plugins Marketplace!
3+
Thanks for your interest in contributing to the Claude and Codex Plugins Marketplace!
44

55
## Quick Start
66

@@ -16,6 +16,8 @@ Thanks for your interest in contributing to the Claude Plugins Marketplace!
1616
my-plugin/
1717
├── .claude-plugin/
1818
│ └── plugin.json # Plugin manifest (name, version, description)
19+
├── .codex-plugin/
20+
│ └── plugin.json # Codex manifest and interface metadata
1921
├── README.md # Plugin documentation
2022
├── CLAUDE.md # Claude-specific instructions (optional, for skills/agents)
2123
├── agents/ # Agent definitions (optional)
@@ -39,7 +41,30 @@ my-plugin/
3941
}
4042
```
4143

42-
### 2. Documentation (README.md)
44+
### 2. Codex Manifest (.codex-plugin/plugin.json)
45+
46+
Every plugin also needs a Codex manifest with the same `name`, `version`, `description`, and `author.name` as the Claude manifest:
47+
48+
```json
49+
{
50+
"name": "my-plugin",
51+
"version": "1.0.0",
52+
"description": "A brief description of what this plugin does",
53+
"author": {
54+
"name": "your-username"
55+
},
56+
"skills": "./skills/",
57+
"interface": {
58+
"displayName": "My Plugin",
59+
"shortDescription": "A brief description of what this plugin does",
60+
"developerName": "your-username",
61+
"category": "Productivity",
62+
"capabilities": ["Skill"]
63+
}
64+
}
65+
```
66+
67+
### 3. Documentation (README.md)
4368

4469
Required sections:
4570
- Description of what the plugin does
@@ -48,14 +73,14 @@ Required sections:
4873
- Configuration options (if any)
4974
- Versioning guidelines (if applicable)
5075

51-
### 3. Claude Instructions (CLAUDE.md)
76+
### 4. Claude Instructions (CLAUDE.md)
5277

5378
Required for skills and agents:
5479
- How Claude should use the plugin
5580
- When to invoke it
5681
- Expected inputs and outputs
5782

58-
### 4. Update Marketplace
83+
### 5. Update Marketplaces
5984

6085
Add your plugin to `marketplace.json`:
6186

@@ -70,7 +95,24 @@ Add your plugin to `marketplace.json`:
7095
}
7196
```
7297

73-
### 5. Update Main README
98+
Also add a Codex entry to `.agents/plugins/marketplace.json`:
99+
100+
```json
101+
{
102+
"name": "my-plugin",
103+
"source": {
104+
"source": "local",
105+
"path": "./my-plugin"
106+
},
107+
"policy": {
108+
"installation": "AVAILABLE",
109+
"authentication": "ON_INSTALL"
110+
},
111+
"category": "Productivity"
112+
}
113+
```
114+
115+
### 6. Update Main README
74116

75117
Add your plugin to the main README.md table:
76118

@@ -94,6 +136,7 @@ Follow [Semantic Versioning](https://semver.org/):
94136
- **Major** (1.0.0 → 2.0.0): Breaking changes
95137

96138
Update plugin.json version on every change.
139+
Keep `.claude-plugin/plugin.json` and `.codex-plugin/plugin.json` in sync for shared metadata fields.
97140

98141
### Commits
99142

@@ -112,6 +155,7 @@ refactor(my-plugin): refactor code
112155
- Test your plugin thoroughly before submitting
113156
- Include usage examples in README
114157
- Consider edge cases and error handling
158+
- Run `bash scripts/validate-plugins.sh` to validate Claude manifests, Codex manifests, and marketplace files
115159

116160
## Pull Request Process
117161

0 commit comments

Comments
 (0)