-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathproject.yml
More file actions
225 lines (218 loc) · 9.77 KB
/
Copy pathproject.yml
File metadata and controls
225 lines (218 loc) · 9.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
name: Heeler
options:
bundleIdPrefix: dev.bybee
deploymentTarget:
iOS: "18.0"
createIntermediateGroups: true
minimumXcodeGenVersion: "2.42.0"
settings:
base:
# Swift 6 language mode implies complete strict concurrency checking.
SWIFT_VERSION: "6.0"
SWIFT_STRICT_CONCURRENCY: complete
DEVELOPMENT_TEAM: 9VM4RM39R3
CODE_SIGN_STYLE: Automatic
packages:
# Repository-local package owning the libssh2/OpenSSL implementation and
# checked-in native artifacts. The one SSH backend (ADR 0011).
HeelerSSH:
path: Packages/HeelerSSH
# Pinned because this package embeds a prebuilt libghostty XCFramework and
# libghostty's public API is still evolving independently from Ghostty.
GhosttyTerminal:
url: https://github.com/lakr233/libghostty-spm.git
exactVersion: "1.3.1"
targets:
Heeler:
type: application
platform: iOS
sources:
- path: Sources/Heeler
excludes:
# Bundled as a folder reference below so notice files stay under
# Notices/ in the app bundle rather than flattening to the root.
- Resources/Notices
# Notification code shared with the service extension: envelope
# decryption, Notification Key store, alert renderer (ADR 0008).
- Sources/HeelerNotificationCore
# Live Activity attributes + details envelope (shared with HeelerWidgets).
- Sources/HeelerActivityCore
# Widget views double-included so Xcode can host their #Preview gallery
# in the app target (plain previews are unsupported inside app-extension
# targets); the @main WidgetBundle stays extension-only.
- Sources/HeelerWidgets/AgentLiveActivityWidget.swift
- Sources/HeelerWidgets/AgentActivityDecryptor.swift
# Audited third-party notices + inventory.json (#161). Folder reference
# preserves the Notices/ subdirectory the catalogue resolves against.
- path: Sources/Heeler/Resources/Notices
type: folder
buildPhase: resources
entitlements:
path: Sources/Heeler/Heeler.entitlements
properties:
# Development here covers Debug/local device builds (sandbox APNs);
# App Store / TestFlight re-signing flips it to production, so the
# APNs environment follows the build configuration (#71).
aps-environment: development
# Shared with the Notification Service Extension; doubles as the
# Keychain access group holding the Notification Keys.
com.apple.security.application-groups:
- group.dev.bybee.heeler.shared
settings:
base:
GENERATE_INFOPLIST_FILE: YES
PRODUCT_BUNDLE_IDENTIFIER: dev.bybee.heeler
# Home-screen name; the App Store listing is "Heeler for herdr".
INFOPLIST_KEY_CFBundleDisplayName: Heeler
MARKETING_VERSION: "0.1.0"
CURRENT_PROJECT_VERSION: "12"
# Scan to Pair (#62) reads the Pairing Code QR from the computer screen.
INFOPLIST_KEY_NSCameraUsageDescription: "Heeler uses the camera to scan the Pairing Code shown on your computer, so you can add that machine without typing anything."
# Only exempt encryption is used (standard SSH algorithms via the
# HeelerSSH package's libssh2/OpenSSL, OS-provided CryptoKit);
# declaring it here keeps every TestFlight upload from stalling on the
# Missing Compliance prompt.
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption: NO
# iPhone only. App Store Connect derives device support from the build.
TARGETED_DEVICE_FAMILY: "1"
INFOPLIST_KEY_UILaunchScreen_Generation: YES
INFOPLIST_KEY_UIApplicationSceneManifest_Generation: YES
INFOPLIST_KEY_UISupportedInterfaceOrientations: "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"
# ActivityKit starts Live Activities from the app; HeelerWidgets renders them.
INFOPLIST_KEY_NSSupportsLiveActivities: YES
dependencies:
- package: HeelerSSH
- package: GhosttyTerminal
- package: GhosttyTerminal
product: GhosttyTheme
- target: HeelerNotificationService
- target: HeelerWidgets
# Decrypts Agent Notifications before display (ADR 0008, #71). A thin
# shell: the logic lives in HeelerNotificationCore, tested from the app
# suite. The extension cannot link the app, so the shared sources (and the
# few app files they lean on) are compiled in directly.
HeelerNotificationService:
type: app-extension
platform: iOS
sources:
- Sources/HeelerNotificationService
- Sources/HeelerNotificationCore
- Sources/Heeler/Support/Base64URL.swift
- Sources/Heeler/Transport/SecretStore.swift
# For AgentStatus; Foundation-only by construction (JSONValue is the
# generated file's one in-repo dependency).
- Sources/Heeler/Transport/Generated/HerdrAPITypes.swift
- Sources/Heeler/Transport/JSONValue.swift
entitlements:
path: Sources/HeelerNotificationService/HeelerNotificationService.entitlements
properties:
com.apple.security.application-groups:
- group.dev.bybee.heeler.shared
info:
path: Sources/HeelerNotificationService/Info.plist
properties:
# An app extension's versions must match its containing app's, or
# App Store validation rejects the bundle. XcodeGen would otherwise
# hardcode its own 1.0/1 defaults here; point at the build settings
# so both bundles stay in lockstep.
CFBundleShortVersionString: $(MARKETING_VERSION)
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
# App Store validation (code 90360) requires a display name on
# every embedded appex; never user-visible for this extension.
CFBundleDisplayName: Heeler Notification Service
NSExtension:
NSExtensionPointIdentifier: com.apple.usernotifications.service
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).NotificationService
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: dev.bybee.heeler.NotificationService
MARKETING_VERSION: "0.1.0"
CURRENT_PROJECT_VERSION: "12"
# Match the containing app's iPhone-only device family.
TARGETED_DEVICE_FAMILY: "1"
# Lock-screen / Dynamic Island Live Activity (docs/agents/live-activity-contract.md).
# Thin WidgetKit shell: attributes, envelope open, and Notification Key
# selection live in HeelerActivityCore / HeelerNotificationCore, compiled
# in the same way as the notification service extension (the appex cannot
# link the app). @main is the WidgetBundle; there is no principal class.
HeelerWidgets:
type: app-extension
platform: iOS
sources:
- Sources/HeelerWidgets
- Sources/HeelerActivityCore
- Sources/HeelerNotificationCore
- Sources/Heeler/Support/Base64URL.swift
- Sources/Heeler/Transport/SecretStore.swift
# For AgentStatus; Foundation-only by construction (JSONValue is the
# generated file's one in-repo dependency). NotificationEnvelope in
# HeelerNotificationCore needs it.
- Sources/Heeler/Transport/Generated/HerdrAPITypes.swift
- Sources/Heeler/Transport/JSONValue.swift
entitlements:
path: Sources/HeelerWidgets/HeelerWidgets.entitlements
properties:
com.apple.security.application-groups:
- group.dev.bybee.heeler.shared
info:
path: Sources/HeelerWidgets/Info.plist
properties:
# An app extension's versions must match its containing app's, or
# App Store validation rejects the bundle. XcodeGen would otherwise
# hardcode its own 1.0/1 defaults here; point at the build settings
# so both bundles stay in lockstep.
CFBundleShortVersionString: $(MARKETING_VERSION)
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
# App Store validation (code 90360) requires a display name on
# every embedded appex. Also the counts-only lock-screen fallback.
CFBundleDisplayName: Heeler
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: dev.bybee.heeler.Widgets
MARKETING_VERSION: "0.1.0"
CURRENT_PROJECT_VERSION: "12"
# Match the containing app's iPhone-only device family.
TARGETED_DEVICE_FAMILY: "1"
HeelerTests:
type: bundle.unit-test
platform: iOS
sources:
- Tests/HeelerTests
# Shared Pairing Code vectors (ADR 0007): the same file the Node plugin
# tests consume, bundled so the Swift tests cannot drift from it.
- path: plugin/test-vectors/pairing-code-v1.json
buildPhase: resources
# Shared notification envelope vectors (ADR 0008), same arrangement.
- path: plugin/test-vectors/notification-payload-v1.json
buildPhase: resources
# Shared Live Activity details envelope vectors, same arrangement.
- path: plugin/test-vectors/live-activity-content-v1.json
buildPhase: resources
settings:
base:
GENERATE_INFOPLIST_FILE: YES
PRODUCT_BUNDLE_IDENTIFIER: dev.bybee.heeler.tests
dependencies:
- target: Heeler
- package: HeelerSSH
- package: GhosttyTerminal
schemes:
Heeler:
build:
targets:
Heeler: all
test:
targets:
- HeelerTests
# The only variable the app test process needs from the invoking shell.
# The fixture itself arrives through the Simulator's launchd environment
# as HEELER_SSH_E2E_CONFIG / HEELER_SSH_JUMP_E2E_CONFIG /
# HEELER_PAIRING_E2E_CONFIG, which must stay off this list: an entry here
# is forwarded unconditionally, substituting an empty string when the
# shell has not exported it, and would shadow the launchd value.
environmentVariables:
HEELER_SSH_E2E_REQUIRED: $(HEELER_SSH_E2E_REQUIRED)
run:
config: Debug