Skip to content

Add mobile-provisions extension#25178

Open
Ernest0-Production wants to merge 1 commit intoraycast:mainfrom
Ernest0-Production:ext/mobile-provisions
Open

Add mobile-provisions extension#25178
Ernest0-Production wants to merge 1 commit intoraycast:mainfrom
Ernest0-Production:ext/mobile-provisions

Conversation

@Ernest0-Production
Copy link
Contributor

@Ernest0-Production Ernest0-Production commented Feb 5, 2026

Description

A Raycast extension that helps you manage and inspect Apple mobile provisioning profiles installed on your system. View detailed information about certificates, entitlements, provisioned devices, and more.

Screencast

Checklist

@raycastbot raycastbot added the new extension Label for PRs with new extensions label Feb 5, 2026
@raycastbot
Copy link
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 10-15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@Ernest0-Production Ernest0-Production marked this pull request as ready for review February 5, 2026 18:40
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 5, 2026

Greptile Overview

Greptile Summary

This PR adds a new mobile-provisions Raycast extension with two view commands: a list browser for installed provisioning profiles under ~/Library/MobileDevice/Provisioning Profiles, and a “dump” command to inspect a specific .mobileprovision file path. It includes UI components for showing entitlements/certificates, device lists, bulk removal of expired profiles, and the required metadata screenshots.

Key risk is in the provisioning profile parsing implementation: it currently decodes the entire CMS container as UTF-8 and slices XML by string search, which can fail on real profiles. There is also a TypeScript compile issue in the main command due to referencing React.ReactNode without importing the React namespace/type.

Confidence Score: 3/5

  • This PR is not safe to merge until parsing and a TS compile error are fixed.
  • Most changes are isolated to a new extension and follow repo conventions, but the parser’s UTF-8 conversion of a binary provisioning profile will break on some real inputs, and show-mobile-provisions.tsx likely fails TypeScript compilation due to a missing React type import.
  • extensions/mobile-provisions/src/utils/parser.ts; extensions/mobile-provisions/src/show-mobile-provisions.tsx

Important Files Changed

Filename Overview
extensions/mobile-provisions/.gitignore Adds extension-local gitignore; no functional impact.
extensions/mobile-provisions/.prettierrc Adds standard Raycast Prettier config (printWidth 120, double quotes).
extensions/mobile-provisions/CHANGELOG.md Adds changelog with {PR_MERGE_DATE} placeholder at top in correct order.
extensions/mobile-provisions/README.md Adds README, but embeds store screenshots from metadata/ (not allowed); also includes external donation image/link.
extensions/mobile-provisions/assets/extension-icon.png Adds extension icon asset; no code changes.
extensions/mobile-provisions/eslint.config.js Adds ESLint config using defineConfig from eslint/config per repo convention.
extensions/mobile-provisions/metadata/mobile-provisions-1.png Adds required metadata screenshot for view-type commands.
extensions/mobile-provisions/metadata/mobile-provisions-2.png Adds required metadata screenshot for view-type commands.
extensions/mobile-provisions/metadata/mobile-provisions-3.png Adds required metadata screenshot for view-type commands.
extensions/mobile-provisions/metadata/mobile-provisions-4.png Adds required metadata screenshot for view-type commands.
extensions/mobile-provisions/package-lock.json Locks dependencies for the new extension.
extensions/mobile-provisions/package.json Defines new extension commands and dependencies; command argument placeholder casing may violate Raycast schema expectations.
extensions/mobile-provisions/src/components/DeviceList.tsx Renders list of device IDs; functional.
extensions/mobile-provisions/src/components/ProvisionProfileDetails.tsx Builds markdown/metadata/actions; uses locale-dependent date formatting in markdown/metadata.
extensions/mobile-provisions/src/dump-provision-profile.tsx Implements dump command; manually types command arguments instead of using generated Argument types.
extensions/mobile-provisions/src/show-mobile-provisions.tsx Main list command; uses React.ReactNode without importing React type (likely TS error).
extensions/mobile-provisions/src/types.ts Adds types for provisioning profile parsing; uses any for entitlements.
extensions/mobile-provisions/src/utils/helpers.ts Adds helper to map profile type to Raycast color.
extensions/mobile-provisions/src/utils/parser.ts Parses profiles by slicing embedded XML out of CMS; decoding via utf8 string can corrupt binary data and fail parsing on some profiles.
extensions/mobile-provisions/tsconfig.json Adds standard TS config for Raycast extension.

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

20 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

Comment on lines +74 to +91
},
issuer: {
commonName: issuer.CN ?? "",
},
validity: {
notBefore: cert.validity.notBefore,
notAfter: cert.validity.notAfter,
},
};
}

export async function parseProvisioningProfile(filePath: string): Promise<ProvisioningProfile> {
const fileContent = await fs.readFile(filePath);
const fileContentString = fileContent.toString("utf8");

const plistStartIndex = fileContentString.indexOf("<?xml");
const plistEndIndex = fileContentString.indexOf("</plist>") + "</plist>".length;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Binary-to-utf8 conversion breaks parse

parseProvisioningProfile() converts the entire .mobileprovision (a CMS container) to a UTF-8 string and then searches for <?xml / </plist>. This will corrupt bytes for many profiles and can cause indexOf to miss the XML or produce an invalid plist substring. Extract the XML from the raw Buffer without UTF-8 decoding (e.g., search in a latin1/binary string, or use a CMS parser and then decode just the plist payload).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants