fix(xtask): run verification from workspace root
This commit is contained in:
@@ -51,7 +51,7 @@ Keep it stable. Prefer pointers to canonical sources over copied structure, file
|
|||||||
- Add only durable style, ownership, gotchas, and at most a few stable commands agents should actually run.
|
- Add only durable style, ownership, gotchas, and at most a few stable commands agents should actually run.
|
||||||
- Prefer links or pointers to canonical sources over copied lists.
|
- Prefer links or pointers to canonical sources over copied lists.
|
||||||
- Avoid project trees, architecture maps, generated inventories, current file sizes, issue lists, TODO inventories, and other snapshots that will rot.
|
- Avoid project trees, architecture maps, generated inventories, current file sizes, issue lists, TODO inventories, and other snapshots that will rot.
|
||||||
- Stable commands: `cargo run -p hemx-xtask -- test`, `cargo run -p hemx-xtask -- html-examples-smoke`, `cargo check --workspace`, `redgate health --strict`. Use the xtask runner for full verification so jobs are capped from local CPU and memory; use the html_examples smoke for focused repo-owned browser verification of the HTML pattern gallery, no-reload dynamic interactions, and no `/tmp` scripts. Keep fast crate tests, focused browser smoke, and full xtask authority distinct; the full path should stay within a documented 10 minute local timeout or be split into deterministic shards under the same wrapper. req: test/004 req: test/006 req: test/012 req: test/013 req: test/014 req: test/015 req: test/016
|
- Stable commands: `cargo run -p hemx-xtask -- test`, `cargo run -p hemx-xtask -- html-examples-smoke`, `cargo check --workspace`, `redgate health --strict`. Use the xtask runner for full verification so jobs are capped from local CPU and memory and commands resolve the workspace independently of the caller's directory; use the html_examples smoke for focused repo-owned browser verification of the HTML pattern gallery, no-reload dynamic interactions, and no `/tmp` scripts. Keep fast crate tests, focused browser smoke, and full xtask authority distinct; the full path should stay within a documented 10 minute local timeout or be split into deterministic shards under the same wrapper. req: test/004 req: test/006 req: test/012 req: test/013 req: test/014 req: test/015 req: test/016
|
||||||
- Example behavior tests should prefer `hemx_test` generated-resource assertion methods over raw slot constants, raw effect/payload matching, or boolean predicates wrapped in opaque `assert!`; failures should include the expectation and actual effects, while rendered target/handle assertions should name the generated resource. Keep browser selector helpers as test adapters only, not authoring APIs. Process-backed tests use the RAII `TestProcess` harness rather than duplicating readiness loops and child cleanup. req: test/008 req: test/009 req: test/010 req: test/017 req: test/018 req: test/019
|
- Example behavior tests should prefer `hemx_test` generated-resource assertion methods over raw slot constants, raw effect/payload matching, or boolean predicates wrapped in opaque `assert!`; failures should include the expectation and actual effects, while rendered target/handle assertions should name the generated resource. Keep browser selector helpers as test adapters only, not authoring APIs. Process-backed tests use the RAII `TestProcess` harness rather than duplicating readiness loops and child cleanup. req: test/008 req: test/009 req: test/010 req: test/017 req: test/018 req: test/019
|
||||||
- Run the workout product exemplar with `cargo run -p hemx-xtask -- workout dev` and open `http://127.0.0.1:3028`; set `HEMX_WORKOUT_ADDR=127.0.0.1:3030` if the default port is busy. Its durable visual direction and recovery expectations live in `examples/workout/DESIGN.md`. req: examples/008
|
- Run the workout product exemplar with `cargo run -p hemx-xtask -- workout dev` and open `http://127.0.0.1:3028`; set `HEMX_WORKOUT_ADDR=127.0.0.1:3030` if the default port is busy. Its durable visual direction and recovery expectations live in `examples/workout/DESIGN.md`. req: examples/008
|
||||||
- Use the same Workout command surface for tests, production build, and mobile release: `cargo run -p hemx-xtask -- workout test`, `cargo run -p hemx-xtask -- workout build`, `HEMX_WORKOUT_ORIGIN=https://workout.example.com cargo run -p hemx-xtask -- workout mobile-release`, and `HEMX_WORKOUT_ORIGIN=https://workout.example.com cargo run -p hemx-xtask -- workout mobile-verify`; Android/iOS SDKs, store submission targets, and signing remain external blockers, not repo-owned secrets, and do not imply a broad `hemx-mobile` framework. req: examples/006 req: examples/011 req: examples/013
|
- Use the same Workout command surface for tests, production build, and mobile release: `cargo run -p hemx-xtask -- workout test`, `cargo run -p hemx-xtask -- workout build`, `HEMX_WORKOUT_ORIGIN=https://workout.example.com cargo run -p hemx-xtask -- workout mobile-release`, and `HEMX_WORKOUT_ORIGIN=https://workout.example.com cargo run -p hemx-xtask -- workout mobile-verify`; Android/iOS SDKs, store submission targets, and signing remain external blockers, not repo-owned secrets, and do not imply a broad `hemx-mobile` framework. req: examples/006 req: examples/011 req: examples/013
|
||||||
|
|||||||
+1
-1
@@ -860,7 +860,7 @@ what a valid business email is. [north_star]
|
|||||||
0 003 Generated registries are validated by compile-time tests: missing handler implementations produce test failures with actionable messages. [north_star]
|
0 003 Generated registries are validated by compile-time tests: missing handler implementations produce test failures with actionable messages. [north_star]
|
||||||
|
|
||||||
### req: test/004
|
### req: test/004
|
||||||
0 004 Repository-wide verification uses a resource-aware runner that caps Cargo build jobs and Rust test threads from available CPU and memory. User-requested concurrency cannot exceed the detected safe cap. [north_star]
|
0 004 Repository-wide verification uses a resource-aware runner that runs from the hemx workspace root regardless of the caller's directory and caps Cargo build jobs and Rust test threads from available CPU and memory. User-requested concurrency cannot exceed the detected safe cap. [north_star]
|
||||||
|
|
||||||
### req: test/012
|
### req: test/012
|
||||||
0 012 Browser E2E runs as an isolated step and can be skipped explicitly when browser infrastructure is unavailable. [north_star]
|
0 012 Browser E2E runs as an isolated step and can be skipped explicitly when browser infrastructure is unavailable. [north_star]
|
||||||
|
|||||||
+15
-2
@@ -1365,7 +1365,7 @@ impl Step {
|
|||||||
fn run(&self, budget: &Budget) -> Result<(), ExitCode> {
|
fn run(&self, budget: &Budget) -> Result<(), ExitCode> {
|
||||||
eprintln!("\n==> {}", self.name);
|
eprintln!("\n==> {}", self.name);
|
||||||
let mut command = Command::new(self.tool);
|
let mut command = Command::new(self.tool);
|
||||||
command.args(&self.args);
|
command.current_dir(workspace_root()).args(&self.args);
|
||||||
if self.tool == "cargo" {
|
if self.tool == "cargo" {
|
||||||
command.env("CARGO_BUILD_JOBS", budget.jobs.to_string());
|
command.env("CARGO_BUILD_JOBS", budget.jobs.to_string());
|
||||||
command.env(
|
command.env(
|
||||||
@@ -1386,6 +1386,13 @@ impl Step {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn workspace_root() -> PathBuf {
|
||||||
|
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
||||||
|
.parent()
|
||||||
|
.expect("hemx-xtask must be a workspace member")
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
fn env_usize(key: &str) -> Option<usize> {
|
fn env_usize(key: &str) -> Option<usize> {
|
||||||
env::var(key).ok()?.parse().ok()
|
env::var(key).ok()?.parse().ok()
|
||||||
}
|
}
|
||||||
@@ -1466,11 +1473,17 @@ mod tests {
|
|||||||
use super::{
|
use super::{
|
||||||
android_twa_release_json, create_app_scaffold, create_mobile_app_scaffold,
|
android_twa_release_json, create_app_scaffold, create_mobile_app_scaffold,
|
||||||
create_workout_app, mobile_external_blockers, origin_host, verify_workout_mobile_release,
|
create_workout_app, mobile_external_blockers, origin_host, verify_workout_mobile_release,
|
||||||
workout_mobile_manifest, write_workout_mobile_release, Budget, WorkoutMobileConfig,
|
workout_mobile_manifest, workspace_root, write_workout_mobile_release, Budget,
|
||||||
|
WorkoutMobileConfig,
|
||||||
};
|
};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn verification_steps_resolve_the_workspace_independent_of_caller_directory() {
|
||||||
|
assert!(workspace_root().join("Cargo.toml").is_file()); // req: test/004
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn budget_is_capped_by_available_memory() {
|
fn budget_is_capped_by_available_memory() {
|
||||||
// req: test/004
|
// req: test/004
|
||||||
|
|||||||
Reference in New Issue
Block a user