@olegkoval/agent-skills 1.12.0 โ†’ 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/.claude-plugin/plugin.json +5 -2
  2. package/.cursor-plugin/index.json +10 -0
  3. package/.kiro/steering/apple-store-submit.md +146 -0
  4. package/.kiro/steering/macos-menubar-app.md +226 -0
  5. package/.windsurf/rules/apple-store-submit.md +145 -0
  6. package/.windsurf/rules/macos-menubar-app.md +225 -0
  7. package/catalog/skills.json +66 -0
  8. package/package.json +1 -1
  9. package/packages/software-development/apple-store-submit/SKILL.md +157 -0
  10. package/packages/software-development/apple-store-submit/adapters/claude/plugin.json +5 -0
  11. package/packages/software-development/apple-store-submit/adapters/claude/skills/apple-store-submit/SKILL.md +158 -0
  12. package/packages/software-development/apple-store-submit/adapters/codex/README.md +3 -0
  13. package/packages/software-development/apple-store-submit/adapters/cursor/plugin.json +6 -0
  14. package/packages/software-development/apple-store-submit/adapters/cursor/skills/apple-store-submit/SKILL.md +158 -0
  15. package/packages/software-development/apple-store-submit/adapters/kiro/steering/apple-store-submit.md +145 -0
  16. package/packages/software-development/apple-store-submit/adapters/windsurf/rules/apple-store-submit.md +144 -0
  17. package/packages/software-development/macos-menubar-app/SKILL.md +237 -0
  18. package/packages/software-development/macos-menubar-app/adapters/claude/plugin.json +5 -0
  19. package/packages/software-development/macos-menubar-app/adapters/claude/skills/macos-menubar-app/SKILL.md +238 -0
  20. package/packages/software-development/macos-menubar-app/adapters/codex/README.md +3 -0
  21. package/packages/software-development/macos-menubar-app/adapters/cursor/plugin.json +6 -0
  22. package/packages/software-development/macos-menubar-app/adapters/cursor/skills/macos-menubar-app/SKILL.md +238 -0
  23. package/packages/software-development/macos-menubar-app/adapters/kiro/steering/macos-menubar-app.md +225 -0
  24. package/packages/software-development/macos-menubar-app/adapters/windsurf/rules/macos-menubar-app.md +224 -0
  25. package/packages/software-development/skill-budget-audit/SKILL.md +145 -0
  26. package/packages/software-development/skill-budget-audit/adapters/claude/plugin.json +5 -0
  27. package/packages/software-development/skill-budget-audit/adapters/claude/skills/skill-budget-audit/SKILL.md +146 -0
  28. package/scripts/build-adapters.sh +8 -6
@@ -0,0 +1,225 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Build a production-quality macOS menubar or notch app in SwiftUI โ€” MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation."
5
+ ---
6
+
7
+
8
+ > ๐Ÿค– *Auto-generated by **weekly-pattern-learner** ยท SwiftUI macOS menubar app pattern observed in FocusNotch session, Jun 2026 (364 user turns, ~48 MB transcript covering idea โ†’ spec โ†’ impl โ†’ critique cycles โ†’ App Store)*
9
+
10
+ # macOS Menubar / Notch App (SwiftUI)
11
+
12
+ ## Overview
13
+
14
+ Build a macOS app that lives in the menu bar or notch using SwiftUI's `MenuBarExtra`. Covers the full lifecycle: project setup, window management, entitlements, user interaction (keyboard shortcuts, sound), and App Store preparation.
15
+
16
+ ## When to Use
17
+
18
+ - User asks to build an app for the macOS menubar, status bar, or notch
19
+ - Adding a menubar presence to an existing macOS app
20
+ - Debugging sandbox rejections or entitlement errors in a SwiftUI app
21
+
22
+ ## Workflow
23
+
24
+ ### 1. Project Setup
25
+
26
+ Create a new macOS App target in Xcode:
27
+
28
+ - **Interface**: SwiftUI
29
+ - **App Sandbox**: Enabled (required for App Store)
30
+ - **Bundle ID**: `com.yourname.AppName`
31
+ - **Deployment target**: macOS 13+ (for `MenuBarExtra`)
32
+
33
+ In `Info.plist`, set:
34
+
35
+ ```xml
36
+ <key>LSUIElement</key>
37
+ <true/>
38
+ ```
39
+
40
+ This hides the app from the Dock โ€” the menu bar becomes the only entry point.
41
+
42
+ ### 2. MenuBarExtra (SwiftUI native)
43
+
44
+ ```swift
45
+ @main
46
+ struct FocusApp: App {
47
+ var body: some Scene {
48
+ MenuBarExtra {
49
+ ContentView()
50
+ .frame(width: 320, height: 480)
51
+ } label: {
52
+ Label("Focus", systemImage: "timer")
53
+ }
54
+ .menuBarExtraStyle(.window)
55
+ }
56
+ }
57
+ ```
58
+
59
+ Use `.menuBarExtraStyle(.window)` for a popover-style panel. Use `.menuBarExtraStyle(.menu)` for a dropdown menu.
60
+
61
+ ### 3. Notch Detection
62
+
63
+ On MacBooks with a notch, the safe area changes. Detect and adapt:
64
+
65
+ ```swift
66
+ func isNotchPresent() -> Bool {
67
+ guard let screen = NSScreen.main else { return false }
68
+ // The notch area is excluded from visibleFrame top
69
+ let screenHeight = screen.frame.height
70
+ let visibleTop = screen.visibleFrame.maxY
71
+ return visibleTop < screenHeight
72
+ }
73
+ ```
74
+
75
+ Position windows below the notch:
76
+
77
+ ```swift
78
+ window.setFrameOrigin(NSPoint(
79
+ x: window.frame.origin.x,
80
+ y: NSScreen.main!.frame.height - window.frame.height - notchOffset
81
+ ))
82
+ ```
83
+
84
+ ### 4. Sandbox Entitlements
85
+
86
+ Minimum `.entitlements` for a sandboxed menubar app:
87
+
88
+ ```xml
89
+ <?xml version="1.0" encoding="UTF-8"?>
90
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
91
+ <plist version="1.0">
92
+ <dict>
93
+ <key>com.apple.security.app-sandbox</key>
94
+ <true/>
95
+ <!-- Add only what the app actually uses: -->
96
+ <!-- <key>com.apple.security.network.client</key> -->
97
+ <!-- <true/> -->
98
+ </dict>
99
+ </plist>
100
+ ```
101
+
102
+ For focus/blocking features that need accessibility:
103
+
104
+ ```xml
105
+ <key>com.apple.security.temporary-exception.apple-events</key>
106
+ <array>
107
+ <string>com.apple.systemevents</string>
108
+ </array>
109
+ ```
110
+
111
+ ### 5. Accessibility Permission (Focus Detection)
112
+
113
+ To detect which app is in focus (required for distraction blocking):
114
+
115
+ ```swift
116
+ import ApplicationServices
117
+
118
+ func requestAccessibilityPermission() -> Bool {
119
+ let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String: true]
120
+ return AXIsProcessTrustedWithOptions(options)
121
+ }
122
+ ```
123
+
124
+ Call this on first launch and prompt the user to grant access in **System Settings โ†’ Privacy โ†’ Accessibility**.
125
+
126
+ ### 6. Sound Effects
127
+
128
+ ```swift
129
+ import AVFoundation
130
+
131
+ class SoundPlayer {
132
+ private var player: AVAudioPlayer?
133
+
134
+ func play(_ filename: String, extension ext: String = "mp3") {
135
+ guard let url = Bundle.main.url(forResource: filename, withExtension: ext) else { return }
136
+ player = try? AVAudioPlayer(contentsOf: url)
137
+ player?.play()
138
+ }
139
+ }
140
+ ```
141
+
142
+ Add sound files to the Xcode target (check **Target Membership** in file inspector).
143
+
144
+ For system sounds (no file needed):
145
+
146
+ ```swift
147
+ NSSound.beep()
148
+ // or
149
+ NSSound(named: .init("Hero"))?.play()
150
+ ```
151
+
152
+ ### 7. Keyboard Shortcuts
153
+
154
+ Global shortcuts (work when app is not focused) โ€” requires Accessibility permission:
155
+
156
+ ```swift
157
+ NSEvent.addGlobalMonitorForEvents(matching: .keyDown) { event in
158
+ if event.modifierFlags.contains([.command, .shift]) && event.keyCode == 36 { // โŒ˜โ‡งโ†ฉ
159
+ // Handle shortcut
160
+ }
161
+ }
162
+ ```
163
+
164
+ Local shortcuts (SwiftUI):
165
+
166
+ ```swift
167
+ .keyboardShortcut("s", modifiers: [.command, .shift])
168
+ ```
169
+
170
+ ### 8. Persistent State (AppStorage)
171
+
172
+ ```swift
173
+ @AppStorage("timerDuration") private var timerDuration: Double = 25 * 60
174
+ @AppStorage("soundEnabled") private var soundEnabled: Bool = true
175
+ ```
176
+
177
+ For complex state, use `UserDefaults` with a suite name to share across extensions.
178
+
179
+ ### 9. Polish Cycle
180
+
181
+ After each implementation slice:
182
+
183
+ > **Optional skills**: Steps 1 and 3 require `/critique` and `/whimsy-injector` from the agent-skills catalog. Install them via `skillshare` if not already available; skip these steps if not installed.
184
+
185
+ 1. Run `/critique` โ€” evaluate against Apple HIG, WCAG contrast, interaction consistency
186
+ 2. Fix all P0/P1 findings
187
+ 3. Run `/whimsy-injector` on completion screens and idle states
188
+ 4. Test on a machine **without** a notch to verify layout
189
+
190
+ ### 10. App Store Preparation
191
+
192
+ See `olko:apple-store-submit` for the full submission and rejection-handling workflow.
193
+
194
+ Pre-submission checklist:
195
+
196
+ ```bash
197
+ # Validate archive
198
+ xcodebuild archive -scheme <AppName> -archivePath build/<AppName>.xcarchive
199
+
200
+ # Check sandbox
201
+ codesign --verify --deep --strict build/<AppName>.xcarchive/Products/Applications/<AppName>.app
202
+
203
+ # Verify entitlements
204
+ codesign -d --entitlements :- build/<AppName>.xcarchive/Products/Applications/<AppName>.app
205
+ ```
206
+
207
+ ## Key Pitfalls
208
+
209
+ | Symptom | Cause | Fix |
210
+ |---------|-------|-----|
211
+ | App appears in Dock | `LSUIElement` missing | Add to `Info.plist` |
212
+ | Menubar icon missing after build | Asset catalog misconfigured | Use PDF or SVG template image, tick **Template Image** |
213
+ | Crash on click | View not loaded in popover window | Add `.frame()` to `MenuBarExtra` content |
214
+ | Sound not playing | File not in target | Check Target Membership in file inspector |
215
+ | Accessibility prompt not shown | Missing entitlement | Add `temporary-exception.apple-events` or use XPC |
216
+ | Notch overlap | Hardcoded y-position | Detect `visibleFrame` vs `frame` delta |
217
+
218
+ ## Verification
219
+
220
+ - [ ] App does not appear in Dock (`LSUIElement` = true)
221
+ - [ ] MenuBarExtra icon renders as template image (respects dark/light mode)
222
+ - [ ] Sound plays on timer events
223
+ - [ ] Keyboard shortcuts respond both globally and locally
224
+ - [ ] App passes `codesign --verify --deep --strict`
225
+ - [ ] Layout correct on M1 MacBook (no notch) and M3 MacBook Pro (notch)
@@ -359,6 +359,72 @@
359
359
  "windsurf",
360
360
  "kiro"
361
361
  ]
362
+ },
363
+ {
364
+ "name": "apple-store-submit",
365
+ "lookupName": "olko:apple-store-submit",
366
+ "category": "software-development",
367
+ "path": "packages/software-development/apple-store-submit",
368
+ "description": "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit.",
369
+ "tags": [
370
+ "apple",
371
+ "app-store",
372
+ "ios",
373
+ "macos",
374
+ "xcode",
375
+ "submission",
376
+ "rejection"
377
+ ],
378
+ "adapters": [
379
+ "codex",
380
+ "claude",
381
+ "cursor",
382
+ "copilot",
383
+ "windsurf",
384
+ "kiro"
385
+ ]
386
+ },
387
+ {
388
+ "name": "macos-menubar-app",
389
+ "lookupName": "olko:macos-menubar-app",
390
+ "category": "software-development",
391
+ "path": "packages/software-development/macos-menubar-app",
392
+ "description": "Build a production-quality macOS menubar or notch app in SwiftUI โ€” MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation.",
393
+ "tags": [
394
+ "macos",
395
+ "swiftui",
396
+ "menubar",
397
+ "notch",
398
+ "xcode",
399
+ "apple",
400
+ "sandbox"
401
+ ],
402
+ "adapters": [
403
+ "codex",
404
+ "claude",
405
+ "cursor",
406
+ "copilot",
407
+ "windsurf",
408
+ "kiro"
409
+ ]
410
+ },
411
+ {
412
+ "name": "skill-budget-audit",
413
+ "lookupName": "olko:skill-budget-audit",
414
+ "category": "software-development",
415
+ "path": "packages/software-development/skill-budget-audit",
416
+ "description": "Diagnose and fix Claude Code skill context budget overflow โ€” identify heavy plugin bundles, remove domain-specific ones, and restore skill discoverability.",
417
+ "tags": [
418
+ "claude-code",
419
+ "skills",
420
+ "plugins",
421
+ "context-budget",
422
+ "token-economy",
423
+ "performance"
424
+ ],
425
+ "adapters": [
426
+ "claude"
427
+ ]
362
428
  }
363
429
  ]
364
430
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: apple-store-submit
3
+ description: Handle Apple App Store rejection emails end-to-end โ€” parse rejection reasons, create a fix plan, implement code changes (privacy strings, entitlements, sandbox), navigate App Store Connect to update metadata, and resubmit. Use when an app receives a rejection or when preparing a first-time submission.
4
+ license: MIT
5
+ allowed-tools: Bash, Read, Write, Edit
6
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires Xcode, an Apple Developer account, and App Store Connect access.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - apple
12
+ - app-store
13
+ - ios
14
+ - macos
15
+ - xcode
16
+ - submission
17
+ - rejection
18
+ ---
19
+
20
+ > ๐Ÿค– *Auto-generated by **weekly-pattern-learner** ยท App Store rejection handling workflow observed in FocusNotch App Store session, Jun 2026 (92 user turns covering rejection โ†’ plan โ†’ code fixes โ†’ metadata โ†’ resubmit)*
21
+
22
+ # Apple App Store Submission & Rejection Handling
23
+
24
+ ## Overview
25
+
26
+ Parse Apple rejection feedback, implement targeted fixes, update App Store Connect metadata, and resubmit โ€” covering the complete cycle from rejection email to approved build.
27
+
28
+ ## When to Use
29
+
30
+ - Apple review team sends a rejection email
31
+ - App fails automated pre-review checks (binary rejected at upload)
32
+ - Preparing metadata for first-time submission (screenshots, keywords, privacy labels)
33
+ - Resolving App Store Connect errors before submitting for review
34
+
35
+ ## Workflow
36
+
37
+ ### 1. Parse the Rejection
38
+
39
+ Read the full rejection email. Extract and list:
40
+
41
+ - **Guideline numbers** violated (e.g., 2.1, 4.2.0, 5.1.1)
42
+ - **Code-level issues** โ€” missing entitlements, incorrect privacy strings, sandbox violations
43
+ - **Metadata issues** โ€” wrong screenshot sizes, subtitle policy, keyword stuffing
44
+ - **UX issues** โ€” crashes described by reviewer, broken flows, missing functionality
45
+
46
+ Create a numbered fix plan: one item per rejection point, with the type of fix needed.
47
+
48
+ ### 2. Classify Fixes by Type
49
+
50
+ | Type | Location |
51
+ |------|----------|
52
+ | Privacy usage strings missing | `Info.plist` |
53
+ | Entitlement missing/wrong | `<AppName>.entitlements` |
54
+ | Crash or broken feature | Source code |
55
+ | Screenshots wrong size/content | App Store Connect |
56
+ | Keywords/subtitle/description | App Store Connect |
57
+ | Build number conflict | Xcode + App Store Connect |
58
+
59
+ ### 3. Implement Code Fixes
60
+
61
+ **Privacy permission strings** (`Info.plist`):
62
+
63
+ ```xml
64
+ <key>NSMicrophoneUsageDescription</key>
65
+ <string>Used for voice input during focus sessions.</string>
66
+
67
+ <key>NSCalendarsUsageDescription</key>
68
+ <string>Used to sync tasks with your calendar.</string>
69
+ ```
70
+
71
+ **Entitlements** (`<AppName>.entitlements`):
72
+
73
+ ```xml
74
+ <key>com.apple.security.app-sandbox</key>
75
+ <true/>
76
+ <key>com.apple.security.network.client</key>
77
+ <true/>
78
+ <key>com.apple.security.files.user-selected.read-write</key>
79
+ <true/>
80
+ ```
81
+
82
+ **Sandbox violations** โ€” remove `NoEscapeBlock` patterns, replace deprecated APIs, use only sandboxed file access via Security-Scoped Bookmarks when needed.
83
+
84
+ ### 4. Build and Archive
85
+
86
+ ```bash
87
+ # Clean build
88
+ xcodebuild clean \
89
+ -scheme <AppName> \
90
+ -destination 'generic/platform=macOS'
91
+
92
+ # Archive
93
+ xcodebuild archive \
94
+ -scheme <AppName> \
95
+ -archivePath build/<AppName>.xcarchive \
96
+ -destination 'generic/platform=macOS'
97
+
98
+ # Export for App Store
99
+ xcodebuild -exportArchive \
100
+ -archivePath build/<AppName>.xcarchive \
101
+ -exportPath build/export \
102
+ -exportOptionsPlist ExportOptions.plist
103
+ ```
104
+
105
+ Validate codesigning before upload:
106
+
107
+ ```bash
108
+ codesign --verify --deep --strict --verbose=4 build/export/<AppName>.app
109
+ spctl --assess --verbose=4 build/export/<AppName>.app
110
+ ```
111
+
112
+ ### 5. Update App Store Connect Metadata
113
+
114
+ Navigate: **My Apps โ†’ [App] โ†’ App Store tab**
115
+
116
+ Common metadata fixes:
117
+
118
+ - **App name**: max 30 chars
119
+ - **Subtitle**: max 30 chars, no duplicate keywords from the title field
120
+ - **Keywords**: 100-char total limit, comma-separated, no spaces after commas
121
+ - **Screenshots**: exact pixel dimensions per device type (check Apple's current spec)
122
+ - **Privacy Nutrition Labels**: must accurately reflect data collected/linked to user
123
+ - **Build selection**: select the newly uploaded build before submitting
124
+
125
+ ### 6. Write Reviewer Notes
126
+
127
+ In the submission form, fill **Notes for Reviewer**:
128
+
129
+ - Explain each rejection point and what was changed
130
+ - Reference specific guideline numbers: "Addressing 2.1 โ€” added NSMicrophoneUsageDescription to Info.plist"
131
+ - If a feature requires special credentials to test, provide test account details
132
+
133
+ ### 7. Submit and Track
134
+
135
+ 1. Upload via **Xcode Organizer โ†’ Distribute App โ†’ App Store Connect**
136
+ 2. In App Store Connect: select the new build, fill notes, **Submit for Review**
137
+ 3. Typical re-review: 24โ€“48h
138
+ 4. If rejected again: respond in the **Resolution Center** thread (same case number)
139
+ 5. Escalate via Resolution Center for policy disagreements โ€” do not open a new submission
140
+
141
+ ## Build Number Protocol
142
+
143
+ Apple rejects builds with a duplicate build number. Increment `CFBundleVersion` in `Info.plist` or Xcode target settings before every upload:
144
+
145
+ ```bash
146
+ # Bump build number (e.g., 9 โ†’ 10)
147
+ xcrun agvtool new-version -all 10
148
+ ```
149
+
150
+ ## Verification
151
+
152
+ - [ ] Every rejection guideline number has a corresponding fix in the plan
153
+ - [ ] `xcodebuild archive` exits 0 with no warnings about entitlements
154
+ - [ ] `codesign --verify` passes
155
+ - [ ] App Store Connect shows build status as "Ready to Submit"
156
+ - [ ] Reviewer Notes reference each changed item
157
+ - [ ] Build number is higher than any previously uploaded build
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "olko-apple-store-submit",
3
+ "description": "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit.",
4
+ "skills": "./skills"
5
+ }
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: apple-store-submit
3
+ description: Handle Apple App Store rejection emails end-to-end โ€” parse rejection reasons, create a fix plan, implement code changes (privacy strings, entitlements, sandbox), navigate App Store Connect to update metadata, and resubmit. Use when an app receives a rejection or when preparing a first-time submission.
4
+ license: MIT
5
+ allowed-tools: Bash, Read, Write, Edit
6
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires Xcode, an Apple Developer account, and App Store Connect access.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - apple
12
+ - app-store
13
+ - ios
14
+ - macos
15
+ - xcode
16
+ - submission
17
+ - rejection
18
+ ---
19
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
20
+
21
+ > ๐Ÿค– *Auto-generated by **weekly-pattern-learner** ยท App Store rejection handling workflow observed in FocusNotch App Store session, Jun 2026 (92 user turns covering rejection โ†’ plan โ†’ code fixes โ†’ metadata โ†’ resubmit)*
22
+
23
+ # Apple App Store Submission & Rejection Handling
24
+
25
+ ## Overview
26
+
27
+ Parse Apple rejection feedback, implement targeted fixes, update App Store Connect metadata, and resubmit โ€” covering the complete cycle from rejection email to approved build.
28
+
29
+ ## When to Use
30
+
31
+ - Apple review team sends a rejection email
32
+ - App fails automated pre-review checks (binary rejected at upload)
33
+ - Preparing metadata for first-time submission (screenshots, keywords, privacy labels)
34
+ - Resolving App Store Connect errors before submitting for review
35
+
36
+ ## Workflow
37
+
38
+ ### 1. Parse the Rejection
39
+
40
+ Read the full rejection email. Extract and list:
41
+
42
+ - **Guideline numbers** violated (e.g., 2.1, 4.2.0, 5.1.1)
43
+ - **Code-level issues** โ€” missing entitlements, incorrect privacy strings, sandbox violations
44
+ - **Metadata issues** โ€” wrong screenshot sizes, subtitle policy, keyword stuffing
45
+ - **UX issues** โ€” crashes described by reviewer, broken flows, missing functionality
46
+
47
+ Create a numbered fix plan: one item per rejection point, with the type of fix needed.
48
+
49
+ ### 2. Classify Fixes by Type
50
+
51
+ | Type | Location |
52
+ |------|----------|
53
+ | Privacy usage strings missing | `Info.plist` |
54
+ | Entitlement missing/wrong | `<AppName>.entitlements` |
55
+ | Crash or broken feature | Source code |
56
+ | Screenshots wrong size/content | App Store Connect |
57
+ | Keywords/subtitle/description | App Store Connect |
58
+ | Build number conflict | Xcode + App Store Connect |
59
+
60
+ ### 3. Implement Code Fixes
61
+
62
+ **Privacy permission strings** (`Info.plist`):
63
+
64
+ ```xml
65
+ <key>NSMicrophoneUsageDescription</key>
66
+ <string>Used for voice input during focus sessions.</string>
67
+
68
+ <key>NSCalendarsUsageDescription</key>
69
+ <string>Used to sync tasks with your calendar.</string>
70
+ ```
71
+
72
+ **Entitlements** (`<AppName>.entitlements`):
73
+
74
+ ```xml
75
+ <key>com.apple.security.app-sandbox</key>
76
+ <true/>
77
+ <key>com.apple.security.network.client</key>
78
+ <true/>
79
+ <key>com.apple.security.files.user-selected.read-write</key>
80
+ <true/>
81
+ ```
82
+
83
+ **Sandbox violations** โ€” remove `NoEscapeBlock` patterns, replace deprecated APIs, use only sandboxed file access via Security-Scoped Bookmarks when needed.
84
+
85
+ ### 4. Build and Archive
86
+
87
+ ```bash
88
+ # Clean build
89
+ xcodebuild clean \
90
+ -scheme <AppName> \
91
+ -destination 'generic/platform=macOS'
92
+
93
+ # Archive
94
+ xcodebuild archive \
95
+ -scheme <AppName> \
96
+ -archivePath build/<AppName>.xcarchive \
97
+ -destination 'generic/platform=macOS'
98
+
99
+ # Export for App Store
100
+ xcodebuild -exportArchive \
101
+ -archivePath build/<AppName>.xcarchive \
102
+ -exportPath build/export \
103
+ -exportOptionsPlist ExportOptions.plist
104
+ ```
105
+
106
+ Validate codesigning before upload:
107
+
108
+ ```bash
109
+ codesign --verify --deep --strict --verbose=4 build/export/<AppName>.app
110
+ spctl --assess --verbose=4 build/export/<AppName>.app
111
+ ```
112
+
113
+ ### 5. Update App Store Connect Metadata
114
+
115
+ Navigate: **My Apps โ†’ [App] โ†’ App Store tab**
116
+
117
+ Common metadata fixes:
118
+
119
+ - **App name**: max 30 chars
120
+ - **Subtitle**: max 30 chars, no duplicate keywords from the title field
121
+ - **Keywords**: 100-char total limit, comma-separated, no spaces after commas
122
+ - **Screenshots**: exact pixel dimensions per device type (check Apple's current spec)
123
+ - **Privacy Nutrition Labels**: must accurately reflect data collected/linked to user
124
+ - **Build selection**: select the newly uploaded build before submitting
125
+
126
+ ### 6. Write Reviewer Notes
127
+
128
+ In the submission form, fill **Notes for Reviewer**:
129
+
130
+ - Explain each rejection point and what was changed
131
+ - Reference specific guideline numbers: "Addressing 2.1 โ€” added NSMicrophoneUsageDescription to Info.plist"
132
+ - If a feature requires special credentials to test, provide test account details
133
+
134
+ ### 7. Submit and Track
135
+
136
+ 1. Upload via **Xcode Organizer โ†’ Distribute App โ†’ App Store Connect**
137
+ 2. In App Store Connect: select the new build, fill notes, **Submit for Review**
138
+ 3. Typical re-review: 24โ€“48h
139
+ 4. If rejected again: respond in the **Resolution Center** thread (same case number)
140
+ 5. Escalate via Resolution Center for policy disagreements โ€” do not open a new submission
141
+
142
+ ## Build Number Protocol
143
+
144
+ Apple rejects builds with a duplicate build number. Increment `CFBundleVersion` in `Info.plist` or Xcode target settings before every upload:
145
+
146
+ ```bash
147
+ # Bump build number (e.g., 9 โ†’ 10)
148
+ xcrun agvtool new-version -all 10
149
+ ```
150
+
151
+ ## Verification
152
+
153
+ - [ ] Every rejection guideline number has a corresponding fix in the plan
154
+ - [ ] `xcodebuild archive` exits 0 with no warnings about entitlements
155
+ - [ ] `codesign --verify` passes
156
+ - [ ] App Store Connect shows build status as "Ready to Submit"
157
+ - [ ] Reviewer Notes reference each changed item
158
+ - [ ] Build number is higher than any previously uploaded build
@@ -0,0 +1,3 @@
1
+ # Codex adapter
2
+
3
+ Use the canonical skill directly from `packages/software-development/apple-store-submit/SKILL.md`.
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "olko:apple-store-submit",
3
+ "version": "0.1.0",
4
+ "description": "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit.",
5
+ "skills": "skills/"
6
+ }