Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"name": "YoungjaeDev"
},
"metadata": {
"description": "Personal Claude Code plugin collection with 24 specialized plugins. Codex 0.135 + Hermes Agent native — generated `.agents/plugins/marketplace.json` + per-plugin `.codex-plugin/plugin.json` (`scripts/sync-codex-manifests.mjs`) and Hermes `plugin.yaml` + `__init__.py` adapters (`scripts/sync-hermes-manifests.mjs`).",
"version": "2.7.0"
"description": "Personal Claude Code plugin collection with 24 specialized plugins. Codex 0.135 native — generated `.agents/plugins/marketplace.json` + per-plugin `.codex-plugin/plugin.json` (`scripts/sync-codex-manifests.mjs`). Hermes Agent installs skills from the same tree via `npx skills` (`scripts/install-skills.mjs`), with no generated adapter.",
"version": "2.8.1"
},
"plugins": [
{
Expand All @@ -26,14 +26,14 @@
"name": "e2e-harness",
"source": "./plugins/e2e-harness",
"description": "Playwright E2E test-harness engineering — wraps Playwright's official AI test agents (npx playwright init-agents --loop=claude generates planner/generator/healer). Three skills close the planner -> generator -> healer self-improving loop: e2e-setup onboards the full harness (agents, auth separation via storageState + setup-project dependency, page.route mocking with Next.js BFF/SSR guidance, E2E operating SSOT doc, GitHub Actions CI with trace/report artifact upload + PR-failure comment + path/label gating); e2e-author selects critical user flows and runs planner -> review-gate -> generator with semantic getByRole locators and a --repeat-each burn-in flake gate; e2e-debug downloads the CI trace, inspects it headlessly, and runs the healer with bounded retries (skip-after-3 + reason comment). Never overwrites an existing playwright.config (merge + backup); degrades gracefully when Playwright is not installed.",
"version": "0.2.1",
"version": "0.2.3",
"category": "testing"
},
{
"name": "code-scout",
"source": "./plugins/code-scout",
"description": "Multi-axis code & ML research harness. 5-axis scout team (github/hf/web/docs/paper) + synthesis-scout + research-orchestrator skill + exa-web-search skill. exa MCP first, WebSearch fallback, brightdata tier-3, insane-search tier-4 (WAF/blocked URLs). paper-scout wraps paper-search-tools 8-source family. /deep-research is the sibling for non-code/ML topics (code-scout does not delegate).",
"version": "2.3.0",
"version": "2.3.1",
"category": "research"
},
{
Expand Down
12 changes: 6 additions & 6 deletions .claude/rules/dual-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

This marketplace is driven by **Claude Code, Codex CLI, and Hermes Agent**. Instructions, hooks, and lore that live on only one surface are invisible to part of the toolchain. When you edit anything that shapes agent behavior, check the paired surfaces on the other runtimes in the same change.

Since 1.40.0 the runtimes share one source tree: Codex 0.135 reads `plugins/<name>/` in place via generated `.codex-plugin/plugin.json` manifests, and Hermes Agent reads it via generated `plugin.yaml` + `__init__.py` adapters (the old `codex-bridge` body-transform mirror was retired). So "keeping the surfaces in sync" is mostly about guidance, hooks, and manifest/adapter regeneration — not copying files.
Since 1.40.0 the runtimes share one source tree: Codex 0.135 reads `plugins/<name>/` in place via generated `.codex-plugin/plugin.json` manifests, and Hermes Agent gets its skills from the same tree through `npx skills` (`scripts/install-skills.mjs`) with no generated artifact at all — the old `codex-bridge` body-transform mirror and the Hermes `plugin.yaml` + `__init__.py` adapters were both retired. So "keeping the surfaces in sync" is mostly about guidance, hooks, and Codex manifest regeneration — not copying files.

## Role

Expand All @@ -16,7 +16,7 @@ Top-level guidance no longer needs mirroring at all: root `CLAUDE.md` is a one-l
|---|---|---|---|
| Top-level guidance | `CLAUDE.md` → one-line `@AGENTS.md` import; `.claude/rules/*.md` (auto-loaded) | `AGENTS.md` (read verbatim — no `@import` mechanism) | `AGENTS.md` (read verbatim) |
| Prompt-submit injection | plugin `UserPromptSubmit` hook (`plugin.json` → `hooks/*.sh`) | bundled `hooks/codex-hooks.json` → generated manifest `hooks` (`codex` format arg, `/hooks` trust); legacy manual `~/.codex/hooks.json` still works | (separate hook surface — currently unused) |
| Skill delivery | `plugins/*/skills` (native) | same tree in place + generated `.codex-plugin/plugin.json` (`scripts/sync-codex-manifests.mjs`) | same tree in place + generated `plugin.yaml` + `__init__.py` (`scripts/sync-hermes-manifests.mjs`) |
| Skill delivery | `plugins/*/skills` (native) | same tree in place + generated `.codex-plugin/plugin.json` (`scripts/sync-codex-manifests.mjs`) | same tree installed into `~/.hermes/skills/` by `npx skills` (`scripts/install-skills.mjs`) — no generated artifact |
| Command / subagent | `plugins/*/{commands,agents}` (native) | not supported by Codex 0.135 — Claude-only | not supported by Hermes — skills only |
| Skill-body tool names | Claude tool names (`Bash`, `Read`, …) | identical to Claude (body read verbatim) | mapped to Hermes tools via in-body compat table (`Bash`→`terminal`, `AskUserQuestion`→`clarify`, …) |
| Shared neutral lore | `.llmwiki/` (read by Claude) | `.llmwiki/` (read by Codex — same root, never forked) | `.llmwiki/` (read by Hermes — same root) |
Expand All @@ -27,27 +27,27 @@ Top-level guidance no longer needs mirroring at all: root `CLAUDE.md` is a one-l
- **Mirror cross-cutting `.claude/rules/` rules into `AGENTS.md`.** Codex has no `@import` mechanism at all — it reads `AGENTS.md` byte-for-byte and expands nothing — so a rule that both agents must honor needs a concise mirror block in `AGENTS.md` plus a one-line pointer in the `## Modular Rules` section of `AGENTS.md` (which Claude reaches through the `CLAUDE.md` → `@AGENTS.md` import). `@import` is a Claude-only feature and only works from `CLAUDE.md`; Codex and Hermes read `AGENTS.md` verbatim.
- **Pair every hook change.** A new or changed Claude `UserPromptSubmit` / `SessionStart` hook in a `plugin.json` should be mirrored to Codex. The primary path is a bundled `hooks/codex-hooks.json` descriptor that `node scripts/sync-codex-manifests.mjs` wires into the generated manifest's top-level `hooks` (the legacy manual `~/.codex/hooks.json` copy still works). Prefer one shared script with a format arg (plain stdout for Claude, JSON `additionalContext` for Codex) over two divergent copies. Either path needs a `/hooks` trust approval in Codex.
- **Regenerate Codex manifests after a plugin's skills / `version` / `description` / `category` change.** Run `node scripts/sync-codex-manifests.mjs` (the `--check` drift guard otherwise fails). Codex reads skill bodies in place — no transform — so valid frontmatter still matters; `commands/` and `agents/` are Claude-only and are not emitted. A source-controlled `hooks/codex-hooks.json` is wired into the manifest's top-level `hooks`; `--check` validates the descriptor shape + referenced scripts and rejects orphans. Only codex-image is excluded (see `manifest-eligibility.mjs` `CODEX_EXCLUDED`) — core-config is now Codex-eligible as a hooks-only manifest.
- **Regenerate Hermes adapters after a HERMES_ELIGIBLE plugin's `version` / `description` change.** Run `node scripts/sync-hermes-manifests.mjs` (the `--check` drift + orphan guard otherwise fails). `plugin.yaml` / `__init__.py` are generated from `marketplace.json` — never hand-edit them. Coverage is the generator's `HERMES_ELIGIBLE` allowlist (the symmetric counterpart of Codex's `EXCLUDED` denylist); add a name to extend it.
- **Nothing to regenerate for Hermes.** `npx skills` parses `.claude-plugin/marketplace.json` at install time and pulls `plugins/<name>/skills/*/SKILL.md` straight from the tree, so there is no derived Hermes artifact to keep in sync and no eligibility allowlist to extend — coverage is every skill-bearing plugin. Adding a plugin needs no Hermes-side action.
- **Keep shared skill bodies runtime-portable.** Claude and Codex share tool names, so a body that also runs under Hermes carries a compatibility table mapping Claude/Codex tool terms (`Bash`, `Read`, `Edit`, `AskUserQuestion`, `Task`, `Skill`, `NotebookEdit`, image generation) to Hermes tools (`terminal`, `read_file`, `patch`, `clarify`, `delegate_task`, `skill_view`, Jupyter Live Kernel / `write_file`·`patch`, `image_generate`). Add or refresh the table when a body's tool usage changes. A body that invokes bundled `scripts/` must not reference `${CLAUDE_PLUGIN_ROOT}` bare — Codex 0.135 does not export it, so the call fails at step one; carry the cross-runtime `PLUGIN_ROOT` resolver block instead (`CLAUDE_PLUGIN_ROOT` → source-tree `plugins/<name>` → Codex cache lookup; reference implementations: project-init, mem0-ops).
- **Keep subagent delegation Claude-only acceleration.** A Claude-side subagent dispatch may only wrap a skill phase whose inline cross-runtime path stays primary and complete — never move skill logic into an agent definition (Codex 0.135 and Hermes have no agents surface, so relocated logic silently vanishes for them).
- **Keep skill `description` frontmatter under 1024 chars.** Codex 0.135 silently skips any skill whose `description` exceeds 1024 characters; Claude Code has no such limit, so the violation is invisible on the Claude side. `--check` validates description length (not just drift), and the shared `.githooks/pre-commit` runs it on every commit — activate once per clone with `git config core.hooksPath .githooks`. Put the full trigger list / per-tool rationale in the skill body, not the description.
- **Quote a skill `description` that contains a colon-space (`: `).** YAML frontmatter parses `description: ...: ...` as a nested mapping and fails with `mapping values are not allowed here`, so the skill silently fails to load on both runtimes. Wrap the value in double quotes (or a `>-` block scalar). `plugin.json` / `marketplace.json` are JSON and unaffected; the lenient manifest generator and `--check` do NOT catch this.
- **Write instruction and skill documentation prose in English.** Skill bodies, bundled reference docs, and plugin `CLAUDE.md` prose are English so all three runtimes — and the Codex GitHub cloud reviewer — read one language. Domain content is exempt and stays in its source language: marketing/UI copy, form presets, humanize samples, illustrative Korean example outputs, and the i18n / trigger phrases inside a skill `description:` frontmatter field (translating those breaks skill matching). A skill whose output is functional content in the user's language (a seeded stub, a runtime message shown to the user) keeps that content as-is — translating it changes what the plugin emits, not just its documentation.
- **Keep shared lore in the neutral root.** Cross-agent insight and wiki content live under `.llmwiki/` (never `.claude/`-only), so both runtimes read one copy.
- **State when a change is intentionally single-surface.** If guidance applies to only one agent (e.g. a Claude-only Plan Mode rule), say so in the change so the asymmetry reads as deliberate, not forgotten.
- **Hermes plugin skills load explicitly, never by passive index.** Under Hermes a plugin skill is reached only through an explicit `skill_view("<plugin>:<skill>")` load (or asking Hermes to load that qualified skill) after the plugin is enabled — it is never auto-surfaced by its `description` the way Claude Code and Codex 0.135 index skills. The trigger phrasing still belongs in the `description`, but the load itself is a deliberate call, so a body that assumes it was auto-selected from its description is wrong for Hermes. This is why every shared body carries the Hermes compatibility note at its top; treat that note as the load contract, not decoration.
- **Hermes indexes `~/.hermes/skills/` passively, like the other two runtimes.** That directory is Hermes' skill source of truth: anything installed there is listed by `skills_list()` and also becomes a slash command, so a `description` surfaces a skill the same way it does under Claude Code and Codex 0.135. (This replaces the old plugin-adapter contract, where a skill was reachable only through an explicit `skill_view("<plugin>:<skill>")` call after enabling the plugin.) Names install flat — `cr-fix`, not `github-dev:cr-fix` — so keep skill names distinctive enough not to collide with skills from other sources.
- **Centralize a skill's tool-name mapping gradually, in `references/<harness>-tools.md`.** The inline Claude/Codex→Hermes compatibility table at the top of each shared body is the current mechanism, but for a *new or newly-edited* skill prefer offloading the mapping to a bundled `references/<harness>-tools.md` and pointing the body at it — one authored table per harness instead of the same table re-typed into every body. This is a deliberate gradual migration: do not rewrite existing bodies just to relocate the table (surgical-diff), only adopt the reference-file form when you are already editing that body's tool usage.

## Don'ts

- **Never add behavioral guidance to `CLAUDE.md` alone when it should bind both agents.** A Claude-only edit silently exempts every Codex session.
- **Never wire a Claude hook without considering the Codex counterpart.** The bundled `hooks/codex-hooks.json` descriptor rides the generated Codex manifest, but Codex still requires a `/hooks` trust approval before a plugin's hooks run (the legacy `~/.codex/hooks.json` path needs the same trust). Neither is silently auto-enabled.
- **Never hand-edit generated manifests/adapters.** `.codex-plugin/plugin.json` + `.agents/plugins/marketplace.json` (Codex) and `plugin.yaml` + `__init__.py` (Hermes) are generator output; edit the marketplace source + regenerate, or the `--check` guards flag drift.
- **Never hand-edit generated manifests.** `.codex-plugin/plugin.json` + `.agents/plugins/marketplace.json` are generator output; edit the marketplace source + regenerate, or the `--check` guard flags drift. Hermes has no generated counterpart to protect.
- **Never promote wiki lore to `.claude/rules/`.** Neither Codex nor Hermes reads `.claude/rules/`. Cross-agent insight graduates to `.llmwiki/insight/` and is surfaced via the shared prompt-injection hook (see `llm-wiki` ingest rules). `.claude/rules/` is reserved for mechanical tool-operation rules (versioning, this file), not lore.
- **Never fork `.llmwiki/` into per-agent copies.** One neutral root is the point; a `.codex/wiki/` fork defeats it.
- **Never reduce `AGENTS.md` to a pointer at `CLAUDE.md`.** An `@CLAUDE.md` line is dead text under Codex and Hermes (neither expands `@`), and a prose "read CLAUDE.md first" redirect cannot reach the Codex GitHub cloud reviewer, which loads the `## Review guidelines` section straight into its system prompt rather than following an arbitrary prose redirect to other files (a specifically-referenced `code_review.md` is the one documented exception the reviewer *can* follow — a soft guarantee per the Codex best-practices doc, distinct from a vague "go read X" pointer). The failure is silent — Codex reports no error, it just runs with no guidance. This repo took the inverse, which is the safe direction: `AGENTS.md` is the SSOT and `CLAUDE.md` is a one-line `@AGENTS.md` import — the form the official Claude docs recommend, and portable to Windows checkouts. (A symlink achieves the same and is marginally stronger — one file cannot drift from itself — but checks out broken on Windows without `core.symlinks` (git writes `CLAUDE.md` as a text file containing the literal target string), so the import is preferred here.)

## Source of Truth

- This file is the Claude-side SSOT; the `AGENTS.md` "멀티런타임 통합" block is its Codex/Hermes mirror — keep them consistent.
- Related: `plugin-versioning.md` (version bump + manifest/adapter regen), the `AGENTS.md` "Codex 통합 (shared-source)" and "Hermes 통합 (shared-source)" sections, `.llmwiki/wiki/plugin-ops/shared-source-codex-manifests.md` (Codex shared-source rationale), and `.llmwiki/wiki/plugin-ops/hermes-plugin-adapter.md` (Hermes adapter rationale).
- Related: `plugin-versioning.md` (version bump + Codex manifest regen), the `AGENTS.md` "Codex 통합 (shared-source)" and "Hermes 통합 (shared-source)" sections, `.llmwiki/wiki/plugin-ops/shared-source-codex-manifests.md` (Codex shared-source rationale), and `.llmwiki/wiki/plugin-ops/skills-install-wrapper.md` (why Hermes goes through `npx skills` instead of a generated adapter; the retired adapter's rationale is kept at `hermes-plugin-adapter.md`).
Loading
Loading