oh-my-opencode 4.17.1 → 4.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.agents/skills/codex-qa/SKILL.md +2 -0
  2. package/dist/cli/get-local-version/types.d.ts +1 -1
  3. package/dist/cli/index.js +55 -25
  4. package/dist/cli-node/index.js +55 -25
  5. package/dist/index.js +23 -17
  6. package/dist/skills/frontend/SKILL.md +1 -1
  7. package/dist/skills/frontend/references/design/README.md +9 -0
  8. package/dist/skills/frontend/references/design/design-system-architecture.md +4 -2
  9. package/dist/skills/frontend/references/design/layout-skill.md +107 -0
  10. package/dist/skills/programming/SKILL.md +12 -2
  11. package/package.json +14 -13
  12. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  13. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +7 -5
  25. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  26. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  28. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/ultrawork/directive.md +37 -10
  34. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +37 -10
  37. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +37 -10
  38. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  39. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
  41. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +4 -4
  42. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  65. package/packages/omo-codex/plugin/package-lock.json +13 -13
  66. package/packages/omo-codex/plugin/package.json +1 -1
  67. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  68. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +9 -0
  69. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +4 -2
  70. package/packages/omo-codex/plugin/skills/frontend/references/design/layout-skill.md +107 -0
  71. package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -2
  72. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +37 -10
  73. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  74. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +4 -4
  75. package/packages/omo-codex/scripts/install-dist/install-local.mjs +24 -12
  76. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  77. package/packages/shared-skills/skills/frontend/references/design/README.md +9 -0
  78. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +4 -2
  79. package/packages/shared-skills/skills/frontend/references/design/layout-skill.md +107 -0
  80. package/packages/shared-skills/skills/programming/SKILL.md +12 -2
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: layout-skill
3
+ description: "Layer A layout-mechanics reference. Stacks on any style skill when the screen is an app shell, dashboard, settings, list-detail, mail/inbox, or any layout with fixed regions plus a scrolling body — or when a layout breaks under long, empty, or unbroken content. Owns spatial structure and scroll ownership; owns zero visual taste. Load it alongside a style skill; it does not replace one."
4
+ ---
5
+
6
+ # Layout Mechanics
7
+
8
+ Style skills decide how a surface looks. This file decides how it is *built to hold content* — what scrolls, what stays fixed, how regions shrink, and which layouts survive real data. It stacks on top of any Layer A style skill (`taste-skill`, `minimalist-skill`, `soft-skill`, `brutalist-skill`, `gpt-tasteskill`) and any Layer B brand. It adds ZERO visual direction — color, type, shadow, radius, and motion still come from the style skill and `DESIGN.md`.
9
+
10
+ Load this when the screen is an **application shell**, not a scroll-the-whole-document marketing page: dashboards, settings, list-detail, mail/inbox, command surfaces, split panes, sidebars — or when a page that looked fine breaks the moment content gets long, empty, or unbroken.
11
+
12
+ ## 1. Scroll ownership — decide this BEFORE writing layout CSS
13
+
14
+ The single most common agent-built layout bug is an app shell where the wrong thing scrolls: the whole page scrolls when only a panel should, two panels fight over the scrollbar, or a "fixed" header scrolls away. Prevent it by naming ownership up front, in `DESIGN.md` and in the component:
15
+
16
+ - **What scrolls?** Name the ONE element that owns vertical scroll for this region.
17
+ - **What stays fixed?** Header, sidebar, footer, toolbar — list them.
18
+ - **Where is height determined?** The scroll container needs a bounded height ancestor, or it will grow instead of scroll.
19
+
20
+ Rules:
21
+
22
+ - **One scroll container per region unless each extra one has a named job.** Nested scrollbars with no declared responsibility are a defect — the user loses track of what a wheel/trackpad gesture will move.
23
+ - Full-height shells are bounded by `100dvh`/`100dvb` (dynamic viewport units), never `100vh` — `vh` causes the iOS Safari address-bar jump.
24
+ - A sticky element (`position: sticky`) follows document scroll; a fixed shell region (grid row/column with `overflow: auto` body) owns its own scroll. Do not mix the two models in one region without reason.
25
+
26
+ ## 2. The two CSS contracts agents get wrong
27
+
28
+ These two are worth memorizing verbatim. They fail *silently* — the layout looks right until content arrives.
29
+
30
+ **Bounded scroll shell** (fixed header/footer, scrolling body):
31
+
32
+ ```css
33
+ .shell {
34
+ display: grid;
35
+ grid-template-rows: auto minmax(0, 1fr) auto; /* header / body / footer */
36
+ max-block-size: 100dvb;
37
+ }
38
+ .shell__body {
39
+ min-block-size: 0; /* WITHOUT THIS the grid child refuses to shrink and overflow never fires */
40
+ overflow: auto;
41
+ }
42
+ ```
43
+
44
+ The `min-block-size: 0` (or `min-height: 0`) on the scroll child is the fix for "why won't my panel scroll — it just pushes the footer off-screen." A grid/flex child's default `min-*-size: auto` refuses to shrink below its content. The same applies to a flex column: the scrollable child needs `min-height: 0`.
45
+
46
+ **Overflow-safe intrinsic grid** (repeat as many columns as fit, no media queries):
47
+
48
+ ```css
49
+ .grid {
50
+ display: grid;
51
+ gap: var(--gap);
52
+ grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
53
+ }
54
+ ```
55
+
56
+ The inner `min(16rem, 100%)` is load-bearing: plain `minmax(16rem, 1fr)` forces a 16rem track even when the container is 12rem wide, causing horizontal overflow on narrow screens. `min(…, 100%)` lets the track collapse below its floor when space is genuinely tight. Use `auto-fit` to stretch the last row, `auto-fill` to keep empty tracks.
57
+
58
+ ## 3. Named layout primitives (shared vocabulary)
59
+
60
+ Build shells from these named primitives instead of ad-hoc fl/grid. Naming them makes `DESIGN.md` Section 5 and subagent handoffs precise ("wrap it in a `sidebar` with a 20rem aside" beats "put it on the left, roughly"). Lineage: Every Layout + web.dev one-line layouts.
61
+
62
+ | Primitive | Spatial job | Core mechanic |
63
+ |---|---|---|
64
+ | **stack** | Vertical rhythm between siblings | flex column + `gap`, or `> * + *` margin |
65
+ | **cluster** | Wrapping row of items (tags, actions) | `flex-wrap: wrap` + `gap`; wraps before overflow |
66
+ | **content-limiter** | Readable prose measure inside a fluid parent | `max-inline-size: ~65ch; margin-inline: auto` |
67
+ | **sidebar** | Narrow aside + fluid main, wraps when tight | flex; aside fixed basis, main `min-inline-size` floor, both `flex-wrap` |
68
+ | **switcher** | N equal regions: row when roomy, stack when tight, NO breakpoint | flex + `min()` basis so it flips at a content threshold |
69
+ | **cover** | Centered region between optional header/footer, min viewport tall | grid rows `auto 1fr auto`, `min-block-size: 100dvb` |
70
+ | **frame** | Media held to an aspect ratio | `aspect-ratio` + `object-fit: cover` |
71
+ | **reel** | Row that scrolls horizontally instead of wrapping | `overflow-inline: auto` + `scroll-snap`; declare keyboard access |
72
+ | **imposter** | Overlay centered over a parent without changing document order | `position: absolute` + translate; do not use to reorder focus |
73
+ | **overlay-stack** | Several layers intentionally in one cell | single grid cell, all children `grid-area: 1/1` |
74
+ | **scroll-body-shell** | Fixed shell regions, only the body scrolls | §2 bounded scroll shell |
75
+ | **fixed-sidenav-shell** | Side nav stays put, main scrolls | grid columns `auto 1fr`, main is the scroll owner |
76
+ | **list-detail** | Explorable list beside its detail region | two-column grid, each pane's scroll ownership named |
77
+ | **sticky-aside** | Support content stays visible during a long read | `position: sticky; top:` on the aside, document scroll |
78
+
79
+ ## 4. Container-local vs viewport-level responsiveness
80
+
81
+ Ask **what the layout is responding to** before reaching for a breakpoint:
82
+
83
+ - The component should adapt to *its own available width* (a card that's wide in main but narrow in a rail) → wrap it in `container-type: inline-size` and use `@container`. This is correct far more often than agents assume, because a component rarely knows the viewport it lands in.
84
+ - The *page frame itself* changes (sidebar collapses, columns drop) → `@media`.
85
+
86
+ Prefer intrinsic adaptation (`switcher`, `sidebar`, intrinsic grid, `clamp()`) over any query — the best breakpoint is often none. Use breakpoint *names* for layout states, never device names (`--bp-wide`, not `--bp-ipad`).
87
+
88
+ ## 5. Recipes are spatial models, not product categories
89
+
90
+ Choose a layout by the screen's spatial shape, not its product label. A settings page and a docs app both want `fixed-sidenav-shell`; a support inbox and a file browser both want `list-detail`; a metrics view and a photo gallery both want an intrinsic grid. Do not invent a bespoke "dashboard layout" when `page-grid + intrinsic grid + cluster` already covers it — and do not force marketing-page structure (hero, zigzag, bento) onto a task app.
91
+
92
+ ## 6. Content stress — the layout is not done until it survives this
93
+
94
+ Landing pages fail on taste; app shells fail on *content*. Before declaring any layout done, stress every region against:
95
+
96
+ - **Empty** — no rows, no avatar, no value. Does the region collapse gracefully or leave a broken frame?
97
+ - **Long label** — a 40-char name in a 12-char slot. Truncate (`text-overflow: ellipsis`) or wrap by design, never by accident.
98
+ - **Long paragraph** — does the measure stay readable, or does text run 200 chars wide?
99
+ - **Unbroken string** — a URL or token with no spaces. Needs `overflow-wrap: anywhere` / `min-inline-size: 0`, or it forces horizontal scroll.
100
+ - **Reflow** — at 375px width the layout reflows to a single readable column with NO horizontal scrollbar. Two-dimensional scrolling of primary content is a fail.
101
+ - **Direction** — if the app supports RTL, the layout uses logical properties (`margin-inline`, `inset-inline-start`) so it mirrors correctly.
102
+
103
+ A layout that only holds the happy-path mock is not finished. Drive these states in `/visual-qa` alongside the interaction states the style skill requires.
104
+
105
+ ## Boundary
106
+
107
+ This file owns spatial structure only. It never sets color, typography, shadow, radius, or motion values — those trace to `DESIGN.md` and the loaded style skill. If you find yourself adding a brand color to a layout primitive, stop: the primitive stays layout-only and the styling wraps or composes around it.
@@ -104,9 +104,17 @@ Mocks are a last resort, not a default. The priority order:
104
104
  - **Deterministic**: no `sleep`, no wall-clock dependence, no order dependence (`-shuffle=on`, pytest-randomly, vitest random seed). Inject a `Clock`. Subscribe to the event, do not poll for it. Time-based flake is a bug, not a test issue.
105
105
  - **Isolated**: every test starts from a known fixture and tears down. `t.TempDir()`, `t.Setenv()`, transactional rollback for DB tests. Two tests passing individually but failing together is a fixture leak — fix it immediately.
106
106
 
107
- ### Prompt tests follow the same rule
107
+ ### Prompt tests: NEVER assert prose
108
108
 
109
- When tests cover LLM prompts or agent outputs, assert on **parsed structure, decisions, or rule data**, never on exact prompt strings. Pinning a sentence is brittle pretend-coverage; asserting that the prompt instructs the model to refuse on category X is real coverage.
109
+ **FORBIDDEN NO EXCEPTIONS: a test MUST NOT assert natural-language prompt text.** `expect(prompt).toContain("based on GPT-5.6")`, `not.toContain("old wording")`, `toMatchSnapshot()` on prose, grepping a sentence fragment — every one of these is pretend-coverage. It stays green while the behavior it claims to guard breaks, then blocks every legitimate rewording until someone bumps the pinned string. A reviewer MUST block it as HIGH; deleting such a test is a fix, not a coverage loss. "A nearby test already does it" is not a defense — that test is the disease, not the convention.
110
+
111
+ Assert ONLY what a machine consumes:
112
+
113
+ - the builder's routing decision — `expect(getPromptSource(model)).toBe("gpt-5-6")`, never the sentence that routing produces
114
+ - a structural token the runtime dispatches on — a tool name, a tag like `<agent-identity>`, a parsed frontmatter field
115
+ - the conditional the code enforces — skill loaded → tool present; `verbose=false` → directive absent
116
+
117
+ If no machine consumes the text, there is no seam: write NO test and say so in the PR; review guards prose. When you DELEGATE test-writing, hand the child the behavior the test must distinguish ("fails if override precedence breaks"), never a ready-made assertion string, prompt fragment, or marker to copy — a prescribed mechanism that is wrong gets implemented faithfully, and the error ships with a green suite.
110
118
 
111
119
  ### Anti-patterns the skill rejects
112
120
 
@@ -119,6 +127,8 @@ When tests cover LLM prompts or agent outputs, assert on **parsed structure, dec
119
127
  | Snapshot tests for everything | Locks formatting, not behavior. | Snapshots for *structure* (CLI help, JSON shape). Assertions for *behavior*. |
120
128
  | Removing a failing test to "unblock CI" | You just deleted a bug report. | Fix the code or fix the test — never delete to silence. |
121
129
  | `assert result is not None` and stopping there | Passes when result is garbage. | Assert the *value*, not its existence. |
130
+ | Expected value derived from the output under test (`expect(config.prompt).toBe(getPrompt(config.model))` when the criterion is about `config.prompt`) | Recomputes a projection of the output and compares it to itself — passes even when the artifact is built from the wrong input. | Derive the expected value from the test's *input*: `expect(config.prompt).toBe(getPrompt(inputModel))` (independent known-good builder fed the fixture's input), or a stable builder routing decision. |
131
+ | Override/precedence fixture equal to its fallback (override == system default) | The assertion passes whether or not the code honored the override — precedence is never exercised. | Make every value the code must select, preserve, or override differ from its fallback. Prove it: temporarily force the regression the test names, watch it fail, revert. |
122
132
  | Single happy-path E2E, no edges | Most bugs live on edges. | Edges are unit-test territory — but include at least one E2E that exercises an error path. |
