Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
909566b
Refresh macOS app polish and release readiness
s1korrrr Jun 29, 2026
f5d5a67
Fix constrained preview layout after audit
s1korrrr Jun 29, 2026
a594a71
Ignore local worktree directory
s1korrrr Jul 13, 2026
7062319
Ignore subagent progress artifacts
s1korrrr Jul 13, 2026
7f63fac
Add validated preferences and layout policy
s1korrrr Jul 13, 2026
61fdbe8
Report skipped files during workspace scans
s1korrrr Jul 13, 2026
526db65
Move scan and selection state into a workspace store
s1korrrr Jul 13, 2026
62b6f0c
Keep workspace state coherent across root changes
s1korrrr Jul 13, 2026
c8ae5e9
Add privacy-conscious output recovery state
s1korrrr Jul 13, 2026
2da5740
Order output persistence across async operations
s1korrrr Jul 13, 2026
2c1ef29
Separate output build and recovery generations
s1korrrr Jul 13, 2026
b7e1bc5
Unify app actions commands and settings
s1korrrr Jul 13, 2026
67d612b
Harden app command readiness and refresh state
s1korrrr Jul 13, 2026
74fb62b
Centralize recovered copy and filter refresh
s1korrrr Jul 13, 2026
84be30d
Rebuild the macOS workspace with adaptive native panes
s1korrrr Jul 13, 2026
f484cf3
Fix adaptive inspector and recovery interactions
s1korrrr Jul 13, 2026
9cf66dc
Stop tracking local Task 6 evidence
s1korrrr Jul 14, 2026
701cf4f
Add isolated end-to-end verification for the Mac app
s1korrrr Jul 14, 2026
18bb4b2
Harden sandboxed end-to-end verification
s1korrrr Jul 14, 2026
04c3862
Document bounded sandbox performance audit
s1korrrr Jul 14, 2026
3052370
Clean scoped E2E export artifacts
s1korrrr Jul 14, 2026
8cc665f
Document adaptive Mac app readiness
s1korrrr Jul 14, 2026
7e33e6f
Close holistic macOS review findings
s1korrrr Jul 14, 2026
d9788e2
Invalidate stale scans before validation
s1korrrr Jul 14, 2026
ffc73e7
Pin SwiftFormat and reconcile CI formatting
s1korrrr Jul 14, 2026
df677dc
Merge pull request #3 from s1korrrr/feat/andrzej_agent_sota_lab
s1korrrr Jul 14, 2026
f03861b
Harden dependencies and release CI
s1korrrr Jul 15, 2026
47c4ce7
Harden App Store packaging validation
s1korrrr Jul 15, 2026
885caea
Bound local processing and add privacy surfaces
s1korrrr Jul 15, 2026
90f0562
Document blocked 0.1.0 release candidate
s1korrrr Jul 15, 2026
722712a
Close traversal and recovery review gaps
s1korrrr Jul 15, 2026
206e4f8
Remove ripgrep dependency from package contract
s1korrrr Jul 15, 2026
43ccbea
Make shell contracts runner-portable
s1korrrr Jul 15, 2026
ae152e6
Record final PR and CI release gates
s1korrrr Jul 15, 2026
8c317f5
feat(release): add Developer ID notarized distribution lane
s1korrrr Jul 15, 2026
d8253db
docs(release): record signing-key authorization gate
s1korrrr Jul 15, 2026
3c92569
docs(release): record GitHub protection gates
s1korrrr Jul 15, 2026
42a3e1f
docs(release): prohibit Developer ID key export
s1korrrr Jul 16, 2026
f359855
fix(extension): harden workspace combination
s1korrrr Jul 16, 2026
c9f0c1d
fix(macOS): secure file reads and output state
s1korrrr Jul 16, 2026
73bcaa2
fix(release): bind credentials source and artifacts
s1korrrr Jul 16, 2026
787d40a
docs(audit): record end-to-end release evidence
s1korrrr Jul 16, 2026
69884ad
Merge pull request #5 from s1korrrr/feat/andrzej_open_source_release
s1korrrr Jul 16, 2026
262aea2
Bump @eslint/js from 9.39.5 to 10.0.1
dependabot[bot] Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .eslintrc.cjs

This file was deleted.

