oh-my-opencode 4.15.0 → 4.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/cli/index.js +644 -530
  2. package/dist/cli-node/index.js +644 -530
  3. package/dist/index.js +13 -13
  4. package/dist/skills/frontend/ATTRIBUTION.md +3 -2
  5. package/dist/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
  6. package/dist/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
  7. package/package.json +13 -13
  8. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  9. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +194 -102
  10. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  11. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
  23. package/packages/omo-codex/plugin/package-lock.json +13 -13
  24. package/packages/omo-codex/plugin/package.json +1 -1
  25. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +147 -2
  26. package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +33 -0
  27. package/packages/omo-codex/plugin/scripts/auto-update.mjs +48 -10
  28. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +18 -0
  29. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +3 -2
  30. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
  31. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
  32. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
  33. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -3
  34. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +32 -0
  35. package/packages/omo-codex/plugin/test/auto-update.test.mjs +153 -3
  36. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +18 -1
  37. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +39 -10
  38. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +19 -1
  39. package/packages/omo-codex/scripts/install-dist/install-local.mjs +444 -330
  40. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +3 -2
  41. package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
  42. package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
  43. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +0 -10
  44. package/packages/omo-codex/plugin/skills/ultraresearch/agents/openai.yaml +0 -2
  45. /package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
  46. /package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
  47. /package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
  48. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
  49. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
  50. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
  51. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
  52. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
  53. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
  54. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
  55. /package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
  56. /package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
  57. /package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
  58. /package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
  59. /package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
  60. /package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
  61. /package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
  62. /package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
  63. /package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
  64. /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
  65. /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
  66. /package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
  67. /package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
  68. /package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
  69. /package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
  70. /package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
  71. /package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
  72. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
  73. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
  74. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
  75. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
  76. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
  77. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
  78. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
  79. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
  80. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
  81. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
  82. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
  83. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
  84. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
  85. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
  86. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
  87. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
  88. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
  89. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
  90. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
  91. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
  92. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
  93. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
  94. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
  95. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
  96. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
  97. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
  98. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
  99. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
  100. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
  101. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
  102. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
  103. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
  104. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
  105. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
  106. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
  107. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
  108. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
  109. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
  110. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
  111. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
  112. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
  113. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
  114. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
  115. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
  116. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
  117. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
  118. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
  119. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
  120. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
  121. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
  122. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
  123. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
  124. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
  125. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-codegraph",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-start-work-continuation",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex start-work plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-loop",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -127,7 +127,7 @@ Gather context BEFORE planning with parallel `explorer` / `librarian` workers pl
127
127
  First survey available skills: read every loosely-relevant skill's description, deliberately choose which this work uses, and prefer applying genuinely-relevant skills over working raw.
128
128
  Then run tier triage per goal — rigor (LIGHT/HEAVY below) and shape (`delivery` default, or `research` when the deliverable is a cited answer, not an artifact) — and record both in an `annotate_ledger` steering entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency, transaction boundaries, or cache invalidation; a cross-domain refactor; or the user signaled care or demanded review. When unsure, take HEAVY; upgrade the moment a HEAVY fact surfaces, never downgrade mid-run.
129
129
  HEAVY goals: spawn the `plan` agent with the gathered context, follow its wave ordering and parallel grouping exactly, and run the verification it specifies; carry 3+ successCriteria covering happy path, edge, regression, and adversarial risk. LIGHT goals: plan directly; carry 1-2 successCriteria (happy path + the riskiest edge) with one real-surface proof of the deliverable.
