opencode-navigator 0.24.0 → 0.26.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.26.0] - 2026-11-06
4
+
5
+ - Prevent background retries from accumulating cancellation listeners and preferences loading from waiting indefinitely on recovery markers.
6
+ - Show exact active Subagent durations from OpenCode 2's native execution start time, preserving the observation fallback when timing is unavailable. Keep interrupted executions marked as cancelled in recent history.
7
+
8
+ ## [0.25.0] - 2026-10-31
9
+
10
+ - Offer Enable Todo when OpenCode 2's native tool is disabled, with an existing server-config picker, exact change preview and separate confirmation. Preserve unrelated JSONC content and refuse stale targets; distinguish disabled Todo from an enabled empty list.
11
+ - Update the seven-slide setup wizard for native Todo enablement, provider/account limits, multi-icon or text-only toolbar pins, About/changelog and Bug reports. Describe each host's real permissions/LSP capabilities and keep navigation visible while short-terminal content scrolls.
12
+
3
13
  ## [0.24.0] - 2026-10-31
4
14
 
5
15
  - Support the latest stable OpenCode 1.19.5 and 2.2.5 releases, preserving both host adapters and existing sidebar behavior.
package/HOST_API.md CHANGED
@@ -9,9 +9,9 @@ define the boundary; internal host components are not plugin APIs.
9
9
  | Capability | OpenCode 1.19.5 | OpenCode 2.2.5 |
10
10
  | --- | --- | --- |
11
11
  | Todo | Supported host Todo source/events | Public message cache, completed `todowrite` and revert boundary |
12
- | Skills | Host discovery and prompt insertion | Native Skill cache and `session.skill` with exact ID |
13
- | MCP | Host status and connection API | Native cache, sync/invalidate and connect/disconnect |
14
- | Subagents | Supported child/status API and events | Native session cache/status and typed execution events |
12
+ | Skills | Host discovery and prompt insertion | Native Skill cache and `experimental.session.skill` with exact ID |
13
+ | MCP | Host status and connection API | Native cache, sync/invalidate and `experimental.mcp.connect/disconnect` |
14
+ | Subagents | Supported child/status API and events | Native session cache/status, execution start time and typed execution events |
15
15
  | Commands | Public keymap | Public owned layers, targets, priorities, modes, discovery and dispatch |
16
16
  | Dialogs/toasts | Public dialog components and mounting | Public show/prompt/confirm/set/clear and toast |
17
17
  | Model/variant | Saved session model and host pickers | Reactive prompt model, variant API and host pickers |
@@ -31,9 +31,10 @@ justify bypassing a native API.
31
31
  | Bug-report transport and external browser launch | Neither supported public TUI contract provides GitHub issue creation or an external browser opener. Direct sending uses the user's authenticated `gh` without reading credential files; a `type: Bug` repository form handles browser reports. Bounded argv-based OS launch has a visible link/clipboard fallback on remote or headless hosts. | Equivalent public host issue/browser APIs preserving authentication ownership, editable draft, real issue type and confirmation semantics. |
32
32
  | Literal Ctrl+, hook on 2.x | Public plugin bindings are strings; the comma expander splits literal commas into alternatives. The named parser does not normalize `comma` to the actual comma event. Dispatch still uses the native command API. | A documented literal-comma binding passing the real Settings smoke. |
33
33
  | Subagent child discovery | Published TUI Data caches sessions but has no complete children-sync operation. Initial/manual/reconnect discovery uses the public paginated API and syncs unknown IDs into the host cache. | A complete children-sync/query on the supplied public Data interface. |
34
- | Subagent observation history and retry details | Native status and cached transcript retry data are used first; recent runs, pre-observation clock markers, errors and unloaded-child retry detail remain observation history. | Equivalent public observed-run/retry history without loading every transcript. |
34
+ | Subagent observation history and retry details | Native status, `SessionInfo.time.busy` and cached retry data are used first. Valid current-execution start times give exact active durations without a pre-observation marker; missing/invalid timing keeps the observed fallback. Recent runs, errors and unloaded-child retry details remain observation history. The prior execution's `idle`/`outcome` never completes a currently running execution. | Equivalent public observed-run/retry history without loading every transcript. |
35
35
  | Read-only Todo projection | Native completed tool calls and revert are public; the host's `sessionTodos` helper is not exported. No direct CRUD/priority API exists. | A public equivalent projection; editing also requires an explicitly selected interaction and supported API. |
