oh-my-opencode 4.14.2 → 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.
- package/dist/cli/index.js +644 -530
- package/dist/cli-node/index.js +644 -530
- package/dist/index.js +13 -13
- package/dist/skills/frontend/ATTRIBUTION.md +10 -2
- package/dist/skills/frontend/SKILL.md +7 -3
- package/dist/skills/frontend/references/design/README.md +11 -34
- package/dist/skills/frontend/references/design/clone-from-url.md +65 -0
- package/dist/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
- package/dist/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
- package/dist/skills/programming/SKILL.md +5 -3
- package/dist/skills/remove-ai-slops/SKILL.md +34 -15
- package/dist/skills/visual-qa/SKILL.md +11 -0
- package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +42 -0
- package/package.json +13 -13
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +194 -102
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +147 -2
- package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +33 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +48 -10
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +18 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -2
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +7 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +11 -34
- package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +65 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +5 -3
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +34 -15
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -3
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +11 -0
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +32 -0
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +153 -3
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +18 -1
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +39 -10
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +19 -1
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +444 -330
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -2
- package/packages/shared-skills/skills/frontend/SKILL.md +7 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +11 -34
- package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +65 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
- package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +5 -3
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +34 -15
- package/packages/shared-skills/skills/visual-qa/SKILL.md +11 -0
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +42 -0
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +0 -10
- package/packages/omo-codex/plugin/skills/ultraresearch/agents/openai.yaml +0 -2
- /package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
- /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": "@code-yeongyu/codex-ultrawork",
|
|
3
|
-
"version": "4.
|
|
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.
|
|
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",
|
package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md
CHANGED
|
@@ -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`
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
276
|
+
"version": "4.15.1",
|
|
277
277
|
"license": "MIT",
|
|
278
278
|
"bin": {
|
|
279
279
|
"omo-ulw-loop": "dist/cli.js",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
52
|
-
|
|
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",
|
|
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(
|
|
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
|
|
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 `
|
|
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
|
|
@@ -199,3 +200,10 @@ capture evidence and a local reconnaissance run following the MIT-licensed
|
|
|
199
200
|
`JCodesMore/ai-website-cloner-template` workflow; it is not copied from Aside or from the
|
|
200
201
|
template. Aside names, trademarks, product text, and visual assets remain the property of
|
|
201
202
|
their respective owners and are referenced only for descriptive design-analysis purposes.
|
|
203
|
+
|
|
204
|
+
`frontend/references/design/clone-from-url.md` is a project-original runtime-extraction
|
|
205
|
+
workflow guide. Its browser + `getComputedStyle` clone approach follows the same
|
|
206
|
+
MIT-licensed `JCodesMore/ai-website-cloner-template` clone-website workflow that `aside.md`
|
|
207
|
+
cites; no source from that template is copied. It carries no third-party attribution beyond
|
|
208
|
+
that lineage note, and it grants no license to copy any target site's trademarks, brand
|
|
209
|
+
assets, or proprietary copy.
|