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.
npx claudepluginhub ivanlutsenko/awac-ai-agent-plugins --plugin plugin-cross-portCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.