130
- Research-shape goals change the cycle: BEFORE each investigation, read this goal's prior ledger findings and open hypotheses, then extend them — never re-investigate an answered question (the ledger is your research notebook). Record findings via `annotate_ledger` with their source (`file:line`, command output, doc URL) as `--evidence`. Track hypotheses as `HYPOTHESIS[id]: <claim> | status: open`, flipped to `confirmed`/`refuted` only on an observed source. A research criterion passes on a cited answer — skip QA-channel, cleanup, and commit, but keep source-observability (never "looks correct"). Keep hypotheses inside the user's stated question; a scope-widening one is an `add_subgoal` proposal you surface, never silent creep. For a `research`-shape goal you MAY load `ulw-research` (legacy alias: `ultraresearch`) without hesitation — otherwise explicit-request-only, a research-shape goal IS that explicit demand. Research-only: never for a `delivery` goal. It composes with the librarian routing above — `ulw-research` for saturation (many parallel sources, recursive expansion), a single `librarian` for one lookup.
130
+ Research-shape goals change the cycle: BEFORE each investigation, read this goal's prior ledger findings and open hypotheses, then extend them — never re-investigate an answered question (the ledger is your research notebook). Record findings via `annotate_ledger` with their source (`file:line`, command output, doc URL) as `--evidence`. Track hypotheses as `HYPOTHESIS[id]: <claim> | status: open`, flipped to `confirmed`/`refuted` only on an observed source. A research criterion passes on a cited answer — skip QA-channel, cleanup, and commit, but keep source-observability (never "looks correct"). Keep hypotheses inside the user's stated question; a scope-widening one is an `add_subgoal` proposal you surface, never silent creep. For a `research`-shape goal you MAY load `ulw-research` without hesitation — otherwise explicit-request-only, a research-shape goal IS that explicit demand. Research-only: never for a `delivery` goal. It composes with the librarian routing above — `ulw-research` for saturation (many parallel sources, recursive expansion), a single `librarian` for one lookup.
131
131
  For each criterion, define upfront: `id`, exact `scenario` (tool + inputs + binary pass/fail), `expectedEvidence` artifact path, adversarial classes, stop condition, and Manual-QA channel. Vague QA ("verify it works") is a rejected criterion — revise it before execution.
132
132
  For optimization work, capture baseline speed before changes plus behavior/regression proof. Every attempt records speed, behavior/regression, and the keep/revert/iterate decision.
133
133
  A criterion's adversarial classes are the ultraqa classes a fact about the change triggers: malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions. Record untriggered classes as not-applicable in one line.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "4.15.0",
9
+ "version": "4.15.1",
10
10
  "workspaces": [
11
11
  "components/codegraph",
12
12
  "components/comment-checker",
@@ -93,7 +93,7 @@
93
93
  },
94
94
  "components/codegraph": {
95
95
  "name": "@sisyphuslabs/codex-codegraph",
96
- "version": "4.15.0",
96
+ "version": "4.15.1",
97
97
  "bin": {
98
98
  "omo-codegraph": "dist/cli.js"
99
99
  },
@@ -112,7 +112,7 @@
112
112
  },
