oh-my-opencode 5.0.0-beta.18 → 5.0.0-beta.19

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 (143) hide show
  1. package/dist/cli/index.js +289 -160
  2. package/dist/cli-node/index.js +289 -160
  3. package/dist/index.js +324 -176
  4. package/dist/skills/ast-grep/AGENTS.md +51 -0
  5. package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
  6. package/dist/skills/start-work/SKILL.md +2 -1
  7. package/dist/skills/ultimate-browsing/SKILL.md +2 -0
  8. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +2 -0
  9. package/dist/skills/visual-qa/AGENTS.md +58 -0
  10. package/dist/tui.js +17 -17
  11. package/package.json +21 -21
  12. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  13. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  14. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  18. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  19. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  20. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  22. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  23. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  24. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  25. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  27. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
  28. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
  29. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
  32. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +1 -4
  33. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  34. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  35. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  36. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  37. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  38. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  40. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  41. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  42. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  43. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  44. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  45. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  46. package/packages/omo-codex/plugin/components/rules/dist/cli.js +43 -30
  47. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  48. package/packages/omo-codex/plugin/components/rules/package.json +2 -2
  49. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  50. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  51. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +6 -2
  52. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  53. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  54. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +1 -2
  55. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  56. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  57. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  58. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +2 -3
  59. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
  60. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  61. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  62. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  63. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +1 -2
  64. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  65. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  66. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  67. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -2
  68. package/packages/omo-codex/plugin/components/start-work-continuation/biome.json +2 -2
  69. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  70. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  72. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  73. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  74. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  75. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +237 -99
  76. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +237 -99
  77. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  78. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  79. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  80. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  81. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  82. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  83. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -0
  84. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  85. package/packages/omo-codex/plugin/components/ultrawork/directive.md +7 -1
  86. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  87. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  88. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +7 -1
  89. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  90. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +16 -0
  91. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  92. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +7 -1
  93. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +1 -1
  94. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +1 -1
  95. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  96. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  97. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +3 -1
  98. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  99. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
  100. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +3 -2
  101. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
  102. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  115. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  116. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  125. package/packages/omo-codex/plugin/package-lock.json +19 -19
  126. package/packages/omo-codex/plugin/package.json +1 -1
  127. package/packages/omo-codex/plugin/scripts/AGENTS.md +40 -0
  128. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  129. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  130. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +2 -1
  131. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
  132. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +2 -0
  133. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +7 -1
  134. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  135. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  136. package/packages/omo-codex/scripts/AGENTS.md +36 -0
  137. package/packages/omo-codex/scripts/install-dist/install-local.mjs +249 -120
  138. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  139. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  140. package/packages/shared-skills/skills/start-work/SKILL.md +2 -1
  141. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
  142. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +2 -0
  143. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
