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
34 lines
1.2 KiB
Swift
34 lines
1.2 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import Kanban
|
|
|
|
/// **The board popover's git-note detection** (12-editions.md ▸ The free tier and `.git`, ruled
|
|
/// 2026-07-27): the free tier's whole git story is one line, shown only on a board that carries an
|
|
/// inert `.git`. The seam
|
|
/// that decides *whether* to show it — `BoardGitNote.hasGitDirectory(at:)` — is a pure, read-only
|
|
/// `FileManager` check, pinned here against real bytes on disk. Everything else about the note (its
|
|
/// wording, its placement in `BoardInfoView`) is SwiftUI rendering and deliberately untested.
|
|
struct BoardInfoPopoverTests {
|
|
|
|
@Test("A board with a .git at its root reports true")
|
|
func trueForABoardWithGit() throws {
|
|
let fixture = try WriterFixture()
|
|
defer { fixture.tearDown() }
|
|
|
|
try fixture.item("", Item.board)
|
|
try fixture.file(".git/HEAD", Data("ref: refs/heads/main\n".utf8))
|
|
|
|
#expect(BoardGitNote.hasGitDirectory(at: fixture.root))
|
|
}
|
|
|
|
@Test("An ordinary board with no .git reports false")
|
|
func falseForAnOrdinaryBoard() throws {
|
|
let fixture = try WriterFixture()
|
|
defer { fixture.tearDown() }
|
|
|
|
try fixture.item("", Item.board)
|
|
|
|
#expect(!BoardGitNote.hasGitDirectory(at: fixture.root))
|
|
}
|
|
}
|