Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 0 additions & 4 deletions .editorconfig

This file was deleted.

11 changes: 11 additions & 0 deletions .github/docs-sync-sources.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CONTRIBUTING.md
ROADMAP.md
STABILITY.md
docs/store6/important-defaults.md
docs/store6/invalidate-vs-clear.md
docs/store6/key-design.md
docs/store6/quickstart.md
llms.txt
compose/README.md
room/README.md
sqldelight/README.md

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docs sync source list unsorted

High Severity

.github/docs-sync-sources.txt is not in LC_ALL=C sort order: compose/README.md, room/README.md, and sqldelight/README.md appear after llms.txt, but compose/ sorts before docs/. The docs-sync-guard job runs sort -c on every PR and will fail before any docs-change check.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 9726208. Configure here.

12 changes: 0 additions & 12 deletions .github/workflows/KMMBridge-Release.yml

This file was deleted.

92 changes: 92 additions & 0 deletions .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Store6 Benchmarks

# Non-blocking measurement lane. Report-only: runs the smoke configuration and uploads JSON
# results. NO step asserts against a number — no numeric performance target has been adopted
# (see benchmarks/README.md for the CI boundary). This workflow is deliberately OUTSIDE
# the exact-head-green ready-gate convention, which continues to mean: the Store6 and CI
# workflows green at the head.
on:
workflow_dispatch:
pull_request:
branches: [ main, store6 ]
paths:
- 'benchmarks/**'
- '.github/workflows/benchmarks.yml'

permissions:
contents: read

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

jobs:
benchmarks-smoke:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout the repo
uses: actions/checkout@v4
with:
persist-credentials: false

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: Set up Gradle
uses: gradle/actions/setup-gradle@v6

- name: Grant execute permission for Gradlew
run: chmod +x gradlew

- name: Run smoke benchmarks (report-only; no thresholds)
run: ./gradlew :benchmarks:smokeBenchmark --stacktrace

- name: Summarize results
shell: bash
run: |
set -euo pipefail
reports_dir="benchmarks/build/reports/benchmarks"
mapfile -t json_reports < <(find "${reports_dir}" -type f -name '*.json' -print | LC_ALL=C sort)
report_count="${#json_reports[@]}"
if [[ "${report_count}" -ne 1 ]]; then
echo "ERROR: expected exactly one benchmark JSON under ${reports_dir}; found ${report_count}" >&2
if [[ "${report_count}" -gt 0 ]]; then
printf ' %s\n' "${json_reports[@]}" >&2
fi
exit 1
fi
json="${json_reports[0]}"
if ! jq -e '
type == "array" and
length > 0 and
all(.[];
type == "object" and
((.benchmark | type) == "string") and
((.benchmark | length) > 0) and
((has("params") | not) or ((.params | type) == "object")) and
((.primaryMetric | type) == "object") and
((.primaryMetric.score | type) == "number") and
((.primaryMetric.scoreUnit | type) == "string") and
((.primaryMetric.scoreUnit | length) > 0)
)
' "${json}" >/dev/null; then
echo "ERROR: benchmark JSON failed structural validation: ${json}" >&2
exit 1
fi
echo "Results from ${json} (smoke-grade numbers; hosted-runner noise applies — see benchmarks/README.md):"
jq -r '.[] | [.benchmark,
((.params // {}) | to_entries | map("\(.key)=\(.value)") | join(",")),
(.primaryMetric.score | tostring),
.primaryMetric.scoreUnit]
| @tsv' "${json}" | column -t -s $'\t'

- name: Upload benchmark results
uses: actions/upload-artifact@v4
with:
name: benchmarks-smoke-${{ github.run_id }}
path: benchmarks/build/reports/benchmarks/
if-no-files-found: error
62 changes: 39 additions & 23 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,29 @@ name: CI

on:
push:
branches: [ main ]
branches: [ main, store6 ]
pull_request:
branches: [ main ]
branches: [ main, store6 ]

permissions:
contents: read

jobs:
build-and-test:
runs-on: ubuntu-latest
timeout-minutes: 30
# The mutations Lincheck budget measured ~58-59m locally and 2h40m-3h13m hosted
# at the current suite (and once 9h23m locally at an earlier revision). The default
# jvmTest excludes it via the build-gated filter in mutations/build.gradle.kts
# (census-guarded below); the scheduled "Store6 full mutations JVM suite" workflow runs
# the full suite daily.
timeout-minutes: 120
strategy:
fail-fast: false
matrix:
api-level: [ 29 ]
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v4
with:
# PR builds (including forks) check out the PR head from its source repo;
# push builds fall back to the pushed ref on this repo. Without the
Expand All @@ -31,7 +39,7 @@ jobs:
persist-credentials: false

- name: Set up JDK 17
uses: actions/setup-java@v5
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'
Expand All @@ -42,33 +50,41 @@ jobs:
- name: Grant execute permission for Gradlew
run: chmod +x gradlew

- name: Build and Test with Coverage
run: ./gradlew clean build koverXmlReport --stacktrace --continue
- name: Build and Test
run: ./gradlew clean build --stacktrace

- name: Census — default jvmTest must execute exactly the non-Lincheck suites
shell: bash
run: |
set -euo pipefail
expected=$(( $(find mutations/src/commonTest mutations/src/jvmTest -name '*Test.kt' | wc -l | tr -d ' ') - 1 ))
executed=$(find mutations/build/test-results/jvmTest -name 'TEST-*.xml' | wc -l | tr -d ' ')
echo "expected=${expected} executed=${executed}"
[ "${expected}" -eq "${executed}" ]

- name: Upload Coverage to Codecov
# Secrets (including CODECOV_TOKEN) are not exposed to fork PRs, so the
# upload would fail under fail_ci_if_error. Skip it for forks; coverage is
# still uploaded and enforced for same-repo PRs and pushes to main.
if: ${{ github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request' }}
uses: codecov/codecov-action@v6
- name: Upload test reports
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: build/reports/kover/coverage.xml
flags: unittests
name: codecov-umbrella
fail_ci_if_error: true
verbose: true
name: test-reports-root-${{ github.run_id }}-${{ github.run_attempt }}
path: |
**/build/test-results/**/*.xml
**/build/reports/tests/**
if-no-files-found: warn
retention-days: 7

publish:
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository == 'MobileNativeFoundation/Store'
runs-on: macos-latest
needs: build-and-test
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v4
with:
persist-credentials: false

- name: Set up JDK 17
uses: actions/setup-java@v5
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'
Expand All @@ -81,7 +97,7 @@ jobs:

- name: Retrieve Version
run: |
echo "VERSION_NAME=$(grep -E '^store[[:space:]]*=' gradle/libs.versions.toml | head -1 | cut -d'"' -f2)" >> $GITHUB_ENV
echo "VERSION_NAME=$(grep -w 'VERSION_NAME' gradle.properties | cut -d'=' -f2)" >> $GITHUB_ENV

- name: Publish to Maven Central (Central Portal)
env:
Expand All @@ -94,4 +110,4 @@ jobs:
./gradlew publishToMavenCentral
else
./gradlew publishAndReleaseToMavenCentral
fi
fi
67 changes: 0 additions & 67 deletions .github/workflows/create_swift_package.yml

This file was deleted.

71 changes: 71 additions & 0 deletions .github/workflows/store6-full-jvm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Store6 full mutations JVM suite

on:
schedule:
- cron: '17 5 * * *'
workflow_dispatch: {}

permissions:
contents: read
issues: write

jobs:
full-mutations-jvm:
runs-on: ubuntu-latest
timeout-minutes: 360
steps:
- name: Checkout
uses: actions/checkout@v4
with:
persist-credentials: false

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6

- name: Grant execute permission for Gradlew
run: chmod +x gradlew

- name: Run the FULL mutations JVM suite (Lincheck included)
run: ./gradlew :mutations:jvmTest -Pstore6.fullJvmSuite --stacktrace

- name: Census — no suite may be lost
shell: bash
run: |
set -euo pipefail
expected=$(find mutations/src/commonTest mutations/src/jvmTest -name '*Test.kt' | wc -l | tr -d ' ')
executed=$(find mutations/build/test-results/jvmTest -name 'TEST-*.xml' | wc -l | tr -d ' ')
echo "expected=${expected} executed=${executed}"
[ "${expected}" -eq "${executed}" ]

- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: full-jvm-results-${{ github.run_id }}-${{ github.run_attempt }}
path: |
mutations/build/test-results/**/*.xml
mutations/build/reports/tests/**
if-no-files-found: warn
retention-days: 14

- name: File the classification duty on failure
if: ${{ failure() }}
env:
GH_TOKEN: ${{ github.token }}
run: |
gh issue list -R "${GITHUB_REPOSITORY}" --state open \
--search "Scheduled full mutations JVM suite red in:title" --json number \
--jq '.[0].number' > /tmp/existing || true
body="Scheduled full-suite run ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} failed. Classify per docs/v6 conduct (017 register / 031 job-cap class / novel). Never rerun for evidence."
if [ -s /tmp/existing ] && [ "$(cat /tmp/existing)" != "null" ] && [ -n "$(cat /tmp/existing)" ]; then
gh issue comment "$(cat /tmp/existing)" -R "${GITHUB_REPOSITORY}" --body "${body}"
else
gh issue create -R "${GITHUB_REPOSITORY}" \
--title "Scheduled full mutations JVM suite red (${GITHUB_RUN_ID})" --body "${body}"
fi
Loading
Loading