mirror of
https://github.com/storytold/effectcraft.git
synced 2026-11-10 18:31:30 -06:00
* AG4: xtask ci --affected cargo xtask ci --affected [--base REV] [--dry-run] runs fmt, clippy, tests (nextest + doctests when available), layers, assets (only on asset changes) and wasm (only for affected L0-L4/web crates) for the packages a change can affect: changed files map to the owning package and to packages whose sources read them via ../ paths, expanded to reverse dependents. Workspace-wide inputs (root Cargo.toml, Cargo.lock, .cargo/, xtask/, toolchain, clippy.toml) fall back to full CI. Documented in docs/testing.md, AGENTS.md and CLAUDE.md. (cherry picked from commit f3ca84fc2ee3948582cbc94e4c99ee510e829540) (cherry picked from commit 8a2cdcadf447eafa57ab14016beae4420f002af0) (cherry picked from commitd8a4301bc1) (cherry picked from commit 36402c61ac2f7e29ecd76a6cfc89365cc2572e0a) * AO1: fast CI profile, looser timing tests - [profile.ci] (release without LTO, 16 codegen units); `xtask ci` runs clippy and tests with --profile ci instead of --release. - Wall-clock asserts in engine memory_tick, gpu OpenGL decline and script socket tests keep their intent with bounds that survive a loaded machine. - docs/testing.md and CONTRIBUTING.md mention the profile. (cherry picked from commit b45c8a379351ebdfda0d7076ad4b740baf6f2087) (cherry picked from commit fa1ea6a107c4c1936cde89b518a05adc73f2b4b0) (cherry picked from commite5d5ed80e9) (cherry picked from commit d2c67660c70764f9c56880a642ad7f0d004a7f92) * AG6: journal replay repros Bug reports become replay scripts and crash regression tests become data files: - engine::replay: a JSON-lines repro format (start line, command steps with expect_error, expect queries with JSON pointer + equals, expect_no_error), a never-panicking runner that reports per-step ok/error and the first failure, and journal export (from the last project open; saves left out; size-capped). - journal.export {path?} and help.exportRepro {path?} (not journaled). - Crash capture: when the last-resort guard catches a panic in the outermost command, the journal plus that command is saved to Repros/crash-*.jsonl in the settings store (newest 20 kept) and the error names the file. - Commands run by a journaled command (script steps) are no longer journaled twice. - effectcraft-cli replay SCRIPT.jsonl [--json] [--keep-going]: exits 1 on a failed step, unmet expectation or panic. - crates/host/tests/repros.rs replays every tests/repros/*.jsonl; three samples from past crash fixes (zero frame rate, Layer Settings with no selection, New Comp from Selection with hostile overlap). - Docs: docs/agents.md "Repro scripts"; AGENTS.md: crash fix regression test = a .jsonl in tests/repros. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit c38509d7dafe507856c48c78db65e00b94b0cebc) (cherry picked from commit e55b56dbf76716adfcbfe4cc773df19a74edc419) (cherry picked from commit96a63855a9) (cherry picked from commit c59351ab3bd697f0868e41230dd883960d94a540) * xtask: ci and ci --affected run cargo test and nextest with --no-fail-fast One run now lists every failing crate instead of stopping at the first. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qXL3GPNnY9BSFF2XoU2Yu (cherry picked from commit e46c7debe738eca62b35bf7392ab77637f6a33ae) * Agents: confinement write-checks journal.export, help.exportRepro and file.exportTimeline Review on #859 (split into this PR): their output paths were only read-checked (relative ones not at all). Test: confinement_covers_every_command_that_writes_a_file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014d65YdNxQmjRkbXRtP2NwH * #1224: handle bin-only CI targets and BOM repros without weakening timing tests * #1224: run the full gate when nextest policy changes --------- Co-authored-by: Elias <hakifx91@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: FredApps <FredApps@users.noreply.github.com> Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
54 lines
2.1 KiB
Rust
54 lines
2.1 KiB
Rust
//! The command journal as a replay script (see [`crate::replay`]): `journal.export` for agents
|
|
//! and `help.exportRepro` for bug reports. Neither is journaled.
|
|
|
|
use serde_json::{Value, json};
|
|
|
|
use super::{CommandSpec, always, str_p};
|
|
use crate::{Result, Session, replay};
|
|
|
|
/// `journal.export {path?}`: the script itself, or written to `path`.
|
|
fn export(s: &mut Session, p: &Value) -> Result<Value> {
|
|
if let Some(path) = str_p(p, "path") {
|
|
let (path, steps) = replay::save_repro(s, Some(path))?;
|
|
return Ok(json!({"path": path, "steps": steps}));
|
|
}
|
|
let script = replay::export(s, None);
|
|
Ok(json!({"steps": script.lines().count().saturating_sub(1), "script": script}))
|
|
}
|
|
|
|
/// `help.exportRepro {path?}`: save the steps so far for a bug report (default: the settings
|
|
/// folder's `Repros`).
|
|
fn export_repro(s: &mut Session, p: &Value) -> Result<Value> {
|
|
let (path, steps) = replay::save_repro(s, str_p(p, "path"))?;
|
|
Ok(json!({"path": path, "steps": steps}))
|
|
}
|
|
|
|
const fn spec(id: &'static str, label: &'static str, params: &'static str, run: super::Run) -> CommandSpec {
|
|
CommandSpec { id, label, menu: &[], shortcut: None, alt_shortcuts: &[], params, enabled: always, run, journal: false }
|
|
}
|
|
|
|
pub fn specs() -> Vec<CommandSpec> {
|
|
#[allow(unused_mut)]
|
|
let mut v = vec![
|
|
spec(
|
|
"journal.export",
|
|
"Export Command Journal",
|
|
"{path? (write the script there)} → {script, steps} or {path, steps}: the commands run since the project was last opened, as a replay script (docs/agents.md, Repro scripts)",
|
|
export,
|
|
),
|
|
spec(
|
|
"help.exportRepro",
|
|
"Save Bug Repro...",
|
|
"{path? (default: Repros in the settings folder)} → {path, steps}: the steps since the project was opened, for a bug report (commands and parameters only)",
|
|
export_repro,
|
|
),
|
|
];
|
|
// A command with a bug, for the crash-repro tests.
|
|
#[cfg(test)]
|
|
v.push(spec("test.panic", "Panic (test)", "{why?}", |_, p| {
|
|
let why = str_p(p, "why").unwrap_or("test").to_string();
|
|
std::panic::panic_any(why)
|
|
}));
|
|
v
|
|
}
|