XcodeGen-managed project (project.yml), SwiftUI single-window app
1280x800 / min 1100x700, dark theme tokens from docs/21, 270pt sidebar
with logo/preset select/Calibrate/stepper 1-5, notice banner, five
stage placeholders, ICCeryCore SPM package with AppPaths + WizardStage,
Swift Testing plumbing. Sandbox off, hardened runtime on, bundle id
com.gronod.iccery2.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- actor ProcessManager: runStreaming + runCaptured (concurrent pipe
drain — no 64 KiB deadlock), sendStdin with independent stdin map
(#84), kill/killAll, duplicate-id rejection (#116)
- Multicast AsyncStream<ProcessEvent> bus: stdout/stderr/exit/error/
jsonRow (ROW_COLORS_JSON: prefix stripped)
- exit emitted exactly once, gated on both pipes reaching EOF so
buffered output is never lost on fast exits or kills
- ARGYLL_NOT_INTERACTIVE=1 on every child; argv logged with ~ home
sanitization; subprocess stdout→info, stderr→warn
- ProcessLineDecoder (byte-split at \n, UTF-8 safe, CRLF, unterminated
tail flush), JSONAccumulator (multiline JSON for instlist/profcheck/
manifest), ProcessID conventions
- 19 new tests incl. large-output captured run and stdin round-trip
- Fixup: entitlements gain com.apple.security.device.usb; sidebar
preset/Calibrate disabled and only Stage 1 enabled per #1 AC
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- scripts/fetch-argyll.sh: POSIX sh port of fetch-argyll.mjs; queries
the Gitea release API for the *_macOS_universal_bin.tgz asset,
extracts Argyll_V*/bin, chmod+x, strips quarantine xattr; honors
ARGYLL_SERVER_URL / ARGYLL_REPO / ARGYLL_RELEASE_TAG / GITEA_TOKEN.
Verified end-to-end: 51 universal tools from v3.5.0-ICCery1.8.
- BinaryResolver: settings argyll_binary_dir override (existence-gated)
→ bundled Argyll/<platform>/, macos-universal preferred when instlist
marker present, else macos-arm64/macos-x86_64; constructed path
returned even when absent (spawn surfaces process:error). Mock and
reference-gamut helpers.
- Vendored tracked resources: mocks/{chartread,colprof,profcheck}.mock
+ reference_gamuts/sRGB.gam from ICCery v1, copied as a folder
reference so the Argyll/ subtree structure survives into the bundle.
- Build phase rsyncs Vendor/Argyll/ → Contents/Resources/Argyll/.
- AppDelegate: killAll via terminateLater so children are signaled
before teardown (#147/#149).
- 6 resolver tests + fetch script smoke-verified against real release.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- codesign -f -s - every fetched Mach-O, then codesign -dvv verify —
an unsigned sidecar now fails the script (#165)
- Replace the 8-cusp reference_gamuts stub with the real v0.8.5
src/assets/sRGB.gam (448 verts / 892 faces) used by the Stage 5
gamut overlay (#185)
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
M1 — Foundation & process core
Native macOS rewrite foundation. Argyll is orchestrated as subprocesses; no libraries are linked.
Delivered (one PR per issue)
com.gronod.iccery2, macOS 14, universalarm64+x86_64, dark theme, 1280×800 / min 1100×700, 270 pt sidebar with original cone logo, 5-step stepper (Stage 0 out-of-band), notice banner, settings/about slots, sandbox off + hardened runtime + USB entitlement.actor ProcessManager:runStreaming/runCaptured/sendStdin/kill/killAll, multicastevents()bus, duplicate-ID rejection,ARGYLL_NOT_INTERACTIVE=1,ROW_COLORS_JSON:prefix → jsonRow, exit gated on both pipes' EOF, concurrent captured drain, sanitised spawn logging.scripts/fetch-argyll.sh(POSIX sh+curl,ARGYLL_SERVER_URL/ARGYLL_REPO/ARGYLL_RELEASE_TAG/GITEA_TOKEN; ad-hoc sign +codesign -dvvverify; quarantine strip). Verified live: 51 universal tools fromv3.5.0-ICCery1.8.BinaryResolver(override →macos-universal-if-instlist → arch dir; missing → constructed path forprocess:error). Vendored mocks + real 448v/892fsRGB.gam.killAllviaterminateLater.PathSecurity,AtomicFileWriter,ArtefactProbe,Ti2Header,TiffPreview(TIFF→PNG ≤1200 px),ArtefactFiles.AppSettings/SettingsStoreat~/Library/Application Support/com.gronod.iccery2/settings.json, contract validation strings, corrupt-JSON → defaults,settingsDidChangenotification;LogSinkrolling 5 MiB×5 with livesetLevel; fullSettingsViewsheet.WizardGating(disk-truth gating: 2←ti1, 3←ti1+ti2, 4←ti3 only, 5←ti3+profile; forward gated/backward free), persistedWizardState, focus revalidation (#151), basename sanitisation (#60), cwd fallback (#59).Verification
xcodebuild build test -scheme ICCery -destination 'platform=macOS' ARCHS='x86_64 arm64' ONLY_ACTIVE_ARCH=NO— 71/71 tests pass, universal binary confirmed vialipo.Argyll/macos-universal/(51 signed tools),Argyll/mocks/,Argyll/reference_gamuts/sRGB.gam.Vendor/Argyll/gitignored).Closes milestone M1 (issues #1–#6).
- scripts/fetch-argyll.sh: POSIX sh port of fetch-argyll.mjs; queries the Gitea release API for the *_macOS_universal_bin.tgz asset, extracts Argyll_V*/bin, chmod+x, strips quarantine xattr; honors ARGYLL_SERVER_URL / ARGYLL_REPO / ARGYLL_RELEASE_TAG / GITEA_TOKEN. Verified end-to-end: 51 universal tools from v3.5.0-ICCery1.8. - BinaryResolver: settings argyll_binary_dir override (existence-gated) → bundled Argyll/<platform>/, macos-universal preferred when instlist marker present, else macos-arm64/macos-x86_64; constructed path returned even when absent (spawn surfaces process:error). Mock and reference-gamut helpers. - Vendored tracked resources: mocks/{chartread,colprof,profcheck}.mock + reference_gamuts/sRGB.gam from ICCery v1, copied as a folder reference so the Argyll/ subtree structure survives into the bundle. - Build phase rsyncs Vendor/Argyll/ → Contents/Resources/Argyll/. - AppDelegate: killAll via terminateLater so children are signaled before teardown (#147/#149). - 6 resolver tests + fetch script smoke-verified against real release. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>