|
28 | 28 | - name: Detect updates in google/gemini-cli |
29 | 29 | id: detect |
30 | 30 | shell: bash |
| 31 | + env: |
| 32 | + GITHUB_TOKEN: ${{ github.token }} |
31 | 33 | run: | |
32 | 34 | set -euo pipefail |
33 | 35 |
|
| 36 | + UPSTREAM_REPO="google-gemini/gemini-cli" |
34 | 37 | SUBMODULE_PATH="submodules/google-gemini-cli" |
35 | 38 | MODELS_FILE="packages/core/src/config/models.ts" |
36 | 39 | CONFIG_SCHEMA_FILE="schemas/settings.schema.json" |
|
39 | 42 | "packages/cli/src/config/config.ts" |
40 | 43 | "packages/core/src/config/config.ts" |
41 | 44 | ) |
| 45 | + CLI_RELEVANT_PATHS_REGEX='^(packages/|schemas/|gemini-rs/|docs/|README\.md|CHANGELOG\.md|package\.json|package-lock\.json|pnpm-lock\.yaml|bun\.lockb?|Cargo\.toml|Cargo\.lock)' |
42 | 46 |
|
43 | 47 | read_file_at_sha() { |
44 | 48 | local sha="$1" |
|
136 | 140 | default_branch="main" |
137 | 141 | fi |
138 | 142 |
|
139 | | - git -C "$SUBMODULE_PATH" fetch origin "$default_branch" --depth=512 |
140 | | - latest_sha="$(git -C "$SUBMODULE_PATH" rev-parse FETCH_HEAD)" |
| 143 | + git -C "$SUBMODULE_PATH" fetch origin "$default_branch" --tags --depth=512 |
| 144 | + |
| 145 | + latest_release_json="$(curl -fsSL \ |
| 146 | + -H "Accept: application/vnd.github+json" \ |
| 147 | + -H "Authorization: Bearer $GITHUB_TOKEN" \ |
| 148 | + "https://api.github.com/repos/$UPSTREAM_REPO/releases/latest")" |
| 149 | + |
| 150 | + latest_release_tag="$(printf '%s' "$latest_release_json" | jq -r '.tag_name // empty')" |
| 151 | + latest_release_name="$(printf '%s' "$latest_release_json" | jq -r '.name // empty')" |
| 152 | + latest_release_url="$(printf '%s' "$latest_release_json" | jq -r '.html_url // empty')" |
| 153 | + latest_release_published_at="$(printf '%s' "$latest_release_json" | jq -r '.published_at // empty')" |
| 154 | + |
| 155 | + if [ -z "$latest_release_tag" ]; then |
| 156 | + echo "Could not resolve latest upstream release tag for $UPSTREAM_REPO" >&2 |
| 157 | + exit 1 |
| 158 | + fi |
| 159 | + |
| 160 | + latest_sha="$(git -C "$SUBMODULE_PATH" rev-list -n 1 "refs/tags/$latest_release_tag^{commit}")" |
| 161 | + current_release_tag="$(git -C "$SUBMODULE_PATH" describe --tags --exact-match "$current_sha" 2>/dev/null || true)" |
141 | 162 |
|
142 | 163 | echo "current_sha=$current_sha" >> "$GITHUB_OUTPUT" |
143 | 164 | echo "latest_sha=$latest_sha" >> "$GITHUB_OUTPUT" |
144 | 165 | echo "default_branch=$default_branch" >> "$GITHUB_OUTPUT" |
145 | | - |
146 | | - if [ "$current_sha" = "$latest_sha" ]; then |
147 | | - echo "No upstream updates." |
| 166 | + echo "current_release_tag=$current_release_tag" >> "$GITHUB_OUTPUT" |
| 167 | + echo "latest_release_tag=$latest_release_tag" >> "$GITHUB_OUTPUT" |
| 168 | + echo "latest_release_name=$latest_release_name" >> "$GITHUB_OUTPUT" |
| 169 | + echo "latest_release_url=$latest_release_url" >> "$GITHUB_OUTPUT" |
| 170 | + echo "latest_release_published_at=$latest_release_published_at" >> "$GITHUB_OUTPUT" |
| 171 | + |
| 172 | + if [ "$current_sha" = "$latest_sha" ] || git -C "$SUBMODULE_PATH" merge-base --is-ancestor "$latest_sha" "$current_sha"; then |
| 173 | + echo "No newer upstream release beyond pinned submodule commit." |
148 | 174 | echo "has_update=false" >> "$GITHUB_OUTPUT" |
149 | 175 | exit 0 |
150 | 176 | fi |
|
157 | 183 |
|
158 | 184 | echo "has_update=true" >> "$GITHUB_OUTPUT" |
159 | 185 |
|
160 | | - cli_changed_files="$(printf '%s\n' "$changed_files" | grep -E '^(codex-rs/|docs/|README\.md|CHANGELOG\.md|Cargo\.toml|Cargo\.lock|package\.json)' || true)" |
| 186 | + cli_changed_files="$(printf '%s\n' "$changed_files" | grep -E "$CLI_RELEVANT_PATHS_REGEX" || true)" |
161 | 187 | if [ -z "$cli_changed_files" ]; then |
162 | 188 | cli_changed_files="$(printf '%s\n' "$changed_files" | head -n 200)" |
163 | 189 | fi |
|
217 | 243 | CURRENT_SHA: ${{ steps.detect.outputs.current_sha }} |
218 | 244 | LATEST_SHA: ${{ steps.detect.outputs.latest_sha }} |
219 | 245 | DEFAULT_BRANCH: ${{ steps.detect.outputs.default_branch }} |
| 246 | + CURRENT_RELEASE_TAG: ${{ steps.detect.outputs.current_release_tag }} |
| 247 | + LATEST_RELEASE_TAG: ${{ steps.detect.outputs.latest_release_tag }} |
| 248 | + LATEST_RELEASE_NAME: ${{ steps.detect.outputs.latest_release_name }} |
| 249 | + LATEST_RELEASE_URL: ${{ steps.detect.outputs.latest_release_url }} |
| 250 | + LATEST_RELEASE_PUBLISHED_AT: ${{ steps.detect.outputs.latest_release_published_at }} |
220 | 251 | CLI_CHANGED_FILES: ${{ steps.detect.outputs.cli_changed_files }} |
221 | 252 | COMMITS: ${{ steps.detect.outputs.commits }} |
222 | 253 | CHANGED_FLAGS: ${{ steps.detect.outputs.changed_flags }} |
|
228 | 259 | const currentSha = process.env.CURRENT_SHA; |
229 | 260 | const latestSha = process.env.LATEST_SHA; |
230 | 261 | const defaultBranch = process.env.DEFAULT_BRANCH; |
| 262 | + const currentReleaseTag = process.env.CURRENT_RELEASE_TAG || ''; |
| 263 | + const latestReleaseTag = process.env.LATEST_RELEASE_TAG || ''; |
| 264 | + const latestReleaseName = process.env.LATEST_RELEASE_NAME || ''; |
| 265 | + const latestReleaseUrl = process.env.LATEST_RELEASE_URL || ''; |
| 266 | + const latestReleasePublishedAt = process.env.LATEST_RELEASE_PUBLISHED_AT || ''; |
231 | 267 | const changedFilesRaw = process.env.CLI_CHANGED_FILES || ''; |
232 | 268 | const commitsRaw = process.env.COMMITS || ''; |
233 | 269 | const changedFlags = process.env.CHANGED_FLAGS || '- (not provided)'; |
|
237 | 273 |
|
238 | 274 | const shortCurrent = currentSha.slice(0, 7); |
239 | 275 | const shortLatest = latestSha.slice(0, 7); |
240 | | - const marker = `<!-- geminisharp-gemini-cli-update:${latestSha} -->`; |
| 276 | + const marker = `<!-- geminisharp-gemini-cli-release:${latestReleaseTag}:${latestSha} -->`; |
241 | 277 | const labelName = 'gemini-cli-sync'; |
242 | 278 |
|
243 | 279 | const changedFiles = changedFilesRaw |
|
281 | 317 | return; |
282 | 318 | } |
283 | 319 |
|
284 | | - const title = `Sync Gemini CLI upstream changes (${shortCurrent} -> ${shortLatest})`; |
| 320 | + const title = `Sync Gemini CLI release ${latestReleaseTag} (${shortCurrent} -> ${shortLatest})`; |
285 | 321 | const body = [ |
286 | 322 | marker, |
287 | 323 | '', |
288 | | - 'Detected upstream updates in `google-gemini/gemini-cli` affecting CLI surface tracking.', |
| 324 | + 'Detected a newer upstream release in `google-gemini/gemini-cli` affecting CLI surface tracking.', |
289 | 325 | '', |
290 | 326 | `- Submodule path: \`submodules/google-gemini-cli\``, |
291 | 327 | `- Watched branch: \`${defaultBranch}\``, |
| 328 | + `- Current pinned release tag: ${currentReleaseTag ? `\`${currentReleaseTag}\`` : '_not pinned to an exact release tag_'}`, |
292 | 329 | `- Current pinned commit: \`${currentSha}\``, |
| 330 | + `- Latest upstream release tag: \`${latestReleaseTag}\``, |
| 331 | + `- Latest upstream release name: ${latestReleaseName || '_not provided_'}`, |
293 | 332 | `- Latest upstream commit: \`${latestSha}\``, |
| 333 | + `- Release published at: ${latestReleasePublishedAt || '_not provided_'}`, |
| 334 | + `- Release page: ${latestReleaseUrl || '_not provided_'}`, |
294 | 335 | `- Compare: ${compareUrl}`, |
295 | 336 | `- Latest commit: ${latestCommitUrl}`, |
296 | 337 | '', |
|
310 | 351 | commits, |
311 | 352 | '', |
312 | 353 | '## Action required', |
| 354 | + '- [ ] Review upstream release notes and confirm breaking/non-breaking CLI changes', |
313 | 355 | '- [ ] Validate latest `gemini --help` and headless `gemini --prompt ... --output-format stream-json` output', |
| 356 | + '- [ ] Update pinned `submodules/google-gemini-cli` release/tag after validation', |
314 | 357 | '- [ ] Sync C# SDK constants/options/models with upstream CLI changes', |
315 | 358 | '- [ ] Add or update tests for new flags/models/features', |
316 | 359 | '- [ ] Update docs (README + docs/Features + docs/Architecture if needed)', |
|
0 commit comments