113
113
  "components/comment-checker": {
114
114
  "name": "@code-yeongyu/codex-comment-checker",
115
- "version": "4.15.0",
115
+ "version": "4.15.1",
116
116
  "license": "MIT",
117
117
  "bin": {
118
118
  "omo-comment-checker": "dist/cli.js"
@@ -133,7 +133,7 @@
133
133
  },
134
134
  "components/git-bash": {
135
135
  "name": "@sisyphuslabs/codex-git-bash-hook",
136
- "version": "4.15.0",
136
+ "version": "4.15.1",
137
137
  "bin": {
138
138
  "omo-git-bash-hook": "dist/cli.js"
139
139
  },
@@ -148,7 +148,7 @@
148
148
  },
149
149
  "components/lazycodex-executor-verify": {
150
150
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
151
- "version": "4.15.0",
151
+ "version": "4.15.1",
152
152
  "license": "MIT",
153
153
  "bin": {
154
154
  "lazycodex-executor-verify": "dist/cli.js"
@@ -165,7 +165,7 @@
165
165
  },
166
166
  "components/lsp": {
167
167
  "name": "@code-yeongyu/codex-lsp",
168
- "version": "4.15.0",
168
+ "version": "4.15.1",
169
169
  "license": "MIT",
170
170
  "dependencies": {
171
171
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon"
@@ -185,7 +185,7 @@
185
185
  },
186
186
  "components/rules": {
187
187
  "name": "@code-yeongyu/codex-rules",
188
- "version": "4.15.0",
188
+ "version": "4.15.1",
189
189
  "license": "MIT",
190
190
  "dependencies": {
191
191
  "picomatch": "^4.0.3"
@@ -207,7 +207,7 @@
207
207
  },
208
208
  "components/start-work-continuation": {
209
209
  "name": "@code-yeongyu/codex-start-work-continuation",
210
- "version": "4.15.0",
210
+ "version": "4.15.1",
211
211
  "license": "MIT",
212
212
  "bin": {
213
213
  "omo-start-work-continuation": "dist/cli.js"
@@ -224,7 +224,7 @@
224
224
  },
225
225
  "components/teammode": {
226
226
  "name": "@sisyphuslabs/codex-teammode",
227
- "version": "4.15.0",
227
+ "version": "4.15.1",
228
228
  "devDependencies": {
229
229
  "@types/node": "^25.9.3",
230
230
  "bun-types": "^1.3.1",
@@ -237,7 +237,7 @@
237
237
  },
238
238
  "components/telemetry": {
239
239
  "name": "@code-yeongyu/codex-telemetry",
240
- "version": "4.15.0",
240
+ "version": "4.15.1",
241
241
  "license": "MIT",
242
242
  "bin": {
243
243
  "omo-telemetry": "dist/cli.js"
@@ -255,7 +255,7 @@
255
255
  },
256
256
  "components/ultrawork": {
257
257
  "name": "@code-yeongyu/codex-ultrawork",
258
- "version": "4.15.0",
258
+ "version": "4.15.1",
259
259
  "license": "MIT",
260
260
  "bin": {
261
261
  "omo-ultrawork": "dist/cli.js"
@@ -273,7 +273,7 @@
273
273
  },
274
274
  "components/ulw-loop": {
275
275
  "name": "@code-yeongyu/codex-ulw-loop",
276
- "version": "4.15.0",
276
+ "version": "4.15.1",
277
277
  "license": "MIT",
278
278
  "bin": {
279
279
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "4.15.0",
3
+ "version": "4.15.1",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,7 @@
1
1
  import { spawn, spawnSync } from "node:child_process";
2
- import { readFileSync } from "node:fs";
3
- import { dirname, join } from "node:path";
2
+ import { existsSync, lstatSync, readFileSync, readdirSync, readlinkSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
5
6
 
6
7
  import { detectInstallFlow, resolveInstallSnapshotPath } from "./install-flow.mjs";
@@ -9,6 +10,23 @@ import { resolveSpawnInvocation } from "./spawn-command.mjs";
9
10
  const DEFAULT_UPDATE_COMMAND = "npx";
10
11
  const DEFAULT_UPDATE_ARGS = ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"];
11
12
  const DEFAULT_LATEST_VERSION_TIMEOUT_MS = 1_500;
13
+ const SISYPHUS_MARKETPLACE_NAME = "sisyphuslabs";
14
+ const OMO_PLUGIN_NAME = "omo";
15
+ const COMMAND_SHIM_MARKER = ":: generated by oh-my-openagent Codex installer";
16
+ const MANAGED_COMPONENT_BIN_NAMES = new Set([
17
+ "lazycodex-executor-verify",
18
+ "omo-codegraph",
19
+ "omo-comment-checker",
20
+ "omo-git-bash-hook",
21
+ "omo-lsp",
22
+ "omo-rules",
23
+ "omo-start-work-continuation",
24
+ "omo-telemetry",
25
+ "omo-ultrawork",
26
+ "omo-ulw-loop",
27
+ "ulw",
28
+ "ulw-loop",
29
+ ]);
12
30
 
13
31
  export function resolveLazyCodexUpdatePlan({ currentVersion, latestVersion, command = DEFAULT_UPDATE_COMMAND, args = DEFAULT_UPDATE_ARGS } = {}) {
14
32
  const current = parseVersion(currentVersion);
@@ -38,6 +56,16 @@ export function detectAutoUpdateInstallFlow(env) {
38
56
  return detectInstallFlow({ pluginRoot: resolveAutoUpdatePluginRoot(env), env });
39
57
  }
40
58
 
59
+ export function detectMarketplaceLocalRepair(env = {}) {
60
+ const codexHome = resolveCodexHome(env);
61
+ const marketplaceRoot = join(codexHome, "plugins", "cache", SISYPHUS_MARKETPLACE_NAME);
62
+ const reasons = [
63
+ ...missingCachedMarketplaceSources(marketplaceRoot),
64
+ ...missingManagedBinTargets({ env, marketplaceRoot }),
65
+ ];
66
+ return { needsRepair: reasons.length > 0, reasons };
67
+ }
68
+
41
69
  export function resolveCurrentVersion(env) {
42
70
  if (env.LAZYCODEX_CURRENT_VERSION?.trim()) return env.LAZYCODEX_CURRENT_VERSION.trim();
43
71
  const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
@@ -120,6 +148,109 @@ function resolveAutoUpdatePluginRoot(env) {
120
148
  return dirname(dirname(fileURLToPath(import.meta.url)));
121
149
  }
122
150
 
151
+ function resolveCodexHome(env) {
152
+ return resolve(env.CODEX_HOME?.trim() || join(resolveHome(env), ".codex"));
153
+ }
154
+
155
+ function resolveHome(env) {
156
+ return env.HOME?.trim() || homedir();
157
+ }
158
+
159
+ function resolveInstallerBinDir(env, codexHome) {
160
+ if (env.CODEX_LOCAL_BIN_DIR?.trim()) return resolve(env.CODEX_LOCAL_BIN_DIR.trim());
161
+ const home = resolveHome(env);
162
+ const defaultCodexHome = resolve(home, ".codex");
163
+ const resolvedCodexHome = resolve(codexHome);
164
+ return resolvedCodexHome === defaultCodexHome ? resolve(home, ".local", "bin") : join(resolvedCodexHome, "bin");
165
+ }
166
+
167
+ function missingCachedMarketplaceSources(marketplaceRoot) {
168
+ const manifest = readJsonObject(join(marketplaceRoot, ".agents", "plugins", "marketplace.json"));
169
+ if (manifest === undefined || !Array.isArray(manifest.plugins)) return [];
170
+ const reasons = [];
171
+ for (const plugin of manifest.plugins) {
172
+ if (!isPlainRecord(plugin) || plugin.name !== OMO_PLUGIN_NAME) continue;
173
+ const localPath = localMarketplaceSourcePath(plugin.source);
174
+ if (localPath === undefined) continue;
175
+ const resolvedPath = resolve(marketplaceRoot, localPath);
176
+ if (!isPathInside(resolvedPath, marketplaceRoot)) {
177
+ reasons.push({ kind: "invalid-marketplace-payload" });
178
+ continue;
179
+ }
180
+ if (!existsSync(resolvedPath)) {
181
+ reasons.push({ kind: "missing-marketplace-payload" });
182
+ }
183
+ }
184
+ return reasons;
185
+ }
186
+
187
+ function missingManagedBinTargets({ env, marketplaceRoot }) {
188
+ const binDir = resolveInstallerBinDir(env, resolveCodexHome(env));
189
+ let names;
190
+ try {
191
+ names = readdirSync(binDir);
192
+ } catch (error) {
193
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return [];
194
+ throw error;
195
+ }
196
+ const reasons = [];
197
+ for (const name of names) {
198
+ const binName = managedBinNameForEntry(name);
199
+ if (binName === undefined) continue;
200
+ const linkPath = join(binDir, name);
201
+ let target;
202
+ try {
203
+ target = readManagedBinTarget(linkPath);
204
+ } catch (error) {
205
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") continue;
206
+ throw error;
207
+ }
208
+ if (target === undefined) continue;
209
+ if (!isManagedCachedComponentTarget(target, marketplaceRoot) || existsSync(target)) continue;
210
+ reasons.push({ kind: "dangling-managed-bin", binName });
211
+ }
212
+ return reasons;
213
+ }
214
+
215
+ function managedBinNameForEntry(name) {
216
+ const candidate = name.endsWith(".cmd") ? name.slice(0, -4) : name;
217
+ return MANAGED_COMPONENT_BIN_NAMES.has(candidate) ? candidate : undefined;
218
+ }
219
+
220
+ function readManagedBinTarget(linkPath) {
221
+ const linkStat = lstatSync(linkPath);
222
+ if (linkStat.isSymbolicLink()) {
223
+ const linkTarget = readlinkSync(linkPath);
224
+ return isAbsolute(linkTarget) ? linkTarget : resolve(dirname(linkPath), linkTarget);
225
+ }
226
+ if (!linkStat.isFile()) return undefined;
227
+ const content = readFileSync(linkPath, "utf8");
228
+ if (!content.includes(COMMAND_SHIM_MARKER)) return undefined;
229
+ return extractCommandShimTarget(content);
230
+ }
231
+
232
+ function extractCommandShimTarget(content) {
233
+ const match = /"([^"\r\n]+components[\\/][^"\r\n]+[\\/]dist[\\/]cli\.js)" %\*/.exec(content);
234
+ return match?.[1];
235
+ }
236
+
237
+ function localMarketplaceSourcePath(source) {
238
+ if (!isPlainRecord(source)) return undefined;
239
+ return source.source === "local" && typeof source.path === "string" ? source.path : undefined;
240
+ }
241
+
242
+ function isManagedCachedComponentTarget(target, marketplaceRoot) {
243
+ if (!isPathInside(target, marketplaceRoot)) return false;
244
+ const parts = target.split(/[\\/]+/);
245
+ const suffix = parts.slice(-4);
246
+ return suffix[0] === "components" && suffix[2] === "dist" && suffix[3] === "cli.js";
247
+ }
248
+
249
+ function isPathInside(path, root) {
250
+ const relativePath = relative(resolve(root), resolve(path));
251
+ return relativePath === "" || (!relativePath.startsWith("..") && !isAbsolute(relativePath));
252
+ }
253
+
123
254
  function readVersionManifest(path) {
124
255
  try {
125
256
  const parsed = JSON.parse(readFileSync(path, "utf8"));
@@ -131,3 +262,17 @@ function readVersionManifest(path) {
131
262
  throw error;
132
263
  }
133
264
  }
265
+
266
+ function readJsonObject(path) {
267
+ try {
268
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
269
+ return isPlainRecord(parsed) ? parsed : undefined;
270
+ } catch (error) {
271
+ if (error instanceof Error) return undefined;
272
+ throw error;
273
+ }
274
+ }
275
+
276
+ function isPlainRecord(value) {
277
+ return typeof value === "object" && value !== null && !Array.isArray(value);
278
+ }
@@ -25,6 +25,35 @@ export function formatMarketplaceFlowNotice({ updateContext, releaseNotes }) {
25
25
  ].join(" ");
26
26
  }
27
27
 
28
+ export function formatMarketplaceRepairStartedNotice({ pendingNotice, releaseNotes, repairReasons = [] }) {
29
+ const reasons = formatRepairReasons(repairReasons);
30
+ return [
31
+ `[LazyCodex] Auto-update repair started in the background: v${pendingNotice.fromVersion} -> v${pendingNotice.toVersion}.`,
32
+ `Detected stale local LazyCodex cache/bin state: ${reasons}.`,
33
+ "LazyCodex started its bundled reinstall repair. Tell the user, in the user's preferred tone, that LazyCodex found a broken local cache or command link and started a repair; recommend starting a new Codex session after it completes.",
34
+ formatReleaseNotesForNotice({ version: pendingNotice.toVersion, releaseNotes }),
35
+ ].join(" ");
36
+ }
37
+
38
+ function formatRepairReasons(repairReasons) {
39
+ if (repairReasons.length === 0) return "stale local cache state was detected";
40
+ return [...new Set(repairReasons.map(formatRepairReason))].join("; ");
41
+ }
42
+
43
+ function formatRepairReason(reason) {
44
+ if (!isPlainRecord(reason)) return "stale local cache state";
45
+ if (reason.kind === "missing-marketplace-payload") return "missing marketplace payload";
46
+ if (reason.kind === "invalid-marketplace-payload") return "invalid marketplace payload";
47
+ if (reason.kind === "dangling-managed-bin" && typeof reason.binName === "string") {
48
+ return `dangling managed command link: ${sanitizeBinName(reason.binName)}`;
49
+ }
50
+ return "stale local cache state";
51
+ }
52
+
53
+ function sanitizeBinName(binName) {
54
+ return /^[a-z0-9][a-z0-9._-]{0,80}$/i.test(binName) ? binName : "managed command";
55
+ }
56
+
28
57
  export async function resolveReleaseNotes({ env, latestVersion }) {
29
58
  const override = env.LAZYCODEX_RELEASE_NOTES?.trim();
30
59
  if (override) return truncateReleaseNotes(override);
@@ -133,3 +162,7 @@ function parsePositiveInteger(value, fallback) {
133
162
  const parsed = Number.parseInt(value, 10);
134
163
  return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
135
164
  }
165
+
166
+ function isPlainRecord(value) {
167
+ return typeof value === "object" && value !== null && !Array.isArray(value);
168
+ }
@@ -14,6 +14,7 @@ import {
14
14
  import {
15
15
  compareVersions,
16
16
  defaultRunCommandForManualUpdate,
17
+ detectMarketplaceLocalRepair,
17
18
  detectAutoUpdateInstallFlow,
18
19
  parsePositiveInteger,
19
20
  parseVersion,
@@ -23,7 +24,12 @@ import {
23
24
  resolveLatestVersion,
24
25
  resolveLazyCodexUpdatePlan,
25
26
  } from "./auto-update-plan.mjs";
26
- import { formatMarketplaceFlowNotice, formatUpdateStartedNotice, resolveReleaseNotes } from "./auto-update-release-notes.mjs";
27
+ import {
28
+ formatMarketplaceFlowNotice,
29
+ formatMarketplaceRepairStartedNotice,
30
+ formatUpdateStartedNotice,
31
+ resolveReleaseNotes,
32
+ } from "./auto-update-release-notes.mjs";
27
33
  import { migrateCodexConfig } from "./migrate-codex-config.mjs";
28
34
  import { migrateOmoSotConfig } from "./migrate-omo-sot.mjs";
29
35
  import { resolveSpawnInvocation } from "./spawn-command.mjs";
@@ -38,9 +44,11 @@ export function resolveAutoUpdatePlan({ env = process.env, now = Date.now(), las
38
44
  return { shouldRun: false, reason: "disabled" };
39
45
  }
40
46
 
47
+ const flow = installFlow ?? detectAutoUpdateInstallFlow(env).flow;
48
+ const marketplaceRepair = flow === "marketplace" ? detectMarketplaceLocalRepair(env) : undefined;
41
49
  const intervalMs = parsePositiveInteger(env.LAZYCODEX_AUTO_UPDATE_INTERVAL_MS, DEFAULT_INTERVAL_MS);
42
50
  const successStatus = lastStatus === undefined || lastStatus === "success";
43
- if (successStatus && typeof lastCheckedAt === "number" && intervalMs > 0 && now - lastCheckedAt < intervalMs) {
51
+ if (marketplaceRepair?.needsRepair !== true && successStatus && typeof lastCheckedAt === "number" && intervalMs > 0 && now - lastCheckedAt < intervalMs) {
44
52
  return { shouldRun: false, reason: "throttled" };
45
53
  }
46
54
  const retryIntervalMs = parsePositiveInteger(env.LAZYCODEX_AUTO_UPDATE_RETRY_INTERVAL_MS, DEFAULT_RETRY_INTERVAL_MS);
@@ -48,8 +56,26 @@ export function resolveAutoUpdatePlan({ env = process.env, now = Date.now(), las
48
56
  return { shouldRun: false, reason: "retry-throttled" };
49
57
  }
50
58
 
51
- const flow = installFlow ?? detectAutoUpdateInstallFlow(env).flow;
52
- if (flow === "marketplace") return { shouldRun: false, reason: "marketplace-flow" };
59
+ if (flow === "marketplace") {
60
+ const repair = marketplaceRepair ?? detectMarketplaceLocalRepair(env);
61
+ if (!repair.needsRepair) return { shouldRun: false, reason: "marketplace-flow" };
62
+ const currentVersion = resolveCurrentVersion(env) ?? "unknown";
63
+ const latestVersion = resolveLatestVersion(env) ?? currentVersion ?? "latest";
64
+ return {
65
+ shouldRun: true,
66
+ kind: "marketplace-local-repair",
67
+ repairReasons: repair.reasons,
68
+ command: resolveCommand(env),
69
+ args: resolveArgs(env),
70
+ currentVersion,
71
+ latestVersion,
72
+ env: {
73
+ ...env,
74
+ LAZYCODEX_AUTO_UPDATE_DISABLED: "1",
75
+ OMO_CODEX_AUTO_UPDATE_DISABLED: "1",
76
+ },
77
+ };
78
+ }
53
79
 
54
80
  const currentVersion = resolveCurrentVersion(env);
55
81
  const latestVersion = resolveLatestVersion(env);
@@ -142,7 +168,13 @@ export async function runAutoUpdateCheck({ env = process.env, now = Date.now() }
142
168
  return { started: false, reason: "locked", notices };
143
169
  }
144
170
  try {
145
- await appendUpdateLog(env, now, "started", { command: plan.command, args: plan.args });
171
+ await appendUpdateLog(env, now, "started", plan.kind === "marketplace-local-repair"
172
+ ? { kind: plan.kind, repairReasons: plan.repairReasons ?? [] }
173
+ : {
174
+ command: plan.command,
175
+ args: plan.args,
176
+ ...(plan.kind === undefined ? {} : { kind: plan.kind }),
177
+ });
146
178
  const pendingNotice = { fromVersion: plan.currentVersion, toVersion: plan.latestVersion, startedAt: now };
147
179
  const releaseNotes = await resolveReleaseNotes({ env, latestVersion: plan.latestVersion });
148
180
  if (env.LAZYCODEX_AUTO_UPDATE_WAIT === "1") {
@@ -155,7 +187,7 @@ export async function runAutoUpdateCheck({ env = process.env, now = Date.now() }
155
187
  await appendUpdateLog(env, now, "finished", { status });
156
188
  if (status === 0) {
157
189
  await writeState(statePath, { lastCheckedAt: now, lastAttemptedAt: now, lastStatus: "success", pendingNotice });
158
- await recordUpdateStartedNotice({ env, now, notices, pendingNotice, releaseNotes });
190
+ await recordUpdateStartedNotice({ env, now, notices, pendingNotice, releaseNotes, plan });
159
191
  } else {
160
192
  await writeState(statePath, { lastAttemptedAt: now, lastStatus: "failed" });
161
193
  }
@@ -169,7 +201,7 @@ export async function runAutoUpdateCheck({ env = process.env, now = Date.now() }
169
201
  detached: true,
170
202
  });
171
203
  await writeState(statePath, { lastAttemptedAt: now, lastStatus: "started", pendingNotice });
172
- await recordUpdateStartedNotice({ env, now, notices, pendingNotice, releaseNotes });
204
+ await recordUpdateStartedNotice({ env, now, notices, pendingNotice, releaseNotes, plan });
173
205
  child.unref();
174
206
  return { started: true, notices };
175
207
  } finally {
@@ -197,10 +229,16 @@ async function settlePendingNotice({ env, now, statePath, state, notices }) {
197
229
  return nextState;
198
230
  }
199
231
 
200
- async function recordUpdateStartedNotice({ env, now, notices, pendingNotice, releaseNotes }) {
201
- notices.push(formatUpdateStartedNotice({ pendingNotice, releaseNotes }));
232
+ async function recordUpdateStartedNotice({ env, now, notices, pendingNotice, releaseNotes, plan }) {
233
+ notices.push(plan.kind === "marketplace-local-repair"
234
+ ? formatMarketplaceRepairStartedNotice({
235
+ pendingNotice,
236
+ releaseNotes,
237
+ repairReasons: plan.repairReasons ?? [],
238
+ })
239
+ : formatUpdateStartedNotice({ pendingNotice, releaseNotes }));
202
240
  await appendUpdateLog(env, now, "notified", {
203
- kind: "update-started",
241
+ kind: plan.kind === "marketplace-local-repair" ? "marketplace-local-repair-started" : "update-started",
204
242
  fromVersion: pendingNotice.fromVersion,
205
243
  toVersion: pendingNotice.toVersion,
206
244
  });
@@ -19,6 +19,7 @@ const skillSources = [
19
19
  ["ulw-plan", "components/ultrawork/skills/ulw-plan"],
20
20
  ];
21
21
  const componentSkillNames = new Set(skillSources.map(([name]) => name));
22
+ const codexHiddenSharedSkillNames = new Set(["ultraresearch"]);
22
23
  const skillDisplayPrefix = "(OmO) ";
23
24
 
24
25
  function shouldCopySkillSource(source) {
@@ -164,6 +165,22 @@ prefixes when identity is needed.
164
165
  `;
165
166
 
166
167
  function applyCodexSkillOverlays(skillName, content) {
168
+ if (skillName === "ulw-research") {
169
+ return content
170
+ .replace(
171
+ ", the legacy alias 'ultraresearch', any 'ulw' research wording,",
172
+ ", any 'ulw' research wording,",
173
+ )
174
+ .replace(
175
+ 'the legacy alias "ultraresearch" (also `/ultraresearch`, `$ultraresearch`), ',
176
+ "",
177
+ )
178
+ .replace(
179
+ "answer those normally, and mention that `ulw-research` is available (legacy alias: `ultraresearch`) when a question would clearly benefit from it.",
180
+ "answer those normally, and mention that `ulw-research` is available when a question would clearly benefit from it.",
181
+ )
182
+ .replace("# Ultraresearch Synthesis: <query>", "# ULW-Research Synthesis: <query>");
183
+ }
167
184
  if (skillName === "start-work") {
168
185
  return content
169
186
  .replace(startWorkOriginalCompletion, startWorkCodexCompletion)
@@ -236,6 +253,7 @@ async function syncSkills() {
236
253
 
237
254
  for (const skillName of sharedSkillNames) {
238
255
  if (componentSkillNames.has(skillName)) continue;
256
+ if (codexHiddenSharedSkillNames.has(skillName)) continue;
239
257
  await cp(join(sharedSkillsRoot, skillName), join(skillsRoot, skillName), {
240
258
  filter: shouldCopySkillSource,
241
259
  recursive: true,
@@ -150,10 +150,11 @@ path-mapped from the designpowers project. It is not committed here; the build
150
150
  materializes the selected files from the pinned submodule under
151
151
  `packages/shared-skills/upstreams/designpowers`. The materialized set includes the
152
152
  upstream `LICENSE`, ten `agents/*.md` role-reference files, and selected
153
- `skills/*/SKILL.md` files. Bridge/state/router integration skills are intentionally
153
+ `skills/*/SKILL.md` files renamed to `vendor/skills/*/reference.md` so they remain
154
+ reference documents instead of nested skill entrypoints. Bridge/state/router integration skills are intentionally
154
155
  excluded; see `frontend/references/designpowers/UPSTREAM.md` for the allowlist and
155
156
  exclusion list. Only the allowed frontmatter description quoting normalization described
156
- above may alter these materialized `SKILL.md` files.
157
+ above may alter these materialized `reference.md` files.
157
158
 
158
159
  - Source: https://github.com/Owl-Listener/designpowers
159
160
  - Pinned upstream commit: cb00757da9d554591fa78d27aa1854d60a05c4f7