Skip to content

Commit 196bea4

Browse files
authored
fix(release): stabilize upstream pinning and align AIO package tags (#41)
* fix(template): expose remaining upstream runtime env options * build(image): reduce runtime footprint and harden service startup * fix(sync): pin stable upstream digest resolution * ci(build): add explicit upstream and aio image labels * build(tags): derive aio line tag from release revision
1 parent 7cfc4b2 commit 196bea4

12 files changed

Lines changed: 155 additions & 52 deletions

File tree

.github/workflows/build.yml

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,27 @@ jobs:
296296
sha_tag="${image}:sha-${GITHUB_SHA}"
297297
raw_version="$(sed -n 's/^ARG UPSTREAM_VERSION=//p' Dockerfile | head -n1)"
298298
upstream_version="${raw_version%%@*}"
299-
aio_track="aio-v1"
299+
upstream_digest="$(sed -n 's/^ARG UPSTREAM_IMAGE_DIGEST=//p' Dockerfile | head -n1)"
300+
changelog_version="$(python3 scripts/release.py latest-changelog-version 2>/dev/null || true)"
301+
aio_revision=""
302+
case "${changelog_version}" in
303+
"${upstream_version}"-aio.*)
304+
candidate_revision="${changelog_version##*.}"
305+
if [[ "${candidate_revision}" =~ ^[0-9]+$ ]]; then
306+
aio_revision="${candidate_revision}"
307+
fi
308+
;;
309+
esac
310+
if [[ -n "${aio_revision}" ]]; then
311+
aio_track="aio-v${aio_revision}"
312+
else
313+
aio_track="aio-v1"
314+
fi
300315
301316
{
302317
echo "upstream_version=${upstream_version}"
318+
echo "upstream_digest=${upstream_digest}"
319+
echo "aio_track=${aio_track}"
303320
echo "tags<<EOF"
304321
echo "${image}:latest"
305322
if [[ -n "${upstream_version}" ]]; then
@@ -324,7 +341,13 @@ jobs:
324341
org.opencontainers.image.source=https://github.com/JSONbored/sure-aio
325342
org.opencontainers.image.title=sure-aio
326343
org.opencontainers.image.version=${{ steps.prep.outputs.upstream_version || '' }}
344+
org.opencontainers.image.description=Unraid-first AIO wrapper image for Sure (web, worker, postgres, redis)
327345
io.jsonbored.upstream.name=Sure
346+
io.jsonbored.upstream.version=${{ steps.prep.outputs.upstream_version || '' }}
347+
io.jsonbored.upstream.digest=${{ steps.prep.outputs.upstream_digest || '' }}
348+
io.jsonbored.wrapper.name=sure-aio
349+
io.jsonbored.wrapper.type=unraid-aio
350+
io.jsonbored.wrapper.track=aio-v1
328351
load: false
329352

330353
sync-awesome-unraid:

.github/workflows/check-upstream.yml

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,47 +36,44 @@ jobs:
3636
chmod +x scripts/check-upstream.py
3737
./scripts/check-upstream.py
3838
39-
- name: Stop if no stable version bump is available
40-
if: ${{ steps.upstream.outputs.version_update_available != 'true' }}
39+
- name: Stop if no stable upstream updates are available
40+
if: ${{ steps.upstream.outputs.updates_available != 'true' }}
4141
run: |
42-
echo "No newer stable upstream Sure tag is available."
43-
if [[ "${{ steps.upstream.outputs.digest_update_available }}" == "true" ]]; then
44-
echo "Digest-only drift detected; leave that to Renovate or manual dependency refresh."
45-
fi
42+
echo "No stable upstream version or digest updates are available."
4643
4744
- name: Create update branch
48-
if: ${{ steps.upstream.outputs.version_update_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
49-
run: git checkout -B "codex/upstream-${{ steps.upstream.outputs.latest_version }}"
45+
if: ${{ steps.upstream.outputs.updates_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
46+
run: git checkout -B "${{ steps.upstream.outputs.branch_name }}"
5047

5148
- name: Apply upstream version bump
52-
if: ${{ steps.upstream.outputs.version_update_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
49+
if: ${{ steps.upstream.outputs.updates_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
5350
env:
5451
WRITE_UPSTREAM_VERSION: "true"
5552
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
5653
run: ./scripts/check-upstream.py
5754

58-
- name: Commit upstream version bump
59-
if: ${{ steps.upstream.outputs.version_update_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
55+
- name: Commit upstream update
56+
if: ${{ steps.upstream.outputs.updates_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
6057
run: |
6158
git config user.name "github-actions[bot]"
6259
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
6360
git add Dockerfile
64-
git commit -m "chore(sync): bump upstream sure to ${{ steps.upstream.outputs.latest_version }}"
61+
git commit -m "${{ steps.upstream.outputs.pr_title }}"
6562
6663
- name: Push update branch
67-
if: ${{ steps.upstream.outputs.version_update_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
64+
if: ${{ steps.upstream.outputs.updates_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
6865
env:
6966
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
70-
run: git push --force --set-upstream origin "codex/upstream-${{ steps.upstream.outputs.latest_version }}"
67+
run: git push --force --set-upstream origin "${{ steps.upstream.outputs.branch_name }}"
7168

7269
- name: Open or update pull request
73-
if: ${{ steps.upstream.outputs.version_update_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
70+
if: ${{ steps.upstream.outputs.updates_available == 'true' && steps.upstream.outputs.strategy == 'pr' }}
7471
env:
7572
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7673
run: |
7774
body_file="$(mktemp)"
7875
cat > "${body_file}" <<EOF
79-
Sure upstream has a newer stable version.
76+
Sure upstream has stable updates available.
8077
8178
- Current pinned upstream version: \`${{ steps.upstream.outputs.current_version }}\`
8279
- Latest upstream version: \`${{ steps.upstream.outputs.latest_version }}\`
@@ -87,15 +84,15 @@ jobs:
8784
This PR was opened automatically by the upstream monitor workflow.
8885
EOF
8986
90-
existing_pr="$(gh pr list --head "codex/upstream-${{ steps.upstream.outputs.latest_version }}" --base main --json number --jq '.[0].number')"
87+
existing_pr="$(gh pr list --head "${{ steps.upstream.outputs.branch_name }}" --base main --json number --jq '.[0].number')"
9188
if [[ -n "${existing_pr}" ]]; then
9289
gh pr edit "${existing_pr}" \
93-
--title "chore(sync): bump upstream sure to ${{ steps.upstream.outputs.latest_version }}" \
90+
--title "${{ steps.upstream.outputs.pr_title }}" \
9491
--body-file "${body_file}"
9592
else
9693
gh pr create \
9794
--base main \
98-
--head "codex/upstream-${{ steps.upstream.outputs.latest_version }}" \
99-
--title "chore(sync): bump upstream sure to ${{ steps.upstream.outputs.latest_version }}" \
95+
--head "${{ steps.upstream.outputs.branch_name }}" \
96+
--title "${{ steps.upstream.outputs.pr_title }}" \
10097
--body-file "${body_file}"
10198
fi

Dockerfile

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,48 @@
11
# syntax=docker/dockerfile:1@sha256:2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2cffc0e3d769
22

33
ARG UPSTREAM_VERSION=v0.6.9
4-
ARG UPSTREAM_IMAGE_DIGEST=sha256:f415c4085489b4e154f2374786fd604b41ff11d3f56b6d1050fa28fa214f1130
4+
ARG UPSTREAM_IMAGE_DIGEST=sha256:3d899b3eced520d8d3166a3d53184cbb1356670fb52d050f94f8e62e59754d70
55
ARG PGVECTOR_VERSION=0.8.2
66
FROM ghcr.io/we-promise/sure@${UPSTREAM_IMAGE_DIGEST}
77

88
ARG PGVECTOR_VERSION
99
ARG S6_OVERLAY_VERSION=3.1.6.2
10+
ARG S6_OVERLAY_NOARCH_SHA256=05af2536ec4fb23f087a43ce305f8962512890d7c71572ed88852ab91d1434e3
11+
ARG S6_OVERLAY_AARCH64_SHA256=3fc0bae418a0e3811b3deeadfca9cc2f0869fb2f4787ab8a53f6944067d140ee
12+
ARG S6_OVERLAY_X86_64_SHA256=95081f11c56e5a351e9ccab4e70c2b1c3d7d056d82b72502b942762112c03d1c
1013
ARG TARGETARCH
1114

1215
USER root
1316

1417
# 1. Install prerequisites, s6-overlay, Redis, and pgvector support
1518
# We use standard PATH binaries for Postgres (it's installed as postgresql)
1619
RUN apt-get update && apt-get install -y --no-install-recommends \
17-
build-essential ca-certificates curl git xz-utils sudo \
18-
postgresql postgresql-client postgresql-server-dev-all redis-server && \
20+
build-essential ca-certificates curl git xz-utils \
21+
postgresql postgresql-client postgresql-server-dev-17 redis-server && \
1922
git clone --branch "v${PGVECTOR_VERSION}" --depth 1 https://github.com/pgvector/pgvector.git /tmp/pgvector && \
2023
make -C /tmp/pgvector OPTFLAGS="" && \
2124
make -C /tmp/pgvector install && \
22-
apt-get purge -y --auto-remove build-essential git postgresql-server-dev-all && \
25+
apt-get purge -y --auto-remove \
26+
build-essential git postgresql-server-dev-17 \
27+
clang-19 llvm-19 llvm-19-dev llvm-19-linker-tools llvm-19-runtime llvm-19-tools && \
2328
curl -L -o /tmp/s6-overlay-noarch.tar.xz https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz && \
29+
echo "${S6_OVERLAY_NOARCH_SHA256} /tmp/s6-overlay-noarch.tar.xz" | sha256sum -c - && \
2430
tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz && \
2531
case "${TARGETARCH}" in \
26-
amd64) s6_arch="x86_64" ;; \
27-
arm64) s6_arch="aarch64" ;; \
32+
amd64) s6_arch="x86_64"; s6_sha="${S6_OVERLAY_X86_64_SHA256}" ;; \
33+
arm64) s6_arch="aarch64"; s6_sha="${S6_OVERLAY_AARCH64_SHA256}" ;; \
2834
*) echo "Unsupported TARGETARCH: ${TARGETARCH}" >&2; exit 1 ;; \
2935
esac && \
3036
curl -L -o /tmp/s6-overlay-arch.tar.xz https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${s6_arch}.tar.xz && \
37+
echo "${s6_sha} /tmp/s6-overlay-arch.tar.xz" | sha256sum -c - && \
3138
tar -C / -Jxpf /tmp/s6-overlay-arch.tar.xz && \
39+
rm -f /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/certs/ssl-cert-snakeoil.pem && \
3240
rm -rf /tmp/* /var/lib/apt/lists/*
3341

3442
# 2. Setup persistent internal storage paths
3543
RUN mkdir -p /var/lib/postgresql/data /var/lib/redis /rails/storage /run/postgresql && \
36-
chown -R postgres:postgres /var/lib/postgresql /run/postgresql /etc/postgresql && \
44+
chown -R postgres:postgres /var/lib/postgresql /run/postgresql && \
45+
if [ -d /etc/postgresql ]; then chown -R postgres:postgres /etc/postgresql; fi && \
3746
chown -R redis:redis /var/lib/redis
3847

3948
# 3. Apply S6 Root Filesystem logic
@@ -55,7 +64,7 @@ VOLUME ["/rails/storage", "/var/lib/postgresql/data", "/var/lib/redis"]
5564

5665
ENV SKYLIGHT_ENABLED=false
5766

58-
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
67+
HEALTHCHECK --interval=30s --timeout=10s --start-period=180s --retries=3 \
5968
CMD curl -f http://localhost:3000/up || exit 1
6069

6170
ENTRYPOINT ["/init"]

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ Just make sure `/mnt/user/appdata/sure-aio` is covered by your standard Unraid C
6868
- The repo monitors stable upstream Sure tags and opens a PR when a newer stable version is released.
6969
- Upstream image digest drift is tracked separately so digest-only refreshes do not masquerade as version-bump PRs.
7070
- Every `main` package publish now ships the exact upstream version tag, an explicit AIO packaging line tag, `latest`, and `sha-<commit>`.
71+
- Published images include explicit metadata labels for both layers:
72+
- upstream app: `io.jsonbored.upstream.version`, `io.jsonbored.upstream.digest`
73+
- wrapper identity: `io.jsonbored.wrapper.name`, `io.jsonbored.wrapper.type`, `io.jsonbored.wrapper.track`
7174
- Formal wrapper releases follow the upstream version plus an AIO revision, such as `v0.6.8-aio.1`.
7275
- See the release workflow details in [docs/releases.md](docs/releases.md).
7376

docs/power-user.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,12 @@ Avoid filling your Unraid cache drive by piping PDFs/receipts straight to object
8282
## 5. Free vs Paid External Data Providers
8383
Sure relies on upstream providers for currency exchange rates and stock logos.
8484

85-
* **Free (Default):** The template defaults both exchange-rate and securities data to `yahoo_finance` so a first boot works without extra accounts.
85+
* **Free (Default):** If you leave provider overrides blank, upstream Sure defaults to `yahoo_finance` for first-boot friendliness.
8686
* **Paid API Keys (Optional):** If you prefer Twelve Data, add your API key and change **[API] Exchange Rate Provider** and **[API] Securities Provider** to `twelve_data`.
8787
* **Logos:** Provide a **[API] Brandfetch Client ID** to automatically scrape high-res logos for your bank names and merchants.
8888
* **High-res logos:** Set `BRAND_FETCH_HIGH_RES_LOGOS=true` if you want Sure to prefer larger Brandfetch logo assets where available.
89-
* **Important override behavior:** If you set these provider and logo values in the Unraid template, upstream Sure treats them as env overrides and disables the matching controls in the self-hosting UI. In `sure-aio`, that is deliberate: the template is the power-user control plane.
89+
* **Indexa token path:** If you use Indexa Capital and want a single global token fallback, set `INDEXA_API_TOKEN`.
90+
* **Important override behavior:** Upstream only locks matching settings UI controls when the related env var is present. Leaving provider/logo env fields blank keeps the UI controls interactive.
9091
* **Advanced provider tuning:** The template also exposes `TWELVE_DATA_URL`, `YAHOO_FINANCE_URL`, `YAHOO_FINANCE_MAX_RETRIES`, `YAHOO_FINANCE_RETRY_INTERVAL`, and `YAHOO_FINANCE_MIN_REQUEST_INTERVAL` if you need proxying or retry tuning.
9192

9293
---
@@ -193,6 +194,10 @@ The template now exposes the main upstream runtime toggles that were previously
193194
2. **Pending transaction behavior**
194195
- `SIMPLEFIN_INCLUDE_PENDING`
195196
- `PLAID_INCLUDE_PENDING`
197+
- `LUNCHFLOW_INCLUDE_PENDING`
198+
- `SIMPLEFIN_DEBUG_RAW`
199+
- `LUNCHFLOW_DEBUG_RAW`
200+
- `SIMPLEFIN_CC_OVERPAYMENT_HEURISTIC`
196201
- Just like provider selection, these env overrides lock the matching Sync control in Sure's UI when set.
197202
3. **Plaid credentials**
198203
- `PLAID_CLIENT_ID`
@@ -208,11 +213,18 @@ The template now exposes the main upstream runtime toggles that were previously
208213
- `CHAT_PROVIDER` / `CHAT_MODEL`
209214
5. **Auth and onboarding behavior**
210215
- `REQUIRE_EMAIL_CONFIRMATION`
216+
- `REQUIRE_INVITE_CODE`
211217
- `AUTH_PROVIDERS_SOURCE`
212218
6. **Database and SSL edge cases**
213219
- `POSTGRES_DB`
214220
- `SSL_CERT_FILE`
215-
7. **Advanced outbound networking**
221+
- `SELF_HOSTING_ENABLED` (legacy alias; keep `SELF_HOSTED=true` as the main switch)
222+
7. **Runtime/process tuning**
223+
- `RAILS_MAX_THREADS`
224+
- `WEB_CONCURRENCY`
225+
- `SIDEKIQ_WEB_USERNAME`
226+
- `SIDEKIQ_WEB_PASSWORD`
227+
8. **Advanced outbound networking**
216228
- `HTTPS_PROXY`
217229
- `HTTP_PROXY`
218230
- `NO_PROXY`

docs/releases.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Every `main` build publishes:
1616

1717
- `latest`
1818
- the exact pinned upstream version
19-
- an explicit packaging line tag like `v0.6.8-aio-v1`
19+
- an explicit packaging line tag like `v0.6.9-aio-v3` (derived from the latest released `v0.6.9-aio.3`)
2020
- `sha-<commit>`
2121

2222
## Release flow

rootfs/etc/cont-init.d/01-setup-db.sh

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
#!/command/with-contenv sh
2+
set -eu
3+
24
PGDATA="/var/lib/postgresql/data"
35
mkdir -p "$PGDATA" /var/lib/redis /run/postgresql
4-
chown -R postgres:postgres "$PGDATA" /run/postgresql /etc/postgresql
5-
chown -R redis:redis /var/lib/redis
6+
# Avoid recursive ownership fixes on every boot for better restart performance.
7+
# Full recursive chown is only needed before first database initialization.
8+
if [ -s "$PGDATA/PG_VERSION" ]; then
9+
chown postgres:postgres "$PGDATA" /run/postgresql
10+
else
11+
chown -R postgres:postgres "$PGDATA" /run/postgresql
12+
if [ -d /etc/postgresql ]; then
13+
chown -R postgres:postgres /etc/postgresql
14+
fi
15+
fi
16+
chown redis:redis /var/lib/redis
617
chmod 700 "$PGDATA"
718
chmod 770 /var/lib/redis
819

rootfs/etc/s6-overlay/s6-rc.d/postgres/run

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ PGDATA="/var/lib/postgresql/data"
66
PGBIN="/usr/lib/postgresql/${PG_VERSION}/bin"
77

88
mkdir -p "$PGDATA" /run/postgresql
9-
chown -R postgres:postgres "$PGDATA" /run/postgresql
9+
chown postgres:postgres "$PGDATA" /run/postgresql
1010
chmod 700 "$PGDATA"
1111

1212
if [ ! -s "$PGDATA/PG_VERSION" ]; then

rootfs/etc/s6-overlay/s6-rc.d/redis/run

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
set -eu
33

44
mkdir -p /var/lib/redis
5-
chown -R redis:redis /var/lib/redis
5+
chown redis:redis /var/lib/redis
66
chmod 770 /var/lib/redis
77

8-
exec sudo -u redis redis-server /etc/redis/redis.conf --dir /var/lib/redis
8+
exec s6-setuidgid redis redis-server /etc/redis/redis.conf --dir /var/lib/redis

scripts/check-upstream.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def latest_github_tag(repo: str, stable_only: bool) -> str:
108108
return sorted(candidates, key=version_sort_key)[-1]
109109

110110

111-
def latest_ghcr_digest(image: str, tag: str = "latest") -> str:
111+
def try_ghcr_digest_for_tag(image: str, tag: str) -> str | None:
112112
token_data = http_json(f"https://ghcr.io/token?scope=repository:{image}:pull")
113113
if not isinstance(token_data, dict) or not token_data.get("token"):
114114
fail(f"Could not get GHCR token for {image}")
@@ -131,14 +131,25 @@ def latest_ghcr_digest(image: str, tag: str = "latest") -> str:
131131
)
132132
try:
133133
with urllib.request.urlopen(request, timeout=30) as response:
134-
digest = response.headers.get("docker-content-digest", "").strip()
134+
return response.headers.get("docker-content-digest", "").strip() or None
135135
except urllib.error.HTTPError as exc:
136+
if exc.code == 404:
137+
return None
136138
fail(f"HTTP error while requesting GHCR manifest for {image}:{tag}: {exc.code} {exc.reason}")
137139
except urllib.error.URLError as exc:
138140
fail(f"Network error while requesting GHCR manifest for {image}:{tag}: {exc.reason}")
139-
if not digest:
140-
fail(f"Could not determine digest for GHCR image {image}:{tag}")
141-
return digest
141+
return None
142+
143+
144+
def ghcr_digest_for_version(image: str, version: str) -> str:
145+
candidates = [version]
146+
if version.startswith("v"):
147+
candidates.append(version[1:])
148+
for tag in candidates:
149+
digest = try_ghcr_digest_for_tag(image, tag)
150+
if digest:
151+
return digest
152+
fail(f"Could not determine digest for GHCR image {image} using version tags: {', '.join(candidates)}")
142153

143154

144155
def read_local_version(config: dict[str, object]) -> str:
@@ -250,14 +261,27 @@ def main() -> None:
250261
current_version = read_local_version(upstream)
251262
current_digest = read_local_digest(upstream)
252263
latest_version = latest_github_tag(str(upstream.get("repo", "")).strip(), stable_only)
253-
latest_digest = latest_ghcr_digest(str(upstream.get("image", "")).strip(), "latest")
264+
latest_digest = ghcr_digest_for_version(str(upstream.get("image", "")).strip(), latest_version)
254265
version_update_available = latest_version != current_version
255266
digest_update_available = latest_digest != current_digest
256-
updates_available = version_update_available
257-
258-
if os.environ.get("WRITE_UPSTREAM_VERSION") == "true" and version_update_available:
259-
write_local_version(upstream, latest_version)
260-
write_local_digest(upstream, latest_digest)
267+
updates_available = version_update_available or digest_update_available
268+
269+
if os.environ.get("WRITE_UPSTREAM_VERSION") == "true" and updates_available:
270+
if version_update_available:
271+
write_local_version(upstream, latest_version)
272+
if digest_update_available:
273+
write_local_digest(upstream, latest_digest)
274+
275+
branch_version = latest_version.replace("/", "-")
276+
if version_update_available:
277+
branch_name = f"codex/upstream-{branch_version}"
278+
pr_title = f"chore(sync): bump upstream sure to {latest_version}"
279+
elif digest_update_available:
280+
branch_name = f"codex/upstream-digest-{branch_version}"
281+
pr_title = f"chore(sync): refresh upstream sure digest for {latest_version}"
282+
else:
283+
branch_name = f"codex/upstream-{branch_version}"
284+
pr_title = f"chore(sync): bump upstream sure to {latest_version}"
261285

262286
release_notes = ""
263287
if isinstance(notifications, dict):
@@ -277,6 +301,8 @@ def main() -> None:
277301
"strategy": str(upstream.get("strategy", "pr")).strip() or "pr",
278302
"upstream_name": str(upstream.get("name", "")).strip(),
279303
"release_notes_url": release_notes,
304+
"branch_name": branch_name,
305+
"pr_title": pr_title,
280306
}
281307
)
282308

0 commit comments

Comments
 (0)