safari-pilot 0.1.1 → 0.1.3

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.
@@ -23,13 +23,13 @@
23
23
  <key>CFBundlePackageType</key>
24
24
  <string>APPL</string>
25
25
  <key>CFBundleShortVersionString</key>
26
- <string>1.0</string>
26
+ <string>0.1.3</string>
27
27
  <key>CFBundleSupportedPlatforms</key>
28
28
  <array>
29
29
  <string>MacOSX</string>
30
30
  </array>
31
31
  <key>CFBundleVersion</key>
32
- <string>1</string>
32
+ <string>202604130112</string>
33
33
  <key>DTCompiler</key>
34
34
  <string>com.apple.compilers.llvm.clang.1_0</string>
35
35
  <key>DTPlatformBuild</key>
@@ -19,13 +19,13 @@
19
19
  <key>CFBundlePackageType</key>
20
20
  <string>XPC!</string>
21
21
  <key>CFBundleShortVersionString</key>
22
- <string>1.0</string>
22
+ <string>0.1.3</string>
23
23
  <key>CFBundleSupportedPlatforms</key>
24
24
  <array>
25
25
  <string>MacOSX</string>
26
26
  </array>
27
27
  <key>CFBundleVersion</key>
28
- <string>1</string>
28
+ <string>202604130112</string>
29
29
  <key>DTCompiler</key>
30
30
  <string>com.apple.compilers.llvm.clang.1_0</string>
31
31
  <key>DTPlatformBuild</key>
@@ -273,7 +273,7 @@
273
273
  browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
274
274
  // Health check
275
275
  if (message && message.type === 'ping') {
276
- sendResponse({ ok: true, type: 'pong', extensionVersion: '0.1.1' });
276
+ sendResponse({ ok: true, type: 'pong', extensionVersion: '0.1.3' });
277
277
  return false;
278
278
  }
279
279
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Safari Pilot",
4
- "version": "0.1.1",
4
+ "version": "0.1.3",
5
5
  "description": "Native Safari automation for AI agents",
6
6
  "permissions": [
7
7
  "activeTab",
@@ -6,7 +6,7 @@
6
6
  <dict>
7
7
  <key>Resources/background.js</key>
8
8
  <data>
9
- Yf5ESv+koRTEyqQ0lrN34bNprVA=
9
+ YQeuy+RDagFvm9//cADKdVDy4W4=
10
10
  </data>
11
11
  <key>Resources/content-isolated.js</key>
12
12
  <data>
@@ -30,7 +30,7 @@
30
30
  </data>
31
31
  <key>Resources/manifest.json</key>
32
32
  <data>
33
- QjWAEfk/0LZsMZn/195jgOahj5M=
33
+ KBx4xWUdKq5//V4dRehmhEXQ2O0=
34
34
  </data>
35
35
  </dict>
36
36
  <key>files2</key>
@@ -39,7 +39,7 @@
39
39
  <dict>
40
40
  <key>hash2</key>
41
41
  <data>
42
- j/Injy0/XGM9j2ND0hWwUDDnkY/a/+NSpc6gG1M0dzE=
42
+ H1HhxSSl4FdA4o6EMn/fa4376J5Nt8sGu+3XJDjZ0NU=
43
43
  </data>
44
44
  </dict>
45
45
  <key>Resources/content-isolated.js</key>
@@ -81,7 +81,7 @@
81
81
  <dict>
82
82
  <key>hash2</key>
83
83
  <data>
84
- A13Wg0RV6m8VaBpEMa9C8G8s++ZG4tlOCKjDo1WzlbM=
84
+ 1fEqyuOEntyd+2dNiknwAKkRf2qtkntZFiZEXw8fVhU=
85
85
  </data>
86
86
  </dict>
87
87
  </dict>
@@ -18,15 +18,15 @@
18
18
  </data>
19
19
  <key>Resources/Base.lproj/Main.storyboardc/Info.plist</key>
20
20
  <data>
21
- z8DOn+PGU5ss7IcA1E+1Lni8Hfo=
21
+ a2VT/xdcFLUwKaa1rN2i7aG440U=
22
22
  </data>
23
23
  <key>Resources/Base.lproj/Main.storyboardc/MainMenu.nib</key>
24
24
  <data>
25
- m6dpidgdJI81r64bzwNhqF0TdmY=
25
+ z4wrX6ZIT8Vqga4FNrBhl7p4mgI=
26
26
  </data>
27
27
  <key>Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib</key>
28
28
  <data>
29
- DaNLcAEwjC0i0Da2VPl5/eCPuFs=
29
+ c/6Czv7zqEUm5pSNZBYPHtK3FtY=
30
30
  </data>
31
31
  <key>Resources/Base.lproj/Main.storyboardc/XfG-lQ-9wD-view-m2S-Jp-Qdl.nib</key>
32
32
  <data>
@@ -51,10 +51,10 @@
51
51
  <dict>
52
52
  <key>cdhash</key>
53
53
  <data>
54
- yEwje1XDJNMr/HJ3JOgzH1quMLo=
54
+ FDsh/+d1zp5QDu11arAcMRJbB24=
55
55
  </data>
56
56
  <key>requirement</key>
57
- <string>identifier "com.safari-pilot.app.Extension" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V37WLKRXUJ</string>
57
+ <string>anchor apple generic and identifier "com.safari-pilot.app.Extension" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V37WLKRXUJ)</string>
58
58
  </dict>
59
59
  <key>Resources/AppIcon.icns</key>
60
60
  <dict>
@@ -81,21 +81,21 @@
81
81
  <dict>
82
82
  <key>hash2</key>
83
83
  <data>
84
- nYaxkzmg1//wFsddjDY4LOK5DsLV15qYrs3mYej1w2U=
84
+ kU2qRLrLe541khk8eANsHzAtUmih9nX13wl52uwLW2c=
85
85
  </data>
86
86
  </dict>
87
87
  <key>Resources/Base.lproj/Main.storyboardc/MainMenu.nib</key>
88
88
  <dict>
89
89
  <key>hash2</key>
90
90
  <data>
91
- QsPW1DpbkxSuis1gkkz9fMXkjqIrrpEOjsv4ZEk+MXE=
91
+ A4bMEIxWI848pN6hafSHG4ceWz5z8KeLEo1BcKEYTAc=
92
92
  </data>
93
93
  </dict>
94
94
  <key>Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib</key>
95
95
  <dict>
96
96
  <key>hash2</key>
97
97
  <data>
98
- G/Cq4XOcnVUM3hKsueePQK+NQnksmI9LonAofrpa+qY=
98
+ rT9p1f1TolVuhgan6fPW/bNoeuJmP2w/ql/1GKZRLBo=
99
99
  </data>
100
100
  </dict>
101
101
  <key>Resources/Base.lproj/Main.storyboardc/XfG-lQ-9wD-view-m2S-Jp-Qdl.nib</key>
Binary file
@@ -273,7 +273,7 @@
273
273
  browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
274
274
  // Health check
275
275
  if (message && message.type === 'ping') {
276
- sendResponse({ ok: true, type: 'pong', extensionVersion: '0.1.1' });
276
+ sendResponse({ ok: true, type: 'pong', extensionVersion: '0.1.3' });
277
277
  return false;
278
278
  }
279
279
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Safari Pilot",
4
- "version": "0.1.1",
4
+ "version": "0.1.3",
5
5
  "description": "Native Safari automation for AI agents",
