Skip to content

Update tree-sitter-highlight requirement from 0.24.7 to 0.25.3 - #4

Closed
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/cargo/tree-sitter-highlight-0.25.3
Closed

Update tree-sitter-highlight requirement from 0.24.7 to 0.25.3#4
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/cargo/tree-sitter-highlight-0.25.3

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Mar 10, 2025

Copy link
Copy Markdown
Contributor

Updates the requirements on tree-sitter-highlight to permit the latest version.

Release notes

Sourced from tree-sitter-highlight's releases.

v0.25.3

Bug Fixes

  • Fixed an infinite loop that could happen in some grammars during error recovery if the end of the file was reached.
  • Fixed a parser-generation error where internal character set constants were given external linkage, which could cause linking errors on some platforms if multiple Tree-sitter parsers were linked into the same application.
Commits
  • 2a835ee 0.25.3
  • 3ad1c7d Fix cases where error recovery could infinite loop (#4257) (#4262)
  • b1a7074 fix(generate): mark TSCharacterRange as static (#4255)
  • 6f2dbaa build: do not define _POSIX_C_SOURCE on NetBSD (#4196)
  • 781dc05 ci: separate nightly lints to separate job
  • 1f64036 fix(test): update expected tree-sitter-rust supertypes
  • 4eb46b4 fix(rust): adapt to some new nightly lints
  • d73126d fix(web): provide type in the exports
  • 637a3e1 fix(wasm): restore passing in ERROR to descendantsOfType (#4226)
  • 8b5c63b tree-sitter-language 0.1.5
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Updates the requirements on [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) to permit the latest version.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](tree-sitter/tree-sitter@v0.24.7...v0.25.3)

---
updated-dependencies:
- dependency-name: tree-sitter-highlight
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update Rust code labels Mar 10, 2025
@sinelaw sinelaw closed this Nov 19, 2025
@dependabot @github

dependabot Bot commented on behalf of github Nov 19, 2025

Copy link
Copy Markdown
Contributor Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot
dependabot Bot deleted the dependabot/cargo/tree-sitter-highlight-0.25.3 branch November 19, 2025 06:36
sinelaw pushed a commit that referenced this pull request Mar 6, 2026
Key changes since Feb 26:
- 10 previously triaged issues confirmed CLOSED (including our #1, #2, #4 bug
  priorities and #1 enhancement priority)
- 9 new issues added (#1128-#1202)
- Corrected #716 status (still open, not closed as previously stated)
- Added new duplicate groups: Deno/multi-LSP, C# naming, clipboard/OSC52
- New sections: Packaging/Distribution, Language/Syntax support
- Added velocity tracking table showing triage effectiveness
- #1054 still open but reporter confirmed fix - should be closed

https://claude.ai/code/session_01BsP93dzqKSGyLSbMRZ9LYS
sinelaw pushed a commit that referenced this pull request Apr 4, 2026
Replace direct std::fs::metadata and std::process::Command usage in
check_git_index_mtime / resolve_git_index with the proper traits:

- resolve_git_index: uses ProcessSpawner (works over SSH for remote)
- git index mtime check: uses FileSystem.metadata() in background
  thread alongside directory metadata checks (non-blocking)

This follows CONTRIBUTING.md rules #4 and #5: never use std::fs or
std::process::Command directly — use the FileSystem and ProcessSpawner
traits so features work transparently on remote hosts.

https://claude.ai/code/session_01VxhvsKhfDTK6PjBWUqWjvJ
sinelaw pushed a commit that referenced this pull request Apr 5, 2026
Replace direct std::fs::metadata and std::process::Command usage in
check_git_index_mtime / resolve_git_index with the proper traits:

- resolve_git_index: uses ProcessSpawner (works over SSH for remote)
- git index mtime check: uses FileSystem.metadata() in background
  thread alongside directory metadata checks (non-blocking)

This follows CONTRIBUTING.md rules #4 and #5: never use std::fs or
std::process::Command directly — use the FileSystem and ProcessSpawner
traits so features work transparently on remote hosts.

https://claude.ai/code/session_01VxhvsKhfDTK6PjBWUqWjvJ
sinelaw pushed a commit that referenced this pull request Apr 26, 2026
Bug #4 from DEVCONTAINER_USABILITY_TEST_2026-04-26.md (L171,
High, scoped to the notify half): the spec says
`portsAttributes.<port>.onAutoForward: "notify"` should surface
a notification when the port is auto-forwarded. The plugin read
the attribute (used it for the picker / panel labels) but never
acted on it. Task 3 of the usability report saw a published port
with `notify` configured and got no toast.

Fix: hook the new `authority_changed` event from Bug #1 — when
we transition into `Container:*` mode, run `runAutoForwardSweep`,
which calls `gatherForwardedPortRows` (existing code, queries
`docker port <id>`), filters for entries that are configured AND
bound AND opted into `notify`, and fires
`editor.setStatus(t("status.port_forwarded", ...))` for each.

Track a `notifiedPorts: Set<key>` so the same binding doesn't
re-fire mid-session; clear it on detach so a fresh attach
re-notifies.

Out of scope: actually publishing ports that docker hasn't
already mapped. The spec's "auto-forward" piece — VS Code-style
host-side userspace forwarder — is much larger work and gets a
separate effort. Today the toast fires for ports that ARE
published (via `appPort` / runArgs / external mapping), which
is the visible piece the user complained about.

Test: `auto_forward_notify_fires_for_configured_port`. Drives a
workspace with `forwardPorts: [9000]` + `notify`, sets
`FAKE_DC_PORTS=9000` so the fake docker reports the binding,
attaches via the fake CLI, asserts `Port 9000 forwarded` lands
in the rendered screen.
sinelaw pushed a commit that referenced this pull request Apr 26, 2026
Bug #4 from DEVCONTAINER_USABILITY_TEST_2026-04-26.md (L171,
High, scoped to the notify half): the spec says
`portsAttributes.<port>.onAutoForward: "notify"` should surface
a notification when the port is auto-forwarded. The plugin read
the attribute (used it for the picker / panel labels) but never
acted on it. Task 3 of the usability report saw a published port
with `notify` configured and got no toast.

Fix: hook the new `authority_changed` event from Bug #1 — when
we transition into `Container:*` mode, run `runAutoForwardSweep`,
which calls `gatherForwardedPortRows` (existing code, queries
`docker port <id>`), filters for entries that are configured AND
bound AND opted into `notify`, and fires
`editor.setStatus(t("status.port_forwarded", ...))` for each.

Track a `notifiedPorts: Set<key>` so the same binding doesn't
re-fire mid-session; clear it on detach so a fresh attach
re-notifies.

Out of scope: actually publishing ports that docker hasn't
already mapped. The spec's "auto-forward" piece — VS Code-style
host-side userspace forwarder — is much larger work and gets a
separate effort. Today the toast fires for ports that ARE
published (via `appPort` / runArgs / external mapping), which
is the visible piece the user complained about.

Test: `auto_forward_notify_fires_for_configured_port`. Drives a
workspace with `forwardPorts: [9000]` + `notify`, sets
`FAKE_DC_PORTS=9000` so the fake docker reports the binding,
attaches via the fake CLI, asserts `Port 9000 forwarded` lands
in the rendered screen.
sinelaw pushed a commit that referenced this pull request Apr 27, 2026
Bug #4 from DEVCONTAINER_USABILITY_TEST_2026-04-26.md (L171,
High, scoped to the notify half): the spec says
`portsAttributes.<port>.onAutoForward: "notify"` should surface
a notification when the port is auto-forwarded. The plugin read
the attribute (used it for the picker / panel labels) but never
acted on it. Task 3 of the usability report saw a published port
with `notify` configured and got no toast.

Fix: hook the new `authority_changed` event from Bug #1 — when
we transition into `Container:*` mode, run `runAutoForwardSweep`,
which calls `gatherForwardedPortRows` (existing code, queries
`docker port <id>`), filters for entries that are configured AND
bound AND opted into `notify`, and fires
`editor.setStatus(t("status.port_forwarded", ...))` for each.

Track a `notifiedPorts: Set<key>` so the same binding doesn't
re-fire mid-session; clear it on detach so a fresh attach
re-notifies.

Out of scope: actually publishing ports that docker hasn't
already mapped. The spec's "auto-forward" piece — VS Code-style
host-side userspace forwarder — is much larger work and gets a
separate effort. Today the toast fires for ports that ARE
published (via `appPort` / runArgs / external mapping), which
is the visible piece the user complained about.

Test: `auto_forward_notify_fires_for_configured_port`. Drives a
workspace with `forwardPorts: [9000]` + `notify`, sets
`FAKE_DC_PORTS=9000` so the fake docker reports the binding,
attaches via the fake CLI, asserts `Port 9000 forwarded` lands
in the rendered screen.
sinelaw pushed a commit that referenced this pull request May 12, 2026
…ed stacking)

The original `issue_1_click_stacks_plugin_popup_and_lsp_servers_popup`
test pre-pushed a popup to the buffer-local `active_state().popups`,
which caught one half of the bug. But the embedded `rust-lsp.ts`
plugin's `editor.showActionPopup` actually lands on the editor-wide
`global_popups` stack (`handle_show_action_popup` →
`self.global_popups.show(popup_obj)`). My earlier fix only checked
`active_state().popups`, so:

  - the LSP Servers popup still gets built on `active_state().popups`
    when the click happens
  - the plugin's async-arriving `ShowActionPopup` lands on
    `global_popups` a tick later
  - the user sees two popups for one click

Add `issue_1_plugin_popup_lands_on_global_popups_after_lsp_servers_popup`
that exercises this exact order: call `show_lsp_status_popup` first,
then push a plugin popup via `handle_plugin_command`. Assert the total
across both stacks is 1.

Issue 4 is the "if I click many times this popup sometimes stacks -
dismissing it I see the same popup underneath" report.
`handle_show_action_popup` uses `global_popups.show()` (plain) instead
of `show_or_replace()`, so repeating the same `popup_id` stacks
identical popups. Add `issue_4_repeated_plugin_action_popup_pushes_stack
_instead_of_replace` that pushes three popups with the same id and
asserts only one remains.

Both tests fail today, demonstrating the bugs. The 5 pre-existing
LSP-indicator-click bug tests still pass — these two are additions,
not edits.

Adds `pub fn Editor::global_popups()` as a read-only accessor for
tests; the field itself stays `pub(crate)`.

https://claude.ai/code/session_01EHPvWNSvRrhYffJtRTebB7
sinelaw pushed a commit that referenced this pull request May 12, 2026
…ed stacking)

The original `issue_1_click_stacks_plugin_popup_and_lsp_servers_popup`
test pre-pushed a popup to the buffer-local `active_state().popups`,
which caught one half of the bug. But the embedded `rust-lsp.ts`
plugin's `editor.showActionPopup` actually lands on the editor-wide
`global_popups` stack (`handle_show_action_popup` →
`self.global_popups.show(popup_obj)`). My earlier fix only checked
`active_state().popups`, so:

  - the LSP Servers popup still gets built on `active_state().popups`
    when the click happens
  - the plugin's async-arriving `ShowActionPopup` lands on
    `global_popups` a tick later
  - the user sees two popups for one click

Add `issue_1_plugin_popup_lands_on_global_popups_after_lsp_servers_popup`
that exercises this exact order: call `show_lsp_status_popup` first,
then push a plugin popup via `handle_plugin_command`. Assert the total
across both stacks is 1.

Issue 4 is the "if I click many times this popup sometimes stacks -
dismissing it I see the same popup underneath" report.
`handle_show_action_popup` uses `global_popups.show()` (plain) instead
of `show_or_replace()`, so repeating the same `popup_id` stacks
identical popups. Add `issue_4_repeated_plugin_action_popup_pushes_stack
_instead_of_replace` that pushes three popups with the same id and
asserts only one remains.

