From plugin-cross-port
Continuous maintenance workflow for plugins that target both Claude Code and Codex. Use when a plugin's commands, skills, or agents have changed and the Codex target needs updating.
How this skill is triggered — by the user, by Claude, or both
Slash command
/plugin-cross-port:maintain-dual-targetThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Keep attached plugins synchronized between Claude Code and Codex after
Keep attached plugins synchronized between Claude Code and Codex after incremental changes.
Source of truth is explicit:
.plugin-cross-port.marketplace.yaml records the canonical marketplace..plugin-cross-port.yaml records plugin-level source_of_truth.manually_maintained.commands/skills/agents/ changed (new agent, description update)plugin.json.plugin-cross-port.marketplace.yaml<plugin-path>/.plugin-cross-port.yamlPrefer the deterministic CLI:
python3 plugins/plugin-cross-port/scripts/cross_port.py marketplace sync
python3 plugins/plugin-cross-port/scripts/cross_port.py marketplace check
python3 plugins/plugin-cross-port/scripts/cross_port.py \
plugin attach plugins/example --source codex
python3 plugins/plugin-cross-port/scripts/cross_port.py \
plugin switch-source plugins/example --to claude-code
manually_maintainedIf .plugin-cross-port.yaml lists a generated file as manually_maintained,
skip overwriting it. Emit a reminder: "Manually maintained: - review
manually."
If --strict or the user said "strict mode":
.plugin-cross-port.yaml under decisions causes a hard stop:
"Strict mode: new agents/hooks detected — update .plugin-cross-port.yaml decisions before continuing."
Otherwise emit warnings only.
.plugin-cross-port.yamlUpdate plugin status after sync. The state is JSON-compatible YAML and must
remain readable without PyYAML.
Re-read .codex-plugin/plugin.json. Verify:
hooks key is absent from Codex manifestsskills points to ./skills/version matches .claude-plugin/plugin.jsonIf version mismatch, update .codex-plugin/plugin.json version to match.
Report what changed:
See references/continuous-mode.md for full details.
The hook at .githooks/pre-commit runs automatically:
cross_port.py marketplace sync --changed-only ... --stageFiles in skills/generated-from-commands/ are generated by default.
To mark a file as manually maintained (e.g., after heavy customization):
# .plugin-cross-port.yaml
manually_maintained:
- skills/generated-from-commands/my-command/SKILL.md
The converter will skip overwriting files listed here.
Use this when hooks, permission behavior, tool IDs, or ecosystem-specific paths cannot be resolved mechanically:
python3 plugins/plugin-cross-port/scripts/cross_port.py plugin adapt plugins/example
python3 plugins/plugin-cross-port/scripts/cross_port.py plugin adapt plugins/example --apply
Review plugins/example/.plugin-cross-port/adaptation-plan.md before applying.
If source files change after planning, rerun plugin adapt.
Codex failed or review-required targets are published as
policy.installation: "NOT_AVAILABLE". Failed Claude Code targets are omitted
from the Claude Code marketplace.
When a canonical marketplace entry is removed, sync removes the whole
plugins/<name>/ directory only after validating that the path is local,
inside plugins_dir, and has a basename matching the plugin name. Use Git for
recovery.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub ivanlutsenko/awac-ai-agent-plugins --plugin plugin-cross-port