Commit Graph
62 Commits
Author SHA1 Message Date
abkslm 38e58964ea Merge branch 'claude/competent-pasteur-a5bb90' into HEAD 2026-07-02 16:07:16 -07:00
abkslmandClaude Fable 5 256418c028 docs: PUSH_SETUP runbook; wire aps-environment entitlements into the build
docs/PUSH_SETUP.md lists the manual steps left to light up push /
Live Activities end-to-end: APNS key, the one-click Xcode Push
capability, Cloudflare provisioning + secrets (with the bundle-id
topic gotcha: xyz.blakeslee.nucleic-remote, not .remote), host relay
config, and the on-device verification checklist. Also adds
CODE_SIGN_ENTITLEMENTS so the existing entitlements file actually
signs into the app.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-02 16:06:33 -07:00
abkslmandClaude Fable 5 761dca5f1d ios: notifications, actionable approvals, Live Activity, and the relay push path
Brings the phone's ambient surfaces (UX_IOS §5/§8) to maturity:

- Notification pipeline (NotificationRouter): local notifications for
  approvals and needs-input transitions while backgrounded; low-risk
  approvals are actionable from the banner (Allow requires device
  auth, high-risk must open the app's Face ID gate); taps deep-link
  to the session; app-icon badge = NEEDS YOU count; resolutions
  withdraw the notification (first-responder-wins). The relay's
  content-free approval.pending tickle localizes via
  Localizable.strings.
- Live Activity: new NucleicRemoteWidgets extension target (lock
  screen + Dynamic Island) rendering one aggregate Activity —
  N running / M waiting + the most urgent session — started/updated/
  ended by LiveActivityManager as session state changes.
- Out-of-band push path: nucleic-edge gains POST /v1/push/register
  (admin) so the host can upload tokens for LAN-only pairings; the
  host's new PushRelayClient (config-gated on NUCLEIC_RELAY_URL +
  NUCLEIC_RELAY_ADMIN_SECRET) mirrors Hello.pushToken to the relay
  and wakes non-connected phones when an approval arrives, throttled
  per device. Everything stays off until the relay is provisioned.