123
133
 
124
134
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -107,6 +107,7 @@
107
107
  "build": "bun run script/build.ts",
108
108
  "build:cli-node": "bun run script/build-cli-node.ts",
109
109
  "build:codex-install": "bun run script/build-codex-install.ts",
110
+ "install:codex-dev": "bun run script/build-codex-install.ts && bun run script/install-codex-dev.ts",
110
111
  "build:codex-plugin": "npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build",
111
112
  "build:senpi-plugin": "node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check",
112
113
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
@@ -211,18 +212,18 @@
211
212
  "typescript": "^6.0.3"
212
213
  },
213
214
  "optionalDependencies": {
214
- "oh-my-opencode-darwin-arm64": "4.17.1",
215
- "oh-my-opencode-darwin-x64": "4.17.1",
216
- "oh-my-opencode-darwin-x64-baseline": "4.17.1",
217
- "oh-my-opencode-linux-arm64": "4.17.1",
218
- "oh-my-opencode-linux-arm64-musl": "4.17.1",
219
- "oh-my-opencode-linux-x64": "4.17.1",
220
- "oh-my-opencode-linux-x64-baseline": "4.17.1",
221
- "oh-my-opencode-linux-x64-musl": "4.17.1",
222
- "oh-my-opencode-linux-x64-musl-baseline": "4.17.1",
223
- "oh-my-opencode-windows-arm64": "4.17.1",
224
- "oh-my-opencode-windows-x64": "4.17.1",
225
- "oh-my-opencode-windows-x64-baseline": "4.17.1"
215
+ "oh-my-opencode-darwin-arm64": "4.18.0",
216
+ "oh-my-opencode-darwin-x64": "4.18.0",
217
+ "oh-my-opencode-darwin-x64-baseline": "4.18.0",
218
+ "oh-my-opencode-linux-arm64": "4.18.0",
219
+ "oh-my-opencode-linux-arm64-musl": "4.18.0",
220
+ "oh-my-opencode-linux-x64": "4.18.0",
221
+ "oh-my-opencode-linux-x64-baseline": "4.18.0",
222
+ "oh-my-opencode-linux-x64-musl": "4.18.0",
223
+ "oh-my-opencode-linux-x64-musl-baseline": "4.18.0",
224
+ "oh-my-opencode-windows-arm64": "4.18.0",
225
+ "oh-my-opencode-windows-x64": "4.18.0",
226
+ "oh-my-opencode-windows-x64-baseline": "4.18.0"
226
227
  },
