keelim-plugin
A personal skill collection for both Codex and Claude.
Goals
- Keep each skill as a single source of truth under
skills/ - Make the same skill folder usable from both Codex and Claude
- Prefer docs-first skills unless automation is clearly worth the maintenance cost
Repository layout
plugin.json: portable Agent Plugins 1.0.0 manifest; package version is independent of the Python tooling version.agents/plugins/marketplace.json: Codex marketplace exposing this repository as one pluginskills/: skill source foldersskills/<skill-name>/SKILL.md: the main skill document with its required machine-readable capability contractskills/<skill-name>/agents/openai.yaml: optional Codex UI metadataCATALOG.md: generated human-readable skill catalog and install matrixcatalog.json: generated machine-readable skill inventory for automation, separate from the Codex marketplacescripts/: catalog generation, skill validation, promotion, and SkillOpt entrypointsevals/skillopt/: SkillOpt pilot fixtures and test harnesses
Current skills
The bullet list below is a compact README orientation. The canonical
user-facing trigger and catalog description for each skill lives in that skill's
SKILL.md frontmatter and is regenerated into CATALOG.md / catalog.json.
Every skill also declares these boolean capabilities in frontmatter:
read_only, local_write, network_read, external_write, credentials,
and hooks. The generated catalogs expose the same values so an agent or
operator can inspect side-effect and trust requirements before invocation.
read_only: true cannot be combined with local writes, external writes, or
hooks; scripts/verify_skills.py enforces the complete schema.
agent-instructions-improver: an audit-and-improve workflow for AGENTS.md and related agent instruction files, including durable session-to-AGENTS.md updates, that reports quality findings before proposing targeted changescodebase-codemap: a source-led repository mapping workflow with a stdlib generator for project-named agent codemapscodex-insights: an evidence-backed session reflection workflow with concise insight reports, skill/subagent recommendations, candidate promotion, and optional metadata-only observation hookseasy-release-note-video-pipeline: an end-to-end release-note Shorts workflow for distinct motion concepts, Google Vids voiceover muxing, and verified private YouTube or Naver Clip draftseli5: a standalone visual HTML explainer using ASD-STE100-inspired clarity principles while preserving conditions, risks, and evidencehtml-report-generator: a reusable offline HTML report foundation with generic block-model JSON, a stdlib renderer, template asset, and security validationjira-ticket-desk: a read-only Jira triage workflow that merges local ticket rules and renders a secure offline HTML desk from a reusable template plus JSON datarelease-automation: a date-based Android release workflow for updatingversionCode, checking the release PR, and dispatchingapp_deploy.ymlwithdry-run,confirm, andexecutemodessession-usage-dashboard: a Codex/Claude session analyzer that renders offline HTML and JSON usage dashboards for tools, skills, and subagentstech-post-maker: a writing skill for first-person technical posts in a calm personal engineer voice, especially build logs, case studies, workflow write-ups, and series posts
Prerequisites
- Python 3.12, matching
pyproject.toml uvfor Python entrypoints and pinned dev tooling- Node.js for
scripts/gen-catalog.mjs npxfor Vercel skills CLI install flows
Repo-local validation
Run the CI-equivalent local check before promoting skill, eval, or tooling changes:
bash scripts/check.sh
The check verifies uv.lock, runs ruff, checks formatting, runs mypy, executes
the bundled Python tests, validates skill metadata, checks generated catalog
drift, and finishes with git diff --check.
After changing any skill folder, frontmatter, bundled resource, or README skill list, refresh and verify the generated catalog:
node scripts/gen-catalog.mjs
node scripts/gen-catalog.mjs --check
bash scripts/verify-skills.sh --require-codex-meta
git diff --check
Install or refresh the pinned development tools with:
uv --cache-dir .skillopt/uv-cache sync --python 3.12 --group dev
All local Python entrypoints in this repo should be run through uv:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python <script> ...
The repo-local uv cache is intentionally ignored. To inspect or prune it:
du -sh .skillopt/uv-cache
uv --cache-dir .skillopt/uv-cache cache prune
Contributing skill changes
When adding or renaming a skill:
- Create or move
skills/<skill-name>/SKILL.mdwith frontmatternamematching the folder, a concisedescription, and all six booleancapabilitiesfields. - Add
agents/openai.yamlwhen the skill should be visible in Codex UI surfaces. - Keep supporting files inside that skill's
references/,scripts/,assets/,examples/, orhooks/directories. - Update the README
Current skillslist only as a compact orientation; keep theSKILL.mdfrontmatter as the catalog source of truth. - Run
node scripts/gen-catalog.mjs,bash scripts/verify-skills.sh --require-codex-meta,node scripts/gen-catalog.mjs --check, andgit diff --check.
Promote skills
Use scripts/promote_plugin_skills.py to route every plugin skill through the
same reviewable promotion path. The script never calls a model; it compares
candidate SKILL.md files or SkillOpt best_skill.md artifacts against the
current skills/<name>/SKILL.md, preserves frontmatter when needed, and applies
only when --apply is passed.
List the skills in scope:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/promote_plugin_skills.py inventory
Compare all available candidates without modifying production skills:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/promote_plugin_skills.py promote
For an end-to-end no-op smoke pass across every skill, stage the current skill files into ignored candidate storage and require one candidate per skill:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/promote_plugin_skills.py stage-current --run-id all-skills-smoke
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/promote_plugin_skills.py promote \
--candidate-root .skillopt/promote-candidates/all-skills-smoke \
--require-candidates
Promote one reviewed candidate after inspecting the diff:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/promote_plugin_skills.py promote \
--skill tech-post-maker \
--candidate /path/to/reviewed/SKILL.md
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/promote_plugin_skills.py promote \
--skill tech-post-maker \
--candidate /path/to/reviewed/SKILL.md \
--apply
SkillOpt-generated candidates are picked up automatically from
.skillopt/outputs/<skill>/**/best_skill.md. Keep .skillopt/ ignored; it may
contain model traces, split data, reports, and smoke candidates.
Codex-only SkillOpt
Use scripts/skillopt_plugin_skills.py for the 8-skill Codex-only tiny pilot.
It curates per-skill redacted splits, runs SkillOpt with a local codex_chat
optimizer overlay plus upstream codex_exec target evaluation, and applies only
the candidates that pass deterministic promotion gates.
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/skillopt_plugin_skills.py prepare --check
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/skillopt_plugin_skills.py curate --skill all --dry-run
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/skillopt_plugin_skills.py run-all --dry-run
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/skillopt_plugin_skills.py run-all --apply-passing --num-epochs 1 --batch-size 4 --workers 1 --max-steps 1
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python scripts/skillopt_plugin_skills.py inspect-all --fail-on-tracebacks
Install the Codex plugin package
The root plugin.json follows the portable Agent Plugins format
and its versioned JSON Schema.
Codex discovers the bundled skills in skills/ automatically. The package adds
no MCP server, credentials, permissions, or automatic hooks. Skill-specific
effects and explicit setup requirements still apply, including the optional
codex-insights hook installation described below.
The repo marketplace
at .agents/plugins/marketplace.json exposes one package, keelim-plugin, under
keelim-plugins. Its source.path is ./, resolved from the repository root,
not from .agents/plugins/. catalog.json remains the generated inventory of
individual skills; Codex does not use it as a marketplace.
From a checkout containing these package files, register and inspect the source:
codex plugin marketplace add .
codex plugin marketplace list
codex plugin list --marketplace keelim-plugins --available --json
In Codex CLI versions that expose codex plugin add (tested with 0.160.0):
codex plugin add keelim-plugin@keelim-plugins
codex plugin list --marketplace keelim-plugins --json
These normal install commands update the current user's Codex configuration and plugin cache. Alternatively, follow the official desktop flow: restart the ChatGPT desktop app, open the Plugins Directory, choose Keelim Plugins, and install keelim-plugin. Test the skills in a new conversation.
After a commit containing the marketplace and manifest is published to GitHub,
the remote registration command is codex plugin marketplace add keelim/keelim-plugin.
Use the local checkout command while testing unpublished changes. Register the
whole repository: a sparse checkout of only .agents/plugins omits the package.
Package validation
bash scripts/check.sh also runs scripts/verify_plugin.py and its regression
tests. This offline repository contract check validates the selected manifest
fields, SemVer, skill paths, marketplace metadata, and source resolution. It is
separate from skill frontmatter/catalog checks and is not a general JSON Schema
validator. To check the manifest against the upstream schema as well:
plugin_schema="$(mktemp)"
curl -fsSL https://agent-plugins.org/schemas/1.0.0/plugin.schema.json -o "$plugin_schema"
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev --with jsonschema \
python -c 'import json, sys; from jsonschema import Draft202012Validator; schema=json.load(open(sys.argv[1])); Draft202012Validator.check_schema(schema); Draft202012Validator(schema).validate(json.load(open("plugin.json")))' "$plugin_schema"
rm "$plugin_schema"
For an installation smoke test without changing personal settings or using credentials, test a clean committed snapshot in a disposable home:
(
set -euo pipefail
plugin_test_root="$(mktemp -d)"
mkdir -p "$plugin_test_root/source" "$plugin_test_root/home/.codex"
git archive HEAD | tar -x -C "$plugin_test_root/source"
printf 'cli_auth_credentials_store = "file"\n' > "$plugin_test_root/home/.codex/config.toml"
codex_test() {
env -i PATH="$PATH" HOME="$plugin_test_root/home" \
CODEX_HOME="$plugin_test_root/home/.codex" codex "$@"
}
cd "$plugin_test_root/home" || exit 1
codex_test plugin marketplace add "$plugin_test_root/source"
codex_test plugin list --marketplace keelim-plugins --available --json
codex_test plugin add keelim-plugin@keelim-plugins
codex_test plugin list --marketplace keelim-plugins --json
printf 'Temporary test files: %s\n' "$plugin_test_root"
)
Expect keelim-plugin@keelim-plugins with the manifest version and, after install,
installed: true and enabled: true. This proves package recognition and local
installation, not live execution of every skill or desktop UI behavior. No
authentication or hook setup is required for this package smoke test.
Install individual skills with the Vercel skills CLI
This remains available for both Codex and Claude Code, independently of the bundled Codex plugin. Choose one installation route per skill to avoid duplicate entries in Codex.
List the skills available from this repository:
npx skills add keelim/keelim-plugin --list
Install a specific skill for both Codex and Claude Code in the current project:
npx skills add keelim/keelim-plugin \
--skill tech-post-maker \
-a codex \
-a claude-code \
-y \
--copy
This installs the skill into:
./.agents/skills/<skill-name>./.claude/skills/<skill-name>
--copy creates project-local snapshots. Re-run the CLI install command after
upstream skill changes, or use manual symlinks while actively developing against
this checkout.
For codex-insights, preview and apply project-scoped hook registration after installing the skill:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python .agents/skills/codex-insights/scripts/install_hooks.py
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python .agents/skills/codex-insights/scripts/install_hooks.py --apply
To install codex-insights hooks globally for every project:
uv --cache-dir .skillopt/uv-cache run --python 3.12 --group dev python .agents/skills/codex-insights/scripts/install_hooks.py --scope global --apply
If you prefer the full GitHub URL form, this also works:
npx skills add https://github.com/keelim/keelim-plugin --list
Manual install
Run these commands from the repository root. Symlinks keep the installed skill
attached to the local skills/ source tree, while CLI --copy installs a
snapshot that must be refreshed explicitly.
Codex
ln -s "$(pwd)/skills/tech-post-maker" ~/.agents/skills/tech-post-maker
Claude
ln -s "$(pwd)/skills/tech-post-maker" ~/.claude/skills/tech-post-maker
Notes
- The Vercel skills CLI flow was verified with both source formats:
keelim/keelim-pluginhttps://github.com/keelim/keelim-plugin
- The repository still supports manual symlink installation.
- The current skills are intentionally docs-first, so the workflows stay easy to inspect and adapt.