Skip to content

Commit 8455ce9

Browse files
Merge pull request #11 from blitzdotdev/1.0.30
1.0.30
2 parents af5e501 + 93aceff commit 8455ce9

File tree

150 files changed

+15698
-7548
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+15698
-7548
lines changed

.claude/skills/asc-iap-attach/SKILL.md

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ This skill uses Apple's internal iris API (`/iris/v1/subscriptionSubmissions`) v
2222

2323
## Preconditions
2424

25-
- Web session cached in macOS Keychain. If no session exists or it has expired (401), call the `asc_web_auth` MCP tool first — this opens the Apple ID login window in Blitz and captures the session automatically.
25+
- Web session file available at `~/.blitz/asc-agent/web-session.json`. If no session exists or it has expired (401), call the `asc_web_auth` MCP tool first — this opens the Apple ID login window in Blitz and captures the session automatically.
2626
- Know your app ID.
2727
- IAPs and/or subscriptions already exist and are in **Ready to Submit** state.
2828
- A build is uploaded and attached to the current app version.
@@ -32,7 +32,7 @@ This skill uses Apple's internal iris API (`/iris/v1/subscriptionSubmissions`) v
3232
### 1. Check for an existing web session
3333

3434
```bash
35-
security find-generic-password -s "asc-web-session" -a "asc:web-session:store" -w > /dev/null 2>&1 && echo "SESSION_EXISTS" || echo "NO_SESSION"
35+
test -f ~/.blitz/asc-agent/web-session.json && echo "SESSION_EXISTS" || echo "NO_SESSION"
3636
```
3737

3838
- If `NO_SESSION`: call the `asc_web_auth` MCP tool first. Wait for it to complete before proceeding.
@@ -44,20 +44,16 @@ Use the iris API to list subscription groups (with subscriptions) and in-app pur
4444

4545
```bash
4646
python3 -c "
47-
import json, subprocess, urllib.request, sys
47+
import json, os, urllib.request, sys
4848
4949
APP_ID = 'APP_ID_HERE'
5050
51-
try:
52-
raw = subprocess.check_output([
53-
'security', 'find-generic-password',
54-
'-s', 'asc-web-session',
55-
'-a', 'asc:web-session:store',
56-
'-w'
57-
], stderr=subprocess.DEVNULL).decode()
58-
except subprocess.CalledProcessError:
51+
session_path = os.path.expanduser('~/.blitz/asc-agent/web-session.json')
52+
if not os.path.isfile(session_path):
5953
print('ERROR: No web session found. Call asc_web_auth MCP tool first.')
6054
sys.exit(1)
55+
with open(session_path) as f:
56+
raw = f.read()
6157
6258
store = json.loads(raw)
6359
session = store['sessions'][store['last_key']]
@@ -118,18 +114,14 @@ Use the following script to attach subscriptions. **Do not print or log the cook
118114

119115
```bash
120116
python3 -c "
121-
import json, subprocess, urllib.request, sys
122-
123-
try:
124-
raw = subprocess.check_output([
125-
'security', 'find-generic-password',
126-
'-s', 'asc-web-session',
127-
'-a', 'asc:web-session:store',
128-
'-w'
129-
], stderr=subprocess.DEVNULL).decode()
130-
except subprocess.CalledProcessError:
117+
import json, os, urllib.request, sys
118+
119+
session_path = os.path.expanduser('~/.blitz/asc-agent/web-session.json')
120+
if not os.path.isfile(session_path):
131121
print('ERROR: No web session found. Call asc_web_auth MCP tool first.')
132122
sys.exit(1)
123+
with open(session_path) as f:
124+
raw = f.read()
133125
134126
store = json.loads(raw)
135127
session = store['sessions'][store['last_key']]
@@ -178,18 +170,14 @@ For in-app purchases (non-subscription), change the type and relationship:
178170

179171
```bash
180172
python3 -c "
181-
import json, subprocess, urllib.request, sys
182-
183-
try:
184-
raw = subprocess.check_output([
185-
'security', 'find-generic-password',
186-
'-s', 'asc-web-session',
187-
'-a', 'asc:web-session:store',
188-
'-w'
189-
], stderr=subprocess.DEVNULL).decode()
190-
except subprocess.CalledProcessError:
173+
import json, os, urllib.request, sys
174+
175+
session_path = os.path.expanduser('~/.blitz/asc-agent/web-session.json')
176+
if not os.path.isfile(session_path):
191177
print('ERROR: No web session found. Call asc_web_auth MCP tool first.')
192178
sys.exit(1)
179+
with open(session_path) as f:
180+
raw = f.read()
193181
194182
store = json.loads(raw)
195183
session = store['sessions'][store['last_key']]
@@ -243,7 +231,7 @@ After attachment, call `get_tab_state` for `ascOverview` to refresh the submissi
243231
The subscription is already attached — this is safe to ignore. HTTP 409 with this message means the item was previously attached.
244232

245233
### 401 Not Authorized (iris API)
246-
The web session has expired. Call the `asc_web_auth` MCP tool to open the Apple ID login window in Blitz — this captures a fresh session and saves it to the keychain automatically. The user will need to complete Apple ID login + 2FA in the popup. After the tool returns success, retry the iris API calls.
234+
The web session has expired. Call the `asc_web_auth` MCP tool to open the Apple ID login window in Blitz — this captures a fresh session and refreshes `~/.blitz/asc-agent/web-session.json` automatically. The user will need to complete Apple ID login + 2FA in the popup. After the tool returns success, retry the iris API calls.
247235

248236
## Agent Behavior
249237

.claude/skills/asc-team-key-create/SKILL.md

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ Use this skill to create a new App Store Connect API Key with Admin permissions
1515

1616
## Preconditions
1717

18-
- Web session cached in macOS Keychain. If no session exists or it has expired (401), call the `asc_web_auth` MCP tool first — this opens the Apple ID login window in Blitz and captures the session automatically.
18+
- Web session file available at `~/.blitz/asc-agent/web-session.json`. If no session exists or it has expired (401), call the `asc_web_auth` MCP tool first — this opens the Apple ID login window in Blitz and captures the session automatically.
1919
- The authenticated Apple ID must have Account Holder or Admin role.
2020

2121
## Workflow
2222

2323
### 1. Check for an existing web session
2424

25-
Before anything else, check if a web session already exists in the macOS Keychain:
25+
Before anything else, check if a web session file already exists:
2626

2727
```bash
28-
security find-generic-password -s "asc-web-session" -a "asc:web-session:store" -w > /dev/null 2>&1 && echo "SESSION_EXISTS" || echo "NO_SESSION"
28+
test -f ~/.blitz/asc-agent/web-session.json && echo "SESSION_EXISTS" || echo "NO_SESSION"
2929
```
3030

3131
- If `NO_SESSION`: call the `asc_web_auth` MCP tool first to open the Apple ID login window in Blitz. Wait for it to complete before proceeding.
@@ -41,22 +41,17 @@ Use the following self-contained script. Replace `KEY_NAME` with the user's chos
4141

4242
```bash
4343
python3 -c "
44-
import json, subprocess, urllib.request, base64, os, sys, time
44+
import json, urllib.request, base64, os, sys, time
4545
4646
KEY_NAME = 'KEY_NAME_HERE'
4747
48-
# Extract cookies from keychain (silent — never print these)
49-
try:
50-
raw = subprocess.check_output([
51-
'security', 'find-generic-password',
52-
'-s', 'asc-web-session',
53-
'-a', 'asc:web-session:store',
54-
'-w'
55-
], stderr=subprocess.DEVNULL).decode()
56-
except subprocess.CalledProcessError:
57-
print('ERROR: No web session found. User must authenticate first.')
58-
print('Run: asc web auth login --apple-id EMAIL')
48+
# Read web session file (silent — never print these)
49+
session_path = os.path.expanduser('~/.blitz/asc-agent/web-session.json')
50+
if not os.path.isfile(session_path):
51+
print('ERROR: No web session found. Call asc_web_auth MCP tool first.')
5952
sys.exit(1)
53+
with open(session_path) as f:
54+
raw = f.read()
6055
6156
store = json.loads(raw)
6257
session = store['sessions'][store['last_key']]
@@ -191,7 +186,7 @@ After the script runs, report:
191186
## Common Errors
192187

193188
### 401 Not Authorized
194-
The web session has expired or doesn't exist. Call the `asc_web_auth` MCP tool — this opens the Apple ID login window in Blitz and captures the session to the macOS Keychain automatically. Then retry the key creation script.
189+
The web session has expired or doesn't exist. Call the `asc_web_auth` MCP tool — this opens the Apple ID login window in Blitz and refreshes `~/.blitz/asc-agent/web-session.json` automatically. Then retry the key creation script.
195190

196191
### 409 Conflict
197192
A key with the same name may already exist, or another conflict occurred. Try a different name.

.github/workflows/build.yml

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ jobs:
1212
runs-on: macos-15
1313
steps:
1414
- uses: actions/checkout@v4
15+
with:
16+
submodules: recursive
17+
18+
- name: Setup Go
19+
uses: actions/setup-go@v5
20+
with:
21+
go-version-file: deps/App-Store-Connect-CLI-helper/go.mod
1522

1623
- name: Select Xcode
1724
run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
@@ -45,6 +52,13 @@ jobs:
4552
runs-on: macos-15-intel
4653
steps:
4754
- uses: actions/checkout@v4
55+
with:
56+
submodules: recursive
57+
58+
- name: Setup Go
59+
uses: actions/setup-go@v5
60+
with:
61+
go-version-file: deps/App-Store-Connect-CLI-helper/go.mod
4862

4963
- name: Select Xcode
5064
run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
@@ -82,6 +96,13 @@ jobs:
8296
contents: write
8397
steps:
8498
- uses: actions/checkout@v4
99+
with:
100+
submodules: recursive
101+
102+
- name: Setup Go
103+
uses: actions/setup-go@v5
104+
with:
105+
go-version-file: deps/App-Store-Connect-CLI-helper/go.mod
85106

86107
- name: Setup Node.js
87108
uses: actions/setup-node@v4
@@ -119,21 +140,40 @@ jobs:
119140
# Add to search list
120141
security list-keychains -d user -s "$KEYCHAIN_PATH" login.keychain-db
121142
143+
- name: Validate production signing inputs
144+
env:
145+
APPLE_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
146+
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
147+
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
148+
APPLE_INSTALLER_IDENTITY: ${{ secrets.APPLE_INSTALLER_IDENTITY }}
149+
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
150+
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
151+
APPLE_API_KEY_BASE64: ${{ secrets.APPLE_API_KEY_BASE64 }}
152+
run: |
153+
[ -n "$APPLE_CERTIFICATE_BASE64" ] || { echo "Missing APPLE_CERTIFICATE_BASE64"; exit 1; }
154+
[ -n "$APPLE_CERTIFICATE_PASSWORD" ] || { echo "Missing APPLE_CERTIFICATE_PASSWORD"; exit 1; }
155+
[ -n "$APPLE_SIGNING_IDENTITY" ] || { echo "Missing APPLE_SIGNING_IDENTITY"; exit 1; }
156+
[ -n "$APPLE_INSTALLER_IDENTITY" ] || { echo "Missing APPLE_INSTALLER_IDENTITY"; exit 1; }
157+
[ -n "$APPLE_API_KEY" ] || { echo "Missing APPLE_API_KEY"; exit 1; }
158+
[ -n "$APPLE_API_ISSUER" ] || { echo "Missing APPLE_API_ISSUER"; exit 1; }
159+
[ -n "$APPLE_API_KEY_BASE64" ] || { echo "Missing APPLE_API_KEY_BASE64"; exit 1; }
160+
122161
- name: Build release .app
123162
env:
124-
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY || '-' }}
163+
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
164+
BLITZ_REQUIRE_SIGNED_RELEASE: "1"
125165
run: |
126166
swift build -c release
127167
bash scripts/bundle.sh release
128168
129169
- name: Build .pkg
130170
env:
131-
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY || '-' }}
132-
APPLE_INSTALLER_IDENTITY: ${{ secrets.APPLE_INSTALLER_IDENTITY || '' }}
171+
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
172+
APPLE_INSTALLER_IDENTITY: ${{ secrets.APPLE_INSTALLER_IDENTITY }}
173+
BLITZ_REQUIRE_SIGNED_RELEASE: "1"
133174
run: bash scripts/build-pkg.sh
134175

135176
- name: Notarize .pkg
136-
if: env.APPLE_API_KEY != ''
137177
env:
138178
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
139179
APPLE_API_KEY_PATH: ${{ runner.temp }}/AuthKey.p8
@@ -165,7 +205,9 @@ jobs:
165205
166206
- name: Get version
167207
id: version
168-
run: echo "version=$(node -e "process.stdout.write(require('./package.json').version)")" >> "$GITHUB_OUTPUT"
208+
run: |
209+
VERSION=$(node -p "require('./package.json').version")
210+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
169211
170212
- name: Extract changelog notes
171213
id: changelog
@@ -224,6 +266,13 @@ jobs:
224266
contents: write
225267
steps:
226268
- uses: actions/checkout@v4
269+
with:
270+
submodules: recursive
271+
272+
- name: Setup Go
273+
uses: actions/setup-go@v5
274+
with:
275+
go-version-file: deps/App-Store-Connect-CLI-helper/go.mod
227276

228277
- name: Setup Node.js
229278
uses: actions/setup-node@v4
@@ -260,11 +309,24 @@ jobs:
260309
261310
- name: Get version
262311
id: version
263-
run: echo "version=$(node -e "process.stdout.write(require('./package.json').version)")" >> "$GITHUB_OUTPUT"
312+
run: |
313+
VERSION=$(node -p "require('./package.json').version")
314+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
315+
316+
- name: Validate x86_64 signing inputs
317+
env:
318+
APPLE_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
319+
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
320+
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
321+
run: |
322+
[ -n "$APPLE_CERTIFICATE_BASE64" ] || { echo "Missing APPLE_CERTIFICATE_BASE64"; exit 1; }
323+
[ -n "$APPLE_CERTIFICATE_PASSWORD" ] || { echo "Missing APPLE_CERTIFICATE_PASSWORD"; exit 1; }
324+
[ -n "$APPLE_SIGNING_IDENTITY" ] || { echo "Missing APPLE_SIGNING_IDENTITY"; exit 1; }
264325
265326
- name: Build x86_64 .app artifact
266327
env:
267-
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY || '-' }}
328+
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
329+
BLITZ_REQUIRE_SIGNED_RELEASE: "1"
268330
run: |
269331
swift build -c release
270332
bash scripts/bundle.sh release

0 commit comments

Comments
 (0)