Commit Graph
10 Commits
Author SHA1 Message Date
Nucleic 92aa0d305a Merge nucleic/humble-quartz-lynx into dev 2026-06-20 19:50:28 -07:00
abkslmandClaude Opus 4.8 7c4f398506 Rename Beta channel + add gold Release Candidate channel
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]>
2026-06-13 19:38:11 -07:00
abkslmandClaude Opus 4.8 309e83fb9f Add channel-based build/deploy strategy (dev/beta/stable)
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]>
2026-06-13 19:19:24 -07:00
abkslmandClaude Opus 4.8 d715aecbfa Embed built-from commit at build time; force white toolbar icons
- 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]>
2026-06-13 18:38:04 -07:00
abkslm 5dd36105bf Merge M4 (iPhone over LAN) into main
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
2026-06-13 01:31:53 -07:00
abkslmandClaude Opus 4.8 2d3a184522 M4: extract NucleicProtocol shared library (iOS+macOS clean)
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]>
2026-06-13 00:27:39 -07:00
abkslmandClaude Opus 4.8 07133415ea Add paneling system around chat (file explorer + terminal)
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]>
2026-06-13 00:02:42 -07:00
abkslmandClaude Opus 4.8 cd34221ea6 M1: macOS app target + AppStore object-graph root
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]>
2026-06-12 01:33:32 -07:00
abkslmandClaude Opus 4.8 766e9d4490 M1: GRDB metadata store (RUNTIME §4)
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]>
2026-06-12 01:10:28 -07:00
abkslmandClaude Opus 4.8 43279a038e Land M0 deliverable: NucleicCore package + spike + fixtures
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]>
2026-06-12 00:34:10 -07:00