6
6
  "permissions": [
7
7
  "activeTab",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "safari-pilot",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Native Safari browser automation for AI agents on macOS",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>method</key>
6
+ <string>developer-id</string>
7
+ <key>teamID</key>
8
+ <string>V37WLKRXUJ</string>
9
+ <key>signingCertificate</key>
10
+ <string>Developer ID Application</string>
11
+ </dict>
12
+ </plist>
@@ -7,10 +7,17 @@ EXT_DIR="$ROOT/extension"
7
7
  APP_DIR="$ROOT/app"
8
8
  XCODE_PROJECT_DIR="$APP_DIR/Safari Pilot"
9
9
  BUNDLE_ID="com.safari-pilot.app"
10
+ SIGN_IDENTITY="Developer ID Application: Aakash Kumar (V37WLKRXUJ)"
11
+ TEAM_ID="V37WLKRXUJ"
12
+
13
+ VERSION=$(python3 -c "import json; print(json.load(open('$ROOT/package.json'))['version'])")
14
+ BUILD_NUMBER=$(date +%Y%m%d%H%M)
10
15
 
11
16
  echo "=== Safari Pilot Extension Build ==="
17
+ echo "Version: $VERSION (build $BUILD_NUMBER)"
18
+
19
+ # ── Step 1: Generate Xcode project ──────────────────────────────────────────
12
20
 
13
- # Step 1: Generate Xcode project from extension source
14
21
  echo "Generating Xcode project..."
15
22
  xcrun safari-web-extension-packager "$EXT_DIR" \
16
23
  --project-location "$APP_DIR" \
@@ -21,23 +28,76 @@ xcrun safari-web-extension-packager "$EXT_DIR" \
21
28
  --no-prompt \
22
29
  --force
23
30
 
24
- # The packager generates the project inside a subdirectory named after the app
25
- # Resulting path: app/Safari Pilot/Safari Pilot.xcodeproj
26
31
  if [ ! -d "$XCODE_PROJECT_DIR/Safari Pilot.xcodeproj" ]; then
27
- echo "ERROR: Xcode project not found at expected location: $XCODE_PROJECT_DIR/Safari Pilot.xcodeproj"
32
+ echo "ERROR: Xcode project not found"
28
33
  exit 1
29
34
  fi
30
35
 
31
- # Step 2: Fix bundle identifier in generated project
32
- # The packager sets the app's bundle ID to com.safari-pilot.Safari-Pilot (derived from name)
33
- # instead of our explicit com.safari-pilot.app — causing embedded binary validation failure.
34
- # Fix: replace the auto-derived ID with our explicit bundle ID in both Debug and Release configs.
36
+ # ── Step 2: Patch Xcode project ─────────────────────────────────────────────
37
+
35
38
  PBXPROJ="$XCODE_PROJECT_DIR/Safari Pilot.xcodeproj/project.pbxproj"
36
- echo "Fixing bundle identifier in Xcode project..."
39
+
40
+ echo "Fixing bundle identifier..."
37
41
  sed -i '' "s/PRODUCT_BUNDLE_IDENTIFIER = \"com.safari-pilot.Safari-Pilot\";/PRODUCT_BUNDLE_IDENTIFIER = \"$BUNDLE_ID\";/g" "$PBXPROJ"
38
42
 
39
- # Step 3: Create placeholder Icon.png if missing
40
- # The packager references Icon.png in the project but doesn't create it.
43
+ echo "Setting version $VERSION (build $BUILD_NUMBER)..."
44
+ sed -i '' "s/MARKETING_VERSION = .*;/MARKETING_VERSION = $VERSION;/g" "$PBXPROJ"
45
+ sed -i '' "s/CURRENT_PROJECT_VERSION = .*;/CURRENT_PROJECT_VERSION = $BUILD_NUMBER;/g" "$PBXPROJ"
46
+
47
+ echo "Setting manual signing with Developer ID..."
48
+ sed -i '' "s/CODE_SIGN_STYLE = Automatic;/CODE_SIGN_STYLE = Manual;/g" "$PBXPROJ"
49
+ sed -i '' "s/DEVELOPMENT_TEAM = \"\";/DEVELOPMENT_TEAM = $TEAM_ID;/g" "$PBXPROJ"
50
+
51
+ # ── Step 3: Create entitlements files for manual signing ────────────────────
52
+
53
+ APP_ENTITLEMENTS="$XCODE_PROJECT_DIR/Safari Pilot/Safari Pilot.entitlements"
54
+ EXT_ENTITLEMENTS="$XCODE_PROJECT_DIR/Safari Pilot Extension/Safari Pilot Extension.entitlements"
55
+
56
+ cat > "$APP_ENTITLEMENTS" <<'PLIST'
57
+ <?xml version="1.0" encoding="UTF-8"?>
58
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
59
+ <plist version="1.0">
60
+ <dict>
61
+ <key>com.apple.security.app-sandbox</key>
62
+ <true/>
63
+ <key>com.apple.security.files.user-selected.read-only</key>
64
+ <true/>
65
+ <key>com.apple.security.network.client</key>
66
+ <true/>
67
+ </dict>
68
+ </plist>
69
+ PLIST
70
+
71
+ cat > "$EXT_ENTITLEMENTS" <<'PLIST'
72
+ <?xml version="1.0" encoding="UTF-8"?>
73
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
74
+ <plist version="1.0">
75
+ <dict>
76
+ <key>com.apple.security.app-sandbox</key>
77
+ <true/>
78
+ <key>com.apple.security.files.user-selected.read-only</key>
79
+ <true/>
80
+ </dict>
81
+ </plist>
82
+ PLIST
83
+
84
+ # Inject entitlements paths into the pbxproj build settings
85
+ # App target: insert CODE_SIGN_ENTITLEMENTS after PRODUCT_BUNDLE_IDENTIFIER for app
86
+ sed -i '' '/PRODUCT_BUNDLE_IDENTIFIER = "com.safari-pilot.app";/{
87
+ a\
88
+ \t\t\t\tCODE_SIGN_ENTITLEMENTS = "Safari Pilot/Safari Pilot.entitlements";
89
+ }' "$PBXPROJ"
90
+
91
+ # Extension target: insert CODE_SIGN_ENTITLEMENTS after PRODUCT_BUNDLE_IDENTIFIER for extension
92
+ sed -i '' '/PRODUCT_BUNDLE_IDENTIFIER = "com.safari-pilot.app.Extension";/{
93
+ a\
94
+ \t\t\t\tCODE_SIGN_ENTITLEMENTS = "Safari Pilot Extension/Safari Pilot Extension.entitlements";
95
+ }' "$PBXPROJ"
96
+
97
+ echo "Entitlements created and wired into project"
98
+
99
+ # ── Step 4: Create placeholder Icon.png if missing ──────────────────────────
100
+
41
101
  ICON_PATH="$XCODE_PROJECT_DIR/Safari Pilot/Resources/Icon.png"