227
228
  "overrides": {
228
229
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.17.1) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 4.18.0) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-codegraph",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.17.1) Checking Comments"
11
+ "statusMessage": "(OmO 4.18.0) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 4.17.1) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 4.18.0) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 4.17.1) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 4.18.0) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 4.17.1) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 4.18.0) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 4.17.1) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 4.18.0) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 4.17.1) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 4.18.0) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -9,7 +9,7 @@ You are Hephaestus, an autonomous deep worker based on GPT-5.6. You and the user
9
9
 
10
10
  User instructions override these defaults; newer instructions override older. Safety and type-safety constraints never yield.
11
11
 
12
- Implement, don't propose. "How does X work?" means understand, then fix; "Why is A broken?" means diagnose, then fix; a message is answer-only when the user says so ("just explain", "don't change anything"). State your read in one line before acting: "I detect [intent type] - [reason]. [What I'm doing now]." That line commits you to finish the named work this turn.
12
+ Implement, don't propose. "How does X work?" means understand, then fix; "Why is A broken?" means diagnose, then fix; a message is answer-only when the user says so ("just explain", "don't change anything"). State your read in one line before acting: "I detect [intent type] - [reason]. [What I'm doing now]. I'll stop right away when [the exact, observable condition that ends this turn]." That line commits you to finish the named work this turn, and the stop condition you declared is BINDING - the instant it is met, stop (see Stop Goal).
13
13
 
14
14
  Requests to answer, review, diagnose, or plan: inspect and report. Requests to change, build, or fix: implement and run non-destructive validation without asking. Confirm only destructive actions, external writes, or material scope expansion; resolve other blockers from context and reasonable assumptions.
15
15
 
@@ -29,13 +29,15 @@ Implement surgically, matching codebase style (naming, indentation, imports, err
29
29
 
30
30
  # Subagents
31
31
 
32
- Read-only Codex subagent roles live in `CODEX_HOME/agents/`. Spawn: `multi_agent_v1.spawn_agent({"message":"TASK: act as a <role>. ...","fork_context":false})`. If your tool list instead has a flat `spawn_agent` with a required `task_name` (`multi_agent_v2`): `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":"TASK: act as a <role>. ...","fork_turns":"none"})` - finished agents end on their own; `wait_agent` takes only `timeout_ms`.
32
+ Read-only Codex subagent roles live in `CODEX_HOME/agents/`. Spawn: `multi_agent_v1.spawn_agent({"message":"TASK: act as a <role>. GOAL: ... STOP WHEN: ... EVIDENCE: ...","fork_context":false})`. If your tool list instead has a flat `spawn_agent` with a required `task_name` (`multi_agent_v2`): `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":"TASK: act as a <role>. GOAL: ... STOP WHEN: ... EVIDENCE: ...","fork_turns":"none"})` - finished agents end on their own; `wait_agent` takes only `timeout_ms`.
33
33
 
34
34
  - `explorer` - codebase search
35
35
  - `librarian` - external docs, OSS code, API contracts
36
36
  - `plan` - planning when design is still open after discovery; never for a known checklist or for work being delegated onward
37
37
  - `lazycodex-gate-reviewer` - final verification of a finished change
38
38
 
39
+ Every spawn message MUST fill all three labels - **GOAL** (the one outcome that makes the child done), **STOP WHEN** (the exact, observable condition that ends its run; the child stops the moment it holds, exactly like your own intent line), **EVIDENCE** (what the child returns so you can SEE, not trust, that the condition held). A spawn missing any label is a defect: the child wanders past its goal, overworks, or reports "done" you cannot verify. Judge a child by its returned EVIDENCE against its STOP WHEN, never by its self-report. Fill the labels with outcomes and binding constraints, never mechanisms: name the behavior the child's work must achieve or distinguish, not a copy-ready assertion string, prompt fragment, expected pass/assert count, or "marker used by current tests" — a prescribed mechanism that is wrong gets implemented faithfully and the defect ships behind a green suite.
40
+
39
41
  Spawn in parallel for independent investigations; do non-overlapping prep while they run, integrate on return. Never duplicate a running search or poll without a completion signal; post brief status updates while children run (active subagent count, latest `WORKING:` phase).
40
42
 
41
43
  # Manual QA Gate
@@ -68,16 +70,16 @@ On a multi-step task, open with one or two visible sentences naming the first st
68
70
 
69
71
  Final message: lead with the result, group by outcome, no conversational openers. Keep all required facts, decisions, caveats, and next steps; trim introductions, repetition, and generic reassurance first. For review requests, findings come first, ordered by severity with file references; if none, say so and name residual risks. No emojis or em dashes unless requested. Never output broken inline citations like `【F:README.md†L5-L14】` - they break the CLI.
70
72
 
71
- # Success Criteria and Stop Rules
73
+ # Stop Goal
72
74
 
73
- Done when ALL of:
75
+ Your STOP GOAL — the turn is over the moment ALL of these hold:
74
76
 
75
77
  - Every requested behavior implemented - no partial delivery.
76
78
  - Diagnostics clean on changed files; build exits 0; tests pass or pre-existing failures are named.
77
79
  - The artifact passed the Manual QA Gate this turn.
78
80
  - The final message reports what you did, verified, could not verify (and why), and pre-existing issues left alone.
79
81
 
80
- When you think you are done: re-read the request and your intent line, re-run verification, then report. Until all are true, keep going - through failed tool calls, long turns, and the urge to hand back a draft.
82
+ Until the stop goal holds, keep going - through failed tool calls, long turns, and the urge to hand back a draft. The moment it holds: re-read the request and your intent line once, confirm each item against evidence already captured, confirm the stop condition you declared in your intent line is met, deliver the final message, and STOP. STOPPING IS MANDATORY AND IMMEDIATE - not a judgment call, not an invitation for one more check. No extra validation loop, no re-polish, no bonus refactor, no drive-by cleanup. Every action past the stop goal is a defect, not diligence.
81
83
 
82
84
  Hard invariants, regardless of pressure to ship:
83
85
 
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.17.1) Loading Project Rules"
10
+ "statusMessage": "(OmO 4.18.0) Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 4.17.1) Loading Project Rules"
22
+ "statusMessage": "(OmO 4.18.0) Loading Project Rules"
23
23
  }
24
24
  ]
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "type": "command",
33
33
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
34
34
  "timeout": 10,
