github dan-snelson/DDM-OS-Reminder v3.0.0b4
DDM OS Reminder (3.0.0b4)

pre-release7 hours ago

28-Mar-2026

  • Added optional prior-plist import to assemble.zsh --interactive, allowing Mac Admins to reuse supported values from an earlier DOR .plist while still generating current-version artifacts from the current sample
    • Imported values are read with PlistBuddy against the current runtime preference-key map so older plist formatting differences do not affect import behavior
    • The documented upgrade-assist path supports plists generated by DDM OS Reminder 2.2.0 or later
    • Missing newer keys now remain at current defaults instead of being dropped during upgrade reuse
    • Passing a prior .plist path directly to zsh assemble.zsh now auto-enables the import flow and infers the RDNN and deployment lane from that plist when its filename is unambiguous, reducing the need for extra CLI flags during upgrades
    • Older supported plists without a -dev, -test, or -prod filename suffix still import, but continue to prompt for deployment mode because the prior lane cannot be inferred
    • ScriptLog is preserved only when the imported basename matches the current RDNN; otherwise it is rewritten to the current assembly path to avoid domain leakage from older/internal plists
    • Assembled-script scriptLog updates now follow the same resolved path as the generated plist so operator messaging and deployed runtime behavior stay aligned
  • Updated free-disk-space reporting in reminderDialog.zsh to prefer Finder-aligned available capacity via NSURLVolumeAvailableCapacityForImportantUsageKey, improving visibility of purgeable space such as local Time Machine snapshots and iCloud-managed capacity. (Pull Request #80; thanks, @huexley!)
    • Added sanity checks and automatic fallback to the previous diskutil path when the JXA/Foundation disk-space query returns invalid data, preserving safe reminder behavior on affected systems.
    • Retained percentage-based warning behavior while updating the human-readable free-space display to use decimal GB formatting that better aligns with macOS/Finder conventions.
  • Merged main (2.6.0) into 3.0.0 while preserving 2.6.0 runtime behavior, including post-deadline restart workflow, KB support-assistance controls, and deadline/infobox urgency highlighting.
  • Consolidated localization coverage across runtime and config generation, including FR-25 parity plus ES/PT/JA support (LanguageOverride, localized key families, localized infobox labels, and restart/deadline/support-assistance copy paths).
  • Expanded locale-aware deadline date rendering so %a/%b in DateFormatDeadlineHumanReadable follow the resolved dialog language (de, fr, es, pt, ja, fallback en) across standard, padded past-due, and demo-mode flows.
  • Hardened reminderDialog.zsh DDM resolution by replacing the old EnforcedInstallDate | tail -n 1 heuristic with a recent-window resolver that:
    • prioritizes default applicable declaration and Found DDM enforced install over generic EnforcedInstallDate matches
    • suppresses the reminder when declaration state is missing, conflicting, invalid, or no longer maps to an available update
    • only accepts setPastDuePaddedEnforcementDate when it safely matches the resolved declaration
    • adds explicit suppression logging for conflict, noMatch, and invalid-version cases
  • Added an internal installLogPathOverride fixture-testing hook for local validation of reminderDialog.zsh and the bundled Jamf EAs.
  • Updated Resources/JamfEA-Pending_OS_Update_Date.zsh and Resources/JamfEA-Pending_OS_Update_Version.zsh to use the same fail-closed trust model as the runtime resolver, while keeping Jamf inventory execution lightweight.
  • Updated Resources/README.md, Diagrams/, and related diagram PNG exports to document the hardened resolver, fail-closed EA behavior, corrected dorm.zsh client-script paths, and current beta-series behavior.
  • Updated Resources/createPlist.zsh and Resources/sample.plist for restart-policy plus localization-key parity, then regenerated release artifacts from merged source.

Multiple Language Support

3 0 0a2_fr 3 0 0a2_de

Import prior-plist via drag-and-drop to assemble.zsh

Allows Mac Admins to reuse supported values from an earlier DOR .plist (2.2.0 or later) while still generating current-version artifacts from the current sample

❯ zsh assemble.zsh '/Users/dan/Downloads/DDM-OS-Reminder-2.2.0/Artifacts/us.snelson.dorm-2026-01-06-073608.plist'

===============================================================
🧩 Assemble DDM OS Reminder (3.0.0b4)
===============================================================

Full Paths:

        Reminder Dialog: DDM-OS-Reminder/reminderDialog.zsh
LaunchDaemon Management: DDM-OS-Reminder/launchDaemonManagement.zsh
      Working Directory: DDM-OS-Reminder
    Resources Directory: DDM-OS-Reminder/Resources

🔍 Checking Reverse Domain Name Notation …

    Reminder Dialog (reminderDialog.zsh):
        reverseDomainNameNotation = org.churchofjesuschrist
        organizationScriptName    = dorm

    LaunchDaemon Management (launchDaemonManagement.zsh):
        reverseDomainNameNotation = org.churchofjesuschrist
        organizationScriptName    = dor


📥 Prior plist provided via command-line argument: '/Users/dan/Downloads/DDM-OS-Reminder-2.2.0/Artifacts/us.snelson.dorm-2026-01-06-073608.plist'

ℹ️  Importing supported values from: /Users/dan/Downloads/DDM-OS-Reminder-2.2.0/Artifacts/us.snelson.dorm-2026-01-06-073608.plist
🔎 Inferred RDNN from prior plist: 'us.snelson'

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Using 'us.snelson' as the Reverse Domain Name Notation
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Interactive Configuration
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


ℹ️  Prior plist supplied; skipping IT support, branding and restart policy prompts.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Select Deployment Mode:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  1) Development - Keep placeholder text for local testing
  2) Testing     - Replace placeholder text with 'TEST' for staging
  3) Production  - Remove placeholder text for clean deployment

  [Press ‘X’ to exit]