Worker tests (23) and Swift suites pass apart from the pre-existing
fixture gaps and nvrsion flake. Simulated APNs delivery is blocked in
this environment (notification auth can't be granted headlessly).

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-02 16:06:33 -07:00
abkslmandClaude Fable 5 480b29207f sync: project quota, provider status, todo triage, and full diffs to the phone
Four Mac surfaces the iOS remote couldn't render now ride the wire,
forward-compatibly (decodeIfPresent defaults; unknown HostMsg tags
already decode to .unknown):

- DashboardSnapshot gains `usage` (WireSubscriptionUsage — the Mac's
  5-hour/weekly quota gauges) and `statusFeeds` (WireStatusFeed —
  active provider incidents); the host re-pushes the dashboard when a
  poll changes either.
- WireTodo gains `triage` (raw TriageLevel name); the phone renders
  the Mac's TriageBadge honoring the encouraging/classic label
  setting.
- ClientMsg.fetchDiff / HostMsg.sessionDiff deliver the full worktree
  patch on demand (capped at 512 KB with a truncated flag), gated on
  the new WireCapabilities.canFetchDiff so a new phone never sends it
  to an old host. iOS renders a file list + colored unified patch,
  falling back to the diffstat summary against older hosts.

Round-trip and legacy-decode tests cover the new fields; the full
suite passes apart from the pre-existing fake-backend fixture gaps
and the flaky nvrsion lock-domain test (same failure rate on the
base commit).

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-02 16:06:32 -07:00
abkslmandClaude Fable 5 a33ab80313 ios: full feature/appearance parity with the macOS app (client-side)
Port the Mac's MarkdownText renderer, AppPalette (color-vision modes +
night-softening), appearance settings (theme/text size/color vision),
and BuildBanner channel strip to the iPhone remote. Add session-row
attention/unseen-completion washes and marker icons, Discard action,
branch/worktree options in the new-chat composer, and a transient
error bubble for host wire errors. Stamp the build channel via
NucleicChannel in Info.plist (ios-release.sh passes NUCLEIC_CHANNEL,
default beta). Demo mode gains NUCLEIC_DEMO_SESSION and skips the
notifications prompt so UI previews are scriptable.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-02 16:06:32 -07:00
abkslm 26884365b1 Merge branch 'dev' into nucleic/trunk 2026-07-01 19:01:20 -07:00
abkslmandNucleic 79a28605b3 nvrsion: Add: Fix truncation of “Run now” button text in New idea composer, add model selector support for Claude Fable 5, refactor Project Workflow Enhancement, add Wait Button Logic, update iOS remote to match Chat Message Queue Display, block sandboxed/controlled agents from running git commands via mcp__nucleic__host_exec using container-level shims, add chat icon animation to bounce when chat is blocked for >60 seconds, add “Cmd+Shift+N” shortcut to open a floating chat composer over the window, remove “Run now” button from “New idea” composer, and shield Git command execution by scanning inside ‘-c’ strings.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-01 19:01:20 -07:00
abkslmandNucleic 63054a4629 Message Queue Display
Nucleic-Session: 4714846A-A598-4711-AA38-640B40927DF4
Co-authored-by: Nucleic <[email protected]>
2026-07-01 18:34:18 -07:00
abkslmandNucleic 687a024373 Message Queue Display
Nucleic-Session: 4714846A-A598-4711-AA38-640B40927DF4
Co-authored-by: Nucleic <[email protected]>
2026-07-01 18:34:06 -07:00
abkslmandNucleic 49e30c0d68 Message Queue Display
Nucleic-Session: 4714846A-A598-4711-AA38-640B40927DF4
Co-authored-by: Nucleic <[email protected]>
2026-07-01 18:33:17 -07:00
abkslm 85d753d2f7 Merge branch 'dev' into nucleic/trunk 2026-06-27 20:24:15 -07:00
abkslmandNucleic 415443e8ce nvrsion: promote trunk to dev
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:24:15 -07:00
abkslmandNucleic ee0fa90feb Add Markdown Formatting
Nucleic-Session: 23936B4B-52E9-43F5-908B-C7919A5BD6DD
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:23:37 -07:00
abkslmandNucleic 13d4b302b9 Add Markdown Formatting
Nucleic-Session: 23936B4B-52E9-43F5-908B-C7919A5BD6DD
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:23:30 -07:00
abkslmandNucleic 05883d6a91 Add Markdown Formatting
Nucleic-Session: 23936B4B-52E9-43F5-908B-C7919A5BD6DD
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:19:05 -07:00
abkslmandNucleic 57a8cc698e Add Markdown Formatting
Nucleic-Session: 23936B4B-52E9-43F5-908B-C7919A5BD6DD
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:18:30 -07:00
abkslmandNucleic 4f3945dd9c Rename Multi-Agent Card Title
Nucleic-Session: 64B9D58A-6385-4BE0-B950-183F2CD077AB
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:11:37 -07:00
abkslmandNucleic d8a2b8fd00 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:10:58 -07:00
abkslmandNucleic 3011e44ac6 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 20:10:41 -07:00
abkslmandNucleic 9ceb563df7 nvrsion: promote trunk to dev
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:52:55 -07:00
abkslm 2ef02b90d4 Merge branch 'dev' into nucleic/trunk 2026-06-27 19:52:55 -07:00
abkslmandClaude Opus 4.8 8dd26a4483 Merge nvrsion promote (trunk → dev); land iOS host_exec formatting
Concludes an in-progress merge the auto-lander could not finish with
partial commits. Lands the iOS host_exec command breakdown and the
RemoteStore preview-data missing-return fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-27 19:45:56 -07:00
abkslmandNucleic ded07c3692 nvrsion: promote trunk to dev
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:33:40 -07:00
abkslmandNucleic 7459276ec0 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:15:37 -07:00
abkslmandNucleic 4c19bffc54 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:15:18 -07:00
abkslmandNucleic fcdb5a09c6 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:15:07 -07:00
abkslmandNucleic ccd2a96de0 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:15:00 -07:00
abkslmandNucleic 09a8d590c9 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:14:53 -07:00
abkslmandNucleic a3f2929123 Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:14:44 -07:00
abkslmandNucleic ca2a270fad Activity Chart Intensity Logic
Nucleic-Session: 76D64900-B16F-45BE-A6CB-E3D2EBC7C73A
Co-authored-by: Nucleic <[email protected]>
2026-06-27 19:14:40 -07:00
abkslm 93d91b6c10 nvrsion: resync trunk onto dev after promote 2026-06-27 17:14:39 -07:00
0e74c7ceb5 Promote nvrsion trunk → dev
Squash-promote the nucleic/trunk work (Sessions Auto-Switching, Play
System Sounds Configuration) into dev. Resolved the two divergent
conflicts where dev and trunk had independently implemented the chat
status-sound feature, keeping trunk's canonical version:

