Current as of 2026-06-01. This is a contributor/maintainer inventory for RepoPrompt CE's public-readiness work. It documents the current state and follow-ups; it is not legal advice or a substitute for legal review.
Release/debug packaging currently derives app identity from version.env:
APP_NAME=RepoPromptDISPLAY_NAME="RepoPrompt CE"MARKETING_VERSION=1.0.0BUILD_NUMBER=1BUNDLE_ID=com.pvncher.repoprompt.ceSIGNING_TEAM_ID=648A27MST5
RepoPrompt CE starts a new public release line at 1.0.0 (1). The separate CE
bundle identifier, Sparkle key pair, and appcast intentionally do not inherit
the closed app's version history. Treat these values as maintainer-owned
release metadata. Contributors should not change bundle IDs, signing team IDs,
Sparkle keys, or release channels unless a maintainer has explicitly provided
the replacement values. Forks that need a branded app should override locally
or carry their own release metadata patch.
./Scripts/package_app.sh release produces a signed release .app bundle. A signed release requires SIGN_IDENTITY and a REPOPROMPT_PROVISIONING_PROFILE for 648A27MST5.com.pvncher.repoprompt.ce, renders the CE entitlements template, uses timestamped hardened-runtime signing, verifies the signed bundle identifier/team, uses Keychain-backed secure storage, copies the root LICENSE and THIRD_PARTY_NOTICES.md files into Contents/Resources/Legal, and recursively copies root ThirdPartyLicenses/ into Contents/Resources/Legal/ThirdPartyLicenses/ in the packaged app.
Scripts/release.sh adds a secret-free ad-hoc release-candidate lane plus the maintainer publishing lane: resolved-lockfile drift checks, a secret-free approved-source staging job, a fresh protected signing runner, trusted-control-plane Developer ID signing and Sparkle metadata generation, notarization, stapling, ZIP and DMG generation, checksums, packaged legal-tree verification, remote-tag SHA attestation, and draft-only GitHub Release creation. Scripts/promote_release.sh verifies the reviewed draft, rechecks the immutable remote tag SHA and draft attestation, confirms that the modern Sparkle private-key seed matches the app bundle public key and independently verifies the appcast ZIP signature, rejects asset, reviewed-checksum, or stable-build drift, compares the mounted DMG app with the verified ZIP app, mirrors the public update assets, publishes both releases without rebuilding, resumes matching partial states, fails closed on stable-channel API errors other than an explicit first-release 404, and runs anonymous post-publish checks. The contributor and maintainer process, GitHub workflows, required environment controls, and secrets are documented in docs/releasing.md.
AppBundle/Info.plist.template currently contains Sparkle fields:
SUFeedURL=https://github.com/repoprompt/repoprompt-ce-updates/releases/latest/download/appcast.xmlSUPublicEDKey=<public EdDSA key committed in the plist>SUBundleName=RepoPrompt CE.app
These are documented as maintainer-owned release/update-channel values. Do not replace them with guessed fork values. The inherited Sparkle EdDSA key pair was rotated to a CE-specific pair on 2026-05-31: only the new public key is committed, the private key is stored in the GitHub release environment, and the app-side Sparkle integrity checks agree with the plist values.
The stable feed is hosted in the deliberately public, artifact-only
repoprompt/repoprompt-ce-updates
repository. This keeps the appcast and signed updater ZIP anonymously
downloadable while the source repository remains private during validation.
The organization currently disables GitHub Pages creation, so the feed uses
public GitHub Release assets in that repository rather than Pages.
The root Package.swift uses exact versions or fixed revisions. The CE fork dependencies previously expressed as branch references are now pinned to the resolved revisions:
| Dependency | Current manifest form | Current Package.resolved state |
Readiness note |
|---|---|---|---|
https://github.com/repoprompt/swift-sdk.git |
revision |
85dec2fc7a27252bc33dc7728be6af6b3bd398c0 |
Pinned. |
https://github.com/repoprompt/swift-tree-sitter.git |
revision |
a778ef4fb7f0d3ad00185f42ce83c688373c4361 |
Customized wrapper fork pinned to one remote authority. |
https://github.com/jamesrochabrun/SwiftAnthropic |
revision |
b7d030cd7453f314c780f5492385f73d704cbd5d |
Pinned. |
https://github.com/repoprompt/SwiftOpenAI |
revision |
1211782eb337e7968124448a20d9260df1952012 |
Pinned. |
Released, buildable Tree-sitter grammar packages use source-preserving exact semantic-version requirements, while committed Package.resolved revisions continue to define the precise resolved snapshots and CodeMap cache identity. The customized SwiftTreeSitter wrapper is pinned directly to the RepoPrompt fork revision a778ef4fb7f0d3ad00185f42ce83c688373c4361. The curated ThirdPartyLicenses/tree-sitter/ bundle maps that wrapper revision, the grammar requirements and revisions, its resolved Tree-sitter 0.25.10 runtime, and the runtime's ICU subset notice. Package.resolved should stay committed so local and CI resolutions match unless maintainers intentionally update dependency versions.
The upgraded JavaScript and Python manifests list their external scanners, but their manifest-time FileManager source probes evaluate false in the root package graph. A clean coordinated link without the shim fails on the two external-scanner ABI symbol families. CE therefore retains the narrow internal Sources/TreeSitterScannerSupport compatibility target with byte-for-byte copies from the newly pinned snapshots. ThirdPartyLicenses/tree-sitter/scanner-support.sha256 records those exact files. Remove the target, guardrails, checksums, and documentation exception together only after a future clean link proves the upstream products compile their scanners.
The in-repo provider package at Packages/RepoPromptAgentProviders is intentional: it is a path dependency used by the root app while provider code is staged for a future external package split.
Contributor-visible license expectations before public distribution:
| Component | Location | Current notice source | Follow-up |
|---|---|---|---|
| Sparkle | Vendor/Sparkle/Sparkle.xcframework |
Sparkle 2.9.2 license, release asset provenance, downloaded-archive SHA-256, and a closed-world typed manifest for the installed framework and trusted tools are copied under Vendor/Sparkle; the license is also copied under ThirdPartyLicenses/sparkle. |
Included in packaged legal files. |
| UniversalCharsetDetection / uchardet | Vendor/UniversalCharsetDetection |
License and author notices are copied under ThirdPartyLicenses/universal-charset-detection. |
Included in packaged legal files. |
| PCRE2 | Sources/CSwiftPCRE2/src |
License header is copied to ThirdPartyLicenses/pcre2/LICENSE.txt. |
Included in packaged legal files. |
| SLJIT | Sources/CSwiftPCRE2/deps/sljit |
License is copied to ThirdPartyLicenses/sljit/LICENSE. |
Included in packaged legal files. |
| wildmatch / OpenBSD-derived fnmatch material | Sources/RepoPromptC/src/wildmatch/wildmatch.c, Sources/RepoPromptC/include/wildmatch.h |
Both checked-in files contain BSD-style notice blocks; wildmatch.h includes its existing advertising acknowledgement condition. |
Source headers remain preserved. Their full checked-in notice text is reproduced in root THIRD_PARTY_NOTICES.md and bundled under Contents/Resources/Legal during app packaging. |
Tree-sitter grammar packages, SwiftTreeSitter, resolved runtime, and runtime ICU subset |
Package.swift, Package.resolved, ThirdPartyLicenses/tree-sitter/ |
The curated Tree-sitter README maps the fixed wrapper revision and exact grammar/runtime pins to full copied license files, including the runtime's ICU subset notice. | Included under Contents/Resources/Legal/ThirdPartyLicenses/tree-sitter/ during app packaging. |
| Resolved SwiftPM dependency graph | Package.resolved, ThirdPartyLicenses/swiftpm/ |
The machine-checkable inventory maps every remote resolved package to copied upstream license and notice files or to the separately curated Tree-sitter bundle. Checksums protect every copied file. | Included under Contents/Resources/Legal/ThirdPartyLicenses/swiftpm/ during app packaging. |
The root LICENSE provides the Apache License, Version 2.0 for
original RepoPrompt CE code. The root
THIRD_PARTY_NOTICES.md records bundled
attribution material and points to copied legal files. The
Scripts/swiftpm_notice_guardrails.sh
guardrail keeps the resolved SwiftPM inventory aligned with Package.resolved
and verifies the copied notice checksums, including the complete curated
Tree-sitter bundle.
Completed setup through 2026-06-01:
- Registered the explicit Apple Developer App ID
com.pvncher.repoprompt.ce. - Created and validated the
RepoPromptCEDeveloperIDDeveloper ID provisioning profile for648A27MST5.com.pvncher.repoprompt.ce. - Enabled App Store Connect API access, created a least-privilege
Developerteam key for notarization, and verified its credentials with a read-onlynotarytool historyrequest. - Created the GitHub
releaseenvironment, stored its Developer ID PKCS#12, export password, ephemeral CI keychain password, CE provisioning profile, CE Sparkle private key, andNOTARYTOOL_*secrets, and set theSIGN_IDENTITYenvironment variable. - Enabled required-reviewer protection for the
releaseenvironment and restricted deployment branches to protectedmain. - Added an immutable
v*release-tag ruleset that permits new tags while preventing updates and deletion after creation. - Enabled GitHub Release immutability for both
repoprompt/repoprompt-ceandrepoprompt/repoprompt-ce-updates. - Added the fine-grained
PUBLIC_UPDATE_REPOSITORY_TOKENsecret scoped only torepoprompt/repoprompt-ce-updateswith repository contents read/write permission. - Published the source repository, reran CI, and exercised the protected Publish Release draft and Promote Release flow through public publication.
- Kept the opted-in contributor cohort in the tracked
.github/APPROVED_CONTRIBUTORSfile so changes remain public and reviewable. The issue and pull-request gates read that default-branch file directly. - Curated copied license and notice files for every remote dependency in the resolved root SwiftPM graph and added machine guardrails for inventory drift and copied-file checksums.
- Added the environment-scoped Promote Release workflow. It uses trusted tooling pinned to a validated
mainSHA, requires the requested tag to be reachable from protectedmain, verifies reviewed source-draft assets and ZIP/DMG contents, validates packaged legal files and the protected CE Sparkle private key, mirrors update assets intorepoprompt-ce-updates, enforces monotonically increasing stable builds, resumes matching partial states, publishes without rebuilding, explicitly selects the latest release, and runs anonymous post-publish checks.
The previously tracked external GitHub configuration gates are complete and are no longer public-release blockers. Continue to verify an installed app update through the public channel for each release candidate before relying on a new stable update.
Docs-only or metadata-documentation changes should at minimum run:
make guardrailsWhen changes touch dependencies or provider-package code, add:
swift package resolve
cd Packages/RepoPromptAgentProviders && swift testWhen changes touch packaging, MCP runtime, debug CLI behavior, Agent Mode runtime behavior, or a running-app feature, run the live CE MCP smoke flow documented in the root README.md after the smallest relevant build/test command.