opencode-navigator 0.24.0 → 0.25.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 +5 -0
- package/HOST_API.md +7 -6
- package/LINT_COVERAGE.md +201 -0
- package/README.md +34 -6
- package/dist/native-todo-setup.js +1156 -0
- package/dist/onboarding.js +379 -0
- package/dist/runtime-dependencies.json +3 -3
- package/dist/sidebar-settings.js +278 -540
- package/dist/tui.js +164 -388
- package/package.json +10 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.25.0] - 2026-10-31
|
|
4
|
+
|
|
5
|
+
- 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.
|
|
6
|
+
- 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.
|
|
7
|
+
|
|
3
8
|
## [0.24.0] - 2026-10-31
|
|
4
9
|
|
|
5
10
|
- 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
|
@@ -33,6 +33,7 @@ justify bypassing a native API.
|
|
|
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
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. |
|
|
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
|
+
| 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. |
|
|
36
37
|
| 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. |
|
|
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. |
|
|
@@ -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.1, 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
|
|
|
@@ -68,11 +69,11 @@ renderer/FFI support. CI and package verification use Node 26.12.1.
|
|
|
68
69
|
- `web-tree-sitter` stays at **0.25.10**, the exact peer required by OpenTUI
|
|
69
70
|
0.8.0. 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`
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
- `typescript` is **7.0.2** throughout the resolved project graph. The shared
|
|
73
|
+
preset's legacy compiler dependency is overridden to TS7; its incompatible
|
|
74
|
+
SonarJS and typescript-eslint JS plugins are not loaded. Native replacements,
|
|
75
|
+
retained compatible plugins and the explicitly approved coverage loss are
|
|
76
|
+
documented in [Lint coverage](LINT_COVERAGE.md). No TS6 compatibility copy is used.
|
|
76
77
|
- Bun remains pinned at **1.4.4**, the current stable release. Direct dependencies
|
|
77
78
|
otherwise use their latest compatible stable releases; transitive updates stay
|
|
78
79
|
within upstream ranges. Runtime peers remain host-owned and are not bundled.
|
package/LINT_COVERAGE.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# TypeScript 7 Lint Coverage
|
|
2
|
+
|
|
3
|
+
Project type checking uses stable TypeScript 7. The lockfile resolves every
|
|
4
|
+
TypeScript dependency, including the shared preset's dependency tree, to that
|
|
5
|
+
version. There is no TypeScript 6 compatibility installation.
|
|
6
|
+
|
|
7
|
+
Oxlint uses `@st1ggy/linter-config/solid-ox` with type-aware analysis. Oxfmt uses
|
|
8
|
+
`@st1ggy/linter-config/oxfmt-common`. `scripts/native-lint-config.ts` adapts the
|
|
9
|
+
published preset without editing installed packages. The user explicitly approved
|
|
10
|
+
the uncovered SonarJS checks below after reviewing the TS7 incompatibility.
|
|
11
|
+
|
|
12
|
+
## Preserved Checks
|
|
13
|
+
|
|
14
|
+
- Native ESLint, TypeScript, import and Unicorn rules remain enabled.
|
|
15
|
+
- The compatible Solid, ESLint-core, import-x, stylistic and Unicorn JS plugins
|
|
16
|
+
remain enabled. There is no blanket removal of JS plugins.
|
|
17
|
+
- `typescript-js/array-type` and `typescript-js/prefer-as-const` use their native
|
|
18
|
+
`typescript/` equivalents. The legacy typescript-eslint plugin is not loaded.
|
|
19
|
+
- Six SonarJS checks use native ESLint equivalents: `block-scoped-var`,
|
|
20
|
+
`no-delete-var`, `no-fallthrough`, `no-labels`, `no-unused-vars` and
|
|
21
|
+
`no-useless-catch`. Existing native options take precedence.
|
|
22
|
+
- Oxfmt still checks formatting separately. This migration does not configure
|
|
23
|
+
Stylelint for the CSS-free TUI project.
|
|
24
|
+
|
|
25
|
+
## Approved Coverage Loss
|
|
26
|
+
|
|
27
|
+
The published preset configures 161 SonarJS rule names. Six have the direct
|
|
28
|
+
native mappings above. The following 155 preset checks are not loaded after
|
|
29
|
+
removing the TS6-dependent SonarJS plugin. Some overlap with other retained rules,
|
|
30
|
+
but that is not claimed as complete semantic equivalence. The list includes
|
|
31
|
+
checks for frameworks and services this project does not use; it describes the
|
|
32
|
+
preset, not 155 distinct bugs or applicable findings in Navigator.
|
|
33
|
+
|
|
34
|
+
In particular, native cyclomatic complexity is not a replacement for SonarJS
|
|
35
|
+
cognitive complexity. Identical-function detection, several security/regex
|
|
36
|
+
checks and SonarJS-specific test heuristics lose their dedicated coverage.
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
sonarjs/assertions-in-test-cases
|
|
40
|
+
sonarjs/async-test-assertions
|
|
41
|
+
sonarjs/aws-apigateway-public-api
|
|
42
|
+
sonarjs/aws-ec2-rds-dms-public
|
|
43
|
+
sonarjs/aws-ec2-unencrypted-ebs-volume
|
|
44
|
+
sonarjs/aws-efs-unencrypted
|
|
45
|
+
sonarjs/aws-iam-all-privileges
|
|
46
|
+
sonarjs/aws-iam-privilege-escalation
|
|
47
|
+
sonarjs/aws-iam-public-access
|
|
48
|
+
sonarjs/aws-opensearchservice-domain
|
|
49
|
+
sonarjs/aws-rds-unencrypted-databases
|
|
50
|
+
sonarjs/aws-restricted-ip-admin-access
|
|
51
|
+
sonarjs/aws-s3-bucket-granted-access
|
|
52
|
+
sonarjs/aws-s3-bucket-insecure-http
|
|
53
|
+
sonarjs/aws-s3-bucket-public-access
|
|
54
|
+
sonarjs/aws-s3-bucket-versioning
|
|
55
|
+
sonarjs/aws-sagemaker-unencrypted-notebook
|
|
56
|
+
sonarjs/aws-sns-unencrypted-topics
|
|
57
|
+
sonarjs/aws-sqs-unencrypted-queue
|
|
58
|
+
sonarjs/call-argument-line
|
|
59
|
+
sonarjs/chai-determinate-assertion
|
|
60
|
+
sonarjs/class-name
|
|
61
|
+
sonarjs/code-eval
|
|
62
|
+
sonarjs/cognitive-complexity
|
|
63
|
+
sonarjs/comma-or-logical-or-case
|
|
64
|
+
sonarjs/constructor-for-side-effects
|
|
65
|
+
sonarjs/content-length
|
|
66
|
+
sonarjs/content-security-policy
|
|
67
|
+
sonarjs/cookie-no-httponly
|
|
68
|
+
sonarjs/cors
|
|
69
|
+
sonarjs/csrf
|
|
70
|
+
sonarjs/disabled-timeout
|
|
71
|
+
sonarjs/dynamically-constructed-templates
|
|
72
|
+
sonarjs/encryption-secure-mode
|
|
73
|
+
sonarjs/explicit-test-skip
|
|
74
|
+
sonarjs/file-permissions
|
|
75
|
+
sonarjs/file-uploads
|
|
76
|
+
sonarjs/fixme-tag
|
|
77
|
+
sonarjs/for-loop-increment-sign
|
|
78
|
+
sonarjs/function-inside-loop
|
|
79
|
+
sonarjs/future-reserved-words
|
|
80
|
+
sonarjs/generator-without-yield
|
|
81
|
+
sonarjs/hardcoded-secret-signatures
|
|
82
|
+
sonarjs/hashing
|
|
83
|
+
sonarjs/hooks-before-test-cases
|
|
84
|
+
sonarjs/inconsistent-function-call
|
|
85
|
+
sonarjs/insecure-cookie
|
|
86
|
+
sonarjs/insecure-jwt-token
|
|
87
|
+
sonarjs/inverted-assertion-arguments
|
|
88
|
+
sonarjs/label-position
|
|
89
|
+
sonarjs/link-with-target-blank
|
|
90
|
+
sonarjs/max-switch-cases
|
|
91
|
+
sonarjs/memoize-cache-key
|
|
92
|
+
sonarjs/misplaced-loop-counter
|
|
93
|
+
sonarjs/no-all-duplicated-branches
|
|
94
|
+
sonarjs/no-angular-bypass-sanitization
|
|
95
|
+
sonarjs/no-case-label-in-switch
|
|
96
|
+
sonarjs/no-clear-text-protocols
|
|
97
|
+
sonarjs/no-code-after-done
|
|
98
|
+
sonarjs/no-dead-store
|
|
99
|
+
sonarjs/no-debug-commands-in-ui-tests
|
|
100
|
+
sonarjs/no-default-utility-imports
|
|
101
|
+
sonarjs/no-duplicate-in-composite
|
|
102
|
+
sonarjs/no-duplicate-test-title
|
|
103
|
+
sonarjs/no-duplicated-branches
|
|
104
|
+
sonarjs/no-element-overwrite
|
|
105
|
+
sonarjs/no-empty-collection
|
|
106
|
+
sonarjs/no-empty-test-file
|
|
107
|
+
sonarjs/no-empty-test-title
|
|
108
|
+
sonarjs/no-equals-in-for-termination
|
|
109
|
+
sonarjs/no-exclusive-tests
|
|
110
|
+
sonarjs/no-extra-arguments
|
|
111
|
+
sonarjs/no-fixed-wait-in-tests
|
|
112
|
+
sonarjs/no-floating-point-equality
|
|
113
|
+
sonarjs/no-forced-browser-interaction
|
|
114
|
+
sonarjs/no-global-this
|
|
115
|
+
sonarjs/no-globals-shadowing
|
|
116
|
+
sonarjs/no-gratuitous-expressions
|
|
117
|
+
sonarjs/no-hardcoded-ip
|
|
118
|
+
sonarjs/no-hardcoded-passwords
|
|
119
|
+
sonarjs/no-hardcoded-secrets
|
|
120
|
+
sonarjs/no-hook-setter-in-body
|
|
121
|
+
sonarjs/no-identical-conditions
|
|
122
|
+
sonarjs/no-identical-expressions
|
|
123
|
+
sonarjs/no-identical-functions
|
|
124
|
+
sonarjs/no-ignored-exceptions
|
|
125
|
+
sonarjs/no-implicit-global
|
|
126
|
+
sonarjs/no-incomplete-assertions
|
|
127
|
+
sonarjs/no-internal-api-use
|
|
128
|
+
sonarjs/no-interpolation-in-inline-snapshots
|
|
129
|
+
sonarjs/no-invariant-returns
|
|
130
|
+
sonarjs/no-inverted-boolean-check
|
|
131
|
+
sonarjs/no-literal-call
|
|
132
|
+
sonarjs/no-mime-sniff
|
|
133
|
+
sonarjs/no-mixed-completion-style
|
|
134
|
+
sonarjs/no-nested-assignment
|
|
135
|
+
sonarjs/no-nested-conditional
|
|
136
|
+
sonarjs/no-nested-functions
|
|
137
|
+
sonarjs/no-nested-template-literals
|
|
138
|
+
sonarjs/no-os-command-from-path
|
|
139
|
+
sonarjs/no-parameter-reassignment
|
|
140
|
+
sonarjs/no-primitive-wrappers
|
|
141
|
+
sonarjs/no-redundant-assignments
|
|
142
|
+
sonarjs/no-redundant-boolean
|
|
143
|
+
sonarjs/no-redundant-jump
|
|
144
|
+
sonarjs/no-referrer-policy
|
|
145
|
+
sonarjs/no-same-argument-assert
|
|
146
|
+
sonarjs/no-same-line-conditional
|
|
147
|
+
sonarjs/no-session-cookies-on-static-assets
|
|
148
|
+
sonarjs/no-skipped-tests
|
|
149
|
+
sonarjs/no-table-as-layout
|
|
150
|
+
sonarjs/no-trivial-assertions
|
|
151
|
+
sonarjs/no-unenclosed-multiline-block
|
|
152
|
+
sonarjs/no-uniq-key
|
|
153
|
+
sonarjs/no-unthrown-error
|
|
154
|
+
sonarjs/no-unused-collection
|
|
155
|
+
sonarjs/no-use-of-empty-return-value
|
|
156
|
+
sonarjs/no-useless-increment
|
|
157
|
+
sonarjs/no-useless-react-setstate
|
|
158
|
+
sonarjs/no-weak-cipher
|
|
159
|
+
sonarjs/no-weak-keys
|
|
160
|
+
sonarjs/non-existent-operator
|
|
161
|
+
sonarjs/object-alt-content
|
|
162
|
+
sonarjs/parameterized-tests
|
|
163
|
+
sonarjs/prefer-default-last
|
|
164
|
+
sonarjs/prefer-native-lodash-alternative
|
|
165
|
+
sonarjs/prefer-promise-shorthand
|
|
166
|
+
sonarjs/prefer-single-boolean-return
|
|
167
|
+
sonarjs/prefer-specific-assertions
|
|
168
|
+
sonarjs/prefer-type-guard
|
|
169
|
+
sonarjs/prefer-while
|
|
170
|
+
sonarjs/production-debug
|
|
171
|
+
sonarjs/pseudo-random
|
|
172
|
+
sonarjs/public-static-readonly
|
|
173
|
+
sonarjs/publicly-writable-directories
|
|
174
|
+
sonarjs/redundant-type-aliases
|
|
175
|
+
sonarjs/review-blockchain-mnemonic
|
|
176
|
+
sonarjs/session-regeneration
|
|
177
|
+
sonarjs/stable-tests
|
|
178
|
+
sonarjs/stateful-regex
|
|
179
|
+
sonarjs/strict-transport-security
|
|
180
|
+
sonarjs/super-linear-regex
|
|
181
|
+
sonarjs/synchronous-suite-callback
|
|
182
|
+
sonarjs/table-header
|
|
183
|
+
sonarjs/table-header-reference
|
|
184
|
+
sonarjs/test-check-exception
|
|
185
|
+
sonarjs/todo-tag
|
|
186
|
+
sonarjs/unverified-certificate
|
|
187
|
+
sonarjs/unverified-hostname
|
|
188
|
+
sonarjs/updated-const-var
|
|
189
|
+
sonarjs/updated-loop-counter
|
|
190
|
+
sonarjs/use-type-alias
|
|
191
|
+
sonarjs/weak-ssl
|
|
192
|
+
sonarjs/x-powered-by
|
|
193
|
+
sonarjs/xml-parser-xxe
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Removing The Adapter
|
|
197
|
+
|
|
198
|
+
Replace the compatibility projection when the shared preset offers a TS7-only
|
|
199
|
+
stack with equivalent native rules or compatible public plugin APIs. Keep the
|
|
200
|
+
coverage inventory explicit when upgrading that preset; do not label a removed
|
|
201
|
+
check as preserved merely because a similarly 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
|
|
201
|
-
|
|
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
|
+

|
|
234
|
+
|
|
235
|
+

|
|
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
|
|
353
|
-
|
|
354
|
-
|
|
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
|
+

|
|
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
|
|
@@ -950,7 +974,8 @@ session or workspace dismisses the entire search dialog chain.
|
|
|
950
974
|
|
|
951
975
|
## Scripts
|
|
952
976
|
|
|
953
|
-
Development
|
|
977
|
+
Development uses Bun 1.4.4 and stable TypeScript 7. Standalone Node/OpenTUI paths
|
|
978
|
+
require Node.js 26.4 or newer; CI pins Node 26.12.1. Install dependencies with
|
|
954
979
|
`bun install --frozen-lockfile`.
|
|
955
980
|
|
|
956
981
|
Oxlint uses the `solid-ox` preset from
|
|
@@ -959,6 +984,9 @@ Oxlint uses the `solid-ox` preset from
|
|
|
959
984
|
OpenTUI callbacks, SDK compatibility, and test fixtures. Type-aware analysis uses
|
|
960
985
|
`oxlint-tsgolint`; `tsconfig.lint.json` covers application code, tests, build scripts,
|
|
961
986
|
and configuration files. Formatter exclusions are maintained in `oxfmt.config.ts`.
|
|
987
|
+
The resolved dependency tree contains TS7 only. The approved removal of
|
|
988
|
+
incompatible SonarJS checks and native replacements is documented in
|
|
989
|
+
[Lint coverage](LINT_COVERAGE.md); compatible Solid and other JS checks remain.
|
|
962
990
|
|
|
963
991
|
```sh
|
|
964
992
|
bun run test
|