Files
nucleic/.gitignore
T
abkslmandClaude Fable 5 61e11572b8 Add Tailscale (Tailnet) as a sync transport between Mac and iPhone
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]>
2026-07-03 03:50:45 -07:00

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*