repo: move to github.com/tangency-labs/fieldcraft (URLs, updater, Pages)

The updater's release endpoint, docs, README, release notes and the Pages
URL point at the tangency-labs org. App IDs (io.github.jyviko.fieldcraft)
stay unchanged so installed copies keep their identity and settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-16 10:38:13 -04:00
1 parent b74d15e44d
commit a079e51f9d
18 files changed
+55 -55

No files matched your search

+3 -3
View File
@@ -1,9 +1,9 @@
FieldCraft is open-source CAE pre-processing in Rust: it turns geometry into analysis-ready 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 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`). modal problems with its own solver. AI agents can drive it over MCP (`fieldcraft-cli mcp`).
[README](https://github.com/jyviko/fieldcraft#readme) · [README](https://github.com/tangency-labs/fieldcraft#readme) ·
[roadmap](https://github.com/jyviko/fieldcraft/blob/main/ROADMAP.md) · [roadmap](https://github.com/tangency-labs/fieldcraft/blob/main/ROADMAP.md) ·
[issues](https://github.com/jyviko/fieldcraft/issues) [issues](https://github.com/tangency-labs/fieldcraft/issues)
**Which file?** **Which file?**
- **macOS 11+** (Apple silicon and Intel): open `fieldcraft-{version}-macos-universal.dmg` and - **macOS 11+** (Apple silicon and Intel): open `fieldcraft-{version}-macos-universal.dmg` and
+1 -1
View File
@@ -1,4 +1,4 @@
# The web app (apps/fieldcraft-web, docs/web.md) on GitHub Pages: https://jyviko.github.io/fieldcraft/ # The web app (apps/fieldcraft-web, docs/web.md) on GitHub Pages: https://tangency-labs.github.io/fieldcraft/
# After SolidCraft's pages.yml (MIT OR Apache-2.0; see ATTRIBUTION.md). # After SolidCraft's pages.yml (MIT OR Apache-2.0; see ATTRIBUTION.md).
# #
# A push to `main` (a release; main holds released code only) builds the app with Trunk (release, # A push to `main` (a release; main holds released code only) builds the app with Trunk (release,
+1 -1
View File
@@ -139,7 +139,7 @@ People trust FieldCraft with their models; a crash loses their work. **This outr
heavy tests, nightly, before every release and on demand (`gh workflow run CI --ref <branch>`). Hostile-input tests run commands on sessions with small heavy tests, nightly, before every release and on demand (`gh workflow run CI --ref <branch>`). Hostile-input tests run commands on sessions with small
work caps (`Session::limits`) so refusals are instant; never lower the production caps for a work caps (`Session::limits`) so refusals are instant; never lower the production caps for a
test. test.
- **Publishing**: `origin` is github.com/jyviko/fieldcraft. Changes land through pull requests - **Publishing**: `origin` is github.com/tangency-labs/fieldcraft. Changes land through pull requests
as the workflow above describes; the coordinator reads every merged diff and sends findings as the workflow above describes; the coordinator reads every merged diff and sends findings
back as fix-forward work. Never force-push `develop` or `main`; `main` holds released code and moves only by back as fix-forward work. Never force-push `develop` or `main`; `main` holds released code and moves only by
fast-forward at a release (docs/releasing.md). Never commit `plan/`, `.agent-files/`, fast-forward at a release (docs/releasing.md). Never commit `plan/`, `.agent-files/`,
+17 -17
View File
@@ -15,7 +15,7 @@ needed most, and how to claim work. The rules every change follows, by a person
You need stable Rust 1.95 or newer. You need stable Rust 1.95 or newer.
```sh ```sh
git clone https://github.com/jyviko/fieldcraft && cd fieldcraft git clone https://github.com/tangency-labs/fieldcraft && cd fieldcraft
cargo run --release -p fieldcraft -- --sample cantilever # the desktop app on a sample model cargo run --release -p fieldcraft -- --sample cantilever # the desktop app on a sample model
cargo run -p fieldcraft-cli -- commands # every command and its parameters cargo run -p fieldcraft-cli -- commands # every command and its parameters
cargo test -p fieldcraft-solver # the tests of one crate cargo test -p fieldcraft-solver # the tests of one crate
@@ -28,32 +28,32 @@ cargo xtask oracle --quick # the verification ca
## Where help is wanted most ## Where help is wanted most
See the [`help wanted`](https://github.com/jyviko/fieldcraft/labels/help%20wanted) and See the [`help wanted`](https://github.com/tangency-labs/fieldcraft/labels/help%20wanted) and
[`good first issue`](https://github.com/jyviko/fieldcraft/labels/good%20first%20issue) labels, and [`good first issue`](https://github.com/tangency-labs/fieldcraft/labels/good%20first%20issue) labels, and
the `area:` labels for your field. In order of how much they would help users: the `area:` labels for your field. In order of how much they would help users:
1. **Reproducible meshes** ([#115](https://github.com/jyviko/fieldcraft/issues/115)). The same part 1. **Reproducible meshes** ([#115](https://github.com/tangency-labs/fieldcraft/issues/115)). The same part
must give the same tet mesh on every platform and every run, as the solvers already do. must give the same tet mesh on every platform and every run, as the solvers already do.
2. **All-hex meshing of thin and curved parts** ([#85](https://github.com/jyviko/fieldcraft/issues/85)). 2. **All-hex meshing of thin and curved parts** ([#85](https://github.com/tangency-labs/fieldcraft/issues/85)).
The octree mesher over-refines thin walls; concave transition templates and an up-front depth The octree mesher over-refines thin walls; concave transition templates and an up-front depth
are next. Hex meshing is the centre of gravity of the project. are next. Hex meshing is the centre of gravity of the project.
3. **Getting results in and out**: ParaView export ([#90](https://github.com/jyviko/fieldcraft/issues/90)), 3. **Getting results in and out**: ParaView export ([#90](https://github.com/tangency-labs/fieldcraft/issues/90)),
Gmsh import ([#91](https://github.com/jyviko/fieldcraft/issues/91)), Abaqus deck reading Gmsh import ([#91](https://github.com/tangency-labs/fieldcraft/issues/91)), Abaqus deck reading
([#98](https://github.com/jyviko/fieldcraft/issues/98)), CSV and STL ([#98](https://github.com/tangency-labs/fieldcraft/issues/98)), CSV and STL
([#92](https://github.com/jyviko/fieldcraft/issues/92), [#93](https://github.com/jyviko/fieldcraft/issues/93)). ([#92](https://github.com/tangency-labs/fieldcraft/issues/92), [#93](https://github.com/tangency-labs/fieldcraft/issues/93)).
4. **Verification benchmarks** ([#97](https://github.com/jyviko/fieldcraft/issues/97), 4. **Verification benchmarks** ([#97](https://github.com/tangency-labs/fieldcraft/issues/97),
[#106](https://github.com/jyviko/fieldcraft/issues/106)). An engineer with a published benchmark [#106](https://github.com/tangency-labs/fieldcraft/issues/106)). An engineer with a published benchmark
can add it as an oracle case without touching solver code. can add it as an oracle case without touching solver code.
5. **Nonlinear elements and materials**: incompatible modes at finite strain 5. **Nonlinear elements and materials**: incompatible modes at finite strain
([#82](https://github.com/jyviko/fieldcraft/issues/82)), kinematic hardening ([#82](https://github.com/tangency-labs/fieldcraft/issues/82)), kinematic hardening
([#81](https://github.com/jyviko/fieldcraft/issues/81)), and the material library ([#81](https://github.com/tangency-labs/fieldcraft/issues/81)), and the material library
([#99](https://github.com/jyviko/fieldcraft/issues/99)). ([#99](https://github.com/tangency-labs/fieldcraft/issues/99)).
6. **The app**: typed command forms ([#112](https://github.com/jyviko/fieldcraft/issues/112)), XY and 6. **The app**: typed command forms ([#112](https://github.com/tangency-labs/fieldcraft/issues/112)), XY and
path plots ([#94](https://github.com/jyviko/fieldcraft/issues/94), [#95](https://github.com/jyviko/fieldcraft/issues/95)). path plots ([#94](https://github.com/tangency-labs/fieldcraft/issues/94), [#95](https://github.com/tangency-labs/fieldcraft/issues/95)).
Bigger areas on the [roadmap](ROADMAP.md) — contact, dynamics, composites, coupled fields, wave Bigger areas on the [roadmap](ROADMAP.md) — contact, dynamics, composites, coupled fields, wave
propagation, turbulence — are open to anyone who wants to own one: start a thread in propagation, turbulence — are open to anyone who wants to own one: start a thread in
[Discussions](https://github.com/jyviko/fieldcraft/discussions). [Discussions](https://github.com/tangency-labs/fieldcraft/discussions).
## Before you start: claim an issue ## Before you start: claim an issue
+1 -1
View File
@@ -8,7 +8,7 @@ edition = "2024"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
rust-version = "1.95" rust-version = "1.95"
authors = ["FieldCraft contributors"] authors = ["FieldCraft contributors"]
repository = "https://github.com/jyviko/fieldcraft" repository = "https://github.com/tangency-labs/fieldcraft"
[workspace.dependencies] [workspace.dependencies]
# internal # internal
+7 -7
View File
@@ -10,8 +10,8 @@ see the results — with a nonlinear implicit solver (large deformation, plastic
in place. Hex meshing is the centre of gravity. Next: buckling and arc-length, contact, then in place. Hex meshing is the centre of gravity. Next: buckling and arc-length, contact, then
the wider material and multiphysics library. See [ROADMAP.md](ROADMAP.md). the wider material and multiphysics library. See [ROADMAP.md](ROADMAP.md).
**Want to help?** Pick an issue labelled **Want to help?** Pick an issue labelled
[good first issue](https://github.com/jyviko/fieldcraft/labels/good%20first%20issue) or [good first issue](https://github.com/tangency-labs/fieldcraft/labels/good%20first%20issue) or
[help wanted](https://github.com/jyviko/fieldcraft/labels/help%20wanted) and read [help wanted](https://github.com/tangency-labs/fieldcraft/labels/help%20wanted) and read
[CONTRIBUTING.md](CONTRIBUTING.md). [CONTRIBUTING.md](CONTRIBUTING.md).
![Claude analyses an I-beam cantilever in FieldCraft over MCP: it opens the part, hex meshes it, sets steel, the clamp and a 1 kN tip load, solves, shows von Mises stress and the deformed shape, and checks the tip deflection against beam theory](docs/media/claude-mcp.gif) ![Claude analyses an I-beam cantilever in FieldCraft over MCP: it opens the part, hex meshes it, sets steel, the clamp and a 1 kN tip load, solves, shows von Mises stress and the deformed shape, and checks the tip deflection against beam theory](docs/media/claude-mcp.gif)
@@ -28,15 +28,15 @@ theory with shear 0.177 mm).
## Download ## Download
[![Download for macOS](https://img.shields.io/badge/macOS-Download-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/jyviko/fieldcraft/releases/latest) [![Download for macOS](https://img.shields.io/badge/macOS-Download-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/tangency-labs/fieldcraft/releases/latest)
[![Download for Windows](https://img.shields.io/badge/Windows-Download-0078D6?style=for-the-badge)](https://github.com/jyviko/fieldcraft/releases/latest) [![Download for Windows](https://img.shields.io/badge/Windows-Download-0078D6?style=for-the-badge)](https://github.com/tangency-labs/fieldcraft/releases/latest)
[![Download for Linux](https://img.shields.io/badge/Linux-Download-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/jyviko/fieldcraft/releases/latest) [![Download for Linux](https://img.shields.io/badge/Linux-Download-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/tangency-labs/fieldcraft/releases/latest)
[![Try it in your browser](https://img.shields.io/badge/Browser-Try%20it-2ea44f?style=for-the-badge&logo=webassembly&logoColor=white)](https://jyviko.github.io/fieldcraft/) [![Try it in your browser](https://img.shields.io/badge/Browser-Try%20it-2ea44f?style=for-the-badge&logo=webassembly&logoColor=white)](https://tangency-labs.github.io/fieldcraft/)
- **macOS:** open the `.dmg` and drag FieldCraft into Applications (Apple silicon and Intel). - **macOS:** open the `.dmg` and drag FieldCraft into Applications (Apple silicon and Intel).
- **Windows:** unzip and run `fieldcraft.exe`. - **Windows:** unzip and run `fieldcraft.exe`.
- **Linux:** the `.AppImage` (allow it to run as a program), or the `.tar.gz`. - **Linux:** the `.AppImage` (allow it to run as a program), or the `.tar.gz`.
- **Browser:** [try it at jyviko.github.io/fieldcraft](https://jyviko.github.io/fieldcraft/), no install. - **Browser:** [try it at tangency-labs.github.io/fieldcraft](https://tangency-labs.github.io/fieldcraft/), no install.
- **Command line:** `fieldcraft-cli` ships in every package; AI agents connect to it over MCP - **Command line:** `fieldcraft-cli` ships in every package; AI agents connect to it over MCP
([docs/mcp.md](docs/mcp.md)). ([docs/mcp.md](docs/mcp.md)).
+1 -1
View File
@@ -3,7 +3,7 @@
FieldCraft is young; only `main` and the latest release get fixes. FieldCraft is young; only `main` and the latest release get fixes.
Please **don't open a public issue** for a security problem. Report it privately through the Please **don't open a public issue** for a security problem. Report it privately through the
repository's [Security tab](https://github.com/jyviko/fieldcraft/security/advisories/new) with repository's [Security tab](https://github.com/tangency-labs/fieldcraft/security/advisories/new) with
what you found, how to reproduce it (a model, deck or script), the version and platform, and the what you found, how to reproduce it (a model, deck or script), the version and platform, and the
impact you expect. impact you expect.
+1 -1
View File
@@ -12,7 +12,7 @@ fn cli(host: &str, args: &[&str]) -> std::process::Output {
#[test] #[test]
fn update_check_reports_the_latest_release() { fn update_check_reports_the_latest_release() {
let server = Server::start().unwrap(); let server = Server::start().unwrap();
server.release("latest", &json!({"tag_name": "v99.0.0", "html_url": "https://github.com/jyviko/fieldcraft/releases/tag/v99.0.0", "assets": []})); server.release("latest", &json!({"tag_name": "v99.0.0", "html_url": "https://github.com/tangency-labs/fieldcraft/releases/tag/v99.0.0", "assets": []}));
let out = cli(&server.url(), &["update", "--check"]); let out = cli(&server.url(), &["update", "--check"]);
assert!(out.status.success(), "{out:?}"); assert!(out.status.success(), "{out:?}");
let report: Value = serde_json::from_slice(&out.stdout).unwrap(); let report: Value = serde_json::from_slice(&out.stdout).unwrap();
+3 -3
View File
@@ -9,15 +9,15 @@
<meta property="og:site_name" content="FieldCraft"> <meta property="og:site_name" content="FieldCraft">
<meta property="og:title" content="FieldCraft"> <meta property="og:title" content="FieldCraft">
<meta property="og:description" content="Open-source CAE built in Rust: structures, heat, fluids, and MCP for AI agents."> <meta property="og:description" content="Open-source CAE built in Rust: structures, heat, fluids, and MCP for AI agents.">
<meta property="og:url" content="https://jyviko.github.io/fieldcraft/"> <meta property="og:url" content="https://tangency-labs.github.io/fieldcraft/">
<meta property="og:image" content="https://jyviko.github.io/fieldcraft/og.png"> <meta property="og:image" content="https://tangency-labs.github.io/fieldcraft/og.png">
<meta property="og:image:width" content="1280"> <meta property="og:image:width" content="1280">
<meta property="og:image:height" content="640"> <meta property="og:image:height" content="640">
<meta property="og:image:alt" content="FieldCraft: Open-source CAE built in Rust"> <meta property="og:image:alt" content="FieldCraft: Open-source CAE built in Rust">
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="FieldCraft"> <meta name="twitter:title" content="FieldCraft">
<meta name="twitter:description" content="Open-source CAE built in Rust: structures, heat, fluids, and MCP for AI agents."> <meta name="twitter:description" content="Open-source CAE built in Rust: structures, heat, fluids, and MCP for AI agents.">
<meta name="twitter:image" content="https://jyviko.github.io/fieldcraft/og.png"> <meta name="twitter:image" content="https://tangency-labs.github.io/fieldcraft/og.png">
<link data-trunk rel="rust" data-bin="fieldcraft-web" data-wasm-opt="z" data-weak-refs /> <link data-trunk rel="rust" data-bin="fieldcraft-web" data-wasm-opt="z" data-weak-refs />
<link data-trunk rel="icon" type="image/svg+xml" href="../../assets/app-icon/icon-small.svg" /> <link data-trunk rel="icon" type="image/svg+xml" href="../../assets/app-icon/icon-small.svg" />
<link data-trunk rel="copy-file" href="../../assets/app-icon/icon.iconset/icon_128x128@2x.png" data-target-path="icons" /> <link data-trunk rel="copy-file" href="../../assets/app-icon/icon.iconset/icon_128x128@2x.png" data-target-path="icons" />
+1 -1
View File
@@ -101,7 +101,7 @@ assets = [
[package.metadata.generate-rpm] [package.metadata.generate-rpm]
name = "fieldcraft" name = "fieldcraft"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
url = "https://github.com/jyviko/fieldcraft" url = "https://github.com/tangency-labs/fieldcraft"
assets = [ assets = [
{ source = "target/release/fieldcraft", dest = "/usr/bin/fieldcraft", mode = "755" }, { source = "target/release/fieldcraft", dest = "/usr/bin/fieldcraft", mode = "755" },
{ source = "target/release/fieldcraft-cli", dest = "/usr/bin/fieldcraft-cli", mode = "755" }, { source = "target/release/fieldcraft-cli", dest = "/usr/bin/fieldcraft-cli", mode = "755" },
+2 -2
View File
@@ -17,7 +17,7 @@ use serde_json::{Value, json};
use crate::crash::without_home; use crate::crash::without_home;
/// The issue form. /// The issue form.
pub const ISSUE_URL: &str = "https://github.com/jyviko/fieldcraft/issues/new"; pub const ISSUE_URL: &str = "https://github.com/tangency-labs/fieldcraft/issues/new";
/// The longest link a draft opens: GitHub refuses new-issue links much past 8 KB. /// The longest link a draft opens: GitHub refuses new-issue links much past 8 KB.
pub const MAX_URL: usize = 7000; pub const MAX_URL: usize = 7000;
/// The session file a draft attaches. /// The session file a draft attaches.
@@ -329,7 +329,7 @@ mod tests {
..Default::default() ..Default::default()
}; };
let d = draft(&input, "v1.2.3, testos x"); let d = draft(&input, "v1.2.3, testos x");
assert!(d.url.starts_with("https://github.com/jyviko/fieldcraft/issues/new?template=bug.yml&title="), "{}", d.url); assert!(d.url.starts_with("https://github.com/tangency-labs/fieldcraft/issues/new?template=bug.yml&title="), "{}", d.url);
assert!(d.attachments.is_empty() && d.clipboard.is_none(), "nothing attached without Share my session"); assert!(d.attachments.is_empty() && d.clipboard.is_none(), "nothing attached without Share my session");
let all = format!("{} {:?} {}", d.title, d.fields, decode(&d.url)); let all = format!("{} {:?} {}", d.title, d.fields, decode(&d.url));
assert!(!all.contains(&home()), "no home folder: {all}"); assert!(!all.contains(&home()), "no home folder: {all}");
+1 -1
View File
@@ -13,7 +13,7 @@ use crate::ModelApp;
use crate::files::Prompt; use crate::files::Prompt;
/// What is sent, event by event. /// What is sent, event by event.
pub const PRIVACY_URL: &str = "https://github.com/jyviko/fieldcraft/blob/main/docs/privacy.md"; pub const PRIVACY_URL: &str = "https://github.com/tangency-labs/fieldcraft/blob/main/docs/privacy.md";
/// The question, as the first run asks it. /// The question, as the first run asks it.
pub const QUESTION: &str = "Help improve FieldCraft by sharing anonymous usage: which tools you use, nothing from your models."; pub const QUESTION: &str = "Help improve FieldCraft by sharing anonymous usage: which tools you use, nothing from your models.";
const DETAIL: &str = "Counted: the commands you run (their names, how long they took, whether they failed), the steps from a design to results, \ const DETAIL: &str = "Counted: the commands you run (their names, how long they took, whether they failed), the steps from a design to results, \
+1 -1
View File
@@ -35,7 +35,7 @@ pub use release::{Asset, Check, Release};
pub use version::Version; pub use version::Version;
/// The repository releases come from. /// The repository releases come from.
pub const REPO: &str = "jyviko/fieldcraft"; pub const REPO: &str = "tangency-labs/fieldcraft";
/// The GitHub API. /// The GitHub API.
pub const DEFAULT_HOST: &str = "https://api.github.com"; pub const DEFAULT_HOST: &str = "https://api.github.com";
/// Replaces [`DEFAULT_HOST`] (and allows plain `http`), for tests against a local server only. /// Replaces [`DEFAULT_HOST`] (and allows plain `http`), for tests against a local server only.
+2 -2
View File
@@ -164,9 +164,9 @@ mod tests {
// Errors are messages, never panics. // Errors are messages, never panics.
let missing = Client::new(&server.url()).release(&Which::Version(Version::parse("1.2.3").unwrap())).unwrap_err(); let missing = Client::new(&server.url()).release(&Which::Version(Version::parse("1.2.3").unwrap())).unwrap_err();
assert!(missing.to_string().contains("no published release of FieldCraft 1.2.3"), "{missing}"); assert!(missing.to_string().contains("no published release of FieldCraft 1.2.3"), "{missing}");
server.route("/repos/jyviko/fieldcraft/releases/latest", 200, b"not json".to_vec()); server.route("/repos/tangency-labs/fieldcraft/releases/latest", 200, b"not json".to_vec());
assert!(matches!(Client::new(&server.url()).check(), Err(Error::Release(_)))); assert!(matches!(Client::new(&server.url()).check(), Err(Error::Release(_))));
server.route("/repos/jyviko/fieldcraft/releases/latest", 403, b"{}".to_vec()); server.route("/repos/tangency-labs/fieldcraft/releases/latest", 403, b"{}".to_vec());
assert!(matches!(Client::new(&server.url()).check(), Err(Error::Network(_)))); assert!(matches!(Client::new(&server.url()).check(), Err(Error::Network(_))));
assert!(matches!(Client::new("http://127.0.0.1:1").check(), Err(Error::Network(_)))); assert!(matches!(Client::new("http://127.0.0.1:1").check(), Err(Error::Network(_))));
} }
+1 -1
View File
@@ -129,7 +129,7 @@ mod tests {
pub(crate) fn github(tag: &str) -> Value { pub(crate) fn github(tag: &str) -> Value {
json!({ json!({
"tag_name": tag, "tag_name": tag,
"html_url": format!("https://github.com/jyviko/fieldcraft/releases/tag/{tag}"), "html_url": format!("https://github.com/tangency-labs/fieldcraft/releases/tag/{tag}"),
"body": "## What's new\n- updates", "body": "## What's new\n- updates",
"draft": false, "draft": false,
"prerelease": false, "prerelease": false,
+10 -10
View File
@@ -56,7 +56,7 @@ about it, and the release notes say which of the two the draft contains.
| `APPLE_TEAM_ID` | The 10-character team id of the Developer ID | | `APPLE_TEAM_ID` | The 10-character team id of the Developer ID |
Add them to the `release` environment ([Where the secrets live](#where-the-secrets-live)) with Add them to the `release` environment ([Where the secrets live](#where-the-secrets-live)) with
`gh secret set <NAME> --env release -R jyviko/fieldcraft`. With the certificate but without the `gh secret set <NAME> --env release -R tangency-labs/fieldcraft`. With the certificate but without the
three notarization secrets the app is signed and not notarized. A dmg made locally with three notarization secrets the app is signed and not notarized. A dmg made locally with
`packaging/macos/package.sh` is ad-hoc signed unless `MACOS_SIGN_IDENTITY` names an identity `packaging/macos/package.sh` is ad-hoc signed unless `MACOS_SIGN_IDENTITY` names an identity
in the keychain. in the keychain.
@@ -84,7 +84,7 @@ Setting it up, once:
```sh ```sh
cargo install --locked rsign2 --version 0.6.7 cargo install --locked rsign2 --version 0.6.7
rsign generate -W -p fieldcraft-release.pub -s fieldcraft-release.key # -W: no password rsign generate -W -p fieldcraft-release.pub -s fieldcraft-release.key # -W: no password
gh secret set FIELDCRAFT_SIGNING_KEY --env release -R jyviko/fieldcraft < fieldcraft-release.key gh secret set FIELDCRAFT_SIGNING_KEY --env release -R tangency-labs/fieldcraft < fieldcraft-release.key
``` ```
Keep an offline copy of the secret key file (a password manager, an encrypted backup) and Keep an offline copy of the secret key file (a password manager, an encrypted backup) and
@@ -130,19 +130,19 @@ never the shell history):
```sh ```sh
for n in APPLE_CERTIFICATE APPLE_CERTIFICATE_PASSWORD KEYCHAIN_PASSWORD APPLE_ID APPLE_PASSWORD \ for n in APPLE_CERTIFICATE APPLE_CERTIFICATE_PASSWORD KEYCHAIN_PASSWORD APPLE_ID APPLE_PASSWORD \
APPLE_TEAM_ID FIELDCRAFT_SIGNING_KEY POSTHOG_KEY; do APPLE_TEAM_ID FIELDCRAFT_SIGNING_KEY POSTHOG_KEY; do
gh secret set "$n" --env release -R jyviko/fieldcraft < "$n.txt" gh secret set "$n" --env release -R tangency-labs/fieldcraft < "$n.txt"
done done
gh secret list --env release -R jyviko/fieldcraft # all eight listed gh secret list --env release -R tangency-labs/fieldcraft # all eight listed
# After a release run on main has signed with them: # After a release run on main has signed with them:
for n in APPLE_CERTIFICATE APPLE_CERTIFICATE_PASSWORD KEYCHAIN_PASSWORD APPLE_ID APPLE_PASSWORD \ for n in APPLE_CERTIFICATE APPLE_CERTIFICATE_PASSWORD KEYCHAIN_PASSWORD APPLE_ID APPLE_PASSWORD \
APPLE_TEAM_ID FIELDCRAFT_SIGNING_KEY POSTHOG_KEY; do APPLE_TEAM_ID FIELDCRAFT_SIGNING_KEY POSTHOG_KEY; do
gh secret delete "$n" -R jyviko/fieldcraft gh secret delete "$n" -R tangency-labs/fieldcraft
done done
``` ```
## Choose and prepare the version ## Choose and prepare the version
1. Look at the previous published release (`gh release list -R jyviko/fieldcraft`) and the 1. Look at the previous published release (`gh release list -R tangency-labs/fieldcraft`) and the
changes since it, and choose one version for the batch: a patch for compatible fixes; a minor changes since it, and choose one version for the batch: a patch for compatible fixes; a minor
for new capabilities, and while on `0.x` also for breaking changes (say what breaks in the for new capabilities, and while on `0.x` also for breaking changes (say what breaks in the
notes); `-rc.N` for a release candidate. `1.0` is the owner's decision. notes); `-rc.N` for a release candidate. `1.0` is the owner's decision.
@@ -189,8 +189,8 @@ commit needs: `cargo xtask affected --base <sha>^ --head <sha>`. A file outside
Publishing is a maintainer's call; an agent preparing a release stops at the draft. Publishing is a maintainer's call; an agent preparing a release stops at the draft.
1. Check the run succeeded for the intended commit and the draft targets it 1. Check the run succeeded for the intended commit and the draft targets it
(`gh release view v<version> -R jyviko/fieldcraft`). (`gh release view v<version> -R tangency-labs/fieldcraft`).
2. Download the assets into an empty folder (`gh release download v<version> -R jyviko/fieldcraft`), 2. Download the assets into an empty folder (`gh release download v<version> -R tangency-labs/fieldcraft`),
run `shasum -a 256 -c SHA256SUMS.txt`, check the signature run `shasum -a 256 -c SHA256SUMS.txt`, check the signature
(`minisign -Vm SHA256SUMS.txt -P <the public key above>`, or `rsign verify -P …`), and check (`minisign -Vm SHA256SUMS.txt -P <the public key above>`, or `rsign verify -P …`), and check
every platform's files are there. every platform's files are there.
@@ -201,13 +201,13 @@ Publishing is a maintainer's call; an agent preparing a release stops at the dra
platforms you could not try (each job checks its own package). platforms you could not try (each job checks its own package).
4. Edit the notes: what is new, fixes, breaking changes, known limitations. Keep the install and 4. Edit the notes: what is new, fixes, breaking changes, known limitations. Keep the install and
signing paragraphs; never claim signing the notes don't state. signing paragraphs; never claim signing the notes don't state.
5. Publish: `gh release edit v<version> -R jyviko/fieldcraft --draft=false --latest` 5. Publish: `gh release edit v<version> -R tangency-labs/fieldcraft --draft=false --latest`
(a release candidate: `--draft=false --prerelease --latest=false`). Publishing creates the tag (a release candidate: `--draft=false --prerelease --latest=false`). Publishing creates the tag
at the draft's commit; never push release tags by hand. at the draft's commit; never push release tags by hand.
## Dry runs ## Dry runs
`gh workflow run release.yml -R jyviko/fieldcraft --ref <branch>` runs the verify jobs and builds every package in parallel, and `gh workflow run release.yml -R tangency-labs/fieldcraft --ref <branch>` runs the verify jobs and builds every package in parallel, and
uploads them with the notes as the `release-assets` artifact of the run, without creating a uploads them with the notes as the `release-assets` artifact of the run, without creating a
release. `-f draft=true` creates or updates the draft, and is accepted on `main` only. release. `-f draft=true` creates or updates the draft, and is accepted on `main` only.
Locally, `packaging/macos/package.sh --arch aarch64` (or `x86_64`, `universal`) and Locally, `packaging/macos/package.sh --arch aarch64` (or `x86_64`, `universal`) and
+1 -1
View File
@@ -7,7 +7,7 @@ each step. The code is `crates/update` (`fieldcraft-update`); the window's side
## Checking ## Checking
The app asks the GitHub Releases API for the latest published release The app asks the GitHub Releases API for the latest published release
(`GET https://api.github.com/repos/jyviko/fieldcraft/releases/latest`; drafts and pre-releases (`GET https://api.github.com/repos/tangency-labs/fieldcraft/releases/latest`; drafts and pre-releases
are never offered) and compares its version with the running one (Semantic Versioning order). are never offered) and compares its version with the running one (Semantic Versioning order).
- **At start-up**, at most once a day, when **Check for updates automatically** is on (the - **At start-up**, at most once a day, when **Check for updates automatically** is on (the
+1 -1
View File
@@ -5,7 +5,7 @@ page through eframe's web runner, drawing with WebGPU where the browser has it a
otherwise. The engine, the meshers and the solvers are the same code, compiled to otherwise. The engine, the meshers and the solvers are the same code, compiled to
`wasm32-unknown-unknown`. `wasm32-unknown-unknown`.
Live: <https://jyviko.github.io/fieldcraft/>, deployed from each release (a push to `main`, Live: <https://tangency-labs.github.io/fieldcraft/>, deployed from each release (a push to `main`,
`.github/workflows/pages.yml`). `.github/workflows/pages.yml`).
## Run it locally ## Run it locally