fix: make the template workflow real, and the UI legible #19

Merged
nvrl merged 1 commits from feat/finishing-pass into main 2026-09-05 05:05:59 +02:00
Owner

The headline flow — fill a config from its template — did not work. Three
bugs, each individually enough to make the tool feel unfinished:

  • add_missing was unreachable. find_binding returned the first match in
    a linear array and edit_append was also bound to a, 17 entries earlier.
    Bindings now resolve through one table built from the config, and
    KeybindsConfig::conflicts() reports any key bound twice instead of
    letting one silently shadow the other. add_missing moves to <Space>,
    with A to take every missing default at once.
  • Item status was ignored on write. Every writer fell back to
    template_value, so "(missing)" keys landed in the output regardless and
    saving was close to a copy. Unaccepted entries are now omitted.
  • Parse errors were swallowed, then the good file was overwritten. A
    malformed target opened as an empty editor and :w truncated it. Parse
    failures are now fatal, reported with context, before the TUI starts.

Also:

  • Split "differs from the template" (ItemStatus::Overridden) from "you
    edited this" (ConfigItem::dirty). A real config differs from its example
    on nearly every line, so the old Modified flag painted the whole list
    orange and carried no signal.
  • Splice template-only entries in at their natural position instead of
    appending them, so a missing nested key no longer strands itself at the
    bottom of the tree at depth 3.
  • Preserve .env comments and blank lines across a save.
  • Header naming the output file and the template it is compared against,
    plus missing/changed counts. Previously nothing on screen said which
    files were in play or where :w would write.
  • ? opens a two-column keybinding reference built from the user's own
    config, scrollable on short terminals. The status bar drops to a few
    contextual hints; the old one joined 11+ hints into an unwrapped line
    that truncated at 80 columns.
  • Foldable groups, which the + prefix had always implied.
  • Search covers values as well as keys, reports match n/m, and Esc
    restores the pre-search cursor.
  • Quitting with unsaved changes is refused; added :q!, :x, :w <path>.
  • Status messages expire after 4s instead of permanently replacing hints.
  • Cancelling a rename on a just-created item removes it again.
  • Editing a Number field with text demotes the type instead of failing
    obscurely at write time.
  • Undo-tree branches are reachable via g-/g+ and reported on undo.
  • Poll instead of blocking, so resizes repaint; drop the unused mouse
    capture that was costing terminal text selection for nothing.
  • --format accepts xml, ini and properties, which were already supported.

36 tests, up from 13.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01C5mrbEFmwv2A4cdzbcSiS1

The headline flow — fill a config from its template — did not work. Three bugs, each individually enough to make the tool feel unfinished: - `add_missing` was unreachable. `find_binding` returned the first match in a linear array and `edit_append` was also bound to `a`, 17 entries earlier. Bindings now resolve through one table built from the config, and `KeybindsConfig::conflicts()` reports any key bound twice instead of letting one silently shadow the other. `add_missing` moves to `<Space>`, with `A` to take every missing default at once. - Item status was ignored on write. Every writer fell back to `template_value`, so "(missing)" keys landed in the output regardless and saving was close to a copy. Unaccepted entries are now omitted. - Parse errors were swallowed, then the good file was overwritten. A malformed target opened as an empty editor and `:w` truncated it. Parse failures are now fatal, reported with context, before the TUI starts. Also: - Split "differs from the template" (ItemStatus::Overridden) from "you edited this" (ConfigItem::dirty). A real config differs from its example on nearly every line, so the old Modified flag painted the whole list orange and carried no signal. - Splice template-only entries in at their natural position instead of appending them, so a missing nested key no longer strands itself at the bottom of the tree at depth 3. - Preserve .env comments and blank lines across a save. - Header naming the output file and the template it is compared against, plus missing/changed counts. Previously nothing on screen said which files were in play or where `:w` would write. - `?` opens a two-column keybinding reference built from the user's own config, scrollable on short terminals. The status bar drops to a few contextual hints; the old one joined 11+ hints into an unwrapped line that truncated at 80 columns. - Foldable groups, which the `+ ` prefix had always implied. - Search covers values as well as keys, reports `match n/m`, and `Esc` restores the pre-search cursor. - Quitting with unsaved changes is refused; added `:q!`, `:x`, `:w <path>`. - Status messages expire after 4s instead of permanently replacing hints. - Cancelling a rename on a just-created item removes it again. - Editing a Number field with text demotes the type instead of failing obscurely at write time. - Undo-tree branches are reachable via `g-`/`g+` and reported on undo. - Poll instead of blocking, so resizes repaint; drop the unused mouse capture that was costing terminal text selection for nothing. - `--format` accepts xml, ini and properties, which were already supported. 36 tests, up from 13. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C5mrbEFmwv2A4cdzbcSiS1
nvrl added 1 commit 2026-09-05 05:05:43 +02:00
fix: make the template workflow real, and the UI legible
Version Check / check-version (pull_request) Successful in 10s
e8634c17a2
The headline flow — fill a config from its template — did not work. Three
bugs, each individually enough to make the tool feel unfinished:

- `add_missing` was unreachable. `find_binding` returned the first match in
  a linear array and `edit_append` was also bound to `a`, 17 entries earlier.
  Bindings now resolve through one table built from the config, and
  `KeybindsConfig::conflicts()` reports any key bound twice instead of
  letting one silently shadow the other. `add_missing` moves to `<Space>`,
  with `A` to take every missing default at once.
- Item status was ignored on write. Every writer fell back to
  `template_value`, so "(missing)" keys landed in the output regardless and
  saving was close to a copy. Unaccepted entries are now omitted.
- Parse errors were swallowed, then the good file was overwritten. A
  malformed target opened as an empty editor and `:w` truncated it. Parse
  failures are now fatal, reported with context, before the TUI starts.

Also:

- Split "differs from the template" (ItemStatus::Overridden) from "you
  edited this" (ConfigItem::dirty). A real config differs from its example
  on nearly every line, so the old Modified flag painted the whole list
  orange and carried no signal.
- Splice template-only entries in at their natural position instead of
  appending them, so a missing nested key no longer strands itself at the
  bottom of the tree at depth 3.
- Preserve .env comments and blank lines across a save.
- Header naming the output file and the template it is compared against,
  plus missing/changed counts. Previously nothing on screen said which
  files were in play or where `:w` would write.
- `?` opens a two-column keybinding reference built from the user's own
  config, scrollable on short terminals. The status bar drops to a few
  contextual hints; the old one joined 11+ hints into an unwrapped line
  that truncated at 80 columns.
- Foldable groups, which the `+ ` prefix had always implied.
- Search covers values as well as keys, reports `match n/m`, and `Esc`
  restores the pre-search cursor.
- Quitting with unsaved changes is refused; added `:q!`, `:x`, `:w <path>`.
- Status messages expire after 4s instead of permanently replacing hints.
- Cancelling a rename on a just-created item removes it again.
- Editing a Number field with text demotes the type instead of failing
  obscurely at write time.
- Undo-tree branches are reachable via `g-`/`g+` and reported on undo.
- Poll instead of blocking, so resizes repaint; drop the unused mouse
  capture that was costing terminal text selection for nothing.
- `--format` accepts xml, ini and properties, which were already supported.

36 tests, up from 13.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C5mrbEFmwv2A4cdzbcSiS1
nvrl merged commit 4c59e6edaa into main 2026-09-05 05:05:59 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: nvrl/mould-rs#19