Both tests fail today, demonstrating the bugs. The 5 pre-existing
LSP-indicator-click bug tests still pass — these two are additions,
not edits.

Adds `pub fn Editor::global_popups()` as a read-only accessor for
tests; the field itself stays `pub(crate)`.

https://claude.ai/code/session_01EHPvWNSvRrhYffJtRTebB7
sinelaw pushed a commit that referenced this pull request May 12, 2026
…ed stacking)

The original `issue_1_click_stacks_plugin_popup_and_lsp_servers_popup`
test pre-pushed a popup to the buffer-local `active_state().popups`,
which caught one half of the bug. But the embedded `rust-lsp.ts`
plugin's `editor.showActionPopup` actually lands on the editor-wide
`global_popups` stack (`handle_show_action_popup` →
`self.global_popups.show(popup_obj)`). My earlier fix only checked
`active_state().popups`, so:

  - the LSP Servers popup still gets built on `active_state().popups`
    when the click happens
  - the plugin's async-arriving `ShowActionPopup` lands on
    `global_popups` a tick later
  - the user sees two popups for one click

Add `issue_1_plugin_popup_lands_on_global_popups_after_lsp_servers_popup`
that exercises this exact order: call `show_lsp_status_popup` first,
then push a plugin popup via `handle_plugin_command`. Assert the total
across both stacks is 1.