Enter mode [1/2/3]: 3

📦 Deployment Mode: prod

🔧 Inserting reminderDialog.zsh into launchDaemonManagement.zsh  …

✅ Assembly complete [2026-03-28-151200]
   → Artifacts/ddm-os-reminder-assembled-2026-03-28-151200.zsh

🔁 Updating reverseDomainNameNotation to 'us.snelson' in assembled script …

🔍 Performing syntax check on 'Artifacts/ddm-os-reminder-assembled-2026-03-28-151200.zsh' …
    ✅ Syntax check passed.

🗂  Generating LaunchDaemon plist …
    🗂  Creating us.snelson.dorm plist from /Users/dan/Documents/GitHub/dan-snelson/DDM-OS-Reminder/Resources/sample.plist …

    🔧 Updating internal plist content …
    🔓 Production mode: removing placeholder text for clean deployment
    🔧 Importing supported values from prior plist …
    ℹ️  Preserving imported ScriptLog: /var/log/us.snelson.log
   → Artifacts/us.snelson.dorm-2026-03-28-151200-prod.plist

🧩 Generating Configuration Profile (.mobileconfig) …
   → Artifacts/us.snelson.dorm-2026-03-28-151200-prod-unsigned.mobileconfig

🔍 Performing syntax check on 'Artifacts/us.snelson.dorm-2026-03-28-151200-prod-unsigned.mobileconfig' …
    ✅ Profile syntax check passed.

🔁 Renaming assembled script …

🔁 Updating scriptLog path based on RDNN …

🏁 Done.

Deployment Artifacts:
        Assembled Script: Artifacts/ddm-os-reminder-us.snelson-2026-03-28-151200-prod.zsh
    Organizational Plist: Artifacts/us.snelson.dorm-2026-03-28-151200-prod.plist
   Configuration Profile: Artifacts/us.snelson.dorm-2026-03-28-151200-prod-unsigned.mobileconfig

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️  Important Next Steps:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  Production Artifacts Generated:
    - All placeholder text removed (clean output)
    - Supported configuration values imported from prior plist
    - Prior plist: /Users/dan/Downloads/DDM-OS-Reminder-2.2.0/Artifacts/us.snelson.dorm-2026-01-06-073608.plist
    - ScriptLog resolved to '/var/log/us.snelson.log'

  Recommended review items:
    - Support team name, phone, email, website
    - Imported ScriptLog path and any carried-forward KB/help visibility
    - Organization overlay icon URLs
    - Button labels and dialog messages

  Files to review:
    - Artifacts/us.snelson.dorm-2026-03-28-151200-prod.plist
    - Artifacts/us.snelson.dorm-2026-03-28-151200-prod-unsigned.mobileconfig

===============================================================

What's Changed

Full Changelog: v2.6.0...v3.0.0b4

Don't miss a new DDM-OS-Reminder release

NewReleases is sending notifications on new releases.