35
- "statusMessage": "(OmO 4.17.1) Matching Project Rules"
35
+ "statusMessage": "(OmO 4.18.0) Matching Project Rules"
36
36
  }
37
37
  ]
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "type": "command",
46
46
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
47
47
  "timeout": 10,
48
- "statusMessage": "(OmO 4.17.1) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 4.18.0) Resetting Project Rule Cache"
49
49
  }
50
50
  ]
51
51
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.17.1) Checking Start-Work Continuation"
10
+ "statusMessage": "(OmO 4.18.0) Checking Start-Work Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 4.17.1) Checking Start-Work Continuation"
22
+ "statusMessage": "(OmO 4.18.0) Checking Start-Work Continuation"
23
23
  }
24
24
  ]
25
25
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-start-work-continuation",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex start-work plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 4.17.1) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 4.18.0) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 4.17.1) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 4.18.0) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -121,9 +121,13 @@ are delegating never justify a planner: plan directly in the notepad.
121
121
  Never spawn `plan` before the discovery wave has returned.
122
122
 
123
123
  ## 1. Create the goal with binding success criteria
124
- Call `create_goal` (or open your reply with a `# Goal` block treated as
125
- binding) using exactly `objective`. Do not include `status`. Goals are
126
- unlimited; never invent a numeric budget or limit.
124
+ You MUST register the goal with the `create_goal` tool NOT prose,
125
+ NOT the notepad, NOT the plan: the registered goal is the binding
126
+ contract for the whole run, and skipping it is a defect. Call it with
127
+ exactly `objective`; do not include `status`. Only when no goal tool
128
+ exists on this surface, open your reply with a `# Goal` block treated
129
+ as binding. Goals are unlimited; never invent a numeric budget or
130
+ limit.
127
131
  The criteria MUST list, upfront:
128
132
  - The user-visible deliverable in one line, and the tier with its
129
133
  justification.
@@ -136,6 +140,9 @@ The criteria MUST list, upfront:
136
140
  - For each criterion, the failing-first proof (test id or scenario)
137
141
  that will be captured RED BEFORE the implementation and GREEN after.
138
142
  Evidence added after the green code does NOT satisfy this.
143
+ - WHEN TO STOP, in one line: "I'll stop right away when <the exact
144
+ observable state that ends this run>". The Stop rules bind to this
145
+ line — the moment it holds, you stop.
139
146
 
140
147
  These scenarios are the contract. You are not done until every one of
141
148
  them PASSES with its evidence captured.
@@ -236,6 +243,18 @@ Until every success criterion PASSES with its evidence captured:
236
243
  scenario captured failing when no test seam exists. It must fail
237
244
  for the RIGHT reason (not a syntax error, not a missing import).
238
245
  Paste RED output into the notepad. No production code yet.
246
+ TEST-ONLY TARGET (regression coverage for behavior that is already
247
+ correct): there is no natural RED and no production change to make
248
+ — this is the sole exception to the production-RED/GREEN steps.
249
+ Substitute a mutation proof: temporarily force the exact regression
250
+ each new assertion names (revert the fix commit or break the seam,
251
+ never committed), capture the assertion failing, then revert the
252
+ mutation and capture GREEN. An assertion that stays green under its
253
+ mutation is not coverage — fix the fixture (a value equal to the
254
+ default it must override proves nothing) or assert the artifact the
255
+ criterion names, never an expected value re-derived from the output
256
+ under test. Reverting the probe IS the GREEN; skip step 3's
257
+ production change for a TEST-ONLY task and go to step 4.
239
258
  PROSE TARGET (prompt, SKILL.md, rule, markdown): the wording is
