oh-my-opencode 4.14.0 → 4.14.2
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/.agents/skills/codex-qa/references/isolation.md +1 -1
- package/README.md +1 -1
- package/dist/cli/doctor/framework/types.d.ts +2 -0
- package/dist/cli/index.js +223 -1447
- package/dist/cli-node/index.js +223 -1447
- package/dist/index.js +4255 -714
- package/dist/plugin/native-skills.d.ts +9 -0
- package/dist/plugin/system-transform.d.ts +1 -1
- package/dist/skills/frontend/ATTRIBUTION.md +7 -1
- package/dist/skills/frontend/SKILL.md +4 -3
- package/dist/skills/frontend/references/design/README.md +4 -3
- package/dist/skills/frontend/references/design/_INDEX.md +5 -3
- package/dist/skills/frontend/references/design/aside.md +209 -0
- package/dist/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
- package/dist/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/dist/skills/lcx-doctor/SKILL.md +48 -13
- package/dist/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/dist/skills/lcx-report-bug/SKILL.md +44 -13
- package/dist/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/dist/skills/visual-qa/SKILL.md +5 -5
- package/dist/skills/visual-qa/references/agent-browser-setup.md +5 -4
- package/dist/skills/visual-qa/scripts/cli.test.ts +7 -2
- package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +10 -2
- package/dist/skills/visual-qa/scripts/visual-qa.mjs +530 -0
- package/dist/tools/delegate-task/skill-resolver.d.ts +1 -0
- package/dist/tools/delegate-task/types.d.ts +2 -0
- package/dist/tools/skill/types.d.ts +1 -0
- package/package.json +26 -13
- package/packages/git-bash-mcp/dist/cli.js +2 -0
- package/packages/lsp-daemon/dist/cli.js +15 -4
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +1 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +9 -3
- package/packages/lsp-daemon/dist/index.js +15 -4
- package/packages/lsp-daemon/dist/paths.d.ts +1 -0
- package/packages/lsp-daemon/dist/paths.js +6 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +4 -7
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +123 -10
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +123 -10
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +126 -9
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +141 -0
- 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/dist/cli.js +90 -25
- package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +2 -0
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.d.ts +2 -0
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +56 -0
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +2 -5
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +2 -0
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +65 -0
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +6 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +8 -106
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -17
- 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/teammode/skills/teammode/SKILL.md +17 -5
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +63 -1
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +80 -50
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +4 -12
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +7 -33
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +4 -12
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-quality-gate.json +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-doc.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +7 -6
- package/packages/omo-codex/plugin/package-lock.json +16 -56
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +7 -1
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +4 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +4 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +5 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +209 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +48 -13
- package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +44 -13
- package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +17 -5
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +63 -1
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +80 -50
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +4 -4
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +5 -4
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/visual-qa.mjs +530 -0
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +23 -0
- package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +38 -2
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +12 -11
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +99 -1
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +62 -8
- package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +102 -0
- package/packages/omo-codex/plugin/test/teammode-safety-fixture.mjs +41 -1
- package/packages/omo-codex/plugin/test/teammode-safety.test.mjs +93 -0
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +6 -0
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +28 -0
- package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +43 -3
- package/packages/omo-codex/scripts/install-delegated-command.test.mjs +93 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +169 -41
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +21 -2
- package/packages/omo-codex/scripts/install-local.test.mjs +0 -1
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +7 -1
- package/packages/shared-skills/skills/frontend/SKILL.md +4 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +4 -3
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +5 -3
- package/packages/shared-skills/skills/frontend/references/design/aside.md +209 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +48 -13
- package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +44 -13
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/packages/shared-skills/skills/visual-qa/SKILL.md +5 -5
- package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +5 -4
- package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +7 -2
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +10 -2
- package/packages/shared-skills/skills/visual-qa/scripts/visual-qa.mjs +530 -0
- package/dist/cli/sparkshell-appserver-websocket.d.ts +0 -4
- package/dist/cli/sparkshell-appserver.d.ts +0 -16
- package/dist/cli/sparkshell-condense.d.ts +0 -10
- package/dist/cli/sparkshell-parse.d.ts +0 -24
- package/dist/cli/sparkshell-session-context.d.ts +0 -20
- package/dist/cli/sparkshell-spark.d.ts +0 -23
- package/dist/cli/sparkshell.d.ts +0 -33
- package/dist/shared/sparkshell-awareness.d.ts +0 -5
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +0 -106
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +0 -355
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SkillLoadOptions } from "../tools/skill/types";
|
|
2
|
+
import type { PluginContext } from "./types";
|
|
3
|
+
type NativeSkills = NonNullable<SkillLoadOptions["nativeSkills"]>;
|
|
4
|
+
export declare function getPluginInputNativeSkills(ctx: PluginContext): NativeSkills | undefined;
|
|
5
|
+
export declare function createNativeSkills(input: {
|
|
6
|
+
readonly client: PluginContext["client"];
|
|
7
|
+
readonly directory: string;
|
|
8
|
+
}): NativeSkills;
|
|
9
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DefaultModeConfig } from "../config/schema/default-mode";
|
|
2
|
-
export declare function createSystemTransformHandler(defaultMode?: DefaultModeConfig, getUltraworkMessage?: (agentName?: string, modelID?: string) => string
|
|
2
|
+
export declare function createSystemTransformHandler(defaultMode?: DefaultModeConfig, getUltraworkMessage?: (agentName?: string, modelID?: string) => string): (input: {
|
|
3
3
|
sessionID?: string;
|
|
4
4
|
model: {
|
|
5
5
|
id: string;
|
|
@@ -186,10 +186,16 @@ SOFTWARE.
|
|
|
186
186
|
|
|
187
187
|
## 5. Project-original files
|
|
188
188
|
|
|
189
|
-
`frontend/SKILL.md`, `frontend/references/design/README.md`, `_INDEX.md`,
|
|
189
|
+
`frontend/SKILL.md`, `frontend/references/design/README.md`, `_INDEX.md`, `aside.md`,
|
|
190
190
|
`design-system-architecture.md`, `react-dev-tooling-skill.md`,
|
|
191
191
|
`frontend/references/perfection/README.md`, `react-perf-tooling.md`, and
|
|
192
192
|
`frontend/scripts/perfection/lighthouse-audit.py` are original to this project and require
|
|
193
193
|
no third-party attribution. The perfection docs and script only invoke third-party tools
|
|
194
194
|
(react-scan, react-doctor, react-grab, playwright-lighthouse, lighthouse, chrome-launcher)
|
|
195
195
|
at runtime; no source from those tools is vendored, so their licenses are not carried here.
|
|
196
|
+
|
|
197
|
+
`frontend/references/design/aside.md` is a project-original synthesis from live browser
|
|
198
|
+
capture evidence and a local reconnaissance run following the MIT-licensed
|
|
199
|
+
`JCodesMore/ai-website-cloner-template` workflow; it is not copied from Aside or from the
|
|
200
|
+
template. Aside names, trademarks, product text, and visual assets remain the property of
|
|
201
|
+
their respective owners and are referenced only for descriptive design-analysis purposes.
|
|
@@ -33,7 +33,7 @@ When `references/designpowers/README.md` is loaded for implementation, redesign,
|
|
|
33
33
|
|
|
34
34
|
## Ruleset 1 — design (`references/design/`)
|
|
35
35
|
|
|
36
|
-
The reference library has one architecture file, 12 taste skills (Layer A — *how to execute*), and
|
|
36
|
+
The reference library has one architecture file, 12 taste skills (Layer A — *how to execute*), and 70 brand design systems (Layer B — *what it should look like*). Most non-trivial tasks load **one Layer A + one Layer B**. `README.md` carries the full routing flow, stacking rules, anti-patterns, and the mandatory browser-based Design QA phase; `_INDEX.md` catalogs all 83 files with mood-to-brand mappings — read it whenever routing is not obvious from the tables below.
|
|
37
37
|
|
|
38
38
|
### Layer 0 — architecture
|
|
39
39
|
|
|
@@ -58,7 +58,7 @@ The reference library has one architecture file, 12 taste skills (Layer A — *h
|
|
|
58
58
|
|
|
59
59
|
### Layer B — brand design systems (orthogonal to Layer A; stack freely)
|
|
60
60
|
|
|
61
|
-
When the user names a brand or site — "Linear-style", "like Stripe's landing" — load `references/design/<brand>.md` as the token source of truth (palette, type scale, components, do/don'ts). Coverage includes `apple` `stripe` `linear.app` `notion` `vercel` `claude` `figma` `airbnb` `nike` `tesla` `spotify` `raycast` `revolut` and ~56 more; the full list with mood shortcuts is in `_INDEX.md`. Extract the tokens and apply them to the project's own content — never copy logos or trademarked imagery. If the named brand is missing, fall back to a Layer A mood match or the `open-design` skill.
|
|
61
|
+
When the user names a brand or site — "Linear-style", "like Stripe's landing", "Aside-style browser agent" — load `references/design/<brand>.md` as the token source of truth (palette, type scale, components, do/don'ts). Coverage includes `aside` `apple` `stripe` `linear.app` `notion` `vercel` `claude` `figma` `airbnb` `nike` `tesla` `spotify` `raycast` `revolut` and ~56 more; the full list with mood shortcuts is in `_INDEX.md`. Extract the tokens and apply them to the project's own content — never copy logos or trademarked imagery. If the named brand is missing, fall back to a Layer A mood match or the `open-design` skill.
|
|
62
62
|
|
|
63
63
|
### React dev tooling
|
|
64
64
|
|
|
@@ -102,6 +102,7 @@ Domains: `product` `style` `typography` `color` `landing` `chart` `ux` `react` `
|
|
|
102
102
|
| Request | Load |
|
|
103
103
|
|---|---|
|
|
104
104
|
| "Build a landing page" (no direction given) | `design/README.md` + `design/_INDEX.md` shortlist → exactly one Layer B reference + `design/taste-skill.md` + `perfection/README.md` |
|
|
105
|
+
| "Aside-style AI browser / browser agent page" | `design/README.md` + `design/aside.md` + `design/taste-skill.md` + `perfection/README.md` |
|
|
105
106
|
| "Linear-style landing page" | `design/README.md` + `design/linear.app.md` + `design/taste-skill.md` + `perfection/README.md` |
|
|
106
107
|
| "Premium SaaS hero like Stripe" | `design/README.md` + `design/stripe.md` + `design/soft-skill.md` + `perfection/README.md` |
|
|
107
108
|
| "Improve this existing dashboard" | `design/README.md` + `design/redesign-skill.md` + `perfection/README.md` |
|
|
@@ -125,7 +126,7 @@ Domains: `product` `style` `typography` `color` `landing` `chart` `ux` `react` `
|
|
|
125
126
|
|
|
126
127
|
| Situation | Load |
|
|
127
128
|
|---|---|
|
|
128
|
-
| Brand/style not among the
|
|
129
|
+
| Brand/style not among the 70 in `references/design/`, or the user says "Open Design" | `open-design` skill — the local nexu-io/open-design library (137+ design skills, 150+ design systems) |
|
|
129
130
|
| Driving a browser for the Design QA phase | `agent-browser` skill |
|
|
130
131
|
| Pure TypeScript/logic work with zero visual surface | `programming` skill alone — this skill adds nothing there |
|
|
131
132
|
|
|
@@ -16,9 +16,9 @@ Two things ship flat most often, and both read as "clean but generic": the **her
|
|
|
16
16
|
The library lives flat in this directory (`references/design/`, max depth 1) and has two conceptual layers, and **most non-trivial tasks load one from each layer**:
|
|
17
17
|
|
|
18
18
|
- **Layer A — taste skills (12 files):** how to execute. Discipline, motion physics, spacing rules, anti-slop guardrails, output completeness. Filenames end in `-skill.md` or start with `imagegen-`.
|
|
19
|
-
- **Layer B — design systems (
|
|
19
|
+
- **Layer B — design systems (70 files):** what it should look like. Concrete color/type/component tokens for one specific brand aesthetic. Filenames are brand names (`aside.md`, `claude.md`, `notion.md`, `stripe.md`, ...).
|
|
20
20
|
|
|
21
|
-
A combined directory of all
|
|
21
|
+
A combined directory of all 83 reference files is at `_INDEX.md`. **Read that index before loading anything** unless the routing is obvious — it has the full mood-mapping and stacking rules in one place.
|
|
22
22
|
|
|
23
23
|
## Open Design Library
|
|
24
24
|
|
|
@@ -94,7 +94,7 @@ Run through this in order and stop at the first match. Do not skip — earlier r
|
|
|
94
94
|
|
|
95
95
|
### Step 1 — Did the user name a specific brand or site?
|
|
96
96
|
|
|
97
|
-
Phrasings: "make it look like Linear", "Stripe-style buttons", "Notion-feel sidebar", "like {brand}'s landing page", or pasting a screenshot of a known brand site.
|
|
97
|
+
Phrasings: "make it look like Linear", "Stripe-style buttons", "Notion-feel sidebar", "Aside-style browser agent", "like {brand}'s landing page", or pasting a screenshot of a known brand site.
|
|
98
98
|
|
|
99
99
|
**Action:** Open `_INDEX.md`, find the brand under "Layer B — Design Systems", then load `<brand>.md`. Use it as the project's design system source of truth (color hex values, type scale, component specs, do/don'ts).
|
|
100
100
|
|
|
@@ -201,6 +201,7 @@ Once references are loaded, before writing any UI code:
|
|
|
201
201
|
| User asks for... | Load these |
|
|
202
202
|
|---|---|
|
|
203
203
|
| "Build me a landing page" (no other info) | `_INDEX.md` shortlist → exactly one Layer B reference + `taste-skill.md` |
|
|
204
|
+
| "Build me an Aside-style AI browser / agent page" | `aside.md` + `taste-skill.md` |
|
|
204
205
|
| "Build me a Linear-style landing page" | `linear.app.md` + `taste-skill.md` |
|
|
205
206
|
| "Make it Notion-like and minimal" | `notion.md` + `minimalist-skill.md` |
|
|
206
207
|
| "Premium SaaS hero, like Stripe" | `stripe.md` + `soft-skill.md` |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
All reference files live flat in this directory. Three layers:
|
|
4
4
|
- **Layer 0 — design system architecture** (1 file): the mandatory gate. Defines `DESIGN.md` structure, creation workflow, validation rules. Always loaded by Phase 0 when no design system exists.
|
|
5
5
|
- **Layer A — taste skills** (12 files): how to execute. Discipline, motion, spacing, anti-slop, output completeness.
|
|
6
|
-
- **Layer B — design systems** (
|
|
6
|
+
- **Layer B — design systems** (70 files): what it should look like. Brand-specific color/type/component tokens.
|
|
7
7
|
|
|
8
8
|
**Phase 0 runs first** (check/create `DESIGN.md`), then most non-trivial tasks load **one Layer A + one Layer B** together. See the routing flow in the sibling `README.md`.
|
|
9
9
|
|
|
@@ -52,9 +52,9 @@ From [Leonxlnx/taste-skill](https://github.com/Leonxlnx/taste-skill).
|
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
55
|
-
## Layer B — Design Systems (
|
|
55
|
+
## Layer B — Design Systems (70)
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
Most Layer B files are materialized from [VoltAgent/awesome-design-md](https://github.com/VoltAgent/awesome-design-md), based on [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/overview/). Project-original entries such as `aside.md` are listed here only when `ATTRIBUTION.md` and `frontend-refs-manifest.mjs` mark them as original. Each file captures one website's complete visual language: color palette, typography, components, layout principles, depth, do/don't, responsive behavior, and an agent prompt guide.
|
|
58
58
|
|
|
59
59
|
### How to use
|
|
60
60
|
|
|
@@ -83,6 +83,7 @@ Each file ships with: visual theme, hex color palette + semantic roles, full typ
|
|
|
83
83
|
|
|
84
84
|
| File | Aesthetic |
|
|
85
85
|
|---|---|
|
|
86
|
+
| `aside.md` | AI browser agent. Bright product-app marketing, custom display type, soft squircle controls, browser-product framing. |
|
|
86
87
|
| `cursor.md` | AI-first code editor. Sleek dark interface, gradient accents. |
|
|
87
88
|
| `expo.md` | React Native platform. Dark theme, tight letter-spacing, code-centric. |
|
|
88
89
|
| `lovable.md` | AI full-stack builder. Playful gradients, friendly dev aesthetic. |
|
|
@@ -183,6 +184,7 @@ Each file ships with: visual theme, hex color palette + semantic roles, full typ
|
|
|
183
184
|
- **"Brutal / Swiss / industrial"** → `nike.md`, `bugatti.md`, `vodafone.md`
|
|
184
185
|
- **"Dark cinematic"** → `runwayml.md`, `elevenlabs.md`, `superhuman.md`, `shopify.md`
|
|
185
186
|
- **"Terminal / developer-native"** → `vercel.md`, `warp.md`, `voltagent.md`, `ollama.md`
|
|
187
|
+
- **"AI browser / agentic browser / product-app launch"** → `aside.md`, `raycast.md`, `superhuman.md`
|
|
186
188
|
- **"Warm / approachable / soft"** → `airbnb.md`, `notion.md`, `intercom.md`, `mastercard.md`
|
|
187
189
|
- **"Data-dense / dashboard"** → `sentry.md`, `kraken.md`, `posthog.md`, `clickhouse.md`
|
|
188
190
|
- **"Bold / sporty / monochrome punch"** → `nike.md`, `uber.md`, `tesla.md`, `binance.md`
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Design System Inspired by Aside
|
|
2
|
+
|
|
3
|
+
> Category: Developer Tools & IDEs
|
|
4
|
+
> AI browser agent. Bright product-app marketing, custom display type, soft squircle controls, agent-browser product framing.
|
|
5
|
+
|
|
6
|
+
## Provenance
|
|
7
|
+
|
|
8
|
+
This reference is derived from a live capture of `https://aside.com/` on 2026-06-30, plus a reconnaissance pass following `JCodesMore/ai-website-cloner-template` at commit `8dd9cb47dde0d49fec06ee1d69bedd04840f3c95`.
|
|
9
|
+
|
|
10
|
+
Reviewer-run evidence artifacts for the source capture were written under `.omo/evidence/20260630-aside-frontend-reference/`:
|
|
11
|
+
|
|
12
|
+
- `aside-live-extraction.json`
|
|
13
|
+
- `aside-home.png`
|
|
14
|
+
- `cloner-output-summary.md`
|
|
15
|
+
- `cloner-desktop-1440.png`
|
|
16
|
+
- `cloner-tablet-768.png`
|
|
17
|
+
- `cloner-mobile-390.png`
|
|
18
|
+
|
|
19
|
+
Those `.omo/evidence` files are local review artifacts, not shipped package assets. Downstream agents should recapture the live site when fidelity to the current Aside page matters. This file carries the stable, reviewer-visible digest from that capture.
|
|
20
|
+
|
|
21
|
+
### Reviewer-Visible Capture Digest
|
|
22
|
+
|
|
23
|
+
- **Source page:** `https://aside.com/`
|
|
24
|
+
- **Source metadata:** title indicated a browser built to do real work; description framed it as a browser that completes complex work across sites, accounts, and history.
|
|
25
|
+
- **Template source:** `JCodesMore/ai-website-cloner-template` at commit `8dd9cb47dde0d49fec06ee1d69bedd04840f3c95`; the template was used as a local reconnaissance workflow, not copied into this repo.
|
|
26
|
+
- **Screenshots captured:** live page at 1440px wide; reconstructed reconnaissance screenshots at 1440px, 768px, and 390px widths.
|
|
27
|
+
- **Page topology:** compact nav, centered hero, sky/cloud hero wash, large browser-product frame, explanatory intro band, capability sections, benchmark tabs, password/security sections, blue closing CTA band, dense footer.
|
|
28
|
+
- **Extracted type signals:** `displayFont` for hero and section display; Geist for body/UI; Geist Mono available for technical specimens.
|
|
29
|
+
- **Extracted scale signals:** H1 around 48px / 52px with slight negative tracking; body 16px / 24px; UI labels around 14px / 20px.
|
|
30
|
+
- **Extracted surface signals:** white page canvas, ink text around `#090b0c`, soft gray controls around `#f5f5f5`, black-opacity dividers, pill trust badge, rounded/squircle CTA buttons, product-frame shadows.
|
|
31
|
+
- **Responsive observations:** desktop preserves full nav and large browser frame; tablet narrows the product frame; mobile crops/stacks the frame while keeping the hero and CTA visible.
|
|
32
|
+
|
|
33
|
+
Do not treat this file as a license to copy Aside's logo, product screenshots, copy, or proprietary assets. Use it as a token and layout reference for original AI-browser, agent-workflow, and product-app surfaces.
|
|
34
|
+
|
|
35
|
+
## 1. Visual Theme & Atmosphere
|
|
36
|
+
|
|
37
|
+
Aside's current site reads as a bright, high-confidence product application rather than a dark developer landing page. The canvas is mostly white with hairline black dividers, dense product UI, large custom display headlines, and pale sky-blue atmospheric bands in the hero and final CTA. It feels closer to a native app launch page than a SaaS template: crisp, controlled, and built around the promise that the browser itself can do real work.
|
|
38
|
+
|
|
39
|
+
The signature move is the contrast between calm white space, a gentle cloud-like blue wash, and dense browser-product framing. The page opens with a centered hero, a small Y Combinator trust pill, and a large browser/app visual. Below that, sections use full-width bands, thin separators, and app-like capability cards instead of decorative feature-card grids. The tone is practical and confident: precise controls, product screenshots, benchmark pills, password/memory/security stories, and compact navigation.
|
|
40
|
+
|
|
41
|
+
Rounded elements should feel like soft squircles, not generic `rounded-2xl` blobs. Live capture shows very large pill radii for trust badges and hero CTAs, medium squircle radii around compact action buttons, and square rhythm for structural section boundaries. Depth is created by product frames, soft shadows, white/black opacity borders, and layered screenshot surfaces, not by colorful background decoration.
|
|
42
|
+
|
|
43
|
+
## 2. Color Palette & Roles
|
|
44
|
+
|
|
45
|
+
### Core Canvas
|
|
46
|
+
|
|
47
|
+
- **White** (`#ffffff`): primary page background. Use for the main canvas and broad content bands.
|
|
48
|
+
- **Ink Black** (`lab(2.93655 -0.435196 -0.608262)`, approximate `#090b0c`): primary text. Use this instead of pure black when possible.
|
|
49
|
+
- **Soft Gray Surface** (`lab(96.52 -0.0000298023 0.0000119209)`, approximate `#f5f5f5`): rounded control and panel surface.
|
|
50
|
+
- **Hairline Divider** (`rgba(0,0,0,0.06)`): section borders and subtle containment.
|
|
51
|
+
- **Muted Text** (`#737373` to `#a1a1a1` range): captions, footer links, secondary product explanations.
|
|
52
|
+
|
|
53
|
+
### Action Surfaces
|
|
54
|
+
|
|
55
|
+
- **Primary Button Surface**: light gray or ink-inverted depending on context. Use compact contrast instead of saturated brand color.
|
|
56
|
+
- **Primary Button Text**: ink black on light controls; white on dark controls.
|
|
57
|
+
- **Hover Surface**: slightly darker neutral fill with 150ms color/background/border transition.
|
|
58
|
+
- **Focus Ring**: neutral gray ring. Keep it visible against white and soft gray.
|
|
59
|
+
|
|
60
|
+
### Accent Use
|
|
61
|
+
|
|
62
|
+
Aside's live capture does not rely on one dominant neon accent. Accents come from product imagery, benchmark pills, subtle icon color, and carefully placed dark controls. If a project needs a brand color, keep it secondary to the black/white/gray product-app system and apply it only to small signals.
|
|
63
|
+
|
|
64
|
+
The current page does use pale cyan/sky-blue atmosphere in large image-backed bands. Treat that as an optional Aside signature for AI-browser launches: soft, airy, and product-framing, not a generic blue gradient background.
|
|
65
|
+
|
|
66
|
+
## 3. Typography Rules
|
|
67
|
+
|
|
68
|
+
### Font Family
|
|
69
|
+
|
|
70
|
+
- **Display**: Aside custom display font exposed in capture as `displayFont`, fallback display sans.
|
|
71
|
+
- **Body / UI**: Geist, fallback sans.
|
|
72
|
+
- **Mono**: Geist Mono for code, benchmark labels, and technical specimens.
|
|
73
|
+
|
|
74
|
+
### Hierarchy
|
|
75
|
+
|
|
76
|
+
| Role | Font | Size | Weight | Line Height | Letter Spacing | Use |
|
|
77
|
+
|---|---|---:|---:|---:|---:|---|
|
|
78
|
+
| Hero Display | displayFont | 48px | 400 | 52px | -0.48px | Primary H1 |
|
|
79
|
+
| Section Display | displayFont | 36px-48px | 400-500 | 1.08-1.15 | tight | Major section claims |
|
|
80
|
+
| Card Title | displayFont or Geist | 24px-30px | 500 | 1.2 | normal/tight | Product capability cards |
|
|
81
|
+
| Body | Geist | 16px | 400 | 24px | normal | General explanation |
|
|
82
|
+
| UI Label | Geist | 14px | 500 | 20px | normal | Nav, buttons, menu labels |
|
|
83
|
+
| Pill/Caption | Geist | 12px-14px | 500-550 | 1.3 | slight | Badges, metadata, benchmarks |
|
|
84
|
+
|
|
85
|
+
### Principles
|
|
86
|
+
|
|
87
|
+
- Use the display font for the claim, not for every word on the page.
|
|
88
|
+
- Keep body copy plain, readable, and product-focused.
|
|
89
|
+
- Favor medium weights over bold weights; the brand voice is confident but not shouty.
|
|
90
|
+
- Avoid negative letter-spacing outside display text. The router's global rule against viewport-scaled font sizing still applies.
|
|
91
|
+
|
|
92
|
+
## 4. Component Stylings
|
|
93
|
+
|
|
94
|
+
### Navigation
|
|
95
|
+
|
|
96
|
+
- Top navigation is compact and product-app-like.
|
|
97
|
+
- Logo at left, grouped menu buttons/links in the center, download CTA at right.
|
|
98
|
+
- Nav labels use Geist 14px/500 with short 150ms color/background transitions.
|
|
99
|
+
- Dropdown triggers can be text buttons with no visible border until hover.
|
|
100
|
+
- Mobile should collapse to icon/hamburger controls with the same neutral/squircle treatment.
|
|
101
|
+
|
|
102
|
+
### Hero Trust Pill
|
|
103
|
+
|
|
104
|
+
- Pill radius: full pill, visually continuous.
|
|
105
|
+
- Border/fill: very subtle neutral contrast against white.
|
|
106
|
+
- Text: 12px-14px Geist, medium weight.
|
|
107
|
+
- Content: use as a trust or provenance signal, not a decorative chip pile.
|
|
108
|
+
|
|
109
|
+
### Primary CTA
|
|
110
|
+
|
|
111
|
+
- Shape: pill for hero CTA, medium squircle for standard nav/action buttons.
|
|
112
|
+
- Height: 36px compact nav, 44px hero/mobile.
|
|
113
|
+
- Padding: generous horizontal padding for hero; compact in nav.
|
|
114
|
+
- Motion: 150ms background/color/border transition; pressed state can scale to 0.97.
|
|
115
|
+
- Icon: use SVG icon from the app's icon library; do not use emoji.
|
|
116
|
+
|
|
117
|
+
### Product Browser Frame
|
|
118
|
+
|
|
119
|
+
This is the key Aside-inspired primitive.
|
|
120
|
+
|
|
121
|
+
- Large product/browser mockup below or near the hero claim.
|
|
122
|
+
- Use a real screenshot, generated bitmap, or carefully built UI surface. Do not substitute flat rectangles.
|
|
123
|
+
- Contain with soft border, rounded/squircle corners, and restrained shadow.
|
|
124
|
+
- Internal chrome should show real browser/app affordances: sidebar, tabs, compact controls, content panels.
|
|
125
|
+
- The frame can overflow and crop at mobile widths, but the focal content must remain legible.
|
|
126
|
+
|
|
127
|
+
### Capability Sections
|
|
128
|
+
|
|
129
|
+
- Full-width horizontal bands separated by `border-b border-black/6` style dividers.
|
|
130
|
+
- Section structure: one major claim, one explanatory block, one app-like visual or metric module.
|
|
131
|
+
- Avoid three generic feature cards unless the product genuinely has three peer capabilities.
|
|
132
|
+
- Link rows and "Learn more" controls stay quiet and text-forward.
|
|
133
|
+
|
|
134
|
+
### Benchmark Pills / Tabs
|
|
135
|
+
|
|
136
|
+
- Medium squircle radius around compact tabs.
|
|
137
|
+
- Neutral backgrounds with dark text.
|
|
138
|
+
- Hover/active states should be visible through fill, border, or text contrast.
|
|
139
|
+
- Useful for agent benchmarks, model comparisons, task modes, and product states.
|
|
140
|
+
|
|
141
|
+
## 5. Layout Principles
|
|
142
|
+
|
|
143
|
+
### Structure
|
|
144
|
+
|
|
145
|
+
- Full page uses stacked bands rather than isolated floating cards.
|
|
146
|
+
- Hero centers the brand claim and then gives the product visual real space.
|
|
147
|
+
- Sections often span full width with internal max-width constraints.
|
|
148
|
+
- Footer is link-dense and calm, with grouped columns.
|
|
149
|
+
|
|
150
|
+
### Spacing
|
|
151
|
+
|
|
152
|
+
- Outer page padding: 8px mobile, 16px desktop.
|
|
153
|
+
- Hero vertical rhythm: generous, but not editorially sparse; the product visual arrives quickly.
|
|
154
|
+
- Section padding: 56px-96px depending on density.
|
|
155
|
+
- Dense UI inside product frames can use 8px-16px rhythm.
|
|
156
|
+
|
|
157
|
+
### Responsive Behavior
|
|
158
|
+
|
|
159
|
+
- Desktop: full nav, large browser/product visual, multi-column footer.
|
|
160
|
+
- Tablet: preserve product framing but reduce visual width and section padding.
|
|
161
|
+
- Mobile: collapse nav, make hero text more compact, crop or stack the product frame deliberately.
|
|
162
|
+
- Avoid horizontal overflow; if a browser mockup is wider than the viewport, scale or crop from a stable container.
|
|
163
|
+
|
|
164
|
+
## 6. Depth, Motion & Interaction
|
|
165
|
+
|
|
166
|
+
### Depth
|
|
167
|
+
|
|
168
|
+
- Use hairline borders and product-frame shadows as the primary elevation language.
|
|
169
|
+
- Prefer subtle neutral shadow over colored glows.
|
|
170
|
+
- Layer product screenshots or UI panels to create depth.
|
|
171
|
+
- Keep broad backgrounds flat white unless a product visual, hero, or closing CTA needs the current Aside-like pale sky-blue atmospheric wash.
|
|
172
|
+
|
|
173
|
+
### Motion
|
|
174
|
+
|
|
175
|
+
- Use short transitions for controls: color, background-color, border-color, opacity, transform.
|
|
176
|
+
- Keep motion in the 150ms-200ms range with standard cubic-bezier easing.
|
|
177
|
+
- Product demos may use scroll or time-based state changes, but document the interaction model in `DESIGN.md` before building.
|
|
178
|
+
- Animate transform/opacity/filter only.
|
|
179
|
+
|
|
180
|
+
### Interaction States
|
|
181
|
+
|
|
182
|
+
Every primitive must define default, hover, active, focus-visible, disabled, loading, empty, and error states before implementation. Aside-like surfaces are quiet, so missing states are obvious.
|
|
183
|
+
|
|
184
|
+
## 7. Do's and Don'ts
|
|
185
|
+
|
|
186
|
+
### Do
|
|
187
|
+
|
|
188
|
+
- Do use a bright canvas with crisp ink typography for the current Aside-inspired look.
|
|
189
|
+
- Do use a custom display face or distinctive display substitute for hero and section claims.
|
|
190
|
+
- Do preserve the product-browser frame as the memorable focal object.
|
|
191
|
+
- Do use soft squircle or pill corners intentionally by component role.
|
|
192
|
+
- Do build dense, useful product UI inside the hero visual.
|
|
193
|
+
- Do use thin black-opacity dividers to make sections feel engineered.
|
|
194
|
+
- Do keep CTA colors neutral and high contrast.
|
|
195
|
+
- Do cite live screenshots or extracted design tokens when claiming Aside fidelity.
|
|
196
|
+
|
|
197
|
+
### Don't
|
|
198
|
+
|
|
199
|
+
- Don't resurrect the older dark-only Aside reference without checking the live site.
|
|
200
|
+
- Don't copy Aside's logo, text, screenshots, or proprietary product assets.
|
|
201
|
+
- Don't replace the product-browser focal object with flat geometric decoration.
|
|
202
|
+
- Don't make the page a purple-blue gradient SaaS layout.
|
|
203
|
+
- Don't use saturated sky blue as a giant primary CTA color; if using Aside's current atmosphere, keep it pale, cloud-like, and subordinate to the product frame.
|
|
204
|
+
- Don't over-round every component equally; distinguish pills, squircles, and structural edges.
|
|
205
|
+
- Don't hide visual QA behind tests. Aside-like work needs screenshots at mobile, tablet, and desktop widths.
|
|
206
|
+
|
|
207
|
+
## Agent Prompt
|
|
208
|
+
|
|
209
|
+
When building an Aside-inspired surface, first create or update `DESIGN.md` with: bright white product-app atmosphere, display/body/mono font roles, ink/neutral token ramp, squircle/pill component rules, a product-browser focal primitive, dense capability bands, and responsive crop/scale behavior for the product frame. Use original content and assets. Verify with screenshots at 375px, 768px, and 1280px or wider, and compare against the live-reference evidence before declaring visual fidelity.
|
|
@@ -18,7 +18,7 @@ Route ownership the same way as `$lcx-report-bug`, but the deliverable differs b
|
|
|
18
18
|
|
|
19
19
|
For `openai/codex`, create a fork PR that includes:
|
|
20
20
|
|
|
21
|
-
- a focused branch from a fresh
|
|
21
|
+
- a focused branch from a fresh `${TMPDIR:-/tmp}` clone/worktree
|
|
22
22
|
- reproduction logs from before the fix
|
|
23
23
|
- the smallest implementation that fixes the defect
|
|
24
24
|
- verification logs from after the fix
|
|
@@ -30,7 +30,7 @@ For `code-yeongyu/lazycodex`, create an issue (never a PR) that includes:
|
|
|
30
30
|
|
|
31
31
|
- reproduction logs from before the fix
|
|
32
32
|
- the root cause with source evidence
|
|
33
|
-
- the verified patch as a unified diff, produced and tested in a fresh
|
|
33
|
+
- the verified patch as a unified diff, produced and tested in a fresh `${TMPDIR:-/tmp}` clone/worktree
|
|
34
34
|
- verification logs from after the fix
|
|
35
35
|
- the `lazycodex-generated` label and the footer tag `Tag: lazycodex-generated`
|
|
36
36
|
- cleanup of temporary worktrees and clones
|
|
@@ -39,27 +39,58 @@ For `code-yeongyu/lazycodex`, create an issue (never a PR) that includes:
|
|
|
39
39
|
|
|
40
40
|
1. Read the user's bug report and identify the affected surface.
|
|
41
41
|
2. Invoke `$omo:debugging` for the investigation. If only unqualified skill names are exposed, invoke `$debugging` and state that it is the OMO debugging skill.
|
|
42
|
-
3. Materialize the latest sources
|
|
42
|
+
3. Materialize the latest sources under `LAZYCODEX_SOURCE_ROOT="${LAZYCODEX_SOURCE_ROOT:-${TMPDIR:-/tmp}/lazycodex-sources}"`, then decide the target repository. Sync both checkouts on every run and compare them before choosing. Validate cached checkouts before reuse so an incomplete `.git` directory cannot route the fix to the wrong repo:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
+
LAZYCODEX_SOURCE_ROOT="${LAZYCODEX_SOURCE_ROOT:-${TMPDIR:-/tmp}/lazycodex-sources}"
|
|
46
|
+
mkdir -p "$LAZYCODEX_SOURCE_ROOT"
|
|
47
|
+
|
|
48
|
+
valid_source_checkout() {
|
|
49
|
+
DEST="$1"
|
|
50
|
+
git -C "$DEST" rev-parse --is-inside-work-tree >/dev/null 2>&1 &&
|
|
51
|
+
git -C "$DEST" config --get remote.origin.url >/dev/null 2>&1
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
recover_corrupt_source_checkout() {
|
|
55
|
+
DEST="$1"
|
|
56
|
+
if [ -e "$DEST" ] && ! valid_source_checkout "$DEST"; then
|
|
57
|
+
QUARANTINED="$DEST.corrupt.$(date +%Y%m%d%H%M%S)"
|
|
58
|
+
mv "$DEST" "$QUARANTINED"
|
|
59
|
+
echo "Moved corrupt source cache $DEST to $QUARANTINED" >&2
|
|
60
|
+
fi
|
|
61
|
+
}
|
|
62
|
+
|
|
45
63
|
sync_latest_source() {
|
|
46
64
|
REPO="$1"; DEST="$2"
|
|
47
|
-
|
|
65
|
+
recover_corrupt_source_checkout "$DEST"
|
|
66
|
+
if [ ! -d "$DEST" ]; then
|
|
48
67
|
gh repo clone "$REPO" "$DEST" -- --depth=1 \
|
|
49
68
|
|| git clone --depth=1 "https://github.com/$REPO" "$DEST"
|
|
50
69
|
fi
|
|
70
|
+
if ! valid_source_checkout "$DEST"; then
|
|
71
|
+
echo "Source cache $DEST is not a usable git checkout after clone" >&2
|
|
72
|
+
return 1
|
|
73
|
+
fi
|
|
74
|
+
git -C "$DEST" remote set-url origin "https://github.com/$REPO.git" >/dev/null 2>&1 || true
|
|
51
75
|
DEFAULT_BRANCH="$(git -C "$DEST" remote show origin | sed -n '/HEAD branch/s/.*: //p')"
|
|
76
|
+
if [ -z "$DEFAULT_BRANCH" ]; then
|
|
77
|
+
DEFAULT_BRANCH="$(git -C "$DEST" symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's#^origin/##')"
|
|
78
|
+
fi
|
|
79
|
+
if [ -z "$DEFAULT_BRANCH" ]; then
|
|
80
|
+
echo "Could not determine default branch for $REPO in $DEST" >&2
|
|
81
|
+
return 1
|
|
82
|
+
fi
|
|
52
83
|
git -C "$DEST" fetch --depth=1 origin "$DEFAULT_BRANCH"
|
|
53
84
|
git -C "$DEST" checkout -B "$DEFAULT_BRANCH" FETCH_HEAD
|
|
54
85
|
}
|
|
55
|
-
sync_latest_source code-yeongyu/lazycodex /
|
|
56
|
-
sync_latest_source openai/codex /
|
|
86
|
+
sync_latest_source code-yeongyu/lazycodex "$LAZYCODEX_SOURCE_ROOT/lazycodex-source"
|
|
87
|
+
sync_latest_source openai/codex "$LAZYCODEX_SOURCE_ROOT/openai-codex-source"
|
|
57
88
|
```
|
|
58
|
-
4. Create a fresh temporary clone and branch
|
|
89
|
+
4. Create a fresh temporary clone and branch under `${TMPDIR:-/tmp}`. Do not modify the user's current repository for the target fix unless the current repository is itself the requested target and the user explicitly asked for local edits.
|
|
59
90
|
|
|
60
91
|
```bash
|
|
61
92
|
TARGET_REPO="code-yeongyu/lazycodex" # or openai/codex
|
|
62
|
-
WORK_ROOT="$(mktemp -d
|
|
93
|
+
WORK_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/lazycodex-fix-XXXXXX")"
|
|
63
94
|
gh repo clone "$TARGET_REPO" "$WORK_ROOT/repo" -- --depth=1
|
|
64
95
|
cd "$WORK_ROOT/repo"
|
|
65
96
|
BASE_BRANCH="$(git remote show origin | sed -n '/HEAD branch/s/.*: //p')"
|
|
@@ -71,7 +102,7 @@ cd "$WORK_ROOT/worktree"
|
|
|
71
102
|
|
|
72
103
|
If `gh` cannot clone, use `git clone --depth=1 "https://github.com/$TARGET_REPO" "$WORK_ROOT/repo"` and continue with the same worktree flow.
|
|
73
104
|
|
|
74
|
-
5. Reproduce the bug in the worktree through the real surface. Save exact command output to
|
|
105
|
+
5. Reproduce the bug in the worktree through the real surface. Save exact command output to `${TMPDIR:-/tmp}/lazycodex-fix-<short-slug>-repro.log`.
|
|
75
106
|
6. Write or update a failing regression test before production changes. Confirm it fails for the bug, not for a missing fixture or typo.
|
|
76
107
|
7. Implement the smallest correct fix. Avoid refactors unless the fix cannot be made safely without one.
|
|
77
108
|
8. Run the regression test, adjacent tests, and the smallest real-surface QA command that proves the user-visible behavior changed.
|
|
@@ -89,7 +120,7 @@ git log --oneline "origin/$BASE_BRANCH..HEAD"
|
|
|
89
120
|
- `code-yeongyu/lazycodex`: export the verified patch and write the issue body from the Verified-Fix Issue Template below:
|
|
90
121
|
|
|
91
122
|
```bash
|
|
92
|
-
PATCH_FILE="
|
|
123
|
+
PATCH_FILE="${TMPDIR:-/tmp}/lazycodex-fix-<short-slug>.patch"
|
|
93
124
|
git diff "origin/$BASE_BRANCH"..HEAD > "$PATCH_FILE"
|
|
94
125
|
```
|
|
95
126
|
|
|
@@ -108,7 +139,7 @@ fi
|
|
|
108
139
|
- `code-yeongyu/lazycodex`: create the verified-fix issue. Never push a branch to this repo and never run `gh pr create` against it:
|
|
109
140
|
|
|
110
141
|
```bash
|
|
111
|
-
ISSUE_BODY="
|
|
142
|
+
ISSUE_BODY="${TMPDIR:-/tmp}/lazycodex-fix-<short-slug>-issue.md"
|
|
112
143
|
gh issue create --repo code-yeongyu/lazycodex --title "<short fix title>" "${LABEL_ARGS[@]}" --body-file "$ISSUE_BODY"
|
|
113
144
|
```
|
|
114
145
|
|
|
@@ -184,8 +215,8 @@ Use the bundled script to generate the PR body. Create a JSON file with this sha
|
|
|
184
215
|
Run:
|
|
185
216
|
|
|
186
217
|
```bash
|
|
187
|
-
PR_INPUT="
|
|
188
|
-
PR_BODY="
|
|
218
|
+
PR_INPUT="${TMPDIR:-/tmp}/lazycodex-fix-<short-slug>-pr.json"
|
|
219
|
+
PR_BODY="${TMPDIR:-/tmp}/lazycodex-fix-<short-slug>-pr.md"
|
|
189
220
|
node "<skill-root>/scripts/create-pr-body.mjs" "$PR_INPUT" "$PR_BODY"
|
|
190
221
|
```
|
|
191
222
|
|
|
@@ -9,4 +9,4 @@ interface:
|
|
|
9
9
|
- "lazycodex fix"
|
|
10
10
|
- "omo-codex bug fix"
|
|
11
11
|
- "codex bug fix pr"
|
|
12
|
-
default_prompt: "Use $lcx-contribute-bug-fix to debug this LazyCodex or Codex bug, work from a fresh
|
|
12
|
+
default_prompt: "Use $lcx-contribute-bug-fix to debug this LazyCodex or Codex bug, work from a fresh ${TMPDIR:-/tmp} clone and worktree, implement the smallest verified fix, apply the lazycodex-generated label, deliver it (verified-fix issue on code-yeongyu/lazycodex — never a PR there; fork PR only for openai/codex), and clean up."
|
|
@@ -7,40 +7,73 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# lcx-doctor
|
|
9
9
|
|
|
10
|
-
You are a LazyCodex install doctor. Inspect the local installation, compare it against the latest LazyCodex and Codex sources, and return a PASS/WARN/FAIL report where every verdict cites the command output or file that produced it. Diagnose only: the only writes you make are under
|
|
10
|
+
You are a LazyCodex install doctor. Inspect the local installation, compare it against the latest LazyCodex and Codex sources, and return a PASS/WARN/FAIL report where every verdict cites the command output or file that produced it. Diagnose only: the only writes you make are under `LAZYCODEX_SOURCE_ROOT` or `${TMPDIR:-/tmp}/lazycodex-sources`. Never mutate the user's install, config, or repositories during diagnosis; propose remediations and apply one only when the user explicitly asks afterward.
|
|
11
11
|
|
|
12
12
|
Use GPT-5.5 style: outcome first, concise, evidence-bound.
|
|
13
13
|
|
|
14
14
|
## Required Workflow
|
|
15
15
|
|
|
16
|
-
1. Materialize the latest sources under
|
|
16
|
+
1. Materialize the latest sources under `LAZYCODEX_SOURCE_ROOT="${LAZYCODEX_SOURCE_ROOT:-${TMPDIR:-/tmp}/lazycodex-sources}"` first. Every source comparison below reads from these checkouts, never from memory. Re-sync on every run so a cached checkout cannot go stale, and validate cached checkouts before reuse so an incomplete `.git` directory cannot poison diagnosis:
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
+
LAZYCODEX_SOURCE_ROOT="${LAZYCODEX_SOURCE_ROOT:-${TMPDIR:-/tmp}/lazycodex-sources}"
|
|
20
|
+
mkdir -p "$LAZYCODEX_SOURCE_ROOT"
|
|
21
|
+
|
|
22
|
+
valid_source_checkout() {
|
|
23
|
+
DEST="$1"
|
|
24
|
+
git -C "$DEST" rev-parse --is-inside-work-tree >/dev/null 2>&1 &&
|
|
25
|
+
git -C "$DEST" config --get remote.origin.url >/dev/null 2>&1
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
recover_corrupt_source_checkout() {
|
|
29
|
+
DEST="$1"
|
|
30
|
+
if [ -e "$DEST" ] && ! valid_source_checkout "$DEST"; then
|
|
31
|
+
QUARANTINED="$DEST.corrupt.$(date +%Y%m%d%H%M%S)"
|
|
32
|
+
mv "$DEST" "$QUARANTINED"
|
|
33
|
+
echo "Moved corrupt source cache $DEST to $QUARANTINED" >&2
|
|
34
|
+
fi
|
|
35
|
+
}
|
|
36
|
+
|
|
19
37
|
sync_latest_source() {
|
|
20
38
|
REPO="$1"; DEST="$2"
|
|
21
|
-
|
|
39
|
+
recover_corrupt_source_checkout "$DEST"
|
|
40
|
+
if [ ! -d "$DEST" ]; then
|
|
22
41
|
gh repo clone "$REPO" "$DEST" -- --depth=1 \
|
|
23
42
|
|| git clone --depth=1 "https://github.com/$REPO" "$DEST"
|
|
24
43
|
fi
|
|
44
|
+
if ! valid_source_checkout "$DEST"; then
|
|
45
|
+
echo "Source cache $DEST is not a usable git checkout after clone" >&2
|
|
46
|
+
return 1
|
|
47
|
+
fi
|
|
48
|
+
git -C "$DEST" remote set-url origin "https://github.com/$REPO.git" >/dev/null 2>&1 || true
|
|
25
49
|
DEFAULT_BRANCH="$(git -C "$DEST" remote show origin | sed -n '/HEAD branch/s/.*: //p')"
|
|
50
|
+
if [ -z "$DEFAULT_BRANCH" ]; then
|
|
51
|
+
DEFAULT_BRANCH="$(git -C "$DEST" symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's#^origin/##')"
|
|
52
|
+
fi
|
|
53
|
+
if [ -z "$DEFAULT_BRANCH" ]; then
|
|
54
|
+
echo "Could not determine default branch for $REPO in $DEST" >&2
|
|
55
|
+
return 1
|
|
56
|
+
fi
|
|
26
57
|
git -C "$DEST" fetch --depth=1 origin "$DEFAULT_BRANCH"
|
|
27
58
|
git -C "$DEST" checkout -B "$DEFAULT_BRANCH" FETCH_HEAD
|
|
28
59
|
}
|
|
29
|
-
sync_latest_source code-yeongyu/lazycodex /
|
|
30
|
-
sync_latest_source openai/codex /
|
|
60
|
+
sync_latest_source code-yeongyu/lazycodex "$LAZYCODEX_SOURCE_ROOT/lazycodex-source"
|
|
61
|
+
sync_latest_source openai/codex "$LAZYCODEX_SOURCE_ROOT/openai-codex-source"
|
|
31
62
|
```
|
|
32
63
|
|
|
33
64
|
2. Inventory the installed surface. Resolve `CODEX_HOME` (default `~/.codex`), then collect:
|
|
34
65
|
- `codex --version` and how `codex` resolves (`command -v codex`).
|
|
35
66
|
- Installed LazyCodex version: the `version` in the installed plugin manifest, discoverable with `find "${CODEX_HOME:-$HOME/.codex}/plugins" -path '*/.codex-plugin/plugin.json'`. Installed plugins live under `$CODEX_HOME/plugins/cache/<marketplace>/<name>/<version>/`.
|
|
36
|
-
- Latest LazyCodex version from
|
|
67
|
+
- Latest LazyCodex version from `$LAZYCODEX_SOURCE_ROOT/lazycodex-source` (release tags or the version stamped in the repo) and latest Codex release (`gh release view --repo openai/codex`).
|
|
37
68
|
- OS, install method, and `lazycodex` / `lazycodex-ai` bin links resolving (`command -v`).
|
|
38
|
-
3. Check config and wiring against the latest installer, not against assumptions. Read what the current installer under
|
|
69
|
+
3. Check config and wiring against the latest installer, not against assumptions. Read what the current installer under `$LAZYCODEX_SOURCE_ROOT/lazycodex-source` writes (installer sources live in the omo-codex package, e.g. `scripts/install/`), then verify the local equivalents:
|
|
39
70
|
- `$CODEX_HOME/config.toml` exists and parses; LazyCodex-managed entries match what the latest installer would write.
|
|
40
|
-
- Plugin payload present and non-empty: `hooks/hooks.json
|
|
71
|
+
- Plugin payload present and non-empty: read `.codex-plugin/plugin.json`; when that manifest declares a `hooks` array, validate every direct hook path declared by the manifest; require `hooks/hooks.json` only when the manifest declares it; do not require retired paths such as `components/workflow-selector` or `hooks/user-prompt-submit-selecting-lazycodex-workflow.json` unless the current manifest declares them.
|
|
72
|
+
- Verify the manifest-declared runtime payload, not a remembered source tree. Current payload includes `skills/`, `.mcp.json`, root CLI runtimes such as `dist/cli/index.js` and `dist/cli-node/index.js`, and every hook/MCP `components/*/dist/*.js` target referenced by installed manifests.
|
|
73
|
+
- Treat install-time materialization rewrites as expected when the rewritten target exists and is non-empty. For example, `.mcp.json` may use plugin-local or absolute installed paths for CodeGraph/MCP runtimes; that is PASS/WARN context, not payload drift. Missing or zero-byte rewritten targets are FAIL.
|
|
41
74
|
- Stale project-local leftovers the installer now removes (e.g. `.codex/hooks.json`, `.codex/skills` in the project) are flagged, not deleted.
|
|
42
|
-
4. Probe the real surface. Do not invoke `lazycodex doctor`; this skill is already running inside that doctor workflow, so calling it would recurse. Instead run non-recursive probes directly: `codex --version`, `command -v codex`, the bin-link checks above, config/plugin payload inspections, and a trivial non-interactive Codex invocation that loads the plugin. Capture stderr verbatim; a clean exit with warnings is WARN, not PASS.
|
|
43
|
-
5. Compare for drift. Where installed bundled files differ from the same files at the installed version, or the latest source
|
|
75
|
+
4. Probe the real surface. Do not invoke `lazycodex doctor`; this skill is already running inside that doctor workflow, so calling it would recurse. Instead run non-recursive probes directly: `codex --version`, `command -v codex`, the bin-link checks above, config/plugin payload inspections, and a trivial non-interactive Codex invocation that loads the plugin. Use the configured Codex default model for the runtime probe unless the user explicitly passed a model override to the doctor surface; never force a guessed/rejected model such as `gpt-5.5-codex-mini`. Capture stderr verbatim; a clean exit with warnings is WARN, not PASS.
|
|
76
|
+
5. Compare for drift. Where installed manifest-declared bundled files differ from the same files at the installed version, or the latest source removed or renamed something the local config still references, record it with both paths. Do not report expected materialization differences, such as absolute `.mcp.json` runtime paths, as drift when their targets exist and are non-empty.
|
|
44
77
|
6. Check whether each FAIL is already known: `gh issue list --repo code-yeongyu/lazycodex --search "<short symptom>" --state open` (and `openai/codex` when the failure points upstream). Link matches in the report instead of re-diagnosing from scratch.
|
|
45
78
|
7. If a probe fails and the cause is not explained by config or source comparison, invoke `$omo:debugging` for the investigation. If Codex exposes only unqualified skill names in the current session, invoke `$debugging` and state that it is the OMO debugging skill.
|
|
46
79
|
8. Emit the report.
|
|
@@ -67,7 +100,7 @@ sync_latest_source openai/codex /tmp/openai-codex-source
|
|
|
67
100
|
| Plugin payload wiring | PASS/WARN/FAIL | [evidence] |
|
|
68
101
|
| Bin links / aliases | PASS/WARN/FAIL | [evidence] |
|
|
69
102
|
| Runtime probe | PASS/WARN/FAIL | [evidence] |
|
|
70
|
-
| Drift vs latest source | PASS/WARN/FAIL | [evidence, citing /
|
|
103
|
+
| Drift vs latest source | PASS/WARN/FAIL | [evidence, citing `$LAZYCODEX_SOURCE_ROOT/lazycodex-source` or `$LAZYCODEX_SOURCE_ROOT/openai-codex-source` paths] |
|
|
71
104
|
|
|
72
105
|
### Remediations
|
|
73
106
|
1. [Most important fix first: exact command or config edit, and what it resolves.]
|
|
@@ -79,7 +112,7 @@ sync_latest_source openai/codex /tmp/openai-codex-source
|
|
|
79
112
|
## Follow-up Routing
|
|
80
113
|
|
|
81
114
|
- Local misconfiguration or stale install: give the remediation; reinstalling via the standard LazyCodex install command is the default fix for payload drift.
|
|
82
|
-
- Defect in LazyCodex or Codex product code: recommend `$lcx-report-bug` to file it, or `$lcx-contribute-bug-fix` when the user wants a fix PR. Both reuse the
|
|
115
|
+
- Defect in LazyCodex or Codex product code: recommend `$lcx-report-bug` to file it, or `$lcx-contribute-bug-fix` when the user wants a fix PR. Both reuse the source-root checkouts you already synced.
|
|
83
116
|
|
|
84
117
|
## Stop Conditions
|
|
85
118
|
|
|
@@ -89,5 +122,7 @@ Do not:
|
|
|
89
122
|
|
|
90
123
|
- mutate config, installs, or repositories during diagnosis
|
|
91
124
|
- report a verdict without captured evidence
|
|
92
|
-
- compare against remembered source layout instead of
|
|
125
|
+
- compare against remembered source layout instead of `$LAZYCODEX_SOURCE_ROOT/lazycodex-source` and `$LAZYCODEX_SOURCE_ROOT/openai-codex-source`
|
|
126
|
+
- require retired payload paths that the current `.codex-plugin/plugin.json` does not declare
|
|
127
|
+
- force a runtime-probe model unless the user explicitly passed one
|
|
93
128
|
- declare healthy while any probe output was never captured
|
|
@@ -8,4 +8,4 @@ interface:
|
|
|
8
8
|
- "codex doctor"
|
|
9
9
|
- "lazycodex install broken"
|
|
10
10
|
- "omo-codex diagnose"
|
|
11
|
-
default_prompt: "Use $lcx-doctor to sync the latest LazyCodex and Codex sources
|
|
11
|
+
default_prompt: "Use $lcx-doctor to sync the latest LazyCodex and Codex sources under LAZYCODEX_SOURCE_ROOT or ${TMPDIR:-/tmp}/lazycodex-sources, inventory the local installation, compare versions, config, and wiring against the latest sources, probe the real surface, and report PASS/WARN/FAIL findings with evidence and remediations."
|