Settings ▸ Remote gains a "Connect via" picker — LAN (default), Tailscale (tailnet), or Relay (disabled, coming soon). On Tailnet, both devices run an embedded tsnet node via TailscaleKit (tailscale/libtailscale) and sync frames flow over the user's tailnet, so the phone can connect from anywhere the tailnet reaches; Noise E2EE runs above the transport unchanged. - NucleicTailnet (new target, macOS + iOS): TailnetNode wraps TailscaleKit's node lifecycle (auth-key login, generation-fenced start/stop since up() is un-cancellable) and drops to the framework's public C API for the data path — tailscale_dial/listen/accept hand back full-duplex socketpair fds, wrapped by FDFrameChannel (DispatchIO) into the shared FrameChannel seam. The Swift wrapper's one-way connection actors can't carry a bidirectional stream. - Host: TailnetListener adopts SyncListener; startSyncServer is single-flight and honors toggle-off/picker changes at the commit point; pairing QRs carry transport + tailnet IP/port hints (PairingPayload additive optional fields, forward/backward compatible over CBOR). - iPhone: pair/reconnect dial over whichever transport the pairing recorded; Settings gains a Tailscale auth-key field (Keychain, committed on editing end); connectivity chip shows "Connected · Tailnet". - TailscaleKit has no SwiftPM distribution: scripts/build-tailscalekit.sh builds a pinned libtailscale commit into an untracked local xcframework; Package.swift links it only when present (everything builds without it, the picker then reports Tailscale support as not built in), and the script clears SwiftPM's content-keyed manifest cache so the toggle is picked up. - iOS floor 17.0 → 18.1 (TailscaleKit requires the iOS 18 Swift runtime); package-app.sh embeds the framework in the .app like Sparkle. 703-test suite: no new failures (the 7 fake-claude/fake-grok staging issues reproduce identically on an untouched checkout — pre-existing, tracked separately). New coverage: FDFrameChannel over socketpairs, pairing-payload version-skew both directions, transport-setting resolution. Co-Authored-By: Claude Fable 5 <[email protected]>
26 lines
894 B
Plaintext
26 lines
894 B
Plaintext
.build/
|
|
dist/
|
|
.nucleic-spike/
|
|
*.xcodeproj
|
|
# …but the iPhone client's project IS a tracked deliverable.
|
|
!ios/NucleicRemote/NucleicRemote.xcodeproj
|
|
xcuserdata/
|
|
*.xcuserstate
|
|
DerivedData/
|
|
.DS_Store
|
|
# Agent scratch / transcript files that land in the working copy during runs —
|
|
# untracked, they dirty the autoship merge target and block integration.
|
|
test-transcripts/
|
|
nucleic-*.md
|
|
# Bundled Linux kernel staged by scripts/fetch-kernel.sh — large binary, not tracked.
|
|
# (Resources/ otherwise holds tracked items like AppIcon.icns.)
|
|
Resources/vmlinux-arm64
|
|
# TailscaleKit framework staged by scripts/build-tailscalekit.sh — large binary, not
|
|
# tracked; Package.swift enables the Tailnet transport only when it exists.
|
|
third_party/TailscaleKit/TailscaleKit.xcframework
|
|
# Cloudflare Workers local dev cache/state — regenerated by wrangler, not tracked.
|
|
.wrangler/
|
|
|
|
# Apple AuthKeys
|
|
AuthKey*
|