Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a93edf16a1 | ||
|
|
69de6b7bde | ||
|
|
29ec2fe7ab | ||
|
|
99e54a2e52 | ||
|
|
4c65582ada | ||
|
|
3cd251636e | ||
|
|
fb3679fcf8 | ||
|
|
916dc0d645 | ||
|
|
4c39d6f8ee | ||
|
|
19a38d9df6 | ||
|
|
8cff9d9141 | ||
|
|
e83d603047 | ||
|
|
cb1c1d985c | ||
|
|
71bab40e53 | ||
|
|
667fdde139 | ||
|
|
d42d283def | ||
|
|
bad162bdce | ||
|
|
5812860910 | ||
|
|
1a313c8e16 | ||
|
|
785502ea9e | ||
|
|
c20ae68d07 | ||
|
|
ca9195daca | ||
|
|
aa93ced550 | ||
|
|
3a6264a608 | ||
|
|
8af0f02a5a | ||
|
|
3c0211285a | ||
|
|
4aac193439 | ||
|
|
c195a11759 | ||
|
|
31acb9e844 | ||
|
|
ff31170fd6 | ||
|
|
4634c135e7 | ||
|
|
c1e6a31120 | ||
|
|
62cc66f9e5 | ||
|
|
a40397fabc | ||
|
|
acbc4c3074 | ||
|
|
fa777c6a79 | ||
|
|
c58a55220f | ||
|
|
68c1f878a2 | ||
|
|
25f72f2ac4 | ||
|
|
f4cdfc01aa | ||
|
|
13aeb5001b | ||
|
|
74a93aaa7c | ||
|
|
9c08afa728 | ||
|
|
32937d1ca7 | ||
|
|
cee841830c | ||
|
|
ca004e5206 | ||
|
|
3689c955f9 | ||
|
|
fbf93e679f | ||
|
|
3c4cfaa23c | ||
|
|
ffde3ed1dd | ||
|
|
ffd6c56f44 |
No files matched your search
@@ -1,8 +0,0 @@
|
|||||||
[alias]
|
|
||||||
xtask = "run --package xtask --"
|
|
||||||
|
|
||||||
# Windows release binaries link the C runtime statically, so they run without the VC++
|
|
||||||
# redistributable (packaging/windows/package.ps1 builds with --target, which keeps the flag
|
|
||||||
# off build scripts and proc-macros).
|
|
||||||
[target.x86_64-pc-windows-msvc]
|
|
||||||
rustflags = ["-C", "target-feature=+crt-static"]
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Every change to FieldCraft needs the maintainer's review before it merges.
|
|
||||||
* @jyviko
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
name: Bug report
|
|
||||||
description: Something FieldCraft does wrong, a wrong result, or a crash
|
|
||||||
labels: [bug]
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: observed
|
|
||||||
attributes:
|
|
||||||
label: Observed failure
|
|
||||||
description: Exactly what happened. Quote error messages and wrong numbers as they appear.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: reproduction
|
|
||||||
attributes:
|
|
||||||
label: Reproduction
|
|
||||||
description: Numbered steps, or a script (`fieldcraft-cli run script.json`, control-channel JSON lines), with the sample, corpus part or attached `.fieldcraft` / `.solidcraft` file that shows it.
|
|
||||||
placeholder: |
|
|
||||||
1. fieldcraft --sample cantilever
|
|
||||||
2. Mesh ▸ Tet ▸ OK
|
|
||||||
3. ...
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: evidence
|
|
||||||
attributes:
|
|
||||||
label: Evidence
|
|
||||||
description: Screenshots, log output, numbers. For a crash, attach the crash report (`fieldcraft-cli crashes`, then `crashes show <id>`).
|
|
||||||
- type: textarea
|
|
||||||
id: expected
|
|
||||||
attributes:
|
|
||||||
label: Expected behaviour
|
|
||||||
description: What should happen instead, and why — a closed form, a published benchmark, the documentation, or how the rest of the app behaves. Never output from a commercial CAE product.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: investigation
|
|
||||||
attributes:
|
|
||||||
label: Investigation
|
|
||||||
description: Anything you found about the cause — code you suspect, what you ruled out. Leave empty if you have not looked.
|
|
||||||
- type: input
|
|
||||||
id: version
|
|
||||||
attributes:
|
|
||||||
label: Version and platform
|
|
||||||
placeholder: "v0.1.0 (or commit), macOS 15 arm64"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
name: Feature request
|
|
||||||
description: A capability FieldCraft should have
|
|
||||||
labels: [enhancement]
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: current
|
|
||||||
attributes:
|
|
||||||
label: Current behaviour
|
|
||||||
description: What you can and cannot do today, and what happens when you try.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: need
|
|
||||||
attributes:
|
|
||||||
label: What you need and why
|
|
||||||
description: The analysis or workflow you are trying to do.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: expected
|
|
||||||
attributes:
|
|
||||||
label: Expected behaviour
|
|
||||||
description: What FieldCraft should do, as precisely as you can.
|
|
||||||
- type: textarea
|
|
||||||
id: reference
|
|
||||||
attributes:
|
|
||||||
label: References
|
|
||||||
description: Papers, textbooks, public specifications or published benchmarks that define the behaviour. Do not paste text, files or results from commercial CAE products.
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
Closes #
|
|
||||||
|
|
||||||
## What and why
|
|
||||||
|
|
||||||
## How it was verified
|
|
||||||
<!-- Tests added or changed; oracle cases (tests/oracle) for solver and meshing results, with their cited references. -->
|
|
||||||
|
|
||||||
## Checklist
|
|
||||||
- [ ] The issue was assigned to me before I started (see CONTRIBUTING.md)
|
|
||||||
- [ ] `cargo fmt --all`, `cargo clippy -p <crates I touched> --all-targets -- -D warnings` and their tests pass
|
|
||||||
- [ ] No code, text or data from GPL-family projects or commercial CAE products
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
FieldCraft is open-source CAE pre-processing in Rust: it turns geometry into analysis-ready
|
|
||||||
finite element models, writes Abaqus, Nastran and LS-DYNA decks, and solves linear static and
|
|
||||||
modal problems with its own solver. AI agents can drive it over MCP (`fieldcraft-cli mcp`).
|
|
||||||
[README](https://github.com/jyviko/fieldcraft#readme) ·
|
|
||||||
[roadmap](https://github.com/jyviko/fieldcraft/blob/main/ROADMAP.md) ·
|
|
||||||
[issues](https://github.com/jyviko/fieldcraft/issues)
|
|
||||||
|
|
||||||
**Which file?**
|
|
||||||
- **macOS 11+** (Apple silicon and Intel): open `fieldcraft-{version}-macos-universal.dmg` and
|
|
||||||
drag `FieldCraft.app` onto Applications. The command-line tool is in
|
|
||||||
`fieldcraft-cli-{version}-macos-universal.zip`.
|
|
||||||
- **Linux** (x86_64, glibc 2.35+: Ubuntu 22.04, Debian 12, Fedora 36 or newer):
|
|
||||||
`fieldcraft-{version}-linux-x86_64.AppImage` (`chmod +x`, then run it), or unpack
|
|
||||||
`fieldcraft-{version}-linux-x86_64.tar.gz` and run `bin/fieldcraft` (`bin/fieldcraft-cli` is the
|
|
||||||
command-line tool).
|
|
||||||
- **Windows 10+** (x64): unzip `fieldcraft-{version}-windows-x64.zip` and run `fieldcraft.exe`
|
|
||||||
(`fieldcraft-cli.exe` is the command-line tool).
|
|
||||||
- `SHA256SUMS.txt`: `sha256sum -c SHA256SUMS.txt --ignore-missing` (macOS:
|
|
||||||
`shasum -a 256 -c SHA256SUMS.txt --ignore-missing`).
|
|
||||||
|
|
||||||
To start with a sample model, run the app with `--sample cantilever` (macOS:
|
|
||||||
`/Applications/FieldCraft.app/Contents/MacOS/FieldCraft --sample cantilever`).
|
|
||||||
|
|
||||||
**Signing.** {macos_signing} The Linux and Windows builds are not signed; on Windows, SmartScreen
|
|
||||||
may say "Windows protected your PC": choose **More info**, then **Run anyway**.
|
|
||||||
|
|
||||||
Every package carries `LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE` and `THIRD-PARTY-LICENSES.txt`.
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
# CI runs once per merge, on main (AGENTS.md, "Workflow for every change"): the core team's pull
|
|
||||||
# requests are checked locally on the crates they touch and merged; a red main is fixed forward.
|
|
||||||
# Pull requests from forks (outside contributors) run the full gate, once the maintainer approves
|
|
||||||
# the run, so the review sees it.
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- '**'
|
|
||||||
- '!**/*.md'
|
|
||||||
- '!docs/**'
|
|
||||||
- 'docs/features.md'
|
|
||||||
- 'docs/oracle.md'
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
# A merge that only touches prose starts no run. The generated pages are checked by the jobs
|
|
||||||
# (features.md by `cargo xtask ci`, oracle.md by the oracle job), so they still count.
|
|
||||||
# (Later patterns override earlier ones.)
|
|
||||||
paths:
|
|
||||||
- '**'
|
|
||||||
- '!**/*.md'
|
|
||||||
- '!docs/**'
|
|
||||||
- 'docs/features.md'
|
|
||||||
- 'docs/oracle.md'
|
|
||||||
schedule:
|
|
||||||
# Nightly: the heavy tests on main.
|
|
||||||
- cron: '23 3 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
# A newer merge cancels the run still going for the one before it, so a burst of merges is tested
|
|
||||||
# once, at the tip. Nightly and manual runs are grouped apart and never cancelled by a merge.
|
|
||||||
concurrency:
|
|
||||||
group: ci-${{ github.ref }}-${{ github.event_name }}
|
|
||||||
cancel-in-progress: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }}
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_TERM_COLOR: always
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: cargo xtask ci
|
|
||||||
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
timeout-minutes: 60
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
components: rustfmt, clippy
|
|
||||||
targets: wasm32-unknown-unknown
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
||||||
- run: cargo xtask ci
|
|
||||||
|
|
||||||
heavy:
|
|
||||||
# The heavy verification and corpus tests (#[ignore]d) and the doc tests.
|
|
||||||
name: cargo xtask test --heavy
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
timeout-minutes: 60
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
||||||
- run: cargo xtask test --heavy
|
|
||||||
|
|
||||||
oracle:
|
|
||||||
# Verification and validation (docs/verification.md): every case against its reference and
|
|
||||||
# its fixture, and docs/oracle.md must be the table the cases produce. Cases marked `slow`
|
|
||||||
# run here too while the whole set stays within a few minutes; `--quick` skips them.
|
|
||||||
name: cargo xtask oracle
|
|
||||||
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
timeout-minutes: 45
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: oracle
|
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
||||||
- run: cargo xtask oracle
|
|
||||||
- name: docs/oracle.md is current
|
|
||||||
run: git diff --exit-code docs/oracle.md
|
|
||||||
|
|
||||||
advisories:
|
|
||||||
name: Dependency advisories and sources
|
|
||||||
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
timeout-minutes: 20
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
- name: Install cargo-deny
|
|
||||||
run: cargo install cargo-deny --version 0.20.2 --locked
|
|
||||||
- run: cargo deny --locked check --warn unmaintained advisories bans sources
|
|
||||||
@@ -1,252 +0,0 @@
|
|||||||
# Release builds (docs/releasing.md), after SolidCraft's and VectorCraft's release.yml
|
|
||||||
# (MIT OR Apache-2.0; see ATTRIBUTION.md).
|
|
||||||
#
|
|
||||||
# A push to `release` (fast-forwarded from main) builds every package and creates or updates the
|
|
||||||
# DRAFT GitHub Release "FieldCraft v<version>", with SHA256SUMS.txt and generated notes. The
|
|
||||||
# version is [workspace.package] version in Cargo.toml; a suffix (0.2.0-rc.1) makes a
|
|
||||||
# pre-release. A person verifies the draft and publishes it; this workflow never publishes,
|
|
||||||
# and pushes to main or tags never start it.
|
|
||||||
#
|
|
||||||
# macOS universal (arm64 + x86_64) .dmg with FieldCraft.app, the CLI as a .zip packaging/macos
|
|
||||||
# Linux x86_64 (glibc 2.35+) .tar.gz and .AppImage packaging/linux
|
|
||||||
# Windows x64 .zip with fieldcraft.exe and fieldcraft-cli.exe packaging/windows
|
|
||||||
#
|
|
||||||
# macOS: signed with a Developer ID and notarized when the APPLE_* secrets exist, ad-hoc
|
|
||||||
# otherwise (the release notes say which). Linux and Windows builds are not signed.
|
|
||||||
#
|
|
||||||
# Dry run: `gh workflow run release.yml --ref <branch>` builds everything and uploads the
|
|
||||||
# `release-assets` artifact without creating a release. `-f draft=true` on `release` retries
|
|
||||||
# the draft.
|
|
||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [release]
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
draft:
|
|
||||||
description: "Create/update the draft release (release branch only; off: build artifacts only)"
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: release-${{ github.ref }}
|
|
||||||
# Never cancel a run mid-notarization or mid-upload; a newer push waits its turn.
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_TERM_COLOR: always
|
|
||||||
CARGO_INCREMENTAL: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
version:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
outputs:
|
|
||||||
version: ${{ steps.v.outputs.version }}
|
|
||||||
prerelease: ${{ steps.v.outputs.prerelease }}
|
|
||||||
draft: ${{ steps.v.outputs.draft }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- id: v
|
|
||||||
name: Resolve the version
|
|
||||||
env:
|
|
||||||
REQUEST_DRAFT: ${{ github.event_name == 'push' || inputs.draft }}
|
|
||||||
run: |
|
|
||||||
. packaging/env.sh
|
|
||||||
if ! printf '%s' "$VERSION" | grep -Eq '^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$'; then
|
|
||||||
echo "::error::Cargo.toml must contain a version like 1.2.3 or 1.2.3-rc.1, not '$VERSION'"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [ "$REQUEST_DRAFT" = true ] && [ "$GITHUB_REF" != refs/heads/release ]; then
|
|
||||||
echo "::error::Draft releases are built from the release branch only"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
case "$VERSION" in *-*) pre=true ;; *) pre=false ;; esac
|
|
||||||
{ echo "version=$VERSION"; echo "prerelease=$pre"; echo "draft=$REQUEST_DRAFT"; } >>"$GITHUB_OUTPUT"
|
|
||||||
echo "### FieldCraft v$VERSION (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY"
|
|
||||||
|
|
||||||
macos:
|
|
||||||
name: macOS universal
|
|
||||||
needs: version
|
|
||||||
runs-on: macos-14
|
|
||||||
timeout-minutes: 120
|
|
||||||
outputs:
|
|
||||||
signing: ${{ steps.package.outputs.signing }}
|
|
||||||
env:
|
|
||||||
FIELDCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
targets: aarch64-apple-darwin, x86_64-apple-darwin
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-macos-universal
|
|
||||||
# Release runs are rare: only release-branch runs keep a cache, so dry runs don't evict CI's.
|
|
||||||
save-if: ${{ github.ref == 'refs/heads/release' }}
|
|
||||||
- name: Import the signing certificate (skipped without APPLE_CERTIFICATE)
|
|
||||||
env:
|
|
||||||
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
|
||||||
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
|
||||||
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
|
||||||
run: packaging/macos/import-cert.sh
|
|
||||||
- name: Build, sign, notarize and package (the dmg is mounted and checked)
|
|
||||||
id: package
|
|
||||||
env:
|
|
||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
||||||
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
||||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
||||||
run: packaging/macos/package.sh --arch universal
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-macos
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
- name: Remove the temporary keychain
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
if [ -n "${MACOS_KEYCHAIN:-}" ]; then security delete-keychain "$MACOS_KEYCHAIN" || true; fi
|
|
||||||
|
|
||||||
linux:
|
|
||||||
name: Linux x86_64
|
|
||||||
needs: version
|
|
||||||
# The oldest GitHub-hosted image, so the binaries need only glibc >= 2.35.
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
timeout-minutes: 90
|
|
||||||
env:
|
|
||||||
FIELDCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Install packaging tools
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y --no-install-recommends desktop-file-utils
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-linux-x86_64
|
|
||||||
# Release runs are rare: only release-branch runs keep a cache, so dry runs don't evict CI's.
|
|
||||||
save-if: ${{ github.ref == 'refs/heads/release' }}
|
|
||||||
- name: Build and package (tar.gz, AppImage)
|
|
||||||
run: packaging/linux/package.sh
|
|
||||||
- name: Check the packages
|
|
||||||
run: |
|
|
||||||
. packaging/env.sh
|
|
||||||
list="$(tar -tzf dist/release/*.tar.gz)"
|
|
||||||
for f in bin/fieldcraft bin/fieldcraft-cli "share/applications/$APP_ID.desktop" \
|
|
||||||
share/doc/fieldcraft/THIRD-PARTY-LICENSES.txt; do
|
|
||||||
grep -Fx -- "fieldcraft-$VERSION-linux-x86_64/$f" <<<"$list"
|
|
||||||
done
|
|
||||||
ldd target/release/fieldcraft
|
|
||||||
for appimage in dist/release/*.AppImage; do
|
|
||||||
chmod +x "$appimage"
|
|
||||||
APPIMAGE_EXTRACT_AND_RUN=1 "$appimage" --version
|
|
||||||
done
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-linux-x86_64
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
windows:
|
|
||||||
name: Windows x64
|
|
||||||
needs: version
|
|
||||||
runs-on: windows-latest
|
|
||||||
timeout-minutes: 90
|
|
||||||
env:
|
|
||||||
FIELDCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
targets: x86_64-pc-windows-msvc
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-windows-x64
|
|
||||||
# Release runs are rare: only release-branch runs keep a cache, so dry runs don't evict CI's.
|
|
||||||
save-if: ${{ github.ref == 'refs/heads/release' }}
|
|
||||||
- name: Build and package (zip)
|
|
||||||
shell: pwsh
|
|
||||||
run: ./packaging/windows/package.ps1
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-windows-x64
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
release:
|
|
||||||
name: Draft release (or dry-run artifacts)
|
|
||||||
needs: [version, macos, linux, windows]
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
env:
|
|
||||||
VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
PRERELEASE: ${{ needs.version.outputs.prerelease }}
|
|
||||||
MACOS_SIGNING: ${{ needs.macos.outputs.signing }}
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
GH_REPO: ${{ github.repository }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
||||||
with:
|
|
||||||
pattern: release-*
|
|
||||||
path: artifacts
|
|
||||||
merge-multiple: true
|
|
||||||
- name: Check the set, checksums and notes
|
|
||||||
run: |
|
|
||||||
for f in "fieldcraft-$VERSION-macos-universal.dmg" "fieldcraft-cli-$VERSION-macos-universal.zip" \
|
|
||||||
"fieldcraft-$VERSION-linux-x86_64.tar.gz" "fieldcraft-$VERSION-linux-x86_64.AppImage" \
|
|
||||||
"fieldcraft-$VERSION-windows-x64.zip"; do
|
|
||||||
test -s "artifacts/$f" || { echo "::error::missing $f"; exit 1; }
|
|
||||||
done
|
|
||||||
(cd artifacts && sha256sum -- * | tee SHA256SUMS.txt)
|
|
||||||
# The macOS paragraph says how the app was signed (packaging/macos/package.sh).
|
|
||||||
case "$MACOS_SIGNING" in
|
|
||||||
notarized) macos="The macOS app is signed with a Developer ID and notarized by Apple." ;;
|
|
||||||
signed) macos="The macOS app is signed with a Developer ID but **not notarized**: the first time, right-click \`FieldCraft.app\` in Applications and choose **Open**." ;;
|
|
||||||
*) macos="The macOS app is **ad-hoc signed and not notarized**: macOS blocks the first launch. Right-click \`FieldCraft.app\` in Applications and choose **Open** (then **Open** again), or run \`xattr -dr com.apple.quarantine /Applications/FieldCraft.app\`." ;;
|
|
||||||
esac
|
|
||||||
awk -v v="$VERSION" -v m="$macos" '{ gsub(/\{version\}/, v); gsub(/\{macos_signing\}/, m); print }' \
|
|
||||||
.github/release-notes.md >notes.md
|
|
||||||
cat notes.md >>"$GITHUB_STEP_SUMMARY"
|
|
||||||
- name: Upload the dry-run artifacts
|
|
||||||
if: needs.version.outputs.draft != 'true'
|
|
||||||
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-assets
|
|
||||||
path: |
|
|
||||||
artifacts/*
|
|
||||||
notes.md
|
|
||||||
if-no-files-found: error
|
|
||||||
- name: Create or update the draft release
|
|
||||||
if: needs.version.outputs.draft == 'true'
|
|
||||||
working-directory: artifacts
|
|
||||||
run: |
|
|
||||||
tag="v$VERSION"
|
|
||||||
title="FieldCraft v$VERSION"
|
|
||||||
if gh api "repos/$GH_REPO/git/matching-refs/tags/$tag" --jq '.[].ref' | grep -Fxq "refs/tags/$tag"; then
|
|
||||||
echo "::error::Tag $tag already exists. Choose a new version; never move a release tag."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if draft="$(gh release view "$tag" --json isDraft --jq .isDraft 2>/dev/null)"; then
|
|
||||||
if [ "$draft" != true ]; then
|
|
||||||
echo "::error::Release $tag is already published. Bump the version before releasing."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# A rebuild of the same version replaces the draft's assets (removing names it no longer
|
|
||||||
# makes); its notes are kept.
|
|
||||||
assets="$(gh release view "$tag" --json assets --jq '.assets[].name')"
|
|
||||||
while IFS= read -r asset; do
|
|
||||||
if [ -n "$asset" ]; then gh release delete-asset "$tag" "$asset" --yes; fi
|
|
||||||
done <<<"$assets"
|
|
||||||
gh release edit "$tag" --draft --title "$title" --target "$GITHUB_SHA" --prerelease="$PRERELEASE"
|
|
||||||
gh release upload "$tag" -- *
|
|
||||||
else
|
|
||||||
gh release create "$tag" --draft --title "$title" --target "$GITHUB_SHA" \
|
|
||||||
--notes-file ../notes.md --generate-notes --prerelease="$PRERELEASE" -- *
|
|
||||||
fi
|
|
||||||
echo "Draft release **$title** at \`${GITHUB_SHA::9}\`: $(gh release view "$tag" --json url --jq .url)" >>"$GITHUB_STEP_SUMMARY"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
/target*/
|
|
||||||
/plan/
|
|
||||||
/dist/
|
|
||||||
/.agent-files/
|
|
||||||
/worktrees/
|
|
||||||
*~
|
|
||||||
.DS_Store
|
|
||||||
*.swp
|
|
||||||
__pycache__/
|
|
||||||
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 295 KiB |
|
After Width: | Height: | Size: 180 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 180 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 204 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 65 KiB |