Collapse the edition split — one target, twins merged, verify-editions retired
Phase 1 of the 2026-07-30 one-app pivot (DESIGN 0bec9a6, card c3a3ddd5):
the KanbanPro target, LaneworkPro scheme, KanbanProTests module-alias
bundle, KanbanPro/ source root and scripts/verify-editions.sh retire
wholesale. project.yml reads as a single-target file again (anchors
inlined, header rewritten in tier vocabulary).
The edition twins merge: EditionTypes -> PasteboardTypes (one
UTType(exportedAs:) home — the one app owns the family types),
EditionAbout -> AboutBox (the quiet Pro signpost survives as the About
box's one line; "…in Settings" deferred until the StoreKit phase gives
it somewhere to point). InertGitTests drops its Base prefix — the
inert-.git posture is unconditional app behavior, unsubscribed and
lapsed being one state.
Entitlements gain com.apple.security.network.client, declared now and
dormant until Pro's remotes use it; no keychain access group. The App
Group key deliberately stays — it goes with AppGroup.swift in phase 2,
since pulling it first would silently drop the app into the fallback
container. README/RELEASE.md build-and-pipeline prose updated to the
one-record world; the subscription story lands with phase 3.
1893 tests in 322 suites green.
Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -13,12 +13,12 @@ import AppKit
|
||||
/// exactly how the system's Edit ▸ Undo row and the toolbar's nil-target pair (`BoardToolbar`) light
|
||||
/// up, disable and retitle with no code of the app's own.
|
||||
///
|
||||
/// The seam, though, must not be an `NSUndoManager`: base's stack is one, Pro's is git
|
||||
/// The seam, though, must not be an `NSUndoManager`: the free tier's stack is one, Pro's is git
|
||||
/// (12-editions.md ▸ The provider seam), and a protocol that vended one could only ever have had a
|
||||
/// single implementation. So the substrate stays behind `HistoryProviding` and *this* object is the
|
||||
/// translation — one per board session, over whichever provider that session was composed with. Pro
|
||||
/// inherits the whole command surface (enablement, dynamic titles, ⌘Z, the toolbar pair) by binding
|
||||
/// its provider and changing nothing here, which is what "a user moving between editions relearns
|
||||
/// its provider and changing nothing here, which is what "a user subscribing (or lapsing) relearns
|
||||
/// nothing" (12) has to mean in code.
|
||||
///
|
||||
/// ### It deliberately keeps its inherited stack empty
|
||||
@@ -110,7 +110,7 @@ public final class BoardUndoManager: UndoManager {
|
||||
// MARK: - BoardUndoRouting
|
||||
|
||||
/// Which undo a hosted window answers with, given what holds the keyboard — 06-history-undo.md
|
||||
/// ▸ Undo routing, which 12 records as **edition-independent**: "focus decides text-undo vs
|
||||
/// ▸ Undo routing, which 12 records as **tier-independent**: "focus decides text-undo vs
|
||||
/// board-undo; only the substrate behind board-undo differs".
|
||||
///
|
||||
/// ### Most of the rule is AppKit's, and is not here
|
||||
|
||||
@@ -8,7 +8,7 @@ import Foundation
|
||||
///
|
||||
/// 13-native-undo.md ▸ Rules hands the naming straight over: "The 06 vocabulary supplies menu titles
|
||||
/// ('Undo Move 3 Cards'), via NSUndoManager's dynamic retitling — the same naming machinery both
|
||||
/// editions use." So the verbs here are exactly 06-history-undo.md ▸ Commit messages' list — *Add /
|
||||
/// tiers use." So the verbs here are exactly 06-history-undo.md ▸ Commit messages' list — *Add /
|
||||
/// Delete / Move / Rename / Edit / Restyle / Resize / Reorder over cards, lanes, and the board*, plus
|
||||
/// the trash pair's **Restore** — and the plural rule is that section's own plural folding ("Delete
|
||||
/// 12 cards"), which is also 13's coalescing sentence read out loud: "a multi-card move is one step
|
||||
|
||||
@@ -80,14 +80,14 @@ public enum HistoryStepOutcome: Equatable, Sendable {
|
||||
/// holds: move → move back ...; rename → restore title" — and both halves of that write are already
|
||||
/// in the caller's hands: the before-value *is* the inverse, and the after-value is what the write
|
||||
/// set (which is also what the staleness predicate compares). A step is therefore that pair, in the
|
||||
/// design's own terms, and deliberately says nothing about how a stack stores it: base's stack is
|
||||
/// `NSUndoManager`-backed and Pro's is git (12-editions.md ▸ The provider seam), and neither
|
||||
/// design's own terms, and deliberately says nothing about how a stack stores it: the free tier's
|
||||
/// stack is `NSUndoManager`-backed and Pro's is git (12-editions.md ▸ The provider seam), and neither
|
||||
/// substrate appears here.
|
||||
///
|
||||
/// ### `name` is the 06 vocabulary, unprefixed
|
||||
///
|
||||
/// "The 06 vocabulary supplies menu titles ('Undo Move 3 Cards'), via NSUndoManager's dynamic
|
||||
/// retitling — the same naming machinery both editions use" (13). What the step carries is the bare
|
||||
/// retitling — the same naming machinery both tiers use" (13). What the step carries is the bare
|
||||
/// phrase — `"Move Card"`, `"Move 3 Cards"`, `"Rename Lane"` — in the vocabulary of
|
||||
/// 06-history-undo.md ▸ Commit messages, plural-folded by the same rule ("one gesture, one undo
|
||||
/// step — a multi-card move is one step with a plural title"). The **"Undo "/"Redo " prefix is
|
||||
@@ -143,22 +143,22 @@ public struct HistoryStep {
|
||||
/// "One stack per board, owned by the board session. Not per-window: every window over a board
|
||||
/// (board window, its card windows) shares the store and shares the stack" (13-native-undo.md
|
||||
/// ▸ Rules). `AppModel.BoardSession` is where that ownership lives, and the composition root binds
|
||||
/// which implementation it gets: base binds `NativeHistoryProvider` (two step stacks over the
|
||||
/// inverses registered at the Writer boundary), Pro binds the git provider in pro-m1 (undo as
|
||||
/// which implementation it gets: the free tier binds `NativeHistoryProvider` (two step stacks over
|
||||
/// the inverses registered at the Writer boundary), Pro binds the git provider in pro-m1 (undo as
|
||||
/// forward restore commits over HEAD's first-parent ancestry — 06-history-undo.md), Teams inherits
|
||||
/// Pro's.
|
||||
///
|
||||
/// ### What this protocol deliberately does not say
|
||||
///
|
||||
/// - **No `NSUndoManager`, anywhere in the signature.** It is base's implementation detail, and a
|
||||
/// seam that vended one would be a seam only one provider could ever satisfy — the opposite of
|
||||
/// the reason the split exists at all ("base's native undo is the first proof the seam is real",
|
||||
/// 12). AppKit still needs an `UndoManager` to hand the responder chain; that adapter is
|
||||
/// `BoardUndoManager`, which sits *over* this protocol rather than inside it.
|
||||
/// - **No persistence promise.** Base's stack dies with the session (13); Pro's survives relaunch
|
||||
/// because git does (06). Both are honest implementations of these seven members.
|
||||
/// - **No `NSUndoManager`, anywhere in the signature.** It is the native provider's implementation
|
||||
/// detail, and a seam that vended one would be a seam only one provider could ever satisfy — the
|
||||
/// opposite of the reason the seam exists at all ("the free tier's native undo is the first proof
|
||||
/// the seam is real", 12). AppKit still needs an `UndoManager` to hand the responder chain; that
|
||||
/// adapter is `BoardUndoManager`, which sits *over* this protocol rather than inside it.
|
||||
/// - **No persistence promise.** The native stack dies with the session (13); Pro's survives
|
||||
/// relaunch because git does (06). Both are honest implementations of these seven members.
|
||||
/// - **No routing.** Which surface ⌘Z reaches is focus's answer, not the substrate's
|
||||
/// (06 ▸ Undo routing, edition-independent) — `BoardUndoRouting`.
|
||||
/// (06 ▸ Undo routing, tier-independent) — `BoardUndoRouting`.
|
||||
@MainActor
|
||||
public protocol HistoryProviding: AnyObject {
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import Foundation
|
||||
|
||||
// MARK: - NativeHistoryProvider
|
||||
|
||||
/// The base edition's undo substrate: one stack per board session (13-native-undo.md).
|
||||
/// The free tier's undo substrate: one stack per board session (13-native-undo.md).
|
||||
///
|
||||
/// ### Two arrays, and why not `NSUndoManager`
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user