Terminology: "TestFlight" -> "Beta" across the banner, build config, Makefile, and
docs. The beta channel's process/product is renamed nucleic-tf -> nucleic-beta so
everything (process, app name, bundle id, label) reads "beta".
New rc channel: NUCLEIC_CHANNEL=rc -> process nucleic-rc, define NUCLEIC_RC, gold
"Release Candidate" banner, Nucleic RC.app (com.abkslm.nucleic.rc). Sits between
staging and main in the gated flow: feature -> dev -> staging -> rc -> main.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Select the build channel at build time via NUCLEIC_CHANNEL (dev | beta | stable),
which Package.swift maps to both the app executable's product name — and thus the
OS process name — and a compile-time define BuildChannel reads:
dev -> nucleic-local + NUCLEIC_DEV (red "Local Build" banner)
beta -> nucleic-tf + NUCLEIC_BETA (blue "TestFlight" banner)
stable -> nucleic + NUCLEIC_STABLE (no banner)
BuildChannel now resolves from the define instead of DEBUG/receipt sniffing.
Adds a Makefile (make dev/run/beta/stable/test) and BUILD.md documenting the
feature -> dev -> staging -> main branch flow.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
- Wire up the EmbedGitCommit prebuild plugin (generates GitCommit.swift with the
short hash at build time), so the build header shows the responsible commit even
on TestFlight/App Store archives where git isn't available at runtime. Drops the
runtime git lookup from BuildInfo.
- Use .tint(.white) (not .foregroundStyle) on the Panels and Git toolbar menus —
toolbar glyphs take their color from the tint, not foregroundStyle.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Brings in the NucleicProtocol shared library (deterministic CBOR + Noise E2EE +
the sync wire message set), the host LAN sync server (NWListener/Bonjour, AppStore
as the authority), the NucleicRemote iPhone app, and macOS remote-access Settings.
See the nucleic-m4-state memory.
# Conflicts:
# Package.swift
Split the pure value types the sync wire layer projects out of NucleicCore
into a new platform-agnostic NucleicProtocol target the iPhone client can link:
JSONValue, the AgentEvent model, Approval/Decision, and the identifiers
(SessionID/ApprovalID/BackendID/AgentInput/SessionStatus/DiffStat). AgentInput
gains Codable for the wire. NucleicCore re-exports NucleicProtocol so all host
code keeps referencing them unqualified. Package gains an iOS platform so the
shared lib resolves in the NucleicRemote Xcode project.
148 tests green (swift test --build-system native).
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Wrap the chat in a draggable paneling system: the chat stays centered with
an optional left column, right column, and a row below it. Two panel types to
start — a lazy file-explorer tree with inline read-only preview, and a full
interactive terminal (SwiftTerm) rooted at the session's worktree.
Panels are placed by dragging from a panel's header or by the Panels toolbar
menu; empty regions show a thin drop rail. Region sizes are draggable. The
whole arrangement is the global working layout (PanelLayoutStore, persisted to
UserDefaults) and can be saved as named layouts with a chosen default, managed
from a Manage Layouts sheet.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Adds the SwiftUI cockpit and the coordinator that ties the M1 core together.
- AppStore (@MainActor @Observable, in NucleicCore so it's testable): the object-
graph root (RUNTIME §1). Owns projects + a SessionController per live session,
observes each controller's canonical event stream, and exposes intents
(createSession → worktree+transcript+controller+persist+start, respond, send,
integrate, discard, refreshOpenStatus). UI binds to it; it never touches a
backend or git directly.
- Fixed an observation race: reloadOpen (on select) and live ingestUI were two
writers of openTranscript; a stale snapshot could clobber later events. Now a
single identity- + monotonic-guarded writer pulls full history.
- NucleicApp executable target: NavigationSplitView (projects→sessions sidebar),
session detail (transcript rows, status, live diffstat, approval bar with
Allow/Deny/Always, Integrate/Discard/Refresh), new-session + add-project sheets.
Run with `swift run --build-system native NucleicApp`; store under
~/Library/Application Support/Nucleic.
3 AppStore tests (create→run→summarize, integrate-to-main, discard) + the SwiftUI
shell. Full suite 78 green.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Adds the project's first external dependency, GRDB 7.11 (the plan's locked choice;
verified it resolves and builds under the native build system).
- SessionMetadataStore protocol in NucleicCore so the pipeline stays storage-
agnostic (tests/UI can swap in a fake).
- GRDBMetadataStore: WAL-mode DatabasePool on disk, in-memory DatabaseQueue for
tests; DatabaseMigrator v1 creates project/session/approval tables + indices per
§4 (device table deferred to M4). Domain types map through 1:1 row records;
approval input/decision stored as canonical JSON.
- SessionController gains an optional metadataStore sink at pipeline step 3,
persisting session metadata + approvals at boundaries (best-effort; never breaks
the canonical transcript or fan-out).
6 store tests (round-trips, scoped upsert, approval pending→resolved, on-disk
reopen, and end-to-end controller→store persistence). Full suite 75 green.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
M0 (the stream-json spike) was completed earlier but its code was left
uncommitted in a sibling worktree and never landed on any branch. This
commits it verbatim as the M1 baseline:
- NucleicCore: AgentEvent/JSONValue model, AgentBackend protocol,
ApprovalCoordinator, ProcessHost, Transcript writer/reader,
ClaudeStreamDecoder, in-process MCP approval server, ClaudeCodeBackend
- nucleic-spike CLI + fake-claude wire stub
- 41 hermetic tests (golden + contract + drift) and live captures under
fixtures/claude/2.1.167/
- PLAN.md / ADAPTERS.md updated with M0 findings; docs/M0_RESULTS.md
Built and tested with `swift build/test --build-system native` (iCloud
codesign workaround).
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>