Skip to content

settings: file manager parity, macOS removal, unsaved-changes guard - #20

Merged
seraphx2 merged 4 commits into
mainfrom
dev
Sep 13, 2026
Merged

seraphx2 merged 4 commits into
mainfrom
dev

Conversation

@seraphx2

Copy link
Copy Markdown
Owner

devmain for the next release (4 commits since v2026.911.1).

What ships

  • File manager gets Terminal's full treatment (a8cbea2) — detect →
    pin → custom-template, mirroring the existing Terminal picker. Expanded
    programs.filemanager candidates (Directory Opus, Total Commander,
    Explorer++, Q-Dir, FreeCommander on Windows; several Linux file managers).
    Terminal's Auto now also honors an explicit "Console Host" choice in
    Windows' own default-terminal setting instead of forcing wt.exe open
    against it. Settings' Terminal/File manager/Shell pickers, and the Run
    command shell picker, now name the concrete program/shell Auto/Default
    actually resolves to instead of a vague "first available" label.
    macOS support is removed entirely — this project never targets it;
    see the new CLAUDE.md for the standing directive and architecture notes.
  • Repo-list Enter opens the action menu directly (c6ec872) — Tab and
    Ctrl+Enter are unbound on the repo list; arrows + Enter now cover the
    whole flow. The default-action config concept (universal.default,
    RuleAction.default, the Settings "default" badge) is removed from the
    schema entirely rather than just routed around — a breaking change for
    any rules.yaml setting it. Also fixes a real bug: RunCommand's Escape
    handler didn't stop event propagation, so one Escape press could bubble
    to the window-level handler and step back twice, landing on the repo
    list instead of the action menu.
  • "Index installed apps" now actually disables the > scope (b153916)
    — unchecking it used to only gate the backend enumeration; typing > or
    pressing the app-launcher hotkey still worked, just showed nothing. Both
    are now fully inert when disabled, and the hotkey is claimed/released to
    match. Also fixes a bug where the "Save settings and re-enumerate
    installed apps now" button never told the frontend to refresh its cached
    apps.enabled, so the fix above could appear not to take effect.
  • Settings guards against losing unsaved edits (79345d4) — Save is
    disabled until something's changed; a Cancel button appears next to it
    once dirty and reverts every field locally. Leaving while dirty is
    blocked from every exit path (← button, Esc, the mouse back-button), with
    a brief shake on the Save/Cancel bar instead of silently discarding edits.

Not addressed here

GitHub's Dependabot flagged one moderate-severity advisory on this push —
unrelated to this branch's changes, not investigated as part of this PR.

seraphx2 and others added 4 commits September 12, 2026 23:08
…acOS

File manager now follows the same detect -> pin -> custom-template pattern
Terminal already had: expanded programs.filemanager candidates (Directory
Opus, Total Commander, Explorer++, Q-Dir, FreeCommander on Windows; several
Linux file managers), a Settings picker, and a filemanager_template escape
hatch for one that needs more than a bare path arg.

Terminal's Auto now also honors an explicit "Console Host" choice in
Windows' own default-terminal setting (HKCU\Console\%%Startup) instead of
forcing wt.exe open against it, falling back to running the shell directly
when nothing else resolves.

Settings' Terminal/File manager/Shell pickers, and the Run command shell
picker, now name the concrete program or shell Auto/Default actually
resolves to instead of a vague "first available" / "default" label -
pick_terminal_binary and default_shell are extracted so the preview uses
the exact same resolution logic as the real thing, not an approximation.

Settings layout: fix the custom-template input overflowing its row and
pushing Shell onto the next line; Terminal/Shell/File manager columns are
now equal-width and share the row.

Remove macOS-specific code, config, and docs entirely - this project never
targets it. Add CLAUDE.md recording that directive plus commands and
architecture notes for future sessions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Enter on the repo list now always opens the action menu; Tab/Ctrl+Enter are
unbound there entirely rather than kept as a redundant alias - one less key
to reach for, arrows + Enter cover the whole flow now.

Removed the default-action feature completely rather than just routing
around it: Action.default, RuleAction.default, UniversalConfig.default,
UniversalPatch.default, and UniversalStatus.default are gone from the Rust
side, the matching fields from the frontend types, universal.default from
default_config.yaml and the rules_template.yaml scaffold, the "default"
badge in Settings' config trace viewer, and the docs describing any of it
(README's keybinding table and footer hints, rules-engine.md's field
reference and recipe). This is a breaking change for any rules.yaml that
set universal.default or default: true - it's silently ignored now.

Also fixes a real bug found along the way: RunCommand's Escape handler
didn't stop event propagation, so a single Escape press bubbled to the
window-level handler after the mode had already flipped to "action-menu",
which then applied its own Escape handling on the same keystroke and
stepped back a second time straight to the repo list.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Unchecking "Index installed apps" only gated the backend enumeration
before - the > scope itself stayed reachable (typing >, the placeholder
hint, the dedicated app-launcher hotkey) and just showed nothing, which
reads as broken rather than off.

- App.svelte: appScope now also requires the live apps.enabled flag, so
  typing > does nothing and the placeholder drops its "> for apps" hint
  when disabled.
- lib.rs: the app-launcher hotkey is no longer registered at startup when
  apps.enabled is false.
- commands.rs: save_config now tracks the hotkey's actual registered state
  as (accelerator set) && (feature enabled) instead of just comparing
  accelerator strings, so toggling the checkbox alone - without touching
  the hotkey itself - correctly claims/releases it.
- Settings.svelte: added a note under the checkbox explaining the hotkey
  won't work either when it's off, and cursor-pointer on all three
  checkbox+label pairs in Settings (they never had it).

Also fixes a real bug found while verifying this: saveAndRescanApps() -
the "Save settings and re-enumerate installed apps now" button right next
to the checkbox - persisted to disk and re-registered the hotkey correctly
but never called onsaved(), so App.svelte's cached copy of apps.enabled
never refreshed and the > gating stuck at whatever it was on last load.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Settings now tracks a snapshot of every field Save actually persists
(everything except hotkey/apps_hotkey/autostart, which already commit
immediately on their own) and compares it against the last-loaded/saved
values to compute a dirty flag:

- Save is disabled until something's actually changed; a Cancel button
  appears next to it once dirty and reverts every field to the last-saved
  config without a round-trip (just re-runs applyConfig against the config
  object saved from the last load/save).
- Leaving while dirty is blocked from every exit path, not just the back
  arrow - Escape and the mouse back-button call backToList() directly in
  App.svelte, bypassing this component entirely, so the dirty flag is
  surfaced to the parent via an ondirtychange callback and the blocked
  attempt triggers a brief shake on the Save/Cancel bar via an exported
  nudge() method (bind:this) instead of silently discarding edits.
- persist() now captures saveConfig()'s authoritative response and
  reapplies it via applyConfig(), so the dirty baseline always reflects
  what the server actually persisted rather than trusting local state.

Also added cursor-pointer to every dropdown across Settings and
RunCommand, and fixed two clippy::unnecessary_closures the apps-hotkey
gating change upstream of this introduced (bool::then -> then_some).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@seraphx2
seraphx2 merged commit e4f8d22 into main Sep 13, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant