بنقرة واحدة
release
Create a new Prose release with automated testing, GitHub release, and local verification.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Create a new Prose release with automated testing, GitHub release, and local verification.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Validate all LLM-accelerated GitHub issues through systematic QA testing via Circuit Electron.
Human-in-the-loop QA loop for verifying a large feature or refactor against the locally-running app before merge/release. Use when automated tests (e2e, web-e2e) don't cover the behavioral/UX surface and you need a structured, interactive "you drive / I observe" verification pass with in-session bug fixes. Complements qa-pr (automated, Circuit) and qa-web (Playwright).
Automated QA testing for Prose PRs using Circuit Electron. Use when testing pull requests before merge.
Implement one solo-ist/prose GitHub issue end-to-end and open a PR ready for review. Use when an Oz child agent is assigned exactly one issue to fix or build in this repo.
Reference and checklist for building and maintaining CI/CD workflows, inter-workflow communication, dispatch scripts, and cloud agent infrastructure. Use when modifying any workflow YAML, dispatch script, or sentinel-based communication.
Merge scorer and PE signals to route PRs. Applies routing matrix (hitl-light / hitl-full) based on score thresholds and risk levels.
| name | release |
| description | Create a new Prose release with automated testing, GitHub release, and local verification. |
Manages the full release workflow for Prose across two distribution channels:
.pkg uploaded via Transporter → TestFlight → App Store.dmg + .zip published to GitHub for direct download + auto-update/release [command]
| Command | Description |
|---|---|
/release | Show current version, build number, and release status |
/release mas | Build and prepare MAS .pkg for Transporter upload |
/release github | Build DMG and create GitHub Release |
/release bump-build | Increment buildVersion and rebuild MAS .pkg |
/release bump-version <version> | Bump marketing version (e.g., 1.1.0) |
/release smoke | Build the DMG and walk 7 critical paths (~5 min) — fast pre-release sanity check |
/release status | Check TestFlight processing, GitHub Release, and CI status |
/release checklist | Run the full pre-release verification checklist |
Two version numbers, managed independently:
CFBundleShortVersionString): Set in package.json "version". Example: 1.0.0. This is what users see. Must match the App Store Connect record.CFBundleVersion): Set in electron-builder.yml "buildVersion". Example: "2". Incremented for each upload to App Store Connect. GitHub Releases don't care about this.| Build | Identity | Profile |
|---|---|---|
| DMG (direct download) | Developer ID Application | None (notarized via CI) |
| MAS (App Store) | Apple Distribution (via team ID 8PT2Y7QQ2F) | build/Prose_Distribution.provisionprofile |
MAS .pkg installer | 3rd Party Mac Developer Installer | N/A |
ist.solo.prose — used across all builds. Must match provisioning profiles and App Store Connect.
| File | Purpose |
|---|---|
package.json | Marketing version ("version") |
electron-builder.yml | Build number (buildVersion), signing config, targets |
build/entitlements.mac.plist | DMG entitlements (includes network.server for MCP) |
build/entitlements.mas.plist | MAS entitlements (sandbox, no network.server) |
build/entitlements.mas.inherit.plist | Child process entitlements for MAS |
build/Prose_Distribution.provisionprofile | MAS distribution profile |
build/afterPack.cjs | Electron fuse flipping |
.github/workflows/release.yml | CI: builds signed DMG on v* tag push |
/release mas)git branch --show-current # Must be on release branch or main
git status --porcelain # Must be clean
node -p "require('./package.json').version" # Current marketing version
grep buildVersion electron-builder.yml # Current build number
# Clean previous builds
rm -rf dist/mas-arm64
# Build with MAS_BUILD flag (gates HTTP MCP server, auto-updater)
npm run build:mas
# Check .pkg exists
ls -la dist/mas-arm64/*.pkg
# Verify version strings
plutil -p dist/mas-arm64/Prose.app/Contents/Info.plist | grep -E "CFBundleVersion|CFBundleShortVersion"
# Verify code signature
codesign --verify --deep --strict dist/mas-arm64/Prose.app
# Verify entitlements
codesign -d --entitlements - dist/mas-arm64/Prose.app 2>&1 | head -20
Entitlements must include: app-sandbox, allow-jit, network.client, files.user-selected.read-write, bookmarks.app-scope
Entitlements must NOT include: network.server, get-task-allow
xcrun altool --upload-app \
--type macos \
--file dist/mas-arm64/Prose-1.0.0-arm64.pkg \
--apiKey 73DLM4525G \
--apiIssuer f46c81a3-3264-4e9d-9b2f-93de6a302175
The API key .p8 file lives at ~/.appstoreconnect/private_keys/AuthKey_73DLM4525G.p8.
## MAS Build Uploaded
- **Version:** <version> (build <N>)
- **Package:** dist/mas-arm64/Prose-<version>-arm64.pkg
- **Signed:** Apple Distribution + 3rd Party Mac Developer Installer
- **Delivery UUID:** <from upload output>
### Next steps
1. Wait for processing in App Store Connect (~10 min)
2. Test via **TestFlight** on your Mac
3. **HUMAN ONLY:** When satisfied, submit for App Store review manually in App Store Connect
⚠️ **NEVER submit for App Store review programmatically.** This is always a human decision. The automated workflow stops at TestFlight upload.
/release github)git branch --show-current # Should be main (after PR merge)
git status --porcelain # Must be clean
rm -rf dist/mac-arm64
npm run build:mac
# Check outputs
ls -la dist/Prose-*-arm64.dmg dist/Prose-*-arm64-mac.zip
# Verify signature
codesign --verify --deep --strict dist/mac-arm64/Prose.app
# Verify entitlements include network.server (MCP)
codesign -d --entitlements - dist/mac-arm64/Prose.app 2>&1 | grep network.server
# Commits since last release
git log $(git tag --list 'v*' --sort=-v:refname | head -1)..HEAD --oneline --no-merges
Write release notes from commits. Template:
# Prose v<version>
<One sentence description.>
## What's New
- <Feature or fix>
## Installation
### Mac App Store
Available on the [Mac App Store](link).
### Direct Download
Download `Prose-<version>-arm64.dmg`, open, and drag to Applications.
The app is signed and notarized — no security bypass needed.
### Auto-Update
Existing users will be prompted to update automatically.
## Requirements
- macOS (Apple Silicon)
- Anthropic API key for AI features ([get one](https://console.anthropic.com/))
VERSION=$(node -p "require('./package.json').version")
# Create tag
git tag "v${VERSION}"
git push origin "v${VERSION}"
The tag push triggers release.yml which builds, signs, notarizes, and publishes the DMG + ZIP to GitHub Releases automatically.
If CI is not available or you want to publish manually:
gh release create "v${VERSION}" \
--title "Prose v${VERSION}" \
--notes-file RELEASE_NOTES.md \
"dist/Prose-${VERSION}-arm64.dmg" \
"dist/Prose-${VERSION}-arm64-mac.zip"
/release smoke)Fast (~5 min) verification before tagging a GitHub release. Exercises the signed/notarized artifact users will actually receive — not dev mode. Use this for routine releases. Escalate to /release checklist if the release touches:
build/entitlements.*.plist)contextIsolation / nodeIntegration settingsrm -rf dist/mac-arm64
npm run build:mac
VERSION=$(node -p "require('./package.json').version")
ls -la "dist/Prose-${VERSION}-arm64.dmg" "dist/Prose-${VERSION}-arm64-mac.zip"
codesign --verify --deep --strict dist/mac-arm64/Prose.app
codesign -d --entitlements - dist/mac-arm64/Prose.app 2>&1 | grep network.server # expect a match (MCP)
open dist/mac-arm64/Prose.app
Do NOT use npm run dev — the smoke test must exercise the signed bundle.
| # | Path | Pass criteria |
|---|---|---|
| 1 | App launches | Window renders, no crash dialog, no console error storm |
| 2 | Editor round-trip | New file → type a paragraph → Cmd+S → close → reopen, content intact |
| 3 | Settings dialog | Opens cleanly, no outline/focus artifacts, closes cleanly |
| 4 | API key test | Settings → LLM → "Test API Key" returns success with current key |
| 5 | Chat streaming | Send a message in chat panel, response streams in fully |
| 6 | Skill download | Help → Download Prose Skill (or Settings → Integrations) downloads the .zip |
| 7 | prose:// scheme | Trigger a prose:// URL (Codex artifact → Open in Prose) and confirm the app handles it |
rm -f electron-screenshot-*.jpeg
## Smoke Test Results — v<version>
- [x] App launches
- [x] Editor round-trip
- [x] Settings dialog
- [x] API key test
- [x] Chat streaming
- [x] Skill download
- [x] prose:// scheme
Ready to tag.
If any path fails, fix before tagging. Do not ship on red smoke.
/release bump-build)Used when you need to re-upload to App Store Connect (Transporter rejects duplicate version + build combos).
grep buildVersion electron-builder.yml
Edit electron-builder.yml: increment buildVersion (e.g., "2" → "3").
rm -rf dist/mas-arm64
npm run build:mas
plutil -p dist/mas-arm64/Prose.app/Contents/Info.plist | grep CFBundleVersion
git add electron-builder.yml
git commit -m "chore(build): bump build number to <N>"
git push origin <branch>
xcrun altool --upload-app \
--type macos \
--file dist/mas-arm64/Prose-1.0.0-arm64.pkg \
--apiKey 73DLM4525G \
--apiIssuer f46c81a3-3264-4e9d-9b2f-93de6a302175
Report the delivery UUID and wait for App Store Connect processing.
/release bump-version <version>)npm version <version> --no-git-tag-version
Do not reset buildVersion. This project uses a global monotonic build counter across marketing versions (e.g., 1.0.0 ended at build 20; first 1.0.1 MAS upload will be build 21). App Store Connect treats version+build as unique either way, and continuous numbering matches the established pattern.
git add package.json package-lock.json
git commit -m "chore: bump version to <version>"
/release checklist)Run through this before any release:
## Pre-release Checklist
### Build
- [ ] `npm run build` succeeds with no errors
- [ ] `npm run build:mac` produces signed DMG
- [ ] `npm run build:mas` produces signed .pkg
- [ ] `codesign --verify --deep --strict` passes on both builds
### App Verification (DMG build)
- [ ] App launches from dist/mac-arm64/Prose.app
- [ ] Editor: create file, type, save, reopen
- [ ] Settings dialog opens and closes without outline
- [ ] API key test passes (Settings > LLM > Test)
- [ ] Chat works with valid API key
- [ ] Feature flags: Google Docs and reMarkable hidden
- [ ] File explorer: no Google/reMarkable tabs
- [ ] Body does not scroll off screen
### MAS-specific
- [ ] HTTP MCP server disabled (check console for log message)
- [ ] MCP install returns error in MAS build
- [ ] Auto-updater disabled in MAS build
### Security
- [ ] No plaintext secrets in ~/.prose/settings.json
- [ ] DMG entitlements: allow-jit (not allow-unsigned-executable-memory)
- [ ] MAS entitlements: app-sandbox, no network.server
- [ ] Fuses flipped (RunAsNode, NodeOptions, CliInspect all false)
### CI
- [ ] E2E tests pass on PR
- [ ] Code review clean (no blocking issues)
buildVersion in electron-builder.yml and rebuildApple Distribution cert is in keychain and not expiredbuild/Prose_Distribution.provisionprofile exists and bundle ID matches ist.solo.prose8PT2Y7QQ2F) as identity in mas: block, not cert namebuild/afterPack.cjs handles the mas casenotarize: true in config. Notarization happens in CI via env vars (APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD). Local builds skip it.CSC_LINK, CSC_KEY_PASSWORD, APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD, APPLE_TEAM_ID, SENTRY_AUTH_TOKEN are set in repo secretsCSC_LINK must be the base64-encoded .p12 containing the Developer ID Application cert