@@ -0,0 +1,51 @@
1
+ # ast-grep — Vendored Structural-Search Skill
2
+
3
+ **Generated:** 2026-08-24 (f3642fcda)
4
+
5
+ ## OVERVIEW
6
+
7
+ Vendored skill teaching agents ast-grep (`sg`) structural search/rewrite, plus a stdlib-Python helper CLI that wraps the `sg` binary. Vendoring pin in `SOURCE`: upstream `code-yeongyu/ast-grep-skill @ 3148c69` (ast-grep 0.45.0), "vendored as a sync; do not fork-drift". Earned this file: own executable surface (749-LOC helper + installers + smoke tests) and a no-fork-drift upstream contract that has no analogue elsewhere in `shared-skills`.
8
+
9
+ ## STRUCTURE
10
+
11
+ ```
12
+ ast-grep/
13
+ ├── SKILL.md / README.md # agent workflow / user overview
14
+ ├── SOURCE # upstream pin — the no-fork-drift contract
15
+ ├── scripts/ast_grep_helper.py # 749-LOC stdlib CLI (argparse; no deps)
16
+ ├── install.sh / install.ps1 # macOS/Linux + Windows installers
17
+ ├── references/ # cli, install, patterns, pitfalls, recipes, yaml-rules (510 LOC), sgconfig
18
+ └── tests/smoke.{sh,ps1} # POSIX + PowerShell smoke (also shell syntax + content checks)
19
+ ```
20
+
21
+ ## HELPER CLI (`scripts/ast_grep_helper.py`)
22
+
23
+ Subcommands: `search`, `replace` (dry-run; `--apply` to write), `scan`, `test`, `new`, `langs`, `doctor`, `install`, `validate`. Resolves the `sg`/`ast-grep` binary across PATH, Homebrew, npm, and OMO caches, validates patterns before executing, and shells out — it never links ast-grep as a library. Internal handlers `cmd_*`; utilities `validate_pattern`, `normalize_lang`, `resolve_binary`, `run_sg`. Nothing in-repo imports it; docs and skills invoke it by path. `omo-opencode/src/cli/install-ast-grep-sg.ts` locates this skill dir to install the binary.
24
+
25
+ ## CONVENTIONS
26
+
27
+ - AST patterns, never regex, for syntax-shaped queries; `$VAR` singles, `$$$` multis; patterns must parse as complete code in the target language.
28
+ - Two-pass rewrites: preview with `--json=compact`, apply separately with `--update-all` — the flags are mutually exclusive in `sg`.
29
+ - `sgconfig.yml` discovered upward; `ruleDirs`, optional `testConfigs`/`utilDirs`, language globs, custom languages, injections.
30
+ - Upstream syncs land as whole vendored refreshes matching `SOURCE`; local edits ride along until the next sync absorbs or reverts them.
31
+
32
+ ## ANTI-PATTERNS
33
+
34
+ - NO regex constructs (`.*`, `.+`, `\w`, `\d`, literal `|`) inside AST patterns — that is the skill's #1 pitfall.
35
+ - No incomplete patterns (e.g. Python `def $F($$$):` without a body).
36
+ - NEVER `--apply` a rewrite without the dry-run preview first.
37
+ - Text/comment/byte queries go to `rg`, not structural matching.
38
+ - Do not fork-drift from the `SOURCE` pin; a sync is a vendored refresh, not a merge.
39
+
40
+ ## COMMANDS
41
+
42
+ ```bash
43
+ # from packages/shared-skills/skills/ast-grep/
44
+ python3 scripts/ast_grep_helper.py search '<PATTERN>' --lang ts [path]
45
+ python3 scripts/ast_grep_helper.py replace '<PATTERN>' '<REWRITE>' --lang ts # dry-run; add --apply
46
+ python3 scripts/ast_grep_helper.py doctor
47
+ bash tests/smoke.sh # or: pwsh tests/smoke.ps1
48
+ # direct: sg run -p '<PATTERN>' --lang ts path
49
+ ```
50
+
51
+ - Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
@@ -0,0 +1,62 @@
1
+ # coding-agent-sessions — Cross-Platform Session Finder (Python)
2
+
3
+ **Generated:** 2026-08-24 (f3642fcda)
4
+
5
+ ## OVERVIEW
6
+
7
+ The only shared skill besides `ultimate-browsing` carrying a real sub-project: a Python package + CLI that finds, lists, searches, and reads local coding-agent session transcripts across ~25 platforms (Codex, Claude, OpenCode, OMO/Senpi/pi, and a long tail), normalizing them into one `Session` model. Earned this file: 33 files, 23 Python modules, own test suite, own `pyrightconfig.json`, own `.npmignore` (ships in the npm package minus tests/caches).
8
+
9
+ ## STRUCTURE
10
+
11
+ ```
12
+ coding-agent-sessions/
13
+ ├── SKILL.md # router: platform table → references/<platform>.md
14
+ ├── references/ # codex, claude, opencode, senpi, all-platforms (store layouts per platform)
15
+ ├── agents/openai.yaml # Codex agent role declaration
16
+ ├── scripts/
17
+ │ ├── find-agent-sessions.py # thin shebang entry (PEP 723, >=3.11); runpy → agent_sessions.cli
18
+ │ ├── agent_sessions/ # the package (12 modules)
19
+ │ └── tests/ # 6 pytest modules
20
+ └── pyrightconfig.json # extraPaths scripts/, excludes scripts/tests
21
+ ```
22
+
23
+ ## PUBLIC API (`scripts/agent_sessions/`)
24
+
25
+ | Module | Key exports |
26
+ |--------|-------------|
27
+ | `scanners.py` | `scan`, `DEFAULT_PLATFORMS`, `PLATFORM_SCANNERS`, per-platform `scan_*` (codex, claude, opencode, senpi, oh_my_pi, gajae_code, …) |
28
+ | `types.py` | `Session`, `Options`, `Json`, `JsonMap` — imported by nearly every module and test |
29
+ | `transcript.py` | parallel file reads, normalization, timestamps, session ids; `recent`, `MAX_PLATFORM_FILES` |
30
+ | `cli.py` | command parsing, filtering, payload construction, JSON emission (283 LOC — behavioral hotspot) |
31
+ | platform adapters | `file_scanners.py` (file-backed providers), `opencode.py` (CLI/SQLite/storage fallbacks), `sqlite_scanners.py`, `sqlite_optional_scanners.py`, `pi_family.py`, `aside_scanner.py`, `kiro_scanner.py` |
32
+
33
+ ## CLI CONTRACT
34
+
35
+ `python3 scripts/find-agent-sessions.py <command>`; aliases `find`=`search`, `read`=`get`. Commands: `list`, `find`/`search` (repeated `--query` lanes, `--from 7d`, repeated `--platform`, `--workers`, `--cwd/--model`, `--include-subagents`, `--limit`), `get`/`read <session-id>`. Output is JSON with `match_reasons` and reconstructed first/last user prompts — that JSON shape is the stable contract.
36
+
37
+ ## CONVENTIONS
38
+
39
+ - Stdlib-only Python (`>=3.11`), `from __future__ import annotations`, pathlib everywhere; no third-party deps at runtime.
40
+ - Probe-first, bounded discovery: platform-specific roots checked before broad globbing; optional platforms excluded from default search when they cannot reconstruct user prompts.
41
+ - Main sessions hide subagent children by default but report child counts; `--include-subagents` flips it. Parent/child linkage preserved and records deduplicated.
42
+ - Tests are pytest with `tmp_path` + `MonkeyPatch` isolation; in-file `# pyright: ignore[reportMissingImports]`-style relaxations for import diagnostics only.
43
+ - `.npmignore` strips `scripts/tests/`, `pyrightconfig.json`, and caches from the shipped skill.
44
+
45
+ ## ANTI-PATTERNS
46
+
47
+ - NEVER answer from normalized previews alone — pull the raw transcript (`read`/`get`) for exact evidence.
48
+ - Usage-only stores are NOT transcript sources.
49
+ - A Claude subagent's embedded `sessionId` is NOT its identity — use its `agentId` + parent-directory linkage.
50
+ - Don't add a platform by globbing blindly; register it in `PLATFORM_SCANNERS`/`DEFAULT_PLATFORMS` with a bounded root probe.
51
+
52
+ ## COMMANDS
53
+
54
+ ```bash
55
+ # from packages/shared-skills/skills/coding-agent-sessions/
56
+ python3 scripts/find-agent-sessions.py list --limit 20
57
+ python3 scripts/find-agent-sessions.py find "commit" --from 7d --platform senpi --platform opencode
58
+ python3 scripts/find-agent-sessions.py read <session-id>
59
+ pytest scripts/tests
60
+ ```
61
+
62
+ - Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
@@ -102,6 +102,7 @@ For PR/branch work, a task-owned worktree is mandatory before implementation sta
102
102
  Solo orchestration with parallel background workers is the default topology. Decide once, when the wave's lanes are known, and record the verdict in the ledger:
103
103
 
104
104
  - **Independent lanes -> parallel workers.** Separate files, no shared contract: one parallel spawn burst; no team.
105
+ - **Dependency-ordered lanes -> a dag run.** Sub-tasks with real ordering between them (C needs A and B finished first) and a harness with a native `dag` tool: dispatch the wave as ONE dag run — one producer node per lane plus a verification node — instead of a spawn burst, and watch the run's lifecycle instead of arming per-lane watchers. Read the `mass-ulw` skill's `SKILL.md` and `references/planning.md` IN FULL before defining any graph.
105
106
  - **Overlapping lanes -> a team.** The lanes touch the same module or contract AND running them concurrently actually finishes sooner: stand up a team (where the harness has one) so one lane's discoveries relay through you mid-flight.
106
107
  - **PR-mode independent lanes -> a worktree per lane.** Under `--make-pr`/`--ship`, when a wave holds independent checkboxes, give each lane its own branch and task-owned worktree, delivered as its own PR.
107
108
 
@@ -118,7 +119,7 @@ Landing rules, regardless of topology:
118
119
  3. Ignore nested checkboxes under acceptance criteria, evidence, and definition-of-done sections.
119
120
  4. Classify the checkbox tier and record it in its ledger entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency or transaction boundaries; a cross-domain refactor; or the plan or user signals care. When unsure, take HEAVY; upgrade and redo skipped gates the moment a HEAVY fact surfaces; never downgrade.
120
121
  5. Decompose that checkbox into atomic sub-tasks sized for ONE worker in ONE run — a sub-task that would need mid-flight steering is two sub-tasks. Collect every other unchecked checkbox in the same plan wave whose dependencies are met — their lanes execute concurrently. A wave that could split further but holds fewer than 3 independent sub-tasks is under-split.
121
- 6. **DELEGATE EVERYTHING. YOU NEVER IMPLEMENT.** Route every sub-task through the delegation router below, then dispatch ALL independent sub-tasks across those checkboxes in one parallel worker-spawn burst (a single batched spawn call where the harness supports it); serialize only named dependencies. Verification and checkbox marking stay per-checkbox.
122
+ 6. **DELEGATE EVERYTHING. YOU NEVER IMPLEMENT.** Route every sub-task through the delegation router below, then dispatch ALL independent sub-tasks across those checkboxes in one parallel worker-spawn burst (a single batched spawn call where the harness supports it); route named dependencies per the lane-topology decision above. Verification and checkbox marking stay per-checkbox.
122
123
  7. Give every dispatched sub-task its completion condition and watch for it per the section below. A dispatch whose completion nobody watches is an unfinished dispatch.
123
124
 
124
125
  ### Monitor every dispatched subagent to its completion condition
@@ -86,6 +86,8 @@ Routing table, per-platform auth (set `TWITTER_*` env vars, `gh auth login`, a t
86
86
 
87
87
  CloakBrowser is a stealth Chromium with source-level fingerprint patches that passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors; agent-browser is the CDP automation CLI that drives it. Both are runtime-installed tools (not vendored here). Full setup, version pins, launch flow, cookie login, and cross-platform notes are in [references/chrome-stealth.md](references/chrome-stealth.md).
88
88
 
89
+ NEVER clear cookies, cache, or site data (`Network.clearBrowserCookies`, `Storage.clearCookies`, `chrome.browsingData.remove`, "clear browsing data") on the user's real/main browser profile — it wipes their logged-in state everywhere. If the task needs that profile's login state, clone the profile directory first (`rsync -a <profile>/ <tmp-clone>/`) and launch CloakBrowser / agent-browser with the clone as the user-data-dir; run any clearing on the clone only.
90
+
89
91
  ```bash
90
92
  # 1. Launch CloakBrowser with CDP on :9242 (see chrome-stealth.md for install + venv).
91
93
  # 2. CloakBrowser launches tabless — open the first tab via CDP before any agent-browser command:
@@ -38,6 +38,8 @@ python -c "import cloakbrowser; print(cloakbrowser.__version__, cloakbrowser.CHR
38
38
 
39
39
  ## Launch + drive
40
40
 
41
+ NEVER clear cookies, cache, or site data (`Network.clearBrowserCookies`, `Storage.clearCookies`, `chrome.browsingData.remove`, "clear browsing data") on the user's real/main browser profile — it wipes their logged-in state everywhere. If you need that profile's login state, clone it first (`rsync -a <profile>/ <tmp-clone>/`) and launch with the clone as the user-data-dir; run any clearing on the clone only.
42
+
41
43
  ```bash
42
44
  # 1. Launch CloakBrowser with CDP on :9242 (background). With the venv active:
43
45
  python -c "import asyncio,cloakbrowser; asyncio.run(cloakbrowser.launch_async(headless=False, stealth_args=True, args=['--remote-debugging-port=9242']))" &
@@ -0,0 +1,58 @@
1
+ # visual-qa — Bundled Visual-Evidence CLI
2
+
3
+ **Generated:** 2026-08-24 (f3642fcda)
4
+
5
+ ## OVERVIEW
6
+
7
+ The visual-QA skill's executable core: a zero-dependency Node CLI that produces machine evidence (`image-diff`, `tui-check`) plus the TypeScript sources it is bundled from. Earned this file: the only shared skill shipping a built bundle whose runtime and development sources must be kept in lockstep.
8
+
9
+ ## STRUCTURE
10
+
11
+ ```
12
+ visual-qa/
13
+ ├── SKILL.md # reviewer workflow (dual oracle, evidence gates) — the prose contract
14
+ ├── references/agent-browser-setup.md
15
+ └── scripts/
16
+ ├── visual-qa.mjs # SHIPPED RUNTIME: bun-build bundle of cli.ts (+ embedded modules)
17
+ ├── cli.ts # development source; dispatches image-diff / tui-check
18
+ ├── image-diff.ts # diffImages — 8x8 grid cells, hotspots, rounded metrics
19
+ ├── tui-grid.ts # checkTui — column overflow + border alignment verdicts
20
+ ├── east-asian-width.ts # charWidth / stringWidth — CJK-aware width math
21
+ ├── ansi.ts # ANSI escape stripping (width must be escape-aware)
22
+ ├── png-decode.ts / png-crc.ts / png-synth.ts # stdlib PNG codec (no deps)
23
+ ├── types.ts
24
+ └── *.test.ts # co-located bun tests for every module above
25
+ ```
26
+
27
+ ## BUNDLE/SOURCE DUALITY
28
+
29
+ `visual-qa.mjs` is the artifact the skill's commands invoke (`node "$SKILL_DIR/scripts/visual-qa.mjs" …`); the `.ts` files exist for development and tests only. A behavior fix lands in the TS source AND the bundle is regenerated from `cli.ts` — editing one without the other makes tests and runtime disagree. Never hand-edit the `.mjs`.
30
+
31
+ ## SURFACE
32
+
33
+ - Commands: `image-diff <reference.png> <actual.png>` and `tui-check <capture.txt> --cols <N>`; JSON verdict output (hotspot cells, overflow lines, wide-char columns, border alignment).
34
+ - Module exports: `diffImages`, `checkTui`, `charWidth`/`stringWidth`, ANSI + PNG helpers. `cli.ts` owns `CliError`, `parseColumns`, `run`, `main`.
35
+
36
+ ## CONVENTIONS
37
+
38
+ - Zero runtime dependencies — PNG decode/synthesis and ANSI handling are hand-rolled in `scripts/`; keep it that way (the bundle must stay require-free apart from `node:` builtins).
39
+ - Width is never `String.length`: CJK wide characters and ANSI escapes are accounted for before any column math.
40
+ - Tests are co-located `bun test scripts/*.test.ts`, given/when/then style per repo convention.
41
+
42
+ ## ANTI-PATTERNS
43
+
44
+ - NEVER hand-edit `visual-qa.mjs`; regenerate from source.
45
+ - Don't add an npm dependency to make PNG/diff easier — the no-dep bundle is the point.
46
+ - Column math that ignores CJK width or ANSI escapes is wrong by construction; `tui-check` exists because text-diff tools get terminal grids wrong.
47
+ - Skill-level rule worth repeating for code changes: `tmux capture-pane` is forbidden as a capture mechanism.
48
+
49
+ ## COMMANDS
50
+
51
+ ```bash
52
+ # from packages/shared-skills/skills/visual-qa/
53
+ node scripts/visual-qa.mjs image-diff <reference.png> <actual.png>
54
+ node scripts/visual-qa.mjs tui-check <capture.txt> --cols 80
55
+ bun test scripts/*.test.ts
56
+ ```
57
+
58
+ - Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
package/dist/tui.js CHANGED
@@ -75871,10 +75871,10 @@ var init_tmux = __esm(() => {
75871
75871
  init_runner2();
75872
75872
  init_tmux_utils2();
75873
75873
  });
75874
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/types.gen.js
75874
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/types.gen.js
75875
75875
  var init_types_gen = () => {};
75876
75876
 
75877
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/core/serverSentEvents.gen.js
75877
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/serverSentEvents.gen.js
75878
75878
  var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url: url2, ...options }) => {
75879
75879
  let lastEventId;
75880
75880
  const sleep = sseSleepFn ?? ((ms) => new Promise((resolve3) => setTimeout(resolve3, ms)));
@@ -75983,7 +75983,7 @@ var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseVa
75983
75983
  return { stream };
75984
75984
  };
75985
75985
 
75986
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/core/auth.gen.js
75986
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/auth.gen.js
75987
75987
  var getAuthToken = async (auth, callback) => {
75988
75988
  const token = typeof callback === "function" ? await callback(auth) : callback;
75989
75989
  if (!token) {
@@ -75998,7 +75998,7 @@ var getAuthToken = async (auth, callback) => {
75998
75998
  return token;
75999
75999
  };
76000
76000
 
76001
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/core/bodySerializer.gen.js
76001
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/bodySerializer.gen.js
76002
76002
  var jsonBodySerializer;
76003
76003
  var init_bodySerializer_gen = __esm(() => {
76004
76004
  jsonBodySerializer = {
@@ -76006,7 +76006,7 @@ var init_bodySerializer_gen = __esm(() => {
76006
76006
  };
76007
76007
  });
76008
76008
 
76009
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/core/pathSerializer.gen.js
76009
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/pathSerializer.gen.js
76010
76010
  var separatorArrayExplode = (style) => {
76011
76011
  switch (style) {
76012
76012
  case "label":
@@ -76104,7 +76104,7 @@ var separatorArrayExplode = (style) => {
76104
76104
  return style === "label" || style === "matrix" ? separator + joinedValues : joinedValues;
76105
76105
  };
76106
76106
 
76107
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/core/utils.gen.js
76107
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/utils.gen.js
76108
76108
  var PATH_PARAM_RE, defaultPathSerializer = ({ path: path4, url: _url2 }) => {
76109
76109
  let url2 = _url2;
76110
76110
  const matches = _url2.match(PATH_PARAM_RE);
@@ -76173,7 +76173,7 @@ var init_utils_gen = __esm(() => {
76173
76173
  PATH_PARAM_RE = /\{[^{}]+\}/g;
76174
76174
  });
76175
76175
 
76176
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/client/utils.gen.js
76176
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client/utils.gen.js
76177
76177
  class Interceptors {
76178
76178
  _fns;
76179
76179
  constructor() {
@@ -76376,7 +76376,7 @@ var init_utils_gen2 = __esm(() => {
76376
76376
  };
76377
76377
  });
76378
76378
 
76379
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/client/client.gen.js
76379
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client/client.gen.js
76380
76380
  var createClient = (config3 = {}) => {
76381
76381
  let _config = mergeConfigs(createConfig(), config3);
76382
76382
  const getConfig = () => ({ ..._config });
@@ -76527,7 +76527,7 @@ var init_client_gen = __esm(() => {
76527
76527
  init_utils_gen2();
76528
76528
  });
76529
76529
 
76530
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/core/params.gen.js
76530
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/params.gen.js
76531
76531
  var extraPrefixesMap, extraPrefixes;
76532
76532
  var init_params_gen = __esm(() => {
76533
76533
  extraPrefixesMap = {
@@ -76539,7 +76539,7 @@ var init_params_gen = __esm(() => {
76539
76539
  extraPrefixes = Object.entries(extraPrefixesMap);
76540
76540
  });
76541
76541
 
76542
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/client/index.js
76542
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client/index.js
76543
76543
  var init_client = __esm(() => {
76544
76544
  init_bodySerializer_gen();
76545
76545
  init_params_gen();
@@ -76547,7 +76547,7 @@ var init_client = __esm(() => {
76547
76547
  init_utils_gen2();
76548
76548
  });
76549
76549
 
76550
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/client.gen.js
76550
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client.gen.js
76551
76551
  var client;
76552
76552
  var init_client_gen2 = __esm(() => {
76553
76553
  init_client();
@@ -76556,7 +76556,7 @@ var init_client_gen2 = __esm(() => {
76556
76556
  }));
76557
76557
  });
76558
76558
 
76559
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/gen/sdk.gen.js
76559
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/sdk.gen.js
76560
76560
  class _HeyApiClient {
76561
76561
  _client = client;
76562
76562
  constructor(args) {
@@ -77207,7 +77207,7 @@ var init_sdk_gen = __esm(() => {
77207
77207
  };
77208
77208
  });
77209
77209
 
77210
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
77210
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
77211
77211
  function wrapClientError(error51, response, request, opts) {
77212
77212
  if (!opts?.throwOnError)
77213
77213
  return error51;
@@ -77234,7 +77234,7 @@ function describe3(request, response) {
77234
77234
  return `${method} ${url2}${status ? " \u2192 " + status : ""}${statusText ? " " + statusText : ""}`;
77235
77235
  }
77236
77236
 
77237
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/client.js
77237
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/client.js
77238
77238
  function pick2(value, fallback) {
77239
77239
  if (!value)
77240
77240
  return;
@@ -77744,17 +77744,17 @@ var require_cross_spawn = __commonJS(function(exports, module) {
77744
77744
  module.exports._enoent = enoent;
77745
77745
  });
77746
77746
 
77747
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/process.js
77747
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/process.js
77748
77748
  var init_process = () => {};
77749
77749
 
77750
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/server.js
77750
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/server.js
77751
77751
  var import_cross_spawn;
77752
77752
  var init_server = __esm(() => {
77753
77753
  init_process();
77754
77754
  import_cross_spawn = __toESM(require_cross_spawn(), 1);
77755
77755
  });
77756
77756
 
77757
- // node_modules/.bun/@opencode-ai+sdk@1.18.19/node_modules/@opencode-ai/sdk/dist/index.js
77757
+ // node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/index.js
77758
77758
  var init_dist = __esm(() => {
77759
77759
  init_client2();
77760
77760
  init_server();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.0-beta.18",
3
+ "version": "5.0.0-beta.19",
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",
@@ -165,23 +165,23 @@
165
165
  "@clack/prompts": "^1.7.0",
166
166
  "@code-yeongyu/comment-checker": "^0.8.0",
167
167
  "@modelcontextprotocol/sdk": "^1.30.0",
168
- "@opencode-ai/plugin": "1.18.19",
169
- "@opencode-ai/sdk": "1.18.19",
170
- "@opentui/core": "^0.5.6",
171
- "@opentui/keymap": "^0.5.6",
172
- "@opentui/solid": "^0.5.6",
168
+ "@opencode-ai/plugin": "1.18.22",
169
+ "@opencode-ai/sdk": "1.18.22",
170
+ "@opentui/core": "^0.5.8",
171
+ "@opentui/keymap": "^0.5.8",
172
+ "@opentui/solid": "^0.5.8",
173
173
  "commander": "^15.0.0",
174
174
  "detect-libc": "^2.1.2",
175
175
  "diff": "^9.0.0",
176
176
  "js-yaml": "^5.0.0",
177
177
  "jsonc-parser": "^3.3.1",
178
178
  "picocolors": "^1.1.1",
179
- "picomatch": "^4.0.5",
180
- "posthog-node": "^5.49.2",
179
+ "picomatch": "^4.0.7",
180
+ "posthog-node": "^5.51.1",
181
181
  "zod": "^4.4.3"
182
182
  },
183
183
  "devDependencies": {
184
- "@code-yeongyu/senpi": "2026.8.23",
184
+ "@code-yeongyu/senpi": "2026.8.24",
185
185
  "@oh-my-opencode/agents-md-core": "workspace:*",
186
186
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
187
187
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -222,18 +222,18 @@
222
222
  "typescript": "^7.0.2"
223
223
  },
224
224
  "optionalDependencies": {
225
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.18",
226
- "oh-my-opencode-darwin-x64": "5.0.0-beta.18",
227
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.18",
228
- "oh-my-opencode-linux-arm64": "5.0.0-beta.18",
229
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.18",
230
- "oh-my-opencode-linux-x64": "5.0.0-beta.18",
231
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.18",
232
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.18",
233
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.18",
234
- "oh-my-opencode-windows-arm64": "5.0.0-beta.18",
235
- "oh-my-opencode-windows-x64": "5.0.0-beta.18",
236
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.18"
225
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.19",
226
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.19",
227
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.19",
228
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.19",
229
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.19",
230
+ "oh-my-opencode-linux-x64": "5.0.0-beta.19",
231
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.19",
232
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.19",
233
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.19",
234
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.19",
235
+ "oh-my-opencode-windows-x64": "5.0.0-beta.19",
236
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.19"
237
237
  },
238
238
  "overrides": {
239
239
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.18",
3
+ "version": "5.0.0-beta.19",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -0,0 +1,47 @@
1
+ # plugin — vendored Codex plugin bundle (`@sisyphuslabs/omo-codex-plugin`)
2
+
3
+ **Score 13** (608 files; distinct package boundary between the adapter and 15 component dirs, each with its own AGENTS.md).
4
+
5
+ ## OVERVIEW
6
+
7
+ The shipped Codex plugin namespace `omo` (marketplace `sisyphuslabs`), v5.0.0-beta.18. npm workspaces root for the 11 component packages; owns aggregate hook wiring, MCP declarations, and the build/sync pipeline. Component roster, sync-skills pipeline, and install targets are owned by the package AGENTS.md — not repeated here.
8
+
9
+ ## STRUCTURE
10
+
11
+ | Path | Role |
12
+ |------|------|
13
+ | `components/` | 11 workspace components + `bootstrap` (standalone, deliberately outside workspaces), `test-support`, `lcx`. Each owns its `AGENTS.md` |
14
+ | `hooks/` | 23 aggregate hook JSON files, assembled from each component's `hooks/hooks.json` by the build |
15
+ | `scripts/` | Build/sync/migration orchestration (own AGENTS.md) |
16
+ | `test/` | node:test black-box contract suite (own AGENTS.md) |
17
+ | `shared/` | `getCodexOmoConfig()` unified-config loader + startup config migration (`src/config-loader.ts`, `src/config-migration.ts`) |
18
+ | `skills/` | GENERATED by `sync-skills.mjs`; gitignored except the two tracked shared copies (`init-deep`, `ulw-plan`) |
19
+ | `.codex-plugin/plugin.json` | Aggregate manifest Codex consumes |
20
+ | `.mcp.json` | 5 servers: `codegraph`, `git_bash`, `lsp` (local stdio) + `grep_app`, `context7` (remote) |
21
+
22
+ ## WHERE TO LOOK
23
+
24
+ | Task | Location |
25
+ |------|----------|
26
+ | Add/modify a component hook | Component's `hooks/hooks.json`; the build re-assembles `hooks/*.json` |
27
+ | Aggregate hook side | `hooks/<event>-checking-<component>.json`; only the aggregate copies carry `commandWindows` dispatch |
28
+ | MCP server enable/paths | `.mcp.json`; install-time rewriting in `../src/install/codex-cache-bundled-mcps.ts` |
29
+ | Unified `[codex]` config resolution | `shared/src/config-loader.ts` |
30
+ | Build pipeline internals | `scripts/AGENTS.md` |
31
+
32
+ ## CONVENTIONS
33
+
34
+ - Build order is fixed: `sync-version` → `sync-hook-status-messages` → `build-bundled-mcp-runtimes` → `materialize-shared-upstreams` → `sync-skills` → `build-components` (all via `npm run build`).
35
+ - `(OmO <version>)` `statusMessage` stamps are generated by sync scripts; never hand-edit.
36
+ - `skills/` is build output: edit component skill sources, then rebuild. The two tracked shared copies are the exception — they are committed.
37
+ - Tests run with `node --test`, NOT bun/vitest: root `bunfig.toml` excludes `plugin/**` from the root bun suite.
38
+
39
+ ## COMMANDS
40
+
41
+ From `packages/omo-codex/plugin/`:
42
+
43
+ ```bash
44
+ npm run build # full sync + components pipeline
45
+ npm test # node --test test/*.test.mjs
46
+ npm run check # build && test
47
+ ```
@@ -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 5.0.0-beta.18) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.19) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.0-beta.18",
3
+ "version": "5.0.0-beta.19",
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": "5.0.0-beta.18",
3
+ "version": "5.0.0-beta.19",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -10,6 +10,15 @@ Conventions for human contributors and AI agents working on this repository.
10
10
  - Tabs for indentation. Double quotes for strings.
11
11
  - Tests use vitest with `#given .. #when .. #then` descriptions or plain `// given / // when / // then` body comments.
12
12
 
13
+ ## Layout
14
+
15
+ - `src/core.ts`: parse API — `parseApplyPatchRequests`, `extractCommentCheckRequests`, `toHookInput`, `isToolFailureOutput`, `isRecord`.
16
+ - `src/apply-patch.ts`: `apply_patch` extraction supporting Codex `tool_input.command`, raw patch text, and OMO-compatible metadata.
17
+ - `src/request-extractor.ts` / `src/hook-input.ts` / `src/core-values.ts`: request/input shaping and constants.
18
+ - `src/runner.ts`: spawns the checker binary — `runCommentChecker`, `resolveCommentCheckerBinary`, `spawnProcess`.
19
+ - `src/codex-hook.ts`: `PostToolUse` hook + CLI (`extractCodexCommentCheckRequests`, `runCommentCheckerPostToolUse`, `runCodexHookCli`).
20
+ - `hooks/hooks.json`: registration. Heaviest suite: `test/codex-hook.test.ts` (513 LOC).
21
+
13
22
  ## Commands
14
23
 
15
24
  - `npm install` - install dependencies.
@@ -1,9 +1,9 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/2.5.9/schema.json",
3
3
  "linter": {
4
4
  "enabled": true,
5
5
  "rules": {
6
- "recommended": true,
6
+ "preset": "recommended",
7
7
  "style": {
8
8
  "noDefaultExport": "error",
9
9
  "noEnum": "error",
@@ -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 5.0.0-beta.18) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.19) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.0-beta.18",
3
+ "version": "5.0.0-beta.19",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,8 +1,5 @@
1
- import {
2
- extractApplyPatchEdits,
3
- getApplyPatchMetadataFiles,
4
- } from "@oh-my-opencode/comment-checker-core";
5
1
  import type { CheckerEdit as CoreApplyPatchEdit } from "@oh-my-opencode/comment-checker-core";
2
+ import { extractApplyPatchEdits, getApplyPatchMetadataFiles } from "@oh-my-opencode/comment-checker-core";
6
3
  import type { CommentCheckRequest } from "./types.js";
7
4
 
8
5
  export function extractApplyPatchRequests(event: {
@@ -27,10 +24,7 @@ function extractApplyPatchMetadataRequests(details: unknown, sourceToolName: str
27
24
  return toCommentCheckRequests(edits, sourceToolName);
28
25
  }
29
26
 
30
- function toCommentCheckRequests(
31
- edits: readonly CoreApplyPatchEdit[],
32
- sourceToolName: string,
33
- ): CommentCheckRequest[] {
27
+ function toCommentCheckRequests(edits: readonly CoreApplyPatchEdit[], sourceToolName: string): CommentCheckRequest[] {
34
28
  const requests: CommentCheckRequest[] = [];
35
29
  for (const edit of edits) {
36
30
  if (edit.before.length === 0) {
@@ -1,6 +1,5 @@
1
- export { parseApplyPatchRequests } from "@oh-my-opencode/comment-checker-core";
1
+ export { isRecord, parseApplyPatchRequests } from "@oh-my-opencode/comment-checker-core";
2
2
  export { toHookInput } from "./hook-input.js";
3
- export { isRecord } from "@oh-my-opencode/comment-checker-core";
4
3
  export { extractCommentCheckRequests, isToolFailureOutput } from "./request-extractor.js";
5
4
  export type {
6
5
  CheckerEdit,
@@ -1,5 +1,5 @@
1
- import { extractApplyPatchRequests } from "./apply-patch.js";
2
1
  import { getString, isRecord } from "@oh-my-opencode/comment-checker-core";
2
+ import { extractApplyPatchRequests } from "./apply-patch.js";
3
3
  import type { CheckerEdit, CommentCheckRequest, TextContent, ToolResultContent, ToolResultLike } from "./types.js";
4
4
 
5
5
  export function extractCommentCheckRequests(event: ToolResultLike): CommentCheckRequest[] {
@@ -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 5.0.0-beta.18) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.19) 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 5.0.0-beta.18) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.19) 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": "5.0.0-beta.18",
3
+ "version": "5.0.0-beta.19",
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,