- SettingsView: the Sounds settings live under the General tab (trunk's
  placement); removed dev's duplicate Sounds section from the Chat tab.
- AppStore: adopt trunk's centralized ChatCueState/announceChatCue
  edge-detection (fired from upsertSummary/upsertSummaries), and remove
  dev's superseded chatStatusSound(...) helper and its two hand-placed
  call sites. Also removed a silent merge-duplicated upsertSummaries.

Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-27 17:14:06 -07:00
abkslmandNucleic 5753cce178 Disable Orchestra Feature
Nucleic-Session: 921760EC-9063-4C8B-807B-DF166B271459
Co-authored-by: Nucleic <[email protected]>
2026-06-27 15:47:36 -07:00
abkslmandNucleic 59fb467cfa Disable Orchestra Feature
Nucleic-Session: 921760EC-9063-4C8B-807B-DF166B271459
Co-authored-by: Nucleic <[email protected]>
2026-06-27 15:47:25 -07:00
abkslmandNucleic 4329aae518 Disable Orchestra Feature
Nucleic-Session: 921760EC-9063-4C8B-807B-DF166B271459
Co-authored-by: Nucleic <[email protected]>
2026-06-27 15:47:20 -07:00
abkslmandNucleic eff0b84114 Streak Square Brightness Logic
Nucleic-Session: 129BD35A-FB15-4E39-82E2-F476950F60AD
Co-authored-by: Nucleic <[email protected]>
2026-06-27 15:46:04 -07:00
abkslmandNucleic 6b770b56b1 Streak Square Brightness Logic
Nucleic-Session: 129BD35A-FB15-4E39-82E2-F476950F60AD
Co-authored-by: Nucleic <[email protected]>
2026-06-27 15:45:53 -07:00
abkslm 9f9fb88672 add app icon to ios 2026-06-27 15:24:50 -07:00
abkslm bd46ca241f nvrsion: promote trunk to dev
Nucleic-Promote: 1
2026-06-27 14:57:57 -07:00
abkslmandClaude Opus 4.8 49aaf8ca89 Nucleic: restore teal default accent (keep lavender for Control projects only)
dev received an intermediate snapshot of this branch that had the accent
scoping machinery (AppPalette.make(controlled:), controlAccent, RootView's
contextProjectID gate) but NOT the reverts of the base accent back to teal.
Result: the standard palette's base accent AND controlAccent were both
lavender, so control and non-control projects rendered identically lavender.

Re-assert the defaults so the gate is actually visible:
- macOS AppTheme: standard base accent -> teal (0.04,0.52,0.50); controlAccent
  stays lavender (0.45,0.32,0.82). Non-control/home now render teal; only
  Nucleic Control projects get lavender.
- iOS NucleicRemote: Palette.accent + AccentColor.colorset back to flat teal
  (remote has no Control concept).

Merges current dev first so this branch is strictly ahead of it — autoshipping
it back to dev will now override dev's lavender base with teal.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-17 19:45:57 -07:00
abkslm e90f5c726f Merge branch 'dev' into nucleic/humble-willow-marten 2026-06-17 19:44:20 -07:00
abkslmandClaude Opus 4.8 fdad762d00 Nucleic: scope lavender accent to Nucleic Control projects only
Make the lavender/purple accent a signal that you are operating inside a
Nucleic Control project; every other project keeps the standard teal tint.

- AppPalette.make gains a 'controlled' flag. When true (and in standard
  color-vision mode) it swaps the teal accent for a cached, nightSoftened
  lavender (controlAccent); otherwise it returns the unchanged palette.
- RootView derives 'controlled' from store.contextProjectID ->
  Project.isNucleicControlled, so the tint follows the active project and
  reverts to teal on the home dashboard / non-control projects. Tracked
  through Observation, so it flips live as you navigate.
- Color-vision (deut/prot/trit) palettes keep their tuned accents; the
  swap only applies in standard mode.
- iOS NucleicRemote reverts to the standard teal: the remote has no
  Nucleic Control concept (the wire protocol doesn't carry it), so it
  can't distinguish controlled projects and stays teal everywhere.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-17 19:33:05 -07:00
abkslm bcf91c0ac6 Merge nucleic/humble-willow-marten into dev 2026-06-17 19:25:34 -07:00
abkslmandClaude Opus 4.8 8f672fa76a Nucleic: lavender/purple accent (light + dark shades)
Switch the standard brand accent from deep teal to lavender/purple across
macOS and iOS, with a distinct shade per appearance:

- macOS (AppTheme standard palette): accent -> (0.45, 0.32, 0.82). ~5.4:1
  with white labels in light; nightSoftened() derives the muted dark shade.
- iOS (Palette.accent): now an appearance-aware UIColor — deep violet in
  light, brighter lavender (0.66, 0.55, 0.95) in dark so it lifts off the
  near-black background.
- iOS AccentColor.colorset: add a dark luminosity variant to match.

Accessibility color-vision palettes (deuteranopia/protanopia/tritanopia)
are intentionally left tuned for distinguishability; tritanopia already
renders violet.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-17 19:24:56 -07:00
abkslm fe2f931a2e Merge nucleic/plucky-lunar-newt into dev 2026-06-16 03:23:14 -07:00
abkslm e2f18efbd9 Merge nucleic/rustic-north-koala into dev
# Conflicts:
#	Sources/NucleicApp/SessionDetailView.swift
#	ios/NucleicRemote/NucleicRemote/Views/ApprovalCardView.swift
2026-06-16 02:03:44 -07:00
abkslmandClaude Opus 4.8 3954ff13b7 Wrap approval detail and size the box to its content
The first pass put the detail in a ScrollView with fixedSize(horizontal:)
and a fixed maxHeight, so the command was forced onto one long line that
scrolled horizontally and the box always claimed full height — a tall box
with a lot of empty space.

Replace it with an ApprovalDetailBox (macOS + iOS) that wraps the text and
measures its content height via a PreferenceKey, sizing the box to fit and
only scrolling vertically once the content exceeds the max height. No more
horizontal scroll; short commands sit in a snug box.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-16 02:00:05 -07:00
abkslm d2817f60fa Merge nucleic/rustic-north-koala into dev 2026-06-16 00:11:11 -07:00
abkslmandClaude Opus 4.8 e31b6a8799 Show full untruncated content in approval requests
Permission requests only ever displayed a summary that was hard-capped:
RiskClassifier.title() slices to 80 chars, and the iOS card used a lossy
compactSummary clipped to 8 lines. The full tool input was present on the
request but never shown, so a long Bash command, file path, or URL was cut
off with "…" and the user couldn't see what they were granting.

- Add RiskClassifier.detail(toolName:input:): the full, untruncated content
  (full command/path/url/query), falling back to the pretty-printed input so
  nothing about an unrecognized tool is hidden.
- Add JSONValue.prettyString() for indented, multi-line display.
- macOS ApprovalBar: render the detail in a bounded, scrollable, selectable
  monospaced block (shown only when it adds beyond the already-shown title).
- iOS ApprovalCardView: replace lossy compactSummary/lineLimit(8) with the
  full content in a bounded scroll view via JSONValue.approvalDetail.
- Tests: assert detail is full and untruncated, with pretty-input fallback.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-16 00:10:38 -07:00
abkslm 136a22eb89 Merge nucleic/nimble-north-gecko into dev 2026-06-15 19:19:57 -07:00
abkslm 161b772794 Merge nucleic/eager-dewy-lemur into dev
Animate the Mac streak lightning bolt; intensity (speed, scale, brightness,
rotation jitter, glow) ramps up with streak length.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

# Conflicts:
#	Sources/NucleicApp/HomeView.swift
2026-06-15 01:28:55 -07:00
abkslm 0dbf40b9bc Merge nucleic/eager-dewy-lemur into dev 2026-06-15 01:23:09 -07:00
abkslm e462a0b4a5 Nucleic: Update Icon Design 2026-06-15 01:23:09 -07:00
abkslmandClaude Opus 4.8 f5902e359d Add In-progress stat card and live list to mobile Home
Surface actively-running sessions on the phone home dashboard: a fourth
"In progress" stat card and a list pinned above the to-dos. Both share one
definition (live sessions with status .running), and list rows link into the
session transcript.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-13 23:16:13 -07:00
abkslmandClaude Opus 4.8 111a5c624a Log header git actions into the session chat
Add a `.note` AgentEvent kind — a system-generated log line — and emit one
into the open session's transcript whenever a control in the header Git menu
is used (merge/squash/rebase outcome, open in Terminal, reveal in Finder,
copy branch/worktree path). Renders as a muted note on both macOS and iOS.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-13 22:51:04 -07:00
abkslmandClaude Opus 4.8 77ca4d1d67 Wrap long permission request text in approval UIs
The macOS ApprovalBar put the title and action buttons on one row, so a
long file-path title got truncated. Stack title above the buttons so it
wraps to as many lines as needed. Bump the iOS card's input summary cap
from 3 to 8 lines. Both made text-selectable.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-13 21:25:57 -07:00
abkslmandClaude Opus 4.8 9d4999bb74 Sandbox: host build/run mode (host_exec tool)
Adds a per-project "Allow host build/run" sandbox capability that lets a
containerized agent request to build and run executables on the host
machine, escaping the Linux sandbox — e.g. compiling and running a macOS
binary the container can't.

- New `host_exec` MCP tool on the approval server, advertised only when the
  session opts in. Pre-allowed via --allowedTools so the call reaches our
  handler directly rather than Claude's permission path: the handler is the
  sole gate, so `auto` mode can never auto-approve it.
- Every host command surfaces an explicit approval (risk .hostExec) and runs
  on the host via /bin/zsh -lc in the session worktree only after approval.
  An explicit "Allow for Session" choice grants the rest of the session;
  auto-approve never sets that — only a deliberate user choice does.
- ProjectSandbox.allowHostExec (off by default) with tolerant decoding so
  rows persisted before the field default to false instead of dropping the
  whole sandbox config.
- Threaded allowHostExec through RunSpec/ResumeSpec/SessionController; Mac
  Project Settings toggle; Mac ApprovalBar "Allow for Session" button; iOS
  risk styling/biometric gate for .hostExec.
- Tests: host_exec advertised/served only when registered + refused
  otherwise; allowHostExec round-trip and legacy-JSON default-to-false.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-13 16:52:01 -07:00
abkslm 644851e179 Merge mobile control-scope parity + design language into main
iPhone client gains full control-scope parity with the Mac (start chats, manage
to-dos, manage/integrate sessions), the desktop design language (teal palette,
status colors, cards), and Home/Projects/To-Dos surfaces. Fixes archived chats
leaking into Needs You. See nucleic-m4-state.

# Conflicts:
#	ios/NucleicRemote/NucleicRemote.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
2026-06-13 02:24:43 -07:00
abkslm 5277583456 NucleicRemote: set development team for device signing + resolve SwiftTerm pins
Adds DEVELOPMENT_TEAM (3XPAYVD6BP) so the app signs to a physical iPhone, and
records the resolved SwiftTerm / swift-argument-parser package pins. Generated by
opening the project in Xcode.
2026-06-13 02:23:45 -07:00
abkslmandClaude Opus 4.8 a70b21cd3e M4+: mirror the desktop design language onto mobile (Home/Projects/To-Dos/Sessions)
Design system: Palette (teal accent + the Mac's categorical status colors, status→color
refined by turn disposition), StatusStyle glyphs/labels, a card surface modifier, app-wide
teal tint.

Fixes the reported bug: Sessions now hides archived chats and uses disposition to split
NEEDS YOU from DONE (a finished-the-work turn no longer shows as needing you). Rows gain
status dots, favorite star, approval-count badge, diffstat; swipe to favorite/archive/delete.

New surfaces, full control-scope parity with the Mac:
- Home: greeting + day-streak flame, GitHub-style activity grid, stat cards, quick to-dos,
  and a start-chat composer (project picker + Auto).
- Projects: per-project session counts → project detail with a scoped composer.
- To-dos: capture, group by project, complete/dispatch/delete.
- Session detail: a control menu (rename, favorite, interrupt, integrate merge/squash/rebase,
  archive, delete).

RemoteStore handles the dashboard event + exposes all control intents; claims control scope.
A NUCLEIC_DEMO/NUCLEIC_TAB env seam seeds mock state for offline UI preview.

iOS app builds for the iOS 27 simulator; Home + Sessions verified rendering via screenshots.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-13 02:20:53 -07:00
abkslmandClaude Opus 4.8 c907333df2 M4: make device testing work — LAN IP in QR + automatic iOS signing
- LANAddress.primaryIPv4() (getifaddrs, prefers en*) embedded in the pairing QR via
  beginPairing, so the phone dials the Mac directly instead of relying on Bonjour
  discovery (much more robust on real networks; Bonjour stays a fallback).
- iOS project switches from CODE_SIGNING_ALLOWED=NO to CODE_SIGN_STYLE=Automatic so
  it signs to a physical device once a team is selected in Xcode (simulator still
  builds without a team).

174 tests green; macOS + iOS-simulator builds clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-13 01:22:12 -07:00
abkslmandClaude Opus 4.8 6f24b42004 M4: NucleicRemote iPhone app — SwiftUI client over the shared protocol
A real iOS Xcode app (ios/NucleicRemote) linking the NucleicProtocol SwiftPM
library as a local package. Builds for the iOS 27 simulator and launches to the
pairing screen.

- Transport: NWFrameChannel (NWConnection) + LANDiscovery (Bonjour _nucleic._tcp).
- Engine: drives NucleicProtocol.SyncClient (Noise XXpsk0 pair / IK reconnect,
  hello/welcome, HostMsg→Event stream).
- State: RemoteStore (ObservableObject) — the single on-device projection of host
  state; IdentityStore persists the device identity (Keychain) + pinned host.
- UI (UX_IOS): attention-first SessionsView, SessionDetailView (transcript/diff +
  status-driven action area / composer), ApprovalCardView with Face ID gate on
  high-risk approvals + allow-always menu, PairingScannerView (AVFoundation QR),
  SettingsView, connection chip. Same status glyphs/semantics as the Mac.

Add-iPhone QR display + server start live on the macOS side (follow-up); push /
Live Activity are M5 (needs the relay). gitignore keeps this .xcodeproj despite
the blanket *.xcodeproj rule.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-13 01:12:55 -07:00