CodexSkillManager is a small macOS SwiftUI app built with SwiftPM (no Xcode project) that lists the Codex skills installed in the user's public skills folder.
- The app scans
~/.codex/skills/publicfor subdirectories. - Each directory name becomes a skill entry.
- The UI is a SwiftUI
NavigationSplitViewwith a list on the left and a detail view on the right. - The detail view shows the skill name and its full path.
- Build:
swift build - Run:
swift run CodexSkillManagerWhen editing this app, build after each change and fix any compile errors before continuing.
Use the macos-spm-app-packaging skill for packaging, notarization, appcast, and GitHub release steps.
Local packaging helpers live in Scripts/:
Scripts/compile_and_run.sh: package (adhoc sign) + launch the.app.Scripts/package_app.sh: build and createCodexSkillManager.app.Scripts/sign-and-notarize.sh: sign + notarize for releases.Scripts/make_appcast.sh: generate Sparkle appcast from a zip.Scripts/generate_sparkle_keys.sh: generate Sparkle keypair and export private key.
Sparkle env vars (set in ~/.zshrc):
SPARKLE_PUBLIC_KEYSPARKLE_PRIVATE_KEY_FILESPARKLE_FEED_URL
- Update version: bump
MARKETING_VERSIONandBUILD_NUMBERinversion.env. - Build:
swift build. - Commit + push:
git add -Agit commit -m "feat: ..."(or other Conventional Commit type)git push
- Write release notes (short, user-facing bullets) and save to a file, e.g.
/tmp/codexskillmanager-release-notes-<version>.md. - Notarize and package:
APP_STORE_CONNECT_API_KEY_P8="/path/to/key.p8" APP_STORE_CONNECT_KEY_ID="..." APP_STORE_CONNECT_ISSUER_ID="..." APP_IDENTITY="Developer ID Application: ..."./Scripts/sign-and-notarize.sh- Note:
SPARKLE_PUBLIC_KEYmust be set (andSPARKLE_FEED_URLif non-default) or the build will be missing Sparkle keys and updates will not work.
- Generate Sparkle appcast entry:
SPARKLE_PRIVATE_KEY_FILE="..." ./Scripts/make_appcast.sh CodexSkillManager-<version>.zip https://raw.githubusercontent.com/Dimillian/CodexSkillManager/main/appcast.xml- Note: Sparkle uses the build number (
BUILD_NUMBER) forsparkle:version, so it must increase each release. git add appcast.xmlgit commit -m "chore: update sparkle appcast"git push
- Publish GitHub release (creates the tag):
gh release create v<version> CodexSkillManager-<version>.zip appcast.xml --title "Codex Skill Manager <version>" --notes-file /tmp/codexskillmanager-release-notes-<version>.md
Package.swift: SwiftPM manifest for the executable target.Sources/CodexSkillManager/App/CodexSkillManagerApp.swift: App entry point + dependency injection.Sources/CodexSkillManager/Skills/SkillStore.swift: Loads skills + selected SKILL.md content.Sources/CodexSkillManager/Skills/SkillSplitView.swift: Split view shell with list + detail.Sources/CodexSkillManager/Skills/SkillDetailView.swift: Markdown rendering for SKILL.md content.version.env: Template version file (used by the packaging scripts if added later).