42
102
  if [ ! -f "$ICON_PATH" ]; then
43
103
  echo "Creating placeholder Icon.png..."
@@ -66,73 +126,107 @@ with open('$ICON_PATH', 'wb') as f:
66
126
  "
67
127
  fi
68
128
 
69
- # Step 4: Build the app
70
- echo "Building app (Release)..."
129
+ # ── Step 5: Archive ─────────────────────────────────────────────────────────
130
+
131
+ ARCHIVE_PATH="$ROOT/.build/extension/Safari Pilot.xcarchive"
132
+
133
+ echo "Archiving app (Release)..."
71
134
  cd "$XCODE_PROJECT_DIR"
72
- xcodebuild \
135
+ xcodebuild archive \
73
136
  -project "Safari Pilot.xcodeproj" \
74
137
  -scheme "Safari Pilot" \
75
138
  -configuration Release \
76
- -derivedDataPath "$ROOT/.build/extension" \
77
- build 2>&1
78
-
79
- # Step 5: Copy built app to bin/
80
- APP_PATH=$(find "$ROOT/.build/extension" -name "Safari Pilot.app" -type d | head -1)
81
- if [ -n "$APP_PATH" ]; then
82
- echo "Built app at: $APP_PATH"
83
- mkdir -p "$ROOT/bin"
84
- rm -rf "$ROOT/bin/Safari Pilot.app"
85
- cp -R "$APP_PATH" "$ROOT/bin/Safari Pilot.app"
86
- echo "Copied to bin/Safari Pilot.app"
87
- else
88
- echo "ERROR: Built app not found in derived data"
139
+ -archivePath "$ARCHIVE_PATH" \
140
+ CODE_SIGN_IDENTITY="$SIGN_IDENTITY" \
141
+ DEVELOPMENT_TEAM="$TEAM_ID" \
142
+ OTHER_CODE_SIGN_FLAGS="--timestamp" \
143
+ 2>&1
144
+
145
+ if [ ! -d "$ARCHIVE_PATH" ]; then
146
+ echo "ERROR: Archive not created"
147
+ exit 1
148
+ fi
149
+
150
+ echo "Archive created at: $ARCHIVE_PATH"
151
+
152
+ # ── Step 6: Export archive ──────────────────────────────────────────────────
153
+
154
+ EXPORT_DIR="$ROOT/.build/extension/Export"
155
+ EXPORT_OPTIONS="$ROOT/scripts/ExportOptions.plist"
156
+
157
+ cat > "$EXPORT_OPTIONS" <<PLIST
158
+ <?xml version="1.0" encoding="UTF-8"?>
159
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
160
+ <plist version="1.0">
161
+ <dict>
162
+ <key>method</key>
163
+ <string>developer-id</string>
164
+ <key>teamID</key>
165
+ <string>$TEAM_ID</string>
166
+ <key>signingCertificate</key>
167
+ <string>Developer ID Application</string>
168
+ </dict>
169
+ </plist>
170
+ PLIST
171
+
172
+ echo "Exporting archive..."
173
+ xcodebuild -exportArchive \
174
+ -archivePath "$ARCHIVE_PATH" \
175
+ -exportPath "$EXPORT_DIR" \
176
+ -exportOptionsPlist "$EXPORT_OPTIONS" \
177
+ 2>&1
178
+
179
+ EXPORTED_APP="$EXPORT_DIR/Safari Pilot.app"
180
+ if [ ! -d "$EXPORTED_APP" ]; then
181
+ echo "ERROR: Export failed — app not found in $EXPORT_DIR"
89
182
  exit 1
90
183
  fi
91
184
 
92
- echo "=== Build complete ==="
185
+ echo "Exported to: $EXPORTED_APP"
93
186
 
94
- # ── Signing & Notarization ───────────────────────────────────────────────────
187
+ # ── Step 7: Copy to bin/ ────────────────────────────────────────────────────
95
188
 
96
- SIGN_IDENTITY="Developer ID Application: Aakash Kumar (V37WLKRXUJ)"
97
- APP_PATH="$ROOT/bin/Safari Pilot.app"
98
- APPEX_PATH="$APP_PATH/Contents/PlugIns/Safari Pilot Extension.appex"
189
+ mkdir -p "$ROOT/bin"
190
+ rm -rf "$ROOT/bin/Safari Pilot.app"
191
+ cp -R "$EXPORTED_APP" "$ROOT/bin/Safari Pilot.app"
192
+ echo "Copied to bin/Safari Pilot.app"
99
193
 
100
- echo "=== Signing Extension ==="
194
+ APP_PATH="$ROOT/bin/Safari Pilot.app"
101
195
 
102
- # Step 6: Sign the .appex FIRST (inside-out — NEVER use --deep)
103
- echo "Signing .appex..."
104
- codesign --force --options runtime --timestamp \
105
- --sign "$SIGN_IDENTITY" \
106
- "$APPEX_PATH"
196
+ # ── Step 8: Verify signature and entitlements ───────────────────────────────
107
197
 
108
- # Step 7: Sign the .app container
109
- echo "Signing .app..."
110
- codesign --force --options runtime --timestamp \
111
- --sign "$SIGN_IDENTITY" \
112
- "$APP_PATH"
198
+ echo "=== Verification ==="
113
199
 
114
- # Step 8: Verify codesign (spctl check deferred until after notarization)
115
- echo "Verifying code signature..."
200
+ echo "Code signature:"
116
201
  codesign --verify --deep --strict --verbose=2 "$APP_PATH"
117
202
 
203
+ echo ""
204
+ echo "App entitlements:"
205
+ codesign -d --entitlements - "$APP_PATH" 2>&1 | grep -v "^Executable"
206
+
207
+ echo ""
208
+ echo "Extension entitlements:"
209
+ codesign -d --entitlements - "$APP_PATH/Contents/PlugIns/Safari Pilot Extension.appex" 2>&1 | grep -v "^Executable"
210
+
211
+ # ── Step 9: Notarize ────────────────────────────────────────────────────────
212
+
118
213
  echo "=== Notarizing ==="
119
214
 
120
- # Step 9: Create ZIP for notarization
121
215
  ditto -c -k --keepParent "$APP_PATH" "$ROOT/bin/Safari Pilot.zip"
122
216
 
123
- # Step 10: Submit for notarization and wait
124
217
  xcrun notarytool submit "$ROOT/bin/Safari Pilot.zip" \
125
218
  --keychain-profile "apple-notarytool" --wait
126
219
 
127
- # Step 11: Staple the ticket
128
220
  xcrun stapler staple "$APP_PATH"
129
221
 
130
- # Step 12: Re-zip the stapled app for distribution
222
+ # Re-zip with stapled ticket
131
223
  rm "$ROOT/bin/Safari Pilot.zip"
132
224
  ditto -c -k --keepParent "$APP_PATH" "$ROOT/bin/Safari Pilot.zip"
133
225
 
134
- # Step 13: Verify with Gatekeeper (now notarized)
135
- echo "Verifying Gatekeeper acceptance..."
226
+ # ── Step 10: Final Gatekeeper check ─────────────────────────────────────────
227
+
228
+ echo "=== Final Verification ==="
136
229
  spctl -a -t exec -vv "$APP_PATH"
230
+ xcrun stapler validate "$APP_PATH"
137
231
 
138
- echo "=== Signed, Notarized, and Stapled ==="
232
+ echo "=== Build Complete: v$VERSION (build $BUILD_NUMBER) ==="