-
Notifications
You must be signed in to change notification settings - Fork 30
Merge main into feat/multi-device-tests #128
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
droid-ash
wants to merge
119
commits into
feat/multi-device-tests
Choose a base branch
from
merge/main-into-multi-device-tests
base: feat/multi-device-tests
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
119 commits
Select commit
Hold shift + click to select a range
34a9ea4
WIP
2391cfe
merged latest main
cfc0db3
WIP
a734846
adding cloud command and other minor changes
ace9248
Merge branch 'fix-for-allocate-ports' into adding-cloud-command
9d5ccb5
merge latest from main
b5fb805
Merge branch 'remove-suite-flag-from-test' into adding-cloud-command
ac4e4ce
WIP - cloud suite and cloud test
f151070
Merge branch 'main' into adding-cloud-command
1d11e6c
Cloud CLI: fire-and-forget submission, runType/name/appFilename metadata
srinidhi-lwt 9c99225
Merge branch 'main' into adding-cloud-command
srinidhi-lwt 8d415d2
app upload and resuing the app
srinidhi-lwt a491d32
removed MD file
srinidhi-lwt 63c6bd5
auth KEY in headers
srinidhi-lwt 56b158d
app parser and app inspector for app validation
srinidhi-lwt 2688ec5
adding traces to langfuse
srinidhi-lwt 4f5c036
Merge branch 'add-llm-call-trace' into adding-cloud-command
srinidhi-lwt 04a6db5
feat: per-feature model and reasoning effort via workspace YAML
droid-ash 1169820
Merge pull request #93 from final-run/feat/planner-hierarchy-optimiza…
arnoldlaishram 2f79fa8
Merge remote-tracking branch 'origin/main' into feat/per-feature-mode…
droid-ash 518a77c
fix: resolve per-feature provider/model in new summary logs post-merge
droid-ash 38c4aff
docs: spell out supported config shapes and per-provider reasoning le…
droid-ash c8ddcc7
fix(ai): enforce structured output on Anthropic path via zod schema
droid-ash 8c629a7
fix(ai): drop .int() from Anthropic schemas to satisfy tool-schema va…
droid-ash 4d7721f
fix(ai): drop outer output wrapper from Anthropic schemas
droid-ash 4b4069f
fix(ai): pin Anthropic to outputFormat structured-output mode
droid-ash 659693e
fix(ai): route OpenAI through Responses API so reasoningEffort takes …
droid-ash 6967a13
refactor(ai): harden per-feature model resolution and run-context cap…
droid-ash b31afb4
chore: add mintlify-docs folder placeholder
droid-ash 32161a6
docs: add mintlify community docs content
droid-ash 5441886
Merge pull request #95 from final-run/add-mintlify-docs-folder
droid-ash 440dd4a
docs(mintlify): rework landing page with hero video and local logos
droid-ash 2acb1c3
docs(readme): surface docs.finalrun.app in top nav and Documentation …
droid-ash 0a53a11
refactor: split dense paragraphs into short, active sentences
mintlify[bot] 58a57ca
Merge pull request #96 from final-run/claude/lucid-burnell-43b853
droid-ash ec7f1a8
docs(mintlify): restructure Get Started — Intro, Installation (with p…
droid-ash 5167f35
Merge pull request #97 from final-run/claude/mintlify-get-started-res…
droid-ash 5769171
Merge pull request #94 from final-run/feat/per-feature-model-reasoning
droid-ash 6aafb3a
chore: bump version to 0.1.7
droid-ash fb51a2b
Merge pull request #99 from final-run/bump-version-0.1.7
droid-ash f39686b
merged latest
srinidhi-lwt 63d9b11
app options fix
srinidhi-lwt 25cd43c
cloud dev URL
srinidhi-lwt 0e90f83
refactored into components and npm packgae
srinidhi-lwt 0aad4df
Migrate report-web to Vite and publish common + report-web to npm
droid-ash ebb17a0
Address CodeRabbit review feedback on PR #101
droid-ash b257576
Revert LLM call trace plumbing
droid-ash 3b9bb85
Add LLM call traces for Langfuse observability
droid-ash ca351a0
Add finalrun cloud commands (test/suite/upload) with app validation
droid-ash 6548768
Remove finalrun cloud command plumbing
droid-ash bbfc94c
Merge pull request #101 from final-run/adding-cloud-command
droid-ash e328e78
Fix report-web build under TypeScript 6
droid-ash 350b3f7
Merge branch 'main' into llm-call-trace-langfuse
droid-ash 41458a0
Merge pull request #104 from final-run/fix/ts6-baseurl-deprecation
droid-ash d2c82a6
Merge pull request #102 from final-run/llm-call-trace-langfuse
droid-ash ae211a2
Merge branch 'main' of https://github.com/final-run/finalrun-agent in…
droid-ash d62dcab
change version of vite and other dep
srinidhi-lwt 148357c
Reorder workspaces so report-web builds before cli
droid-ash a87350e
Merge pull request #105 from final-run/fixing-build-issues
droid-ash 1523bcb
Merge remote-tracking branch 'origin/main' into claude/epic-archimede…
droid-ash 146ddb4
Phase 1: Extract @finalrun/cloud-core
droid-ash 6d9d527
Phase 2: Lazy-loading scaffolding for local-runtime modules
droid-ash 3c47721
Phase 3: Add @finalrun/local-runtime package + per-platform tarball b…
droid-ash dc63992
Phase 4: Bun compile + rewrite scripts/install.sh for binary distribu…
droid-ash 483a7b0
Phase 5: Stop publishing to npm
droid-ash 1d3ca36
Phase 6: Add finalrun upgrade subcommand
droid-ash 96b4695
Honor FINALRUN_DIR in the binary's runtime resolver
droid-ash 71858b1
Bake CLI version into the Bun-compiled binary
droid-ash d4b06f8
Add manual-trigger GitHub Actions release workflow
droid-ash fc009fa
Address CodeRabbit review on PR #111 (16 actionable findings)
droid-ash c77192e
Address remaining active CodeRabbit findings on PR #111
droid-ash 8c50afd
Address 4 follow-up CodeRabbit findings on PR #111
droid-ash d185429
Merge pull request #111 from final-run/cli-binary-distribution
droid-ash fef35f3
Release v0.1.8
droid-ash 318988d
Add CHANGELOG entry for v0.1.8
droid-ash f5206e3
Make CHANGELOG.md the single source of truth for release notes
droid-ash e8ff500
Merge pull request #113 from final-run/release/v0.1.8
droid-ash ad9f4e2
Fix release workflow: drop lockfile-dependent steps
droid-ash 5234ca0
Merge pull request #114 from final-run/fix/release-workflow-no-lockfile
droid-ash a68db91
Fix install.sh curl|bash hang + simplify flags to --ci
droid-ash 52ba25a
Fix misleading --ci hint in exhausted-platform-prompt warning
droid-ash a030fbc
Merge pull request #115 from final-run/fix/install-hang-rename-flag
droid-ash dfdc76d
Rewrite RELEASING.md in plain language + document the manual fallback
droid-ash 44dec1a
RELEASING.md: drop unnecessary sections
droid-ash 8ac6b45
Merge pull request #116 from final-run/docs/releasing-plain-language
droid-ash 55ae5ae
Fix env-file zip when env comes from config.yaml default
droid-ash bcb92a5
Merge pull request #117 from final-run/fix/env-file-respect-config-de…
droid-ash b258aa3
Release v0.1.9
droid-ash e015a66
Merge pull request #118 from final-run/release/v0.1.9
droid-ash c4d40ef
Add Windows x64 release support
droid-ash f78ae01
release.yml: skip tag-uniqueness check in dry-run mode
droid-ash f311ba6
Drop dry_run workflow input
droid-ash 3fe8346
Merge pull request #119 from final-run/claude/confident-khayyam-dc2041
droid-ash 357e105
Release v0.1.10
droid-ash 9d5b78e
Add install.ps1 + Windows branch in finalrun upgrade
droid-ash a50a556
install.ps1: fix two CodeRabbit review findings
droid-ash 89fcbb4
Merge pull request #120 from final-run/release/v0.1.10
droid-ash 36f56d3
README: trim install section, add Windows
droid-ash ff57e96
Merge pull request #121 from final-run/docs/readme-install-trim
droid-ash 2e4bc20
package.json: skip workspaces without a build script
droid-ash 8e883d3
Merge pull request #122 from final-run/fix/build-skip-workspaces-with…
droid-ash 783a5db
installer: detect AI provider keys; docs: add Cloud API key page
droid-ash fec8fc3
installer: clickable URLs in the no-key block
droid-ash 4d429dc
installer: revert OSC 8 hyperlinks; rely on terminal URL detection
droid-ash 339c4f5
installer: underline URLs in the no-key block
droid-ash 7ebd25b
Merge pull request #123 from final-run/claude/hungry-proskuriakova-6f…
droid-ash 7e18920
installer: skip platform prompt when tools already installed; fix Xco…
droid-ash 67e3035
Merge pull request #124 from final-run/claude/installer-skip-ready-pl…
droid-ash 874a949
installer: auto-sync FinalRun skills (no prompt, skip when up to date)
droid-ash d9a29fd
Merge pull request #125 from final-run/claude/installer-skills-auto
droid-ash 7035c80
installer: symlink into ~/.local/bin and verify PATH instead of telli…
droid-ash 5983e45
installer: escalate the no-API-key message from yellow warn to red fail
droid-ash 05c2e61
installer: address CodeRabbit findings on PR #126
droid-ash fc85212
Merge pull request #126 from final-run/claude/installer-local-bin-sym…
droid-ash d3ec2be
Unify TypeScript 6 across workspaces and fix TS 6 typings defaults.
arnoldlaishram 4db3f1d
Fix clean-install build under TypeScript 6 and Vite 8.
droid-ash f248431
Merge pull request #127 from final-run/ts-version-update
droid-ash 08da896
Merge branch 'main' into feat/multi-device-tests
droid-ash 3b764c8
Document standalone binary install path on installation page
mintlify[bot] File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,29 @@ | ||
| # Changesets | ||
|
|
||
| This directory holds [Changesets](https://github.com/changesets/changesets) used | ||
| to coordinate versioning and publishing of the public packages in this monorepo: | ||
|
|
||
| - `@finalrun/common` | ||
| - `@finalrun/report-web` | ||
| - `@finalrun/finalrun-agent` | ||
|
|
||
| `@finalrun/goal-executor` and `@finalrun/device-node` are intentionally ignored | ||
| (they ship only as `bundleDependencies` inside `@finalrun/finalrun-agent`). | ||
|
|
||
| ## Workflow | ||
|
|
||
| 1. After making a change in a public package, run: | ||
| ``` | ||
| npx changeset | ||
| ``` | ||
| Pick the packages and the bump type (patch/minor/major) and write a short | ||
| summary. A markdown file appears in this directory. | ||
|
|
||
| 2. Commit the changeset file alongside the code change in the same PR. | ||
|
|
||
| 3. On `main`, to cut a release: | ||
| ``` | ||
| npx changeset version # bumps package.json versions, updates deps, writes CHANGELOG | ||
| git commit -am "chore: release" | ||
| npx changeset publish # publishes bumped packages to npm | ||
| ``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| { | ||
| "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", | ||
| "changelog": "@changesets/cli/changelog", | ||
| "commit": false, | ||
| "fixed": [], | ||
| "linked": [], | ||
| "access": "public", | ||
| "baseBranch": "main", | ||
| "updateInternalDependencies": "patch", | ||
| "ignore": ["@finalrun/goal-executor", "@finalrun/device-node"] | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| --- | ||
| '@finalrun/common': minor | ||
| '@finalrun/report-web': minor | ||
| --- | ||
|
|
||
| Publish `@finalrun/common` and `@finalrun/report-web` to npm for the first | ||
| time. Previously common shipped only as a `bundleDependency` of | ||
| `@finalrun/finalrun-agent`, and report-web was unpublished (consumed only | ||
| via yalc / local tarballs). | ||
|
|
||
| `@finalrun/report-web` is also fully migrated from a Next.js App Router | ||
| shell to a Vite SPA; the library exports (`/ui`, `/ui/styles.css`, | ||
| `/routes`) are unchanged. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| ## Install | ||
|
|
||
| ### macOS / Linux | ||
|
|
||
| One command. No Node.js, no npm, nothing else required. | ||
|
|
||
| ```sh | ||
| curl -fsSL https://raw.githubusercontent.com/final-run/finalrun-agent/main/scripts/install.sh | bash | ||
| ``` | ||
|
|
||
| For CI / non-interactive environments (binary only, no runtime tarball, no prompts): | ||
|
|
||
| ```sh | ||
| curl -fsSL https://raw.githubusercontent.com/final-run/finalrun-agent/main/scripts/install.sh | bash -s -- --ci | ||
| ``` | ||
|
|
||
| CI environments (`CI=1`) get this behavior automatically even without the flag. | ||
|
|
||
| ### Windows (PowerShell) | ||
|
|
||
| ```powershell | ||
| irm https://raw.githubusercontent.com/final-run/finalrun-agent/main/scripts/install.ps1 | iex | ||
| ``` | ||
|
|
||
| For CI / non-interactive environments: | ||
|
|
||
| ```powershell | ||
| $env:FINALRUN_NON_INTERACTIVE=1; irm https://raw.githubusercontent.com/final-run/finalrun-agent/main/scripts/install.ps1 | iex | ||
| ``` | ||
|
|
||
| Windows hosts support **Android local execution and all cloud commands.** iOS local execution requires macOS (xcodebuild) — use `finalrun cloud` for iOS testing from Windows. First run may show a SmartScreen warning since the binary is not yet code-signed; click "More info → Run anyway". | ||
|
|
||
| ## Artifacts | ||
|
|
||
| | Platform | Binary | Runtime tarball | | ||
| |---|---|---| | ||
| | macOS Apple Silicon | `finalrun-darwin-arm64` | `finalrun-runtime-<version>-darwin-arm64.tar.gz` | | ||
| | macOS Intel | `finalrun-darwin-x64` | `finalrun-runtime-<version>-darwin-x64.tar.gz` | | ||
| | Linux x86_64 | `finalrun-linux-x64` | `finalrun-runtime-<version>-linux-x64.tar.gz` | | ||
| | Linux ARM64 | `finalrun-linux-arm64` | `finalrun-runtime-<version>-linux-arm64.tar.gz` | | ||
| | Windows x86_64 | `finalrun-windows-x64.exe` | `finalrun-runtime-<version>-windows-x64.tar.gz` | | ||
|
|
||
| Each artifact ships with a matching `.sha256` sidecar. | ||
|
|
||
| ## Upgrading from a previous version | ||
|
|
||
| ```sh | ||
| finalrun upgrade | ||
| ``` | ||
|
|
||
| The CLI re-runs the install script with sensible defaults (auto-detects whether you previously installed the runtime tarball, preserves your install directory). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,257 @@ | ||
| name: Release | ||
|
|
||
| # Manual-only trigger. Click "Run workflow" in the Actions tab. | ||
| # | ||
| # Flow when triggered from main (or any branch): | ||
| # 1. Reads version from packages/cli/package.json on the chosen branch. | ||
| # 2. Fails fast if the matching tag (v<version>) already exists. | ||
| # 3. Builds all 5 Bun binaries (darwin-arm64/x64, linux-x64/arm64, windows-x64). | ||
| # 4. Builds all 5 runtime tarballs (per-platform). | ||
| # 5. Smoke-tests the Windows binary on a real windows-latest runner. | ||
| # 6. Tags the exact build SHA as v<version> and pushes the tag. | ||
| # 7. Creates a GitHub Release at that tag, attaches all artifacts + | ||
| # their .sha256 sidecars, marks it as "latest". | ||
| # | ||
| # To cut a release: | ||
| # 1. Bump packages/cli/package.json version on a branch (default main). | ||
| # 2. Commit + push to the branch. | ||
| # 3. Actions tab → Release → Run workflow → choose branch → Run. | ||
| on: | ||
| workflow_dispatch: | ||
| inputs: | ||
| branch: | ||
| description: 'Branch to release from' | ||
| required: false | ||
| default: 'main' | ||
|
|
||
| permissions: | ||
| contents: write # create tag + GitHub Release | ||
|
|
||
| # Serialize releases so two clicks of "Run workflow" can't race on tag | ||
| # creation, both build the full artifact set, and then duel on `git push`. | ||
| # cancel-in-progress: false → queue rather than abort the in-flight run. | ||
| concurrency: | ||
| group: release-${{ github.event.inputs.branch }} | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| build: | ||
| runs-on: ubuntu-24.04 | ||
| outputs: | ||
| version: ${{ steps.version.outputs.version }} | ||
| tag: ${{ steps.version.outputs.tag }} | ||
| sha: ${{ steps.version.outputs.sha }} | ||
| is_latest: ${{ steps.version.outputs.is_latest }} | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| with: | ||
| ref: ${{ github.event.inputs.branch }} | ||
| fetch-depth: 0 # need history + tags so we can validate uniqueness | ||
|
|
||
| - name: Resolve & validate version | ||
| id: version | ||
| run: | | ||
| set -euo pipefail | ||
| VERSION=$(node -p "require('./packages/cli/package.json').version") | ||
| TAG="v${VERSION}" | ||
| SHA=$(git rev-parse HEAD) | ||
| BRANCH="${{ github.event.inputs.branch }}" | ||
|
|
||
| # Strict semver: 0.1.7, 1.2.3, 0.2.0-rc.1, 0.2.0-beta.1, etc. | ||
| # Rejects empty, non-numeric, or trailing-junk versions. | ||
| if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$ ]]; then | ||
| echo "::error::Invalid semver in packages/cli/package.json: '$VERSION'" | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Refuse if the tag already exists locally OR on origin (the local | ||
| # check alone misses tags pushed by other contributors / CI runs). | ||
| if git rev-parse --verify --quiet "refs/tags/$TAG" >/dev/null; then | ||
| echo "::error::Tag $TAG already exists locally. Bump packages/cli/package.json or delete the existing tag." | ||
| exit 1 | ||
| fi | ||
| if git ls-remote --tags --exit-code origin "refs/tags/$TAG" >/dev/null 2>&1; then | ||
| echo "::error::Tag $TAG already exists on origin. Bump packages/cli/package.json." | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Pre-release tags (e.g. 0.2.0-rc.1) should NOT clobber the | ||
| # "latest" pointer; only stable releases from main do that. | ||
| IS_LATEST="false" | ||
| if [[ "$BRANCH" == "main" && ! "$VERSION" =~ - ]]; then | ||
| IS_LATEST="true" | ||
| fi | ||
|
|
||
| echo "version=$VERSION" >> "$GITHUB_OUTPUT" | ||
| echo "tag=$TAG" >> "$GITHUB_OUTPUT" | ||
| echo "sha=$SHA" >> "$GITHUB_OUTPUT" | ||
| echo "is_latest=$IS_LATEST" >> "$GITHUB_OUTPUT" | ||
| echo "Releasing $TAG from $BRANCH commit $SHA (is-latest: $IS_LATEST)" | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: '20.19' | ||
| # No cache: 'npm' — this repo intentionally does not commit | ||
| # package-lock.json (.gitignore line 4), so setup-node's npm | ||
| # cache feature has nothing to key on. | ||
| # Same reason `npm install` instead of `npm ci`: ci requires a lockfile. | ||
| - run: npm install | ||
|
|
||
| - uses: oven-sh/setup-bun@v2 | ||
| with: | ||
| bun-version: '1.3.11' | ||
|
|
||
| - name: Build all workspace dist files | ||
| run: | | ||
| npm run build --workspace=@finalrun/common | ||
| npm run build --workspace=@finalrun/cloud-core | ||
| npm run build --workspace=@finalrun/device-node | ||
| npm run build --workspace=@finalrun/goal-executor | ||
| npm run build --workspace=@finalrun/report-web | ||
| npm run build --workspace=@finalrun/finalrun-agent | ||
|
|
||
| - name: Build binaries (all 5 targets via Bun cross-compile) | ||
| run: ./scripts/build-binary.sh | ||
|
|
||
| - name: Build runtime tarballs (all 5 targets) | ||
| run: | | ||
| for t in darwin-arm64 darwin-x64 linux-x64 linux-arm64 windows-x64; do | ||
| npm run build:tarball --workspace=@finalrun/local-runtime -- --target="$t" | ||
| done | ||
|
|
||
| - name: Stage release artifacts | ||
| run: | | ||
| mkdir -p release-artifacts | ||
| cp dist/binaries/finalrun-* release-artifacts/ | ||
| cp packages/local-runtime/dist/finalrun-runtime-*.tar.gz* release-artifacts/ | ||
| ls -la release-artifacts/ | ||
|
|
||
| - uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: release-artifacts | ||
| path: release-artifacts/ | ||
| retention-days: 7 | ||
|
|
||
| # Validate the Windows .exe actually executes on a real Windows host before | ||
| # we tag and publish. Bun cross-compiles the binary from ubuntu-24.04, so | ||
| # without this gate a Windows-specific runtime breakage (missing DLL, bad | ||
| # PE header, embedded-runtime mismatch) would only surface after release. | ||
| # Cheap insurance: ~30s of windows-latest runtime per release. | ||
| smoke-windows: | ||
| needs: build | ||
| runs-on: windows-latest | ||
| steps: | ||
| - uses: actions/download-artifact@v4 | ||
| with: | ||
| name: release-artifacts | ||
| path: release-artifacts/ | ||
|
|
||
| - name: Smoke-test the Windows binary | ||
| shell: pwsh | ||
| run: | | ||
| $exe = "release-artifacts/finalrun-windows-x64.exe" | ||
| if (-not (Test-Path $exe)) { | ||
| Write-Error "Expected $exe in downloaded artifacts but did not find it." | ||
| exit 1 | ||
| } | ||
| Write-Host "Running: $exe --version" | ||
| & $exe --version | ||
| if ($LASTEXITCODE -ne 0) { | ||
| Write-Error "finalrun.exe --version exited $LASTEXITCODE" | ||
| exit 1 | ||
| } | ||
| Write-Host "Running: $exe --help" | ||
| & $exe --help | ||
| if ($LASTEXITCODE -ne 0) { | ||
| Write-Error "finalrun.exe --help exited $LASTEXITCODE" | ||
| exit 1 | ||
| } | ||
|
|
||
| release: | ||
| needs: [build, smoke-windows] | ||
| runs-on: ubuntu-24.04 | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| with: | ||
| ref: ${{ needs.build.outputs.sha }} | ||
| fetch-depth: 0 | ||
|
|
||
| - uses: actions/download-artifact@v4 | ||
| with: | ||
| name: release-artifacts | ||
| path: release-artifacts/ | ||
|
|
||
| - name: Tag the build commit and push the tag | ||
| env: | ||
| TAG: ${{ needs.build.outputs.tag }} | ||
| SHA: ${{ needs.build.outputs.sha }} | ||
| run: | | ||
| set -euo pipefail | ||
| git config user.name "github-actions[bot]" | ||
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | ||
| git tag -a "$TAG" "$SHA" -m "Release $TAG" | ||
| git push origin "$TAG" | ||
|
|
||
| - name: Build release notes from template + CHANGELOG section | ||
| env: | ||
| VERSION: ${{ needs.build.outputs.version }} | ||
| run: | | ||
| set -euo pipefail | ||
|
|
||
| # Extract the matching `## [VERSION]` section from CHANGELOG.md. | ||
| # Maintainers must update CHANGELOG.md (manually, or via Claude) | ||
| # in the release PR — the workflow refuses to publish without it, | ||
| # so a release can't accidentally go out without notes. | ||
| CHANGELOG_SECTION=$(awk -v marker="## [${VERSION}]" ' | ||
| index($0, marker) == 1 { capture = 1; print; next } | ||
| capture && /^## \[/ { exit } | ||
| capture { print } | ||
| ' CHANGELOG.md) | ||
|
|
||
| if [ -z "$CHANGELOG_SECTION" ]; then | ||
| echo "::error::CHANGELOG.md has no '## [${VERSION}]' section." | ||
| echo "::error::Add an entry under that heading describing what changed in this release, then re-run the workflow." | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Combine the static install instructions (from the template) | ||
| # with the version-specific changelog section. The template is | ||
| # the same across releases; the changelog section changes. | ||
| { | ||
| cat .github/release-notes-template.md | ||
| echo "" | ||
| echo "---" | ||
| echo "" | ||
| echo "## What's changed in this release" | ||
| echo "" | ||
| # Skip the first line (`## [VERSION] - DATE`) since we just | ||
| # printed our own heading; keep the rest verbatim. | ||
| echo "$CHANGELOG_SECTION" | tail -n +2 | ||
| } > /tmp/release-notes.md | ||
|
|
||
| echo "::group::Final release notes" | ||
| cat /tmp/release-notes.md | ||
| echo "::endgroup::" | ||
|
|
||
| - name: Create GitHub Release with all artifacts | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| TAG: ${{ needs.build.outputs.tag }} | ||
| VERSION: ${{ needs.build.outputs.version }} | ||
| IS_LATEST: ${{ needs.build.outputs.is_latest }} | ||
| run: | | ||
| set -euo pipefail | ||
| # Pre-releases (e.g. 0.2.0-rc.1) and releases from non-main | ||
| # branches don't update the "latest" pointer that install.sh and | ||
| # the README badges resolve against. | ||
| extra_flags=() | ||
| if [ "$IS_LATEST" = "true" ]; then | ||
| extra_flags+=(--latest) | ||
| else | ||
| extra_flags+=(--prerelease) | ||
| fi | ||
| gh release create "$TAG" \ | ||
| --title "FinalRun $VERSION" \ | ||
| --notes-file /tmp/release-notes.md \ | ||
| "${extra_flags[@]}" \ | ||
| release-artifacts/* |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do not ignore the root
package-lock.json.This repo uses
npm ci, so the lockfile needs to stay tracked for reproducible installs and workspace dependency updates. Ignoring it will make dependency bumps harder to review and can leave CI without the exact resolved tree.Proposed fix
-package-lock.json📝 Committable suggestion
🤖 Prompt for AI Agents