18 changes: 18 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 5
groups:
development-tools:
dependency-type: development
update-types:
- minor
- patch
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 5
64 changes: 59 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,28 @@ on:
push:
pull_request:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build-test:
runs-on: macos-latest
timeout-minutes: 30
env:
SWIFTFORMAT_VERSION: 0.61.1
SWIFTFORMAT_SHA256: b990400779aceb7d7020796eb9ba814d4480543f671d38fc0ff48cb72f04c584
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18
node-version: 24
cache: npm

- name: Install JS dependencies
Expand All @@ -29,11 +40,54 @@ jobs:
- name: JS tests
run: npm test

- name: Audit JS dependencies
run: |
npm audit --omit=dev
npm audit
npm audit signatures

- name: Package VS Code extension
run: |
npm run package
script/tests/vsix_inventory_test.sh

- name: Install SwiftFormat
run: brew install swiftformat
run: |
archive="$RUNNER_TEMP/swiftformat.zip"
install_dir="$RUNNER_TEMP/swiftformat"
curl --fail --location --silent --show-error \
--output "$archive" \
"https://github.com/nicklockwood/SwiftFormat/releases/download/$SWIFTFORMAT_VERSION/swiftformat.zip"
echo "$SWIFTFORMAT_SHA256 $archive" | shasum --algorithm 256 --check
unzip -q "$archive" -d "$install_dir"
echo "$install_dir" >> "$GITHUB_PATH"

- name: SwiftFormat lint
run: swiftformat --lint .
run: |
test "$(swiftformat --version)" = "$SWIFTFORMAT_VERSION"
swiftformat --lint . --disable redundantSendable

- name: Swift tests
run: cd SwiftExplorerApp && swift test

- name: Swift Release build with warnings as errors
run: cd SwiftExplorerApp && swift build -c release -Xswiftc -warnings-as-errors

- name: Shell contracts
run: |
bash -n Packaging/AppStore/build_app_store_package.sh
bash -n Packaging/DeveloperID/build_release.sh
bash -n Packaging/DeveloperID/notarize_release.sh
bash Packaging/AppStore/tests/validate_provisioning_profile_test.sh
bash script/tests/build_and_run_contract_test.sh
bash script/tests/open_source_release_contract_test.sh

- name: Developer ID release contracts
run: Packaging/DeveloperID/tests/run_tests.sh

- name: App Store bundle validation
run: |
plutil -lint Packaging/AppStore/AppStore.entitlements
plutil -lint Packaging/AppStore/Info.plist.in
plutil -lint Packaging/AppStore/PrivacyInfo.xcprivacy
Packaging/AppStore/build_app_store_package.sh --skip-signing
42 changes: 42 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: CodeQL

on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '23 4 * * 1'

permissions:
actions: read
contents: read
security-events: write

concurrency:
group: codeql-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
analyze:
name: Analyze ${{ matrix.language }}
runs-on: macos-latest
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
language: [javascript-typescript, swift]
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Initialize CodeQL
uses: github/codeql-action/init@641a925cfafe92d0fdf8b239ba4053e3f8d99d6d # v3
with:
languages: ${{ matrix.language }}

- name: Autobuild
uses: github/codeql-action/autobuild@641a925cfafe92d0fdf8b239ba4053e3f8d99d6d # v3

- name: Analyze
uses: github/codeql-action/analyze@641a925cfafe92d0fdf8b239ba4053e3f8d99d6d # v3
222 changes: 222 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
name: macOS Developer ID Release

on:
push:
tags:
- 'macos-v*'

permissions:
contents: read

jobs:
verify-source:
if: startsWith(github.ref, 'refs/tags/macos-v')
runs-on: macos-15
timeout-minutes: 10
permissions:
checks: read
contents: read
outputs:
commit: ${{ steps.verify.outputs.commit }}
version: ${{ steps.verify.outputs.version }}
steps:
- name: Checkout exact tag
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0

- name: Verify signed annotated tag, main ancestry, and required checks
id: verify
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
version="${GITHUB_REF_NAME#macos-v}"
[[ "$version" =~ ^[0-9]+([.][0-9]+){1,2}$ ]]

ref_json="$(gh api "repos/$GITHUB_REPOSITORY/git/ref/tags/$GITHUB_REF_NAME")"
test "$(jq -r '.object.type' <<< "$ref_json")" = tag
tag_object="$(jq -r '.object.sha' <<< "$ref_json")"
tag_json="$(gh api "repos/$GITHUB_REPOSITORY/git/tags/$tag_object")"
test "$(jq -r '.verification.verified' <<< "$tag_json")" = true