36
- | Console/Go request lifecycle and projection | `client.usage.limits` is public, but the internal usage cache and budget selectors are not in published Plugin Context. Workspace IDs are not provider account IDs. | Equivalent public cache and selector on the plugin interface. |
36
+ | Native Todo enablement | `config.get` exposes ordered sources, but `experimental.config.update` supports only shell. The setup feature previews and confirms a JSONC leaf edit in an existing discovered source through public server file APIs. File reads are location-confined, so selected-file IO is routed to its server-side parent; the original session/location remains the stale-target guard. Reads immediately before writes reject changed previews, and readback verifies the file and effective flag. The public write API has no CAS, so this is not an atomic transaction against concurrent external writers; uncertain outcomes require Refresh before retry. No model, shell or Todo event is used. | A public Todo config patch API preserving source precedence, unrelated JSONC content and conditional-write semantics. |
37
+ | Console/Go request lifecycle and projection | `client.experimental.usage.limits` is public, but the internal usage cache and budget selectors are not in published Plugin Context. Workspace IDs are not provider account IDs. | Equivalent public cache and selector on the plugin interface. |
37
38
  | External quotas / reset credits | Console/Go is not a universal provider API and has no Codex reset-credit consume operation. Sources stay documented, account-bound and portable. Native auth/request errors never enable a bypass reader. | Host APIs matching provider/account/units/resets and idempotent consume semantics. |
38
39
  | Pinned-file snapshot installer | Native package updates do not implement the recognized versioned wrapper/staging layout. Preserve installation source and scope. | A public atomic file-snapshot update API with equivalent verification. |
39
40
  | Corner masks and product UI | Multiline shape, three-cell controls, filters, groups, presets and pins are product features. Paint hooks only draw; scroll restoration runs outside paint. | Equivalent public primitives preserving geometry, behavior and fallback mode. |
@@ -54,7 +55,7 @@ exercise migration only; they do not extend the supported host matrix.
54
55
  The published 2.2.5 TUI context, plugin, index and Solid declarations are identical
55
56
  to 2.2.0. OpenTUI 0.8 retains the drawing-only paint-hook contract; renderer tests,
56
57
  nested dialogs and frame-level typing probes run against the updated runtime.
57
- Development uses Bun 1.4.4 and OpenTUI 0.8, leaving Solid/OpenTUI external so the
58
+ Development uses Bun 1.4.4 and OpenTUI 0.8.2, leaving Solid/OpenTUI external so the
58
59
  host owns its runtime. The 1.x host ships older runtime modules; its actual smoke
59
60
  must pass rather than injecting the development modules into it.
60
61
 
@@ -66,13 +67,22 @@ renderer/FFI support. CI and package verification use Node 26.12.1.
66
67
  ### Deliberate Compatibility Pins
67
68
 
68
69
  - `web-tree-sitter` stays at **0.25.10**, the exact peer required by OpenTUI
69
- 0.8.0. Upgrade it when the supported host runtime publishes a compatible peer
70
+ 0.8.2. Upgrade it when the supported host runtime publishes a compatible peer
70
71
  contract; the independent 0.27 line is not a compatible substitution.
71
- - `typescript` stays at **6.0.3**, the latest compatible compiler for the shared
72
- linter stack. TypeScript 7.0.2 type-checks Navigator, but SonarJS/`ts-api-utils`
73
- fails while loading its missing JavaScript compiler API. Upgrade when those
74
- consumers support the new compiler distribution; do not disable their rules
75
- to make an incompatible upgrade pass.
72
+ - `typescript` is **6.0.3**, selected to match the complete published
73
+ `@st1ggy/linter-config` **10.0.0** preset. SonarJS and typescript-eslint JS
74
+ plugins remain enabled without the former TS7 projection or override.
75
+ [Lint coverage](LINT_COVERAGE.md) records the current setup and historical exclusions.
76
+ - Oxlint **1.90.0**, Oxfmt **0.75.0** and oxlint-tsgolint **7.0.2005** match the
77
+ preset's exact peer versions. Advance them when the preset supports newer engines.
78
+ - OpenTUI's transitive `bun-ffi-structs` **0.3.1** declares the outdated compiler
79
+ peer `typescript: ^5`. A root-only Bun metadata patch expands it to `^5 || ^6`;
80
+ no runtime bytes or declarations change. Strict declaration compilation with
81
+ library checks enabled, packing regressions and the resolved compiler graph
82
+ verify the selected TS6 use. Remove the patch when upstream accepts TS6.
83
+ Bun patches apply only in this repository, not transitively in consumer projects
84
+ or the separately generated snapshot runtime manifest. Those installations may
85
+ still report the upstream peer warning; this is not an upstream fix.
76
86
  - Bun remains pinned at **1.4.4**, the current stable release. Direct dependencies
77
87
  otherwise use their latest compatible stable releases; transitive updates stay
78
88
  within upstream ranges. Runtime peers remain host-owned and are not bundled.
@@ -0,0 +1,199 @@
1
+ # Lint Coverage
2
+
3
+ Project type checking uses stable TypeScript 6.0.3, matching the compiler API
4
+ used by the published shared preset. The user selected this compatibility-first
5
+ setup instead of extending the previous TypeScript 7 coverage exclusions.
6
+
7
+ Oxlint uses `@st1ggy/linter-config/solid-ox` with type-aware analysis. Oxfmt uses
8
+ `@st1ggy/linter-config/oxfmt-common`. The version 10 preset is extended directly,
9
+ including its SonarJS and typescript-eslint JS plugins. No compiler-compatibility
10
+ projection filters its rules. Deliberate project exceptions remain documented
11
+ beside their individual settings in `oxlint.config.ts`.
12
+
13
+ ## Preserved Checks
14
+
15
+ - Native ESLint, TypeScript, import and Unicorn rules remain enabled.
16
+ - All published Solid, ESLint-core, import-x, stylistic, Unicorn, SonarJS and
17
+ typescript-eslint JS plugins remain enabled.
18
+ - Promise handling and strict equality follow the version 10 preset.
19
+ - Bun 1.4.4 can return undefined from `rejects`/`resolves` matchers for already
20
+ settled promises. Tests normalize matcher results through `Promise.resolve`
21
+ before awaiting, preserving pending assertions and satisfying both the native
22
+ thenable rule and SonarJS assertion handling without disabling either rule.
23
+ - Oxfmt still checks formatting separately. This migration does not configure
24
+ Stylelint for the CSS-free TUI project.
25
+
26
+ ## Historical TypeScript 7 Coverage Exclusions
27
+
28
+ Navigator 0.25.0 used native substitutions for six SonarJS rules and excluded
29
+ the following 155 rule names from preset 8 for TS7 compatibility. This list is
30
+ historical, not the current configuration. Preset 10 now supplies its complete
31
+ rule set, subject only to the documented project-specific exceptions.
32
+
33
+ Native cyclomatic complexity was not considered a replacement for SonarJS
34
+ cognitive complexity. The compiler-driven exclusions are no longer applied.
35
+
36
+ ```text
37
+ sonarjs/assertions-in-test-cases
38
+ sonarjs/async-test-assertions
39
+ sonarjs/aws-apigateway-public-api
40
+ sonarjs/aws-ec2-rds-dms-public
41
+ sonarjs/aws-ec2-unencrypted-ebs-volume
42
+ sonarjs/aws-efs-unencrypted
43
+ sonarjs/aws-iam-all-privileges
44
+ sonarjs/aws-iam-privilege-escalation
45
+ sonarjs/aws-iam-public-access
46
+ sonarjs/aws-opensearchservice-domain
47
+ sonarjs/aws-rds-unencrypted-databases
48
+ sonarjs/aws-restricted-ip-admin-access
49
+ sonarjs/aws-s3-bucket-granted-access
50
+ sonarjs/aws-s3-bucket-insecure-http
51
+ sonarjs/aws-s3-bucket-public-access
52
+ sonarjs/aws-s3-bucket-versioning
53
+ sonarjs/aws-sagemaker-unencrypted-notebook
54
+ sonarjs/aws-sns-unencrypted-topics
55
+ sonarjs/aws-sqs-unencrypted-queue
56
+ sonarjs/call-argument-line
57
+ sonarjs/chai-determinate-assertion
58
+ sonarjs/class-name
59
+ sonarjs/code-eval
60
+ sonarjs/cognitive-complexity
61
+ sonarjs/comma-or-logical-or-case
62
+ sonarjs/constructor-for-side-effects
63
+ sonarjs/content-length
64
+ sonarjs/content-security-policy
65
+ sonarjs/cookie-no-httponly
66
+ sonarjs/cors
67
+ sonarjs/csrf
68
+ sonarjs/disabled-timeout
69
+ sonarjs/dynamically-constructed-templates
70
+ sonarjs/encryption-secure-mode
71
+ sonarjs/explicit-test-skip
72
+ sonarjs/file-permissions
73
+ sonarjs/file-uploads
74
+ sonarjs/fixme-tag
75
+ sonarjs/for-loop-increment-sign
76
+ sonarjs/function-inside-loop
77
+ sonarjs/future-reserved-words
78
+ sonarjs/generator-without-yield
79
+ sonarjs/hardcoded-secret-signatures
80
+ sonarjs/hashing
81
+ sonarjs/hooks-before-test-cases
82
+ sonarjs/inconsistent-function-call
83
+ sonarjs/insecure-cookie
84
+ sonarjs/insecure-jwt-token
85
+ sonarjs/inverted-assertion-arguments
86
+ sonarjs/label-position
87
+ sonarjs/link-with-target-blank
88
+ sonarjs/max-switch-cases
89
+ sonarjs/memoize-cache-key
90
+ sonarjs/misplaced-loop-counter
91
+ sonarjs/no-all-duplicated-branches
92
+ sonarjs/no-angular-bypass-sanitization
93
+ sonarjs/no-case-label-in-switch
94
+ sonarjs/no-clear-text-protocols
95
+ sonarjs/no-code-after-done
96
+ sonarjs/no-dead-store
97
+ sonarjs/no-debug-commands-in-ui-tests
98
+ sonarjs/no-default-utility-imports
99
+ sonarjs/no-duplicate-in-composite
100
+ sonarjs/no-duplicate-test-title
101
+ sonarjs/no-duplicated-branches
102
+ sonarjs/no-element-overwrite
103
+ sonarjs/no-empty-collection
104
+ sonarjs/no-empty-test-file
105
+ sonarjs/no-empty-test-title
106
+ sonarjs/no-equals-in-for-termination
107
+ sonarjs/no-exclusive-tests
108
+ sonarjs/no-extra-arguments
109
+ sonarjs/no-fixed-wait-in-tests
110
+ sonarjs/no-floating-point-equality
111
+ sonarjs/no-forced-browser-interaction
112
+ sonarjs/no-global-this
113
+ sonarjs/no-globals-shadowing
114
+ sonarjs/no-gratuitous-expressions
115
+ sonarjs/no-hardcoded-ip
116
+ sonarjs/no-hardcoded-passwords
117
+ sonarjs/no-hardcoded-secrets
118
+ sonarjs/no-hook-setter-in-body
119
+ sonarjs/no-identical-conditions
120
+ sonarjs/no-identical-expressions
121
+ sonarjs/no-identical-functions
122
+ sonarjs/no-ignored-exceptions
123
+ sonarjs/no-implicit-global
124
+ sonarjs/no-incomplete-assertions
125
+ sonarjs/no-internal-api-use
126
+ sonarjs/no-interpolation-in-inline-snapshots
127
+ sonarjs/no-invariant-returns
128
+ sonarjs/no-inverted-boolean-check
129
+ sonarjs/no-literal-call
130
+ sonarjs/no-mime-sniff
131
+ sonarjs/no-mixed-completion-style
132
+ sonarjs/no-nested-assignment
133
+ sonarjs/no-nested-conditional
134
+ sonarjs/no-nested-functions
135
+ sonarjs/no-nested-template-literals
136
+ sonarjs/no-os-command-from-path
137
+ sonarjs/no-parameter-reassignment
138
+ sonarjs/no-primitive-wrappers
139
+ sonarjs/no-redundant-assignments
140
+ sonarjs/no-redundant-boolean
141
+ sonarjs/no-redundant-jump
142
+ sonarjs/no-referrer-policy
143
+ sonarjs/no-same-argument-assert
144
+ sonarjs/no-same-line-conditional
145
+ sonarjs/no-session-cookies-on-static-assets
146
+ sonarjs/no-skipped-tests
147
+ sonarjs/no-table-as-layout
148
+ sonarjs/no-trivial-assertions
149
+ sonarjs/no-unenclosed-multiline-block
150
+ sonarjs/no-uniq-key
151
+ sonarjs/no-unthrown-error
152
+ sonarjs/no-unused-collection
153
+ sonarjs/no-use-of-empty-return-value
154
+ sonarjs/no-useless-increment
155
+ sonarjs/no-useless-react-setstate
156
+ sonarjs/no-weak-cipher
157
+ sonarjs/no-weak-keys
158
+ sonarjs/non-existent-operator
159
+ sonarjs/object-alt-content
160
+ sonarjs/parameterized-tests
161
+ sonarjs/prefer-default-last
162
+ sonarjs/prefer-native-lodash-alternative
163
+ sonarjs/prefer-promise-shorthand
164
+ sonarjs/prefer-single-boolean-return
165
+ sonarjs/prefer-specific-assertions
166
+ sonarjs/prefer-type-guard
167
+ sonarjs/prefer-while
168
+ sonarjs/production-debug
169
+ sonarjs/pseudo-random
170
+ sonarjs/public-static-readonly
171
+ sonarjs/publicly-writable-directories
172
+ sonarjs/redundant-type-aliases
173
+ sonarjs/review-blockchain-mnemonic
174
+ sonarjs/session-regeneration
175
+ sonarjs/stable-tests
176
+ sonarjs/stateful-regex
177
+ sonarjs/strict-transport-security
178
+ sonarjs/super-linear-regex
179
+ sonarjs/synchronous-suite-callback
180
+ sonarjs/table-header
181
+ sonarjs/table-header-reference
182
+ sonarjs/test-check-exception
183
+ sonarjs/todo-tag
184
+ sonarjs/unverified-certificate
185
+ sonarjs/unverified-hostname
186
+ sonarjs/updated-const-var
187
+ sonarjs/updated-loop-counter
188
+ sonarjs/use-type-alias
189
+ sonarjs/weak-ssl
190
+ sonarjs/x-powered-by
191
+ sonarjs/xml-parser-xxe
192
+ ```
193
+
194
+ ## Future Compiler Upgrades
195
+
196
+ The compatibility projection has been removed. Reconsider TypeScript 7 only when
197
+ the complete published lint stack supports its compiler API. Keep coverage
198
+ explicit; do not label a removed check as preserved merely because a similarly
199
+ named rule exists.
package/README.md CHANGED
@@ -197,8 +197,22 @@ OpenCode 2.x CLI plugins are global terminal settings; there is no project-local
197
197
  plugin overrides are required. OpenCode validates `cli.json` strictly, so keep it
198
198
  within the linked schema and restart OpenCode after changing it.
199
199
 
200
- OpenCode 2.1's built-in Todo tool is opt-in. Enable it in the OpenCode server
201
- configuration used by that host, then restart OpenCode:
200
+ OpenCode 2's built-in Todo tool is opt-in. When its effective configuration
201
+ disables the tool, Navigator offers **Enable Todo…** in the section and
202
+ **Enable native Todo** in the command palette. Choose an existing discovered
203
+ server configuration file, review `experimental.todo → true`, then confirm
204
+ **Enable Todo**. Cancel and Escape preserve the file. Navigator retains JSONC
205
+ comments, formatting and unrelated settings, and checks for changed files,
206
+ configuration sources, sessions and workspaces before writing.
207
+
208
+ The check uses the host configuration, not the presence or absence of tasks.
209
+ An enabled empty list therefore says **No tasks yet** without another enable
210
+ offer. Configuration read failures have their own Retry action. Remote file
211
+ operations stay on the connected server; no model or Todo mutation is used for
212
+ setup. Refresh or restart OpenCode if a saved flag has not yet been applied.
213
+ See [Host API boundaries](HOST_API.md) for precedence and conditional-write limits.
214
+
215
+ Alternatively, enable the tool manually in the server configuration used by that host:
202
216
 
203
217
  ```json
204
218
  {
@@ -216,6 +230,10 @@ completed list visible; a completed write with an empty array clears it.
216
230
  Native tasks have `content` and one of `pending`, `in_progress`, `completed`, or
217
231
  `cancelled`; priorities remain unavailable in OpenCode 2's native schema.
218
232
 
233
+ ![Disabled native Todo offers enablement](screenshots/84-native-todo-disabled.png)
234
+
235
+ ![Review the server configuration change before enabling Todo](screenshots/86-native-todo-enable-preview.png)
236
+
219
237
  The optional **server** half of Navigator is used for provider-native quotas and
220
238
  read-only access to the previous Navigator Todo archive. Add it to the server
221
239
  configuration only when those integrations are needed:
@@ -349,9 +367,13 @@ opencode
349
367
  OpenCode reads TUI configuration at startup. Restart it after changing the
350
368
  plugin or `tui.json`.
351
369
 
352
- On first launch, a seven-step setup wizard introduces monitoring, Search Everything,
353
- Skills, Quick Actions, LSP, MCP controls, presets, and workspace customization
354
- before letting you choose which sections to show. The guide is shown once and can be opened again
370
+ On first launch, a seven-step setup wizard introduces monitoring and native Todo
371
+ enablement, provider/account limits, Search Everything and Skills, Actions and
372
+ private toolbar pins, host-supported language tools, MCP, and customization.
373
+ It includes About, release history and Bug reports before the final section picker.
374
+ Descriptions match each host's permissions/LSP capabilities. Long content and
375
+ section choices scroll with the mouse or PageUp/PageDown while headings and
376
+ Back/Next/Finish stay visible. The guide is shown once and can be opened again
355
377
  later from the sidebar settings button. The settings dialog also selects global
356
378
  or current-worktree scope, manages named layout presets, and controls section
357
379
  order, MCP state persistence, icon style, and the sidebar shortcuts without
@@ -359,6 +381,8 @@ a restart. Settings are grouped into tabs; use `Tab` and `Shift+Tab` to switch
359
381
  tabs. In the Sections tab, use `Left`/`Right` or `Shift+Up`/`Shift+Down` to
360
382
  reorder the selected section.
361
383
 
384
+ ![Setup navigation remains visible in a short terminal](screenshots/94-setup-short.png)
385
+
362
386
  The Sections tab combines visibility, ordering, and the number of visible items
363
387
  for each section. Click `Items: All` / `Items: N`, or press `L` on the selected
364
388
  section, to edit its item limit. Enter toggles visibility; the arrow controls
@@ -912,9 +936,11 @@ tasks before pending tasks. Finished contains separate Completed and Cancelled
912
936
  groups. The selected view is temporary and resets to All when changing sessions.
913
937
  The header always reports completed tasks against the full task count.
914
938
 
915
- Subagents show observed run duration, retry countdowns, and execution errors. An
916
- already-running child discovered by the sidebar uses a clock icon (`~` in Text
917
- fallback) because its exact start time is unknown. Recent keeps the last 10 observed
939
+ Subagents show run duration, retry countdowns, and execution errors. OpenCode 2
940
+ uses its public execution-start timestamp for exact active durations, including
941
+ children already running when Navigator opens. Missing or invalid native timing
942
+ and OpenCode 1 retain observed durations. An already-running child whose exact
943
+ start is unknown has a clock icon (`~` in Text fallback). Recent keeps the last 10 observed
918
944
  finished runs per parent session in memory across navigation, until OpenCode exits.
919
945
  An idle transition is labelled Finished, not a guarantee of successful task
920
946
  completion; errors and cancellations retain their own labels. A worker timeout
@@ -950,7 +976,8 @@ session or workspace dismisses the entire search dialog chain.
950
976
 
951
977
  ## Scripts
952
978
 
953
- Development requires Bun 1.4.2 and Node.js 24.16 or newer. Install dependencies with
979
+ Development uses Bun 1.4.4 and stable TypeScript 6.0.3. Standalone Node/OpenTUI paths
980
+ require Node.js 26.4 or newer; CI pins Node 26.12.1. Install dependencies with
954
981
  `bun install --frozen-lockfile`.
955
982
 
956
983
  Oxlint uses the `solid-ox` preset from
@@ -959,6 +986,11 @@ Oxlint uses the `solid-ox` preset from
959
986
  OpenTUI callbacks, SDK compatibility, and test fixtures. Type-aware analysis uses
960
987
  `oxlint-tsgolint`; `tsconfig.lint.json` covers application code, tests, build scripts,
961
988
  and configuration files. Formatter exclusions are maintained in `oxfmt.config.ts`.
989
+ The complete version 10 preset includes SonarJS and typescript-eslint checks;
990
+ the former TS7 compatibility projection is removed. See [Lint coverage](LINT_COVERAGE.md)
991
+ for current exceptions and historical exclusions. A tested root-only Bun metadata
992
+ patch corrects the legacy TypeScript 5 peer in OpenTUI's FFI helper for this repo.
993
+ Consumer installations retain upstream metadata; see [Host APIs](HOST_API.md).
962
994
 
963
995
  ```sh
964
996
  bun run test