File ▸ Share… stages a board as a zip and hands it to the system share sheet

Duplicate's own posture — a faithful copy, `.git` the sole exclusion, attachments/comments/trash
carried verbatim — staged to a temp directory (BoardShareStager, ditto-zipped via
DittoZipArchiver) and presented through NSSharingServicePicker (BoardSharePresentation), anchored
to the board window's toolbar or its center. Follows Duplicate/Save as Template's flush-then-
cancellable-copy sequence under the banner's in-progress row (ShareBoardCommand, AppCommands.swift),
menu-validated on focus alone rather than the read-only lock (a share is a read, Print's own
posture) with the one carve-out an open inline title editor still needs. WriteOperation gains
.shareBoard for the banner vocabulary; 11-command-nexus.md's File menu table gains the row.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-09 02:13:54 -04:00
parent 05bbf78926
commit da5d310673
10 changed files with 997 additions and 15 deletions
+10 -5
View File
@@ -186,11 +186,15 @@ struct KanbanApp: App {
IndieAboutCommand(configuration: AboutBox.configuration)
// The File group, in 11-command-nexus.md's own row order: New Card, New Lane, New Board,
// Open, Open Recent , Board Info, Duplicate, Save as Template, Reveal in Finder, Add
// Attachment, then the trash trio and Empty Trash. The board-scoped ones validate against
// the frontmost board through the focus system, so each is simply absent-of-effect when no
// board is in front; New Board and Open Recent are available everywhere, including with no
// window at all. Close is the system's own item no row of ours to add.
// Open, Open Recent , Board Info, Duplicate, Save as Template, Share, Reveal in Finder,
// Add Attachment, then the trash trio and Empty Trash. The board-scoped ones validate
// against the frontmost board through the focus system, so each is simply absent-of-effect
// when no board is in front; New Board and Open Recent are available everywhere, including
// with no window at all. Close is the system's own item no row of ours to add.
//
// **Share joined 2026-08-09** (design ruling, card 72691b11) right after Save as
// Template: the third command in a row that copies the whole board wholesale, each to a
// different destination a sibling folder, the templates store, or a share sheet.
CommandGroup(after: .newItem) {
BoardCreationCommands()
NewBoardCommand(appModel: appModel)
@@ -212,6 +216,7 @@ struct KanbanApp: App {
DuplicateBoardCommand(appModel: appModel)
SaveAsTemplateCommand(appModel: appModel)
ShareBoardCommand(appModel: appModel)
RevealInFinderCommand()
AddAttachmentCommand()
AddCommentCommand()