---
domain: macos-platform
last_rule_review_commit: fea3860d011f006a058506cb1f054407a5975a87
last_rule_updated_at: 2026-06-24
---

# macos-platform

## 목적 / 책임

macOS desktop target의 bundle metadata, entitlement, URL scheme, runner 설정, bundled ADB resource packaging, certified build/signing/notarization tooling, certified Jenkins job provisioning을 담당한다.

## 포함 경로

- `macos/Runner/Info.plist` — bundle metadata와 `appsok://` URL scheme
- `macos/Runner/Configs/` — product name, bundle identifier, build config
- `macos/Runner/Assets.xcassets/` — macOS app icon asset catalog
- `macos/Runner/AppDelegate.swift`, `macos/Runner/MainFlutterWindow.swift`, `macos/Runner/Base.lproj/` — macOS app/window/menu runner wiring
- `macos/Runner/*.entitlements` — sandbox/network 권한
- `macos/Runner/Resources/adb-runtime/` — bundled ADB runtime metadata와 NOTICE
- `macos/Runner.xcodeproj/`, `macos/Runner.xcworkspace/` — Xcode project/workspace 설정
- `macos/RunnerTests/` — macOS Runner XCTest scaffold
- `macos/Flutter/` — Flutter generated xcconfig와 plugin 등록
- `scripts/build-certified-macos.sh` — Flutter gate, Developer ID signing, notarization, final zip 생성
- `scripts/setup-appsok-ci-secrets.sh` — SOPS age key, encrypted CI secret, notary profile setup
- `scripts/upsert-jenkins-certified-job.sh` — certified macOS artifact Jenkins job XML dry-run/create/update
- `.sops.yaml`, `secrets/*.sops.json` — encrypted CI signing/notary input 설정과 암호화 payload

## 제외 경로

- `lib/src/services/jenkins_client.dart` — network 호출 자체는 `artifact-flow` 책임
- `lib/src/services/adb_service.dart` — ADB command wrapper는 `device-console` 책임
- `lib/src/theme/` — 시각 스타일은 `app-shell` 책임
- `agent-test/` — 검증 명령 라우팅은 테스트 룰 책임

## 주요 구성 요소

- `AppInfo.xcconfig` — macOS 앱 표시 이름과 bundle id
- `Info.plist` — URL scheme 등록
- `DebugProfile.entitlements`, `Release.entitlements` — sandbox와 network client 권한
- `Runner.xcodeproj` build phase — pinned Android platform-tools `adb`를 app bundle resource로 복사하고 adhoc sign
- `GeneratedPluginRegistrant.swift` — `app_links`, `flutter_secure_storage_darwin`, `webview_flutter_wkwebview` plugin 등록
- `build-certified-macos.sh` — release build, bundled `adb` signing, app signing, notarization/staple/assessment packaging, SHA-256 sidecar 생성
- `setup-appsok-ci-secrets.sh` — SOPS-encrypted CI input 생성, Jenkins credential input 암호화, `notarytool` profile 저장
- `upsert-jenkins-certified-job.sh` — credential-free SCM URL 기반 `appsok-macos-certified` Jenkins job XML 생성/갱신

## 유지할 패턴

- 앱 표시 이름은 사용자에게 보이는 이름 `AppSok`을 유지한다.
- bundle identifier는 `com.tokilabs.appsok` 기준으로 관리한다.
- URL scheme은 식별자 규칙상 `appsok://`을 유지한다.
- Jenkins 호출에는 network client entitlement가 필요하다.
- Release entitlement는 필요 권한만 유지하고, Debug/Profile 권한과 차이가 있으면 목적을 명확히 둔다.
- bundled ADB는 `source.properties`의 pinned `Pkg.Revision`과 실제 `adb version`을 맞춘 뒤 app resource로 복사한다.
- app bundle 안의 `adb-runtime/adb`는 app signing/notarization 전에 별도로 codesign 검증한다.
- CI signing/notary secret은 SOPS-encrypted payload와 macOS Keychain profile로만 다루고 raw password/key를 tracked 문서나 로그에 남기지 않는다.
- Jenkins certified job upsert는 dry-run을 기본값으로 두고, SCM URL userinfo를 거부하며, Jenkins credential은 SOPS payload에서 읽어 임시 curl config로만 전달한다.
- certified build 산출물은 `AppSok-certified.zip`과 같은 경로의 `.sha256` sidecar를 함께 생성한다.
- 배포 전에는 sandbox 상태에서 ADB binary 실행과 USB 접근 가능 여부를 macOS host에서 검증한다.
- macOS build/signing 검증은 local container가 아니라 standard remote Mac runner `toki@toki-labs.com`의 `$HOME/docker/services/code-server/data/volume/workspace/appsok` checkout을 기준으로 한다.
- certified build script는 `flutter analyze`, `flutter test`, `flutter build macos` gate 이후 signing/notarization/package 순서를 유지한다.
- 원격에는 valid codesigning identity가 확인되어 있지만, notary credential profile은 profile availability 확인 전까지 미확정으로 둔다.

## 다른 도메인과의 경계

- **artifact-flow**: deep link payload가 Jenkins job/build/artifact를 가리킬 수 있으나 parsing/권한 확인은 artifact-flow에서 담당한다. certified Jenkins job provisioning은 배포 CI 설정으로 macos-platform 책임이다.
- **device-console**: bundled ADB resource, sandbox, codesign, packaging 제약은 macos-platform에서 관리하고, runtime 선택과 command semantics는 device-console에서 관리한다.
- **app-shell**: 앱 이름과 window metadata는 platform 설정에서 관리하고, 화면 layout은 app-shell에서 관리한다.

## 금지 사항

- entitlement를 넓힐 때 사유 없이 sandbox를 해제하지 않는다.
- macOS 설정 파일을 Flutter 자동 생성물과 충돌하는 방식으로 수동 대량 편집하지 않는다.
- notarization, signing, MDM 배포 전제를 확인하지 않고 배포 가능하다고 단정하지 않는다.
- Jenkins job XML이나 SCM URL에 username/password/token을 직접 포함하지 않는다.
- SOPS key, keychain password, Apple ID password, notary credential 원문을 tracked 파일, task log, 최종 응답에 기록하지 않는다.
