Codync
免费开源的 1:1 Grok Bot 与 Muse 替代方案。可在 iPhone、Mac 或 Linux 桌面上将 Claude 代码、Codex、Cursor 以及 40 多个编码代理作为持久机器人使用。支持群组聊天、线程、应用。
AI 翻译
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证macOS app that migrates Jamf Pro classic configuration profiles to Jamf Platform Blueprints via the in-place Classic-to-DDM transform. Created by Jordy Thery.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A native macOS app that migrates Jamf Pro classic configuration profiles (macOS and mobile device) into Jamf Platform Blueprints, using the Apple-supported in-place Classic → DDM transform. It turns a manual, API-driven workflow into a safe, reviewable one.
Status: verified end to end against live Jamf tenants — create, server-side verify, deploy, the in-place transform on a Mac and on an iPhone, and classic scope cleanup with restore. Try every migration on a test device before using it fleet-wide.
Download the latest Profile2Blueprint-X.Y.Z.zip from Releases, unzip it, and move Profile2Blueprint.app to /Applications. The app is signed with a Developer ID certificate and notarized, so Gatekeeper verifies it instead of blocking it. Requires macOS 14 or later.
Choose Demo Mode in the connection picker in the toolbar (or the Connection menu), or click Try Demo Mode on the page shown when no tenant is set up. The full flow — eligibility, scope mapping, create, verify, deploy, unscope and restore — runs against a sample tenant, “Contoso (Demo)”, answered inside the app: no tenant is contacted, nothing is saved to your tenants or the Keychain, and there is nothing to configure. Every window title ends in “— Demo” while it is on. This is the quickest way to see whether the app fits your environment.
In Jamf Account, create an API integration scoped to the platform environment (tenant scope cannot reach the Blueprints API, and the scope level is fixed once the integration is created). Jamf’s Integrations Management guide covers the steps. Grant it:
| Capability | Actions | Needed for |
|---|---|---|
device-groups | Read | Listing platform device groups to map classic scope onto |
configuration-profiles | Read | Reading the classic profiles to migrate |
blueprints | Create, Read, Deploy | Creating, verifying and deploying Blueprints |
configuration-profiles | Update | Optional: only to unscope the classic profile after a deployment |
Jamf Account presents these as per-capability checkboxes; the APIs refer to them as device-groups:read, blueprints:create and so on.
Then in the app, open Settings › Connections → Add Connection… → pick the region → paste the Client ID and Client secret → Load Environments to pick the platform environment (or paste its Environment ID) → Test Connection (requests a token, checks the read permissions and counts platform device groups) → Save. Secrets are stored only in your Keychain. Optionally add the Jamf Pro Web Address you use in a browser to get Open in Jamf Pro links for the classic profile and its Blueprint.
Apple allows a classic (imperative) MDM profile to be transformed in place into a DDM-managed profile — no enforcement gap, no conflict — when all of these hold:
PayloadIdentifier and PayloadUUID of the DDM legacy profile match the classic profile’s.PayloadContent matches.PayloadType, PayloadIdentifier and PayloadUUID match, in the same order.The app walks that workflow stage by stage — fetch → validate → distill (plist → JSON) → map scope → build → create → verify → deploy — with an explicit confirmation gate before anything irreversible. Rules 1–2 cannot be checked through the API; the app says so and leaves them to you.
{name} (the profile’s name), {id} (its Jamf Pro ID) and {platform} (“macOS” or “mobile device”) tokens. All three are optional and default to the original wording, so a test environment can be labeled differently from production; an empty template means no description. Both stay editable per Blueprint before creating.Requires Xcode with the macOS 26 SDK or later (Swift 6, strict concurrency). Open the project and run the Profile2Blueprint scheme; the only dependency is JTKit, resolved from GitHub. ⌘U runs the unit tests.
Profile2Blueprint/
App/ AppModel, Workspace, MigrationSession, HistoryLog,
ActivityEntries, DemoFiles, Log
Models/ Tenant, ClassicProfile, PlistValue (order-preserving),
ProfilePlatform, EligibilityReport, MigrationRecord,
Blueprint (the create request), APIError, LosslessJSON+App
Services/
Auth/ KeychainStore (where the client secrets are kept)
API/ RequestPolicy (allow-list), ClassicAPI, ClassicScopeWriter
Migration/ PlistParser, ClassicXMLParser, PlistToJSON, ScopeMapper,
EligibilityChecker, BlueprintBuilder, FidelityVerifier,
MigrationPipeline (actor, staged state machine),
ClassicScopeService (with ScopeBackupStore)
Persistence/ TenantStore, HistoryStore, SessionStateStore, StoredList
Features/ Connect, ProfileList, ProfileDetail, ScopeMapping, Review,
Deploy, Batch, History, Shared
Resources/ Fixtures (Contoso demo profiles and the demo Classic server)
Profile2BlueprintTests/ Swift Testing suite, on JTKit's fake network
Profile2BlueprintUITests/ Demo Mode smoke tests (run by the release check)
The Platform API client, sign-in, Blueprints, device groups, the activity log, About, Settings, the update check and Demo Mode come from JTKit.
Demo mode uses JTKit’s demo network and Jamf Platform server, with the app’s Classic profiles added to it, so the same client, allow-list, pipeline and UI run in demo mode as against a tenant.
PayloadUUID differs from its PayloadIdentifier is blocked: the Blueprints API overwrites the UUID with the identifier, so the transform would fail on devices. Typical of uploaded profiles; a clone made in Jamf Pro gets matching identifiers.jamf-cli, which wire-probed them; they are instance- and version-specific, so the API remains the authority.com.apple.preferences.users) blocks migration. Rewriting the type would break the rule that every payload type matches the installed profile.PUT /proclassic/{resource}/id/{id}) uses the Classic API’s partial-XML convention. Jamf’s OpenAPI specs don’t document the request body; both the macOS and the mobile form are verified against a live tenant.If Profile2Blueprint saves you time, you can buy me a coffee. ☕️
This tool is provided as-is, without warranty of any kind. Use it at your own risk. This is a personal project. It is not affiliated with or endorsed by my employer, Jamf or Apple. Issues and pull requests are appreciated. Support is best-effort.