Build the menu bar per the Command Nexus

Nexus parity, audited row by row (11-command-nexus.md § Menu commands) —
every already-built item's title, chord, and placement matched exactly;
this pass fills what remained:

- The future-window rows, present with stable titles and validation-driven
  disablement until their milestones fill the actions: Save as Template
  (m9), Add Attachment… ⇧⌘A, Find Next/Previous ⌘G/⇧⌘G, the View-menu
  card triplet Edit Body ⌘E / Raw Source ⌥⌘E / History (m6), Board ▸
  Pull/Push (git milestones) — one shared disabled-row shape in
  FutureCommands.swift so later milestones only flip validation.
- No Print story in v1: the print group is removed.
- Help carries the Nexus's one remap-teaching line — Customize Keyboard
  Shortcuts…, opening System Settings' Keyboard ▸ Shortcuts extension
  directly (the modern extension URL, verified to launch the appex).
- The launch-restore decision now runs through a pure, tested
  AppModel.shouldRestoreAtLaunch gate; the Settings pane's caption rides a
  proper Form section footer.

904 unit tests.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
2026-07-27 23:28:22 -04:00
parent cf87b72092
commit c1f304d3fe
5 changed files with 233 additions and 26 deletions
+20
View File
@@ -300,4 +300,24 @@ struct AppModelTests {
model.storeRegistry.release(try #require(model.session(for: ref)?.store))
}
// MARK: Launch restoration
/// App Settings's "Restore open boards at launch" (11-command-nexus.md) gates the flagged set
/// by AND, not by either half alone: the preference off never restores even with boards flagged
/// (a user who turned it off gets welcome, full stop), and the preference on restores nothing when
/// there is nothing flagged (an ordinary first launch, which shows welcome exactly as it always
/// has, not an empty restoration pass).
@Test(
"The launch-restoration gate is the preference AND something to restore",
arguments: [
(preference: true, hasRestorables: true, expected: true),
(preference: true, hasRestorables: false, expected: false),
(preference: false, hasRestorables: true, expected: false),
(preference: false, hasRestorables: false, expected: false),
]
)
func launchRestorationGate(preference: Bool, hasRestorables: Bool, expected: Bool) {
#expect(AppModel.shouldRestoreAtLaunch(preference: preference, hasRestorables: hasRestorables) == expected)
}
}