Issue 4 is the "if I click many times this popup sometimes stacks -
dismissing it I see the same popup underneath" report.
`handle_show_action_popup` uses `global_popups.show()` (plain) instead
of `show_or_replace()`, so repeating the same `popup_id` stacks
identical popups. Add `issue_4_repeated_plugin_action_popup_pushes_stack
_instead_of_replace` that pushes three popups with the same id and
asserts only one remains.

Both tests fail today, demonstrating the bugs. The 5 pre-existing
LSP-indicator-click bug tests still pass — these two are additions,
not edits.

Adds `pub fn Editor::global_popups()` as a read-only accessor for
tests; the field itself stays `pub(crate)`.

https://claude.ai/code/session_01EHPvWNSvRrhYffJtRTebB7
sinelaw pushed a commit that referenced this pull request May 26, 2026
…advanced features

Tested: TC-060-065 (command palette full coverage), TC-070-073 (settings/theme/keybinding),
TC-081-085 (binary file, empty file, rapid keys, resize, 12+ tabs), Git Log (55-commit
live preview), Macro recording (F5/F4 workflow), Bookmarks (palette + Alt+N), Markdown
preview (ANSI bold/italic rendering), Review Diff, Live Grep (77 results streaming),
Diagnostics Panel, Smart Home, Position History (Alt+Left), Auto-close brackets,
Surround selection, Duplicate Line, path:line:col palette syntax.

0 new bugs confirmed. Updated knowledge base with Settings UI workflow, keybinding
editor details, macro/bookmark workflows, and binary file handling notes.
Run #5 plan: Large file (100MB+), Theme Editor visual, multi-language syntax highlighting,
code folding, git blame, whitespace indicators.

https://claude.ai/code/session_01Rz2F6gaZfVSf95zNVemcdx
sinelaw pushed a commit that referenced this pull request May 27, 2026
A mouse click on a session row fires `select` with the clicked item's
key (not the list key "sessions"), so the handler ignored it. Accept the
click by also matching the payload's `list_key`, so clicking a row
selects + live-switches it (and the focus event re-arms the dock).

Add e2e: "/"+filter+Enter-returns-to-list (#5/#6), Space multi-select
(#4), and mouse-click-row-then-Space-checks-that-row (#3). Make the
order-stability test deterministic (sibling project dirs under one parent
so the project-path sort is fixed) — the earlier flake was random tempdir
paths, not the dock.
sinelaw pushed a commit that referenced this pull request May 27, 2026
A mouse click on a session row fires `select` with the clicked item's
key (not the list key "sessions"), so the handler ignored it. Accept the
click by also matching the payload's `list_key`, so clicking a row
selects + live-switches it (and the focus event re-arms the dock).

Add e2e: "/"+filter+Enter-returns-to-list (#5/#6), Space multi-select
(#4), and mouse-click-row-then-Space-checks-that-row (#3). Make the
order-stability test deterministic (sibling project dirs under one parent
so the project-path sort is fixed) — the earlier flake was random tempdir
paths, not the dock.
sinelaw pushed a commit that referenced this pull request May 31, 2026
A mouse click on a session row fires `select` with the clicked item's
key (not the list key "sessions"), so the handler ignored it. Accept the
click by also matching the payload's `list_key`, so clicking a row
selects + live-switches it (and the focus event re-arms the dock).

Add e2e: "/"+filter+Enter-returns-to-list (#5/#6), Space multi-select
(#4), and mouse-click-row-then-Space-checks-that-row (#3). Make the
order-stability test deterministic (sibling project dirs under one parent
so the project-path sort is fixed) — the earlier flake was random tempdir
paths, not the dock.
sinelaw pushed a commit that referenced this pull request Jun 3, 2026
…board

The async clipboard paste on master (anchor-based async read so a hung
X11/Wayland owner can't freeze the editor) made the capslock copy/paste
tests race: Ctrl+V kicks off an asynchronous system/OSC52 clipboard read
that never resolves in headless CI, so the assertion runs against the
un-pasted buffer. test_capslock_ctrl_v_pastes failed deterministically in
CI ("hello" vs "hellohello"); the cut/copy siblings are exposed to the
same flake.

Per CONTRIBUTING.md "Testing" #4, drive these through the internal-only
clipboard (set_clipboard_for_test enables internal_only mode) so the real
Ctrl+C/X/V keybinding flow is synchronous and isolated from the host —
the same pattern paste.rs / vi_mode.rs already use. The tests still
exercise the actual capslock+ctrl keybindings; only the clipboard backend
is swapped for the deterministic in-memory one.
sinelaw pushed a commit that referenced this pull request Jun 3, 2026
…board

The async clipboard paste on master (anchor-based async read so a hung
X11/Wayland owner can't freeze the editor) made the capslock copy/paste
tests race: Ctrl+V kicks off an asynchronous system/OSC52 clipboard read
that never resolves in headless CI, so the assertion runs against the
un-pasted buffer. test_capslock_ctrl_v_pastes failed deterministically in
CI ("hello" vs "hellohello"); the cut/copy siblings are exposed to the
same flake.

Per CONTRIBUTING.md "Testing" #4, drive these through the internal-only
clipboard (set_clipboard_for_test enables internal_only mode) so the real
Ctrl+C/X/V keybinding flow is synchronous and isolated from the host —
the same pattern paste.rs / vi_mode.rs already use. The tests still
exercise the actual capslock+ctrl keybindings; only the clipboard backend
is swapped for the deterministic in-memory one.
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…ng infra

After auditing what's actually in the codebase, the entire "non-modal
banner system" line of design was over-engineering. The two reverts
that precede this commit drop the BannerManager code. This commit
brings the doc into alignment so the design story matches what we'll
actually build.

Audit findings, now reflected in the doc:

- The status-bar click chain is wired and production-grade for every
  built-in indicator (LSP, warning, line-ending, encoding, language,
  message, remote): area tracking in `StatusBarLayout`, per-frame
  layout export through `WindowChrome`, click dispatch in
  `handle_click_status_bar`, hover styling. What's *missing* is
  per-token area tracking for plugin-registered status-bar tokens
  (`RegisterStatusBarElement`). That's a small extension to existing
  types, not new infrastructure.
- The existing modal popup primitive is the right surface for our
  project-lifecycle questions, once we fix the *framing*. The trust
  modal already exists fully implemented at `show_workspace_trust_
  popup` — it's just stubbed out at `popup_dialogs.rs:977`. Re-
  enabling it with a concrete body that names the actual
  `executable_content_markers` is a code change, not a primitive
  change.
- Cross-plugin coordination via the existing `action_popup_result`
  broadcast scales fine at the current three-plugin scope.
  Standardizing the popup-id naming convention (`<plugin>:<question>`)
  costs nothing and gives the same ordering / invalidation guarantees
  a managed queue would.
- The split between `trust.json` and per-plugin global state is not
  split-brain — it's different things in different places. No
  unification needed.

Doc edits:

- Principles: replace "Inline beats modal" (#4) with "Ask rarely,
  ask concretely" — and explain the retraction. What users hate
  about modal trust dialogs is abstract framing + bad timing, both
  fixable without dropping modality.
- "What disappears from the user's life": replace "stacked popups,
  inline banners replace popups" with the actual mechanism — the
  existing `WorkspaceTrust` dedup short-circuit becomes the
  convention. Replace "(locked) pill" with "clickable chip that
  re-opens the prompt."
- "Capabilities the editor needs": annotate each capability as
  extension-of-existing or genuinely-new. Add an explicit list of
  things we considered building and rejected (new banner primitive,
  managed popup queue, unified decision store), with the reasoning.
- "Failure modes": "banner fatigue" becomes "popup fatigue," fixed
  by persistent dismissal + content-hash short-circuit.
- "Why the rest of this doc exists": call out the banner-rejection
  decision explicitly so a future reader doesn't re-invent it.
- "Goal of stepping-stone work": drop "modal popups not banners" as
  a difference (we're keeping modal popups in the end-state too).
  Keep the provenance gap and the status-bar-token clickability gap,
  rewrite the trust-modal gap as "re-enable with concrete framing."
- "Path from here to the North Star": completely rewrite. Seven
  capabilities, ranked, with three explicit rejections of things I
  had previously been planning to build. Mirrors the audit findings.

Anchor scenarios in §"What the user sees in the ideal world" now use
`[Popup]` instead of `[Banner]`, reflecting that the surface is the
existing popup primitive with better framing — not a new visual
category. The user-visible end state is unchanged.

https://claude.ai/code/session_019Gm3tj2kLNoQXCTp5Am9EH
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…ng infra

After auditing what's actually in the codebase, the entire "non-modal
banner system" line of design was over-engineering. The two reverts
that precede this commit drop the BannerManager code. This commit
brings the doc into alignment so the design story matches what we'll
actually build.

Audit findings, now reflected in the doc:

- The status-bar click chain is wired and production-grade for every
  built-in indicator (LSP, warning, line-ending, encoding, language,
  message, remote): area tracking in `StatusBarLayout`, per-frame
  layout export through `WindowChrome`, click dispatch in
  `handle_click_status_bar`, hover styling. What's *missing* is
  per-token area tracking for plugin-registered status-bar tokens
  (`RegisterStatusBarElement`). That's a small extension to existing
  types, not new infrastructure.
- The existing modal popup primitive is the right surface for our
  project-lifecycle questions, once we fix the *framing*. The trust
  modal already exists fully implemented at `show_workspace_trust_
  popup` — it's just stubbed out at `popup_dialogs.rs:977`. Re-
  enabling it with a concrete body that names the actual
  `executable_content_markers` is a code change, not a primitive
  change.
- Cross-plugin coordination via the existing `action_popup_result`
  broadcast scales fine at the current three-plugin scope.
  Standardizing the popup-id naming convention (`<plugin>:<question>`)
  costs nothing and gives the same ordering / invalidation guarantees
  a managed queue would.
- The split between `trust.json` and per-plugin global state is not
  split-brain — it's different things in different places. No
  unification needed.

Doc edits:

- Principles: replace "Inline beats modal" (#4) with "Ask rarely,
  ask concretely" — and explain the retraction. What users hate
  about modal trust dialogs is abstract framing + bad timing, both
  fixable without dropping modality.
- "What disappears from the user's life": replace "stacked popups,
  inline banners replace popups" with the actual mechanism — the
  existing `WorkspaceTrust` dedup short-circuit becomes the
  convention. Replace "(locked) pill" with "clickable chip that
  re-opens the prompt."
- "Capabilities the editor needs": annotate each capability as
  extension-of-existing or genuinely-new. Add an explicit list of
  things we considered building and rejected (new banner primitive,
  managed popup queue, unified decision store), with the reasoning.
- "Failure modes": "banner fatigue" becomes "popup fatigue," fixed
  by persistent dismissal + content-hash short-circuit.
- "Why the rest of this doc exists": call out the banner-rejection
  decision explicitly so a future reader doesn't re-invent it.
- "Goal of stepping-stone work": drop "modal popups not banners" as
  a difference (we're keeping modal popups in the end-state too).
  Keep the provenance gap and the status-bar-token clickability gap,
  rewrite the trust-modal gap as "re-enable with concrete framing."
- "Path from here to the North Star": completely rewrite. Seven
  capabilities, ranked, with three explicit rejections of things I
  had previously been planning to build. Mirrors the audit findings.

Anchor scenarios in §"What the user sees in the ideal world" now use
`[Popup]` instead of `[Banner]`, reflecting that the surface is the
existing popup primitive with better framing — not a new visual
category. The user-visible end state is unchanged.

https://claude.ai/code/session_019Gm3tj2kLNoQXCTp5Am9EH
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
)

- cargo fmt for the alignment/ops changes (fmt CI was red).
- Focusing the FILES panel now resets its cursor to the selected row's
  start, so it no longer scrolls horizontally to a long path's end-of-line.

https://claude.ai/code/session_01D1vLAnwKHqmebN9qRQ9E47
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…shift-wheel h-scroll

- #2: opening a comment from the panel in side-by-side now rebuilds the
  composite focused on the comment's hunk (parameterized buildCenterComposite
  with a focus-hunk index) instead of staying at the first hunk — the unified
  cursor jump is inert when the composite is showing.
- #3: comments rail is narrow by default (~15% width; diff/comments split
  0.74 -> 0.82).
- #4: Shift+mouse-wheel over the side-by-side area now pans horizontally —
  handle_horizontal_scroll scrolls the composite's per-pane left_column
  (it only touched the split viewport, which the composite render ignores).
- #1: pin the FILES cursor to the selected row's start on every focus path
  (incl. mouse via buffer_activated), so it can't land horizontally scrolled.

https://claude.ai/code/session_01D1vLAnwKHqmebN9qRQ9E47
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…h-scroll (#4)

- test_review_comments_rail_is_narrow: the COMMENTS header starts past
  column 130 of a 160-col screen (rail ~15%).
- test_review_side_by_side_shift_wheel_scrolls_horizontally: Shift+wheel on
  the composite pans it (rendered content changes from the left-edge state).

(#2 comment-jump and #1 file-focus h-scroll are verified manually in tmux;
the harness can't drive the async comment-jump rebuild / the residual #1
edge reliably.)

https://claude.ai/code/session_01D1vLAnwKHqmebN9qRQ9E47
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
)

- cargo fmt for the alignment/ops changes (fmt CI was red).
- Focusing the FILES panel now resets its cursor to the selected row's
  start, so it no longer scrolls horizontally to a long path's end-of-line.

https://claude.ai/code/session_01D1vLAnwKHqmebN9qRQ9E47
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…shift-wheel h-scroll

- #2: opening a comment from the panel in side-by-side now rebuilds the
  composite focused on the comment's hunk (parameterized buildCenterComposite
  with a focus-hunk index) instead of staying at the first hunk — the unified
  cursor jump is inert when the composite is showing.
- #3: comments rail is narrow by default (~15% width; diff/comments split
  0.74 -> 0.82).
- #4: Shift+mouse-wheel over the side-by-side area now pans horizontally —
  handle_horizontal_scroll scrolls the composite's per-pane left_column
  (it only touched the split viewport, which the composite render ignores).
- #1: pin the FILES cursor to the selected row's start on every focus path
  (incl. mouse via buffer_activated), so it can't land horizontally scrolled.

https://claude.ai/code/session_01D1vLAnwKHqmebN9qRQ9E47
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…h-scroll (#4)

- test_review_comments_rail_is_narrow: the COMMENTS header starts past
  column 130 of a 160-col screen (rail ~15%).
- test_review_side_by_side_shift_wheel_scrolls_horizontally: Shift+wheel on
  the composite pans it (rendered content changes from the left-edge state).

(#2 comment-jump and #1 file-focus h-scroll are verified manually in tmux;
the harness can't drive the async comment-jump rebuild / the residual #1
edge reliably.)

https://claude.ai/code/session_01D1vLAnwKHqmebN9qRQ9E47
sinelaw pushed a commit that referenced this pull request Jun 8, 2026
…ng infra

After auditing what's actually in the codebase, the entire "non-modal
banner system" line of design was over-engineering. The two reverts
that precede this commit drop the BannerManager code. This commit
brings the doc into alignment so the design story matches what we'll
actually build.

Audit findings, now reflected in the doc:

- The status-bar click chain is wired and production-grade for every
  built-in indicator (LSP, warning, line-ending, encoding, language,
  message, remote): area tracking in `StatusBarLayout`, per-frame
  layout export through `WindowChrome`, click dispatch in
  `handle_click_status_bar`, hover styling. What's *missing* is
  per-token area tracking for plugin-registered status-bar tokens
  (`RegisterStatusBarElement`). That's a small extension to existing
  types, not new infrastructure.
- The existing modal popup primitive is the right surface for our
  project-lifecycle questions, once we fix the *framing*. The trust
  modal already exists fully implemented at `show_workspace_trust_
  popup` — it's just stubbed out at `popup_dialogs.rs:977`. Re-
  enabling it with a concrete body that names the actual
  `executable_content_markers` is a code change, not a primitive
  change.
- Cross-plugin coordination via the existing `action_popup_result`
  broadcast scales fine at the current three-plugin scope.
  Standardizing the popup-id naming convention (`<plugin>:<question>`)
  costs nothing and gives the same ordering / invalidation guarantees
  a managed queue would.
- The split between `trust.json` and per-plugin global state is not
  split-brain — it's different things in different places. No
  unification needed.

Doc edits:

- Principles: replace "Inline beats modal" (#4) with "Ask rarely,
  ask concretely" — and explain the retraction. What users hate
  about modal trust dialogs is abstract framing + bad timing, both
  fixable without dropping modality.
- "What disappears from the user's life": replace "stacked popups,
  inline banners replace popups" with the actual mechanism — the
  existing `WorkspaceTrust` dedup short-circuit becomes the
  convention. Replace "(locked) pill" with "clickable chip that
  re-opens the prompt."
- "Capabilities the editor needs": annotate each capability as
  extension-of-existing or genuinely-new. Add an explicit list of
  things we considered building and rejected (new banner primitive,
  managed popup queue, unified decision store), with the reasoning.
- "Failure modes": "banner fatigue" becomes "popup fatigue," fixed
  by persistent dismissal + content-hash short-circuit.
- "Why the rest of this doc exists": call out the banner-rejection
  decision explicitly so a future reader doesn't re-invent it.
- "Goal of stepping-stone work": drop "modal popups not banners" as
  a difference (we're keeping modal popups in the end-state too).
  Keep the provenance gap and the status-bar-token clickability gap,
  rewrite the trust-modal gap as "re-enable with concrete framing."
- "Path from here to the North Star": completely rewrite. Seven
  capabilities, ranked, with three explicit rejections of things I
  had previously been planning to build. Mirrors the audit findings.

Anchor scenarios in §"What the user sees in the ideal world" now use
`[Popup]` instead of `[Banner]`, reflecting that the surface is the
existing popup primitive with better framing — not a new visual
category. The user-visible end state is unchanged.

https://claude.ai/code/session_019Gm3tj2kLNoQXCTp5Am9EH
sinelaw pushed a commit that referenced this pull request Jul 20, 2026
…ead of removing them

CI's Playwright suite caught that removing the mutating POST routes broke the
web-UI E2E tests: the harness drives the editor through `POST /action` (15+
call sites), `/widget`, and `/reset` — the latter has no WebSocket equivalent.
My earlier "nothing uses them" investigation was wrong (it searched for `fetch`
/ uppercase `POST` and missed Playwright's `page.request.post`).

Restore the routes and instead close the CSRF/finding-#3 hole the intended way:
apply the SAME same-origin/Host check as the `/ws` upgrade to every
state-mutating POST (in `serve_request`). A cross-origin browser page sends its
own `Origin` and is rejected; non-browser callers (curl, the Playwright request
API, the parity harness) send no `Origin` and pass, so the routes stay
scriptable. This keeps the Content-Length crash fix (#1), the write-timeout
(#2), the rebinding guard (#4), and the rest intact.

Verified: the full Playwright suite passes locally (149/0), including the
trust-dialog and live-grep-toolbar sections that failed in CI; webui unit tests
and scene_parity pass. Docs updated to describe the gating (not removal).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsqkqerfYQ4A48asmUxDQG
sinelaw pushed a commit that referenced this pull request Jul 20, 2026
…ead of removing them

CI's Playwright suite caught that removing the mutating POST routes broke the
web-UI E2E tests: the harness drives the editor through `POST /action` (15+
call sites), `/widget`, and `/reset` — the latter has no WebSocket equivalent.
My earlier "nothing uses them" investigation was wrong (it searched for `fetch`
/ uppercase `POST` and missed Playwright's `page.request.post`).

Restore the routes and instead close the CSRF/finding-#3 hole the intended way:
apply the SAME same-origin/Host check as the `/ws` upgrade to every
state-mutating POST (in `serve_request`). A cross-origin browser page sends its
own `Origin` and is rejected; non-browser callers (curl, the Playwright request
API, the parity harness) send no `Origin` and pass, so the routes stay
scriptable. This keeps the Content-Length crash fix (#1), the write-timeout
(#2), the rebinding guard (#4), and the rest intact.

Verified: the full Playwright suite passes locally (149/0), including the
trust-dialog and live-grep-toolbar sections that failed in CI; webui unit tests
and scene_parity pass. Docs updated to describe the gating (not removal).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsqkqerfYQ4A48asmUxDQG
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update Rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant