The pasteboard UTType constants become edition twins — Pro stops claiming ownership it doesn't have
Latent since the m7 split: base's Info.plist exports the three family pasteboard types (cards, lanes, clipboard) and Pro's imports them, but the shared constants declared all three UTType(exportedAs:) — a claim of ownership the system checks against the running app's plist. In Pro that claim is false, and the first touch (the clipboard type, via the launch sweep) raised a runtime fault that blocked board loading under the debugger. EditionAbout's twin-file pattern, applied to an initializer: the constants move to Kanban/App/EditionTypes.swift (exportedAs) with a KanbanPro/Edition/EditionTypes.swift twin (importedAs, identifiers verbatim); project.yml excludes base's copy from Pro. Type identity is the string, so payloads cross editions unchanged. Verified: Pro fixture launch opens the board with zero UTI warnings; both suites green; verify-editions 30/30. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -3,15 +3,13 @@ import Foundation
|
||||
import UniformTypeIdentifiers
|
||||
|
||||
// MARK: - The clipboard type
|
||||
|
||||
extension UTType {
|
||||
|
||||
/// What a Lanework copy puts on the pasteboard under its own type — the JSON `ClipboardManifest`
|
||||
/// (04-interactions.md ▸ Clipboard: "the pasteboard carries a JSON manifest + plain text").
|
||||
/// Declared as an exported type in `Info.plist` beside the two drag types, for the same reason
|
||||
/// those are: a payload nobody has declared is a payload the system will not carry.
|
||||
static let laneworkClipboard = UTType(exportedAs: "dev.rzen.indie.kanban.clipboard")
|
||||
}
|
||||
//
|
||||
// `UTType.laneworkClipboard` — what a Lanework copy puts on the pasteboard under its own type, the
|
||||
// JSON `ClipboardManifest` below (04-interactions.md ▸ Clipboard: "the pasteboard carries a JSON
|
||||
// manifest + plain text"). Declared in `Info.plist` beside the two drag types, for the same reason
|
||||
// those are: a payload nobody has declared is a payload the system will not carry. The constant
|
||||
// itself lives in `EditionTypes.swift` — base exports the type, Pro imports it, and each edition's
|
||||
// twin uses the initializer its own plist can honor.
|
||||
|
||||
// MARK: - The manifest
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
import Foundation
|
||||
import UniformTypeIdentifiers
|
||||
|
||||
// MARK: - The family pasteboard types, as base declares them
|
||||
|
||||
/// **Base's half of the edition UTI posture** (12-editions.md ▸ Targets: base *exports* the family
|
||||
/// types, Pro *imports* them, declarations verbatim identical). `UTType(exportedAs:)` is a claim of
|
||||
/// ownership the system checks against the running app's `Info.plist` — in Pro, whose plist imports
|
||||
/// these, that claim is a runtime fault. So the three constants live in an edition twin rather than
|
||||
/// beside their payloads: Pro compiles `KanbanPro/Edition/EditionTypes.swift`, which declares the
|
||||
/// same names with `UTType(importedAs:)` — the edition split's file-level doctrine, applied to an
|
||||
/// initializer.
|
||||
///
|
||||
/// What each type *is* stays documented at its payload — `DragPayload` for cards and lanes,
|
||||
/// `ClipboardManifest` for the clipboard type.
|
||||
extension UTType {
|
||||
|
||||
/// A drag carrying board **cards** — see `DragPayload`.
|
||||
static let laneworkCards = UTType(exportedAs: "dev.rzen.indie.kanban.cards")
|
||||
|
||||
/// A drag carrying board **lanes** — see `DragPayload`.
|
||||
static let laneworkLanes = UTType(exportedAs: "dev.rzen.indie.kanban.lanes")
|
||||
|
||||
/// A Lanework copy's pasteboard manifest — see `ClipboardManifest`.
|
||||
static let laneworkClipboard = UTType(exportedAs: "dev.rzen.indie.kanban.clipboard")
|
||||
}
|
||||
Reference in New Issue
Block a user