commit="$(jq -r '.object.sha' <<< "$tag_json")"
test "$commit" = "$GITHUB_SHA"
git fetch --no-tags origin main
test "$commit" = "$(git rev-parse origin/main)"

checks="$(gh api "repos/$GITHUB_REPOSITORY/commits/$commit/check-runs?per_page=100")"
required_checks=(build-test 'Analyze javascript-typescript' 'Analyze swift')
for required_check in "${required_checks[@]}"; do
passed="$(jq --arg name "$required_check" \
'[.check_runs[] | select(.name == $name and .status == "completed" and .conclusion == "success")] | length' \
<<< "$checks")"
test "$passed" -ge 1 || {
echo "Required successful check is missing: $required_check" >&2
exit 1
}
done

echo "commit=$commit" >> "$GITHUB_OUTPUT"
echo "version=$version" >> "$GITHUB_OUTPUT"

sign-notarize:
if: ${{ vars.CI_SIGNING_PROVISIONED == 'true' }}
needs: verify-source
runs-on: macos-15
timeout-minutes: 45
environment: release
permissions:
attestations: write
contents: read
id-token: write
env:
SIGNING_IDENTITY: 'Developer ID Application: Rafal Sikora (2NY8A789TN)'
NOTARY_PROFILE: codebase-combiner-notary
steps:
- name: Checkout verified source commit
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
ref: ${{ needs.verify-source.outputs.commit }}
fetch-depth: 0

- name: Import Developer ID identity
env:
DEVELOPER_ID_P12_BASE64: ${{ secrets.DEVELOPER_ID_P12_BASE64 }}
DEVELOPER_ID_P12_PASSWORD: ${{ secrets.DEVELOPER_ID_P12_PASSWORD }}
CI_DEVELOPER_ID_CERTIFICATE_SHA256: ${{ vars.CI_DEVELOPER_ID_CERTIFICATE_SHA256 }}
LOCAL_DEVELOPER_ID_CERTIFICATE_SHA256: ${{ vars.LOCAL_DEVELOPER_ID_CERTIFICATE_SHA256 }}
run: |
set -euo pipefail
[[ "$CI_DEVELOPER_ID_CERTIFICATE_SHA256" =~ ^[A-Fa-f0-9]{64}$ ]]
[[ "$LOCAL_DEVELOPER_ID_CERTIFICATE_SHA256" =~ ^[A-Fa-f0-9]{64}$ ]]
test "${CI_DEVELOPER_ID_CERTIFICATE_SHA256^^}" != "${LOCAL_DEVELOPER_ID_CERTIFICATE_SHA256^^}"
keychain="$RUNNER_TEMP/release.keychain-db"
keychain_secret="$(openssl rand -hex 32)"
certificate="$RUNNER_TEMP/developer-id.p12"
public_certificate="$RUNNER_TEMP/developer-id.pem"
printf '%s' "$DEVELOPER_ID_P12_BASE64" | base64 --decode > "$certificate"
security create-keychain -p "$keychain_secret" "$keychain"
security set-keychain-settings -lut 21600 "$keychain"
security unlock-keychain -p "$keychain_secret" "$keychain"
security import "$certificate" -k "$keychain" -P "$DEVELOPER_ID_P12_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$keychain_secret" "$keychain"
security list-keychains -d user -s "$keychain"
security find-identity -p codesigning -v "$keychain" | grep -F "$SIGNING_IDENTITY"
security find-certificate -c "$SIGNING_IDENTITY" -p "$keychain" > "$public_certificate"
actual_fingerprint="$(openssl x509 -in "$public_certificate" -noout -fingerprint -sha256 | sed 's/^sha256 Fingerprint=//; s/^SHA256 Fingerprint=//; s/://g' | tr '[:lower:]' '[:upper:]')"
test "$actual_fingerprint" = "${CI_DEVELOPER_ID_CERTIFICATE_SHA256^^}"
test "$actual_fingerprint" != "${LOCAL_DEVELOPER_ID_CERTIFICATE_SHA256^^}"
rm -f "$public_certificate"
echo "RELEASE_KEYCHAIN=$keychain" >> "$GITHUB_ENV"

- name: Store notary credentials in the ephemeral Keychain
env:
APPLE_API_KEY_P8_BASE64: ${{ secrets.APPLE_API_KEY_P8_BASE64 }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }}
run: |
set -euo pipefail
key="$RUNNER_TEMP/AuthKey_${APPLE_API_KEY_ID}.p8"
printf '%s' "$APPLE_API_KEY_P8_BASE64" | base64 --decode > "$key"
chmod 600 "$key"
xcrun notarytool store-credentials "$NOTARY_PROFILE" \
--key "$key" \
--key-id "$APPLE_API_KEY_ID" \
--issuer "$APPLE_API_ISSUER_ID" \
--keychain "$RELEASE_KEYCHAIN" \
--validate
rm -f "$key"

- name: Build and sign the DMG
env:
DEVELOPER_ID_SOURCE_TAG: ${{ github.ref_name }}
run: |
Packaging/DeveloperID/build_release.sh \
--version "${{ needs.verify-source.outputs.version }}" \
--signing-identity "$SIGNING_IDENTITY"

- name: Notarize, staple, and validate
run: |
version="${{ needs.verify-source.outputs.version }}"
Packaging/DeveloperID/notarize_release.sh \
--dmg "dist/developer-id/Codebase-Combiner-$version-arm64.dmg" \
--keychain-profile "$NOTARY_PROFILE" \
--keychain "$RELEASE_KEYCHAIN" \
--timeout 30m

- name: Attest every published release subject
uses: actions/attest-build-provenance@43d14bc2b83dec42d39ecae14e916627a18bb661 # v3
with:
subject-path: |
dist/developer-id/Codebase-Combiner-${{ needs.verify-source.outputs.version }}-arm64.dmg
dist/developer-id/Codebase-Combiner-${{ needs.verify-source.outputs.version }}-arm64.cdx.json
dist/developer-id/Codebase-Combiner-${{ needs.verify-source.outputs.version }}-arm64-symbols.zip
dist/developer-id/release-manifest.json
dist/developer-id/notarization/summary.json
dist/developer-id/notarization/submission.json
dist/developer-id/notarization/*-log.json

- name: Transfer verified release assets
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: macos-release-${{ needs.verify-source.outputs.version }}
if-no-files-found: error
retention-days: 14
path: |
dist/developer-id/Codebase-Combiner-${{ needs.verify-source.outputs.version }}-arm64.dmg
dist/developer-id/Codebase-Combiner-${{ needs.verify-source.outputs.version }}-arm64.cdx.json
dist/developer-id/Codebase-Combiner-${{ needs.verify-source.outputs.version }}-arm64-symbols.zip
dist/developer-id/SHA256SUMS
dist/developer-id/release-manifest.json
dist/developer-id/notarization/summary.json
dist/developer-id/notarization/submission.json
dist/developer-id/notarization/*-log.json

- name: Remove ephemeral signing material
if: always()
run: |
rm -f "$RUNNER_TEMP"/AuthKey_*.p8 "$RUNNER_TEMP/developer-id.p12"
if [[ -n "${RELEASE_KEYCHAIN:-}" ]]; then
security delete-keychain "$RELEASE_KEYCHAIN" || true
fi

draft-release:
needs: [verify-source, sign-notarize]
runs-on: macos-15
timeout-minutes: 10
permissions:
contents: write
steps:
- name: Checkout verified source commit
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
ref: ${{ needs.verify-source.outputs.commit }}

- name: Download verified release assets
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: macos-release-${{ needs.verify-source.outputs.version }}
path: release-assets

- name: Create draft GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
version="${{ needs.verify-source.outputs.version }}"
notes="docs/release/$version/RELEASE_NOTES.md"
test -f "$notes"
gh release create "$GITHUB_REF_NAME" \
--verify-tag \
--draft \
--title "Codebase Combiner $version for macOS" \
--notes-file "$notes" \
"release-assets/Codebase-Combiner-$version-arm64.dmg" \
"release-assets/SHA256SUMS" \
"release-assets/Codebase-Combiner-$version-arm64.cdx.json" \
"release-assets/Codebase-Combiner-$version-arm64-symbols.zip" \
"release-assets/release-manifest.json" \
"release-assets/notarization/summary.json" \
"release-assets/notarization/submission.json" \
"release-assets/notarization/"*-log.json
Loading
Loading