Every panic (in a command, in the kernel, anywhere else) and every unclean exit (abort, stack overflow, kill) leaves a report in a local crash folder: message, file:line, a trimmed backtrace, version, commit, system and renderer, the command and recent commands, and when possible the design and replay.json that reproduce it (solvecraft-cli crashes replay <id>). - Cost: nothing until the app installs the hook (tests, CLI and web never do); then one small journal line per top-level command of the design on screen, taken back with a truncate when the command changed nothing. - Unclean exits: each run holds a lock on its journal; a journal nobody holds at the next start belongs to an app that died. Autosaves restart the journal from the autosaved design. - Bounded: a crash's signature (place + message, numbers ignored) is counted, not rewritten; at most 5 new reports per run, 20 reports, 50 MB, 90 days; recovered kernel panics are pruned first. - Agents: diagnostics.crash_reports / crash_report / crash_reports.clear commands, the MCP crash_reports tool, solvecraft-cli crashes, solvecraft --crash-log; diagnostics.crash_test (with SOLVECRAFT_CRASH_TEST) checks it. - People: the Crash Reports window opens after a crash (Help > Crash Reports…) with a reviewed issue draft per report; nothing is sent. - Release builds keep line tables for file:line in backtraces. Tests: child processes that really panic in a command, in the kernel, on a thread, and abort; dedup counts, limits, hostile folders, journal parsing, the UI window and draft, the MCP tool. docs/crash-reports.md. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
108 lines
3.4 KiB
TOML
108 lines
3.4 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*", "apps/*", "xtask"]
|
|
# Third-party code kept with local fixes (see vendor/README.md); not linted as ours.
|
|
exclude = ["vendor"]
|
|
|
|
[workspace.package]
|
|
version = "0.5.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
authors = ["SolidCraft contributors"]
|
|
repository = "https://github.com/bherbruck/solidcraft"
|
|
|
|
[workspace.dependencies]
|
|
# internal
|
|
solvecraft-geom = { path = "crates/geom" }
|
|
solvecraft-sketch = { path = "crates/sketch" }
|
|
solvecraft-kernel = { path = "crates/kernel" }
|
|
solvecraft-render = { path = "crates/render" }
|
|
solvecraft-doc = { path = "crates/doc" }
|
|
solvecraft-io = { path = "crates/io" }
|
|
solvecraft-engine = { path = "crates/engine" }
|
|
solvecraft-ui-egui = { path = "crates/ui-egui" }
|
|
solvecraft-mcp = { path = "crates/mcp" }
|
|
|
|
# foundation
|
|
thiserror = "2"
|
|
serde = { version = "1", features = ["derive", "rc"] }
|
|
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
log = "0.4"
|
|
sha2 = "0.10"
|
|
|
|
# geometry kernel (Apache-2.0; see plan/adr/0001-geometry-kernel.md). Only crates/kernel uses it.
|
|
truck-modeling = "0.6"
|
|
truck-shapeops = { version = "0.4", default-features = false }
|
|
truck-meshalgo = { version = "0.4", default-features = false, features = ["tessellation", "analyzers"] }
|
|
truck-stepio = { version = "0.3", default-features = false }
|
|
truck-topology = "0.6"
|
|
|
|
# packages (3MF)
|
|
zip = { version = "3", default-features = false, features = ["deflate"] }
|
|
quick-xml = "0.38"
|
|
|
|
# fonts (sketch text outlines; MIT OR Apache-2.0, pure Rust)
|
|
ttf-parser = { version = "0.25", default-features = false, features = ["std"] }
|
|
|
|
# images
|
|
image = { version = "0.25", default-features = false, features = ["png"] }
|
|
|
|
# ui
|
|
egui = "0.36"
|
|
eframe = { version = "0.36", default-features = false, features = ["persistence"] }
|
|
# Instant/SystemTime that also work in the browser (std panics on wasm32-unknown-unknown).
|
|
web-time = "1"
|
|
egui-wgpu = "0.36"
|
|
rfd = "0.17"
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[workspace.lints.clippy]
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
too_many_arguments = "allow"
|
|
type_complexity = "allow"
|
|
# `!(x > tol)` is our idiom for "not a usable number" (NaN-safe).
|
|
neg_cmp_op_on_partial_ord = "allow"
|
|
|
|
[profile.dev.package."*"]
|
|
opt-level = 2
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
|
|
# Tests and lints (`cargo xtask ci`, GitHub CI): quick to build, quick enough to run. Light
|
|
# optimisation, line tables only (file:line in backtraces), no LTO. Debug assertions are off because
|
|
# truck's debug-only checks reject valid geometry (seam edges, closed edges); that was the only
|
|
# reason the tests used to build with --release, which cost most of CI's time.
|
|
[profile.ci]
|
|
inherits = "dev"
|
|
opt-level = 1
|
|
debug = "line-tables-only"
|
|
debug-assertions = false
|
|
overflow-checks = true
|
|
incremental = false
|
|
|
|
[profile.ci.package."*"]
|
|
opt-level = 2
|
|
|
|
[profile.release]
|
|
opt-level = 3
|
|
lto = "thin"
|
|
codegen-units = 16
|
|
# Line tables only: crash reports name file:line in their backtraces (no runtime cost; a larger
|
|
# binary). See docs/crash-reports.md.
|
|
debug = "line-tables-only"
|
|
|
|
# truck-shapeops with SolveCraft fixes (Apache-2.0, see vendor/truck-shapeops and ATTRIBUTION.md).
|
|
[patch.crates-io]
|
|
truck-shapeops = { path = "vendor/truck-shapeops" }
|
|
truck-stepio = { path = "vendor/truck-stepio" }
|
|
truck-meshalgo = { path = "vendor/truck-meshalgo" }
|
|
matext4cgmath = { path = "vendor/matext4cgmath" }
|
|
|
|
# Keep OpenGL pipelines, resolve textures and CAD callbacks at the same safe sample count.
|
|
egui-wgpu = { path = "vendor/egui-wgpu" }
|