The last thread cut — SwiftGitX and libgit2 leave the project

Step 6 of strategy/01-git-excision.md, the proving step: the two packages and their rationale blocks (including the stale never-runs-in-the-free-app note) come out of project.yml, the project regenerates, and the build resolves clean — nothing living referenced libgit2. Resurrection pins (SwiftGitX 0.4.0, libgit2 1.9.2) are recorded in the plan and at the pre-git-excision tag. 2,707 tests green.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-08 11:41:27 -04:00
parent edaf5be706
commit 09a21cf5a0
+3 -37
View File
@@ -23,35 +23,9 @@ packages:
IndieAbout: IndieAbout:
url: https://git.rzen.dev/rzen/indie-about.git url: https://git.rzen.dev/rzen/indie-about.git
minorVersion: 0.2.2 minorVersion: 0.2.2
# **The bundled git client** (06-history-undo.md ▸ Rules: "Bundled libgit2 — no git install # SwiftGitX 0.4.0 / libgit2 1.9.2 (both `github.com/ibrahimcetin/…`) left with the git excision
# required"): SwiftGitX vendors libgit2 as an in-process library, so every git operation the app # (strategy/01-git-excision.md, 2026-08-08) — the exact pins for resurrection are recorded there
# performs runs inside the sandbox with no `Process`, no `/usr/bin/git`, and no sandbox extension. # and at the `pre-git-excision` tag.
# A board's history therefore works identically in a Release build on a machine that has never had
# Xcode or the command-line tools installed.
#
# `exactVersion` rather than a range, and pinned to the pathfinder's own 0.4.0: the package is
# pre-1.0 with an API that moves between minors (the commit and diff surfaces this depends on both
# changed shape in 0.3→0.4), so a floating pin would be a resolver deciding when the git provider
# stops compiling.
SwiftGitX:
url: https://github.com/ibrahimcetin/SwiftGitX
exactVersion: 0.4.0
# **The C library underneath SwiftGitX, named directly** (06-history-undo.md ▸ Interaction with
# external writers: "foreign changes are committed under the pinned synthetic author"). SwiftGitX
# 0.4.0's `commit(message:)` takes no signature — its `CommitOptions` leaves `author`/`committer`
# null and libgit2 falls back to `git_signature_default`, which reads a config the sandbox cannot
# see — so the auto-committer's per-commit authorship is unreachable through the wrapper. It
# reaches `git_commit_create` itself (`GitCommitOperation`), which needs the same vendored module
# SwiftGitX imports.
#
# **The same package SwiftGitX already resolves**, pinned to the version SwiftGitX pins exactly
# (`.package(url: …/libgit2.git, exact: "1.9.2")`): this adds no second copy of libgit2 to the
# binary and no second resolution to argue with — it makes a module the app already links
# *importable*. A drift between these two pins is a resolver error at build time, which is the
# loudest place for it to be.
libgit2:
url: https://github.com/ibrahimcetin/libgit2.git
exactVersion: 1.9.2
settings: settings:
base: base:
@@ -69,12 +43,6 @@ settings:
# What that buys this file: no anchors, no per-target exclusion lists, no second copy of the # What that buys this file: no anchors, no per-target exclusion lists, no second copy of the
# resources. There is one product, one Info.plist, one entitlements file, one Swift module, and one # resources. There is one product, one Info.plist, one entitlements file, one Swift module, and one
# `.kanban` UTI **exported** (never imported) by the app that owns it. # `.kanban` UTI **exported** (never imported) by the app that owns it.
#
# libgit2 arrived here with pro-m1, as SwiftGitX above — a dependency of the one target, dormant
# behind the subscription gate rather than the contents of a second download. It links into the free
# app and never runs there: detection itself is tier-gated (`HistoryStore.compose`), so a free-tier
# session opens without so much as a `fileExists` under `.git` (12-editions.md ▸ The free tier and
# `.git`, and `InertGitTests`).
targets: targets:
# MARK: - Lanework # MARK: - Lanework
@@ -116,8 +84,6 @@ targets:
- package: swift-markdown - package: swift-markdown
product: Markdown product: Markdown
- package: IndieAbout - package: IndieAbout
- package: SwiftGitX
- package: libgit2
postBuildScripts: postBuildScripts:
- script: '"${SRCROOT}/../indie-skills/skills/app-versioning/scripts/update_build_info.sh"' - script: '"${SRCROOT}/../indie-skills/skills/app-versioning/scripts/update_build_info.sh"'
name: Update Build Info name: Update Build Info