Replace x-sim codex plugin with whole-repo codex plugin, clarify install flow#88
Conversation
…per-harness install flow
There was a problem hiding this comment.
Code Review
This pull request adds support for publishing the repository as a Codex plugin, mirroring the canonical skills directory into the plugin structure, and adding a doctor check to detect drift. It also introduces several new skills (such as cmux, jobs, and x-sim) and helper tools. The review feedback highlights a potential bug in the skill rendering logic where deleted files might not be pruned, a hardcoded path in the job pipeline visualization script that ignores the KNOWLEDGE_DIR environment variable, and a performance issue in the x-sim tool due to repeated regex compilation.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| expected[filepath.FromSlash(sub)] = true | ||
| src := filepath.Join(repoRoot, filepath.FromSlash(rel)) | ||
| dest := filepath.Join(destRoot, filepath.FromSlash(sub)) | ||
| data, err := os.ReadFile(src) | ||
| if err != nil { | ||
| if errors.Is(err, fs.ErrNotExist) { | ||
| continue // tracked but deleted in worktree | ||
| } | ||
| return fmt.Errorf("read %s: %w", src, err) | ||
| } |
There was a problem hiding this comment.
In renderCodexPluginSkills, expected[filepath.FromSlash(sub)] = true is set before attempting to read the source file. If the file is tracked but has been deleted in the worktree, os.ReadFile(src) will fail with fs.ErrNotExist and the loop will continue. However, because expected was already populated, the stale file in the destination directory will not be pruned during the subsequent cleanup phase.\n\nTo fix this, only mark the file as expected after it has been successfully read.
\t\tsrc := filepath.Join(repoRoot, filepath.FromSlash(rel))\n\t\tdest := filepath.Join(destRoot, filepath.FromSlash(sub))\n\t\tdata, err := os.ReadFile(src)\n\t\tif err != nil {\n\t\t\tif errors.Is(err, fs.ErrNotExist) {\n\t\t\t\tcontinue // tracked but deleted in worktree\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"read %s: %w\", src, err)\n\t\t}\n\t\texpected[filepath.FromSlash(sub)] = trueThere was a problem hiding this comment.
Fixed in b51ed1b: expected is now marked only after a successful read, so copies of tracked-but-deleted files get pruned. Added TestRenderCodexPluginSkillsPrunesTrackedButDeletedFiles covering this.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1ac758797e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| @@ -0,0 +1,24 @@ | |||
| { | |||
| "name": "dotagents", | |||
| "version": "0.1.0", | |||
There was a problem hiding this comment.
Bump the Codex plugin version on updates
For this marketplace-installed plugin, keeping the manifest at a permanent 0.1.0 means users can stay on stale rendered skills after future repo updates: Codex stores installed plugin caches by <marketplace>/<plugin>/<version> and its documented reinstall/cachebuster flow expects the manifest version to change before codex plugin add refreshes local contents. This conflicts with the README’s Codex update path (marketplace upgrade, then reinstall), because changes under plugins/dotagents/skills/ will not necessarily replace the active cache unless this version/cachebuster is updated as part of render or release.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Addressed in b51ed1b by dropping the fixed version entirely, mirroring the Claude plugin manifest. Verified against codex 0.136.0 that a version-less plugin caches under .../dotagents/local and that plugin remove + add refreshes the cached copy after marketplace upgrade. README update flow adjusted accordingly.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ea1330c5ef
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8d36dfc928
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if err == nil && bytes.Equal(current, data) { | ||
| unchanged++ | ||
| continue |
There was a problem hiding this comment.
Preserve rendered file modes when contents match
When a skill file changes only its executable bit (for example a hook or bundled tool is chmodded +x with identical bytes), this early continue treats the rendered Codex copy as fresh and never reaches the os.Stat/WriteFile path that applies info.Mode().Perm(). The new doctor check also compares only bytes, so dotagents render and CI can both pass while plugins/dotagents/skills/... keeps a stale non-executable mode, breaking plugin-installed hooks/scripts on the next install.
Useful? React with 👍 / 👎.
What
Remove
plugins/x-sim/. It was a hand-maintained copied mirror of the canonicalskills/x-simskill, packaged as a single-skill Codex plugin. It was not referenced bydotagents.yamland not installed anywhere; x-sim stays a plain skill synced like every other.Publish the whole repo as a Codex plugin. New
.agents/plugins/marketplace.json(marketplaceyourconscience, matching the Claude marketplace name) plusplugins/dotagents/with.codex-plugin/plugin.jsonand a renderedskills/copy. Codex requires real copies (symlinked skills are silently dropped at install - re-verified against codex 0.136.0), so the copy is generated from git-tracked skill files (~328KB) bydotagents render, which already renders the Claude plugin agents. A newcodex plugindoctor check fails when the rendered copy drifts, preserving single-source-of-truth.Clarify the install flow. README Install section now leads with a pick-one table: Claude plugin, Codex plugin, or CLI +
dotagents setupfor the full managed surface on any supported harness. The plugin section documents both harnesses, the no-double-delivery rule, and that Hermes/Droid/Pi have no plugin system and install via setup/sync. The stale "Why Claude Code only" rationale (31MB) is replaced - tracked skill files are only a few hundred KB.New
dotagents-codexcatalog entry (enabled:false, review-only) documenting the self-publication, mirroring the existingdotagentsClaude entry.Verification
codex plugin marketplace add+codex plugin add dotagents@yourconscienceinstalled all 16 skills as real files (x-sim included); test install removed afterwards.dotagents doctor:codex plugincheck passes (50 rendered skill files fresh).🤖 Generated with Claude Code