240
259
  NOT the behavior — never pin sentences, phrase presence/absence,
241
260
  or word/char counts. PIN only a machine-consumed value (parsed
@@ -244,7 +263,8 @@ Until every success criterion PASSES with its evidence captured:
244
263
  two shipped copies. A pure-prose change with no machine consumer
245
264
  has NO seam: ship it on review + QA-by-read, NO test — a text grep
246
265
  is pretend-coverage, not RED proof.
247
- 3. GREEN: write the SMALLEST production change that flips RED→GREEN.
266
+ 3. GREEN (skip for TEST-ONLY reverting the mutation is GREEN): write
267
+ the SMALLEST production change that flips RED→GREEN.
248
268
  Before GREEN work that depends on external review, PR, issue, or
249
269
  branch state, refresh current branch/PR/issue state and preserve existing ordering/policy;
250
270
  separate compatibility detection from policy changes unless the goal
@@ -382,10 +402,11 @@ message + present for approval.
382
402
  revert, capture the proof failing, then redo the change. Exempt
383
403
  only: pure formatting, comment-only edits, dependency bumps with no
384
404
  behavior delta, rename-only moves — justify each in `## Findings`.
385
- - A test that mirrors its implementation asserting mocks were
386
- called, pinning a constant, or unable to fail under any plausible
387
- regression is NOT evidence. Prefer a real-surface proof with no
388
- new test over a tautological test.
405
+ - A test that cannot fail for the regression it names is NOT
406
+ evidence: mock-call assertions, pinned constants, a fixture equal
407
+ to the default it must override, an expected value re-derived from
408
+ the output under test. Prefer a real-surface proof with no new
409
+ test over a tautological one.
389
410
  - Refactors: characterization tests pinning current observable
390
411
  behavior FIRST, green against the old code, green throughout.
391
412
  - Smallest correct change. No drive-by refactors.
@@ -407,9 +428,15 @@ message + present for approval.
407
428
  - After each result, ask whether the user's core request can now be
408
429
  answered with useful evidence in hand. If yes, answer now — skip any
409
430
  remaining retrieval, ceremony, or verification that adds no evidence.
410
- - Stop ONLY when every scenario PASSES with captured evidence, every
431
+ - The STOP GOAL: every scenario PASSES with captured evidence, every
411
432
  cleanup receipt is recorded, notepad is current, and (if gate
412
- triggered) reviewer approved unconditionally.
433
+ triggered) reviewer approved unconditionally. Above ALL of that, the
434
+ decisive test — outranking every other consideration — is: are the
435
+ completion conditions FUNDAMENTALLY fulfilled, is the user's problem
436
+ ACTUALLY SOLVED in observable behavior? If no, you are NOT done,
437
+ whatever the ledger says. If yes, deliver the final message and STOP
438
+ — no hesitation, no extra verification pass, no polish loop. Work
439
+ past the stop goal is scope creep, not diligence.
413
440
  - Leftover QA state (live process, `tmux` session, browser context,
414
441
  bound port, temp file / dir) means NOT done. Tear it down, record
415
442
  the receipt, then continue.
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 4.17.1) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 4.18.0) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
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",