April 3, 2026
4 pull requests merged across 2 repos
bahdotsh/blogr
— blogr init followed by blogr serve fails with "Theme 'minimal-retro' not found" because the config stores "minimal-retro" but the theme registers as "Minimal Retro".
- Add
normalize_theme_name()inblogr-themesthat lowercases and replaces hyphens/underscores with spaces, so"minimal-retro","Minimal Retro", and"minimal_retro"all resolve correctly - Add
ThemeInfo::slug()for canonical config-file form (lowercase, hyphenated) - Fix all write paths (theme set, config set, TUI) to store the slug
- Fix all comparison paths to use normalization
- Fix newsletter test that relied on the broken lookup behavior
Test plan
-
cargo test --workspace— all 134 tests pass -
cargo clippy --all-targets --all-features -- -D warnings— clean -
cargo fmt --all -- --check— clean - Manual:
blogr init test-blog && cd test-blog && blogr serveshould work without error
bahdotsh/wrkflw
- Step outputs were not propagated between composite action steps —
execute_composite_actionalways passed an emptyHashMapforstep_outputs, so${{ steps.<id>.outputs.<key> }}always resolved to empty strings within composite actions. - Step env values with
${{ }}expressions were not resolved — values liketoolchain: ${{inputs.toolchain}}were inserted as literal strings, never run through the expression evaluator. - Both bugs together caused
dtolnay/rust-toolchain(and likely other composite actions) to fail in emulation mode.
What changed
1. Added a composite_step_outputs map in execute_composite_action and call apply_step_environment_updates after each step — same pattern as normal job execution.
2. Added preprocess_expressions call on step env values in execute_step, after secret substitution.
Test plan
-
cargo fmt --checkpasses -
cargo clippy --workspace --all-features -- -D warningspasses - All 396 existing tests pass
-
wrkflw validatepasses on project workflows -
wrkflw run --runtime emulation .github/workflows/ci.ymlnow succeeds (previously failed on all jobs)
- Adds a full GitHub Actions expression evaluator that handles
${{ }}expressions with operators, context references, and built-in functions - Fixes composite actions like
dtolnay/rust-toolchainthat use complex expressions (e.g.${{ steps.parse.outputs.toolchain == 'nightly' && inputs.components && ' --allow-downgrade' || '' }}) - Replaces the hardcoded
evaluate_job_conditionpattern-matcher with the expression evaluator forif:conditions - Adds missing
inputs.*,github.*,runner.*context substitution andRUNNER_OS/RUNNER_ARCHenv vars
What changed
| File | Change |
|---|---|
crates/executor/src/expression.rs | New — recursive-descent expression evaluator (tokenizer, parser, context resolution, built-in functions) |
crates/executor/src/substitution.rs | Added inputs.*/github.*/runner.* regex patterns, evaluator-powered fallback for complex expressions |
crates/executor/src/engine.rs | Replaced evaluate_job_condition with expression evaluator, fixed command display to show resolved expressions |
crates/executor/src/environment.rs | Added RUNNER_OS, RUNNER_ARCH, RUNNER_NAME, RUNNER_ENVIRONMENT |
crates/executor/src/lib.rs | Added pub mod expression |
Expression evaluator capabilities
- Operators:
==,!=,<,<=,>,>=,&&,||,! - Literals: strings (
'hello'), numbers, booleans, null - Contexts:
inputs.*,env.*,github.*,runner.*,matrix.*,steps.*.outputs.* - Functions:
contains(),startsWith(),endsWith(),format(),success(),failure(),always(),cancelled() - Truthiness: matches GitHub Actions semantics (empty string, 0, false, null are falsy)
Test plan
- 258 unit tests pass (
cargo test -p wrkflw-executor --lib) - Clippy clean (
cargo clippy -p wrkflw-executor -- -D warnings) - Rustfmt clean
- Verified against project's own CI workflow —
${{runner.os}}resolves tomacOScorrectly - dtolnay/rust-toolchain expression pattern evaluated correctly in unit tests
- Centralized theme module (
theme.rs) — single source of truth for all colors, styles, symbols, and block/badge helpers. Eliminates ~200 hardcodedColor::references scattered across 11 files. - Consistent Unicode symbols — replaces the mixed emoji (✅❌⏭⟳) with proper single-cell-width Unicode (✔✖⊘◉○▸) that don't break column alignment in terminals.
- Upgraded ratatui 0.23→0.28 and crossterm 0.26→0.28 — migrated all breaking API changes (
Framegenerics removed,Table::newsignature,f.size()→f.area()). - Colored CLI output (
cli_style.rs) — validate, execute, and list commands now have proper colored output with tree-style rendering (├──└──), replacing rawprintln!with zero styling. - Braille spinner animation for running workflow states, cycling on tick.
- Visual polish — numbered tabs (
1·Workflows), box-drawing dividers,[✔]/[ ]checkboxes, underlined table headers, themed status badges, compact status bar hints, breadcrumb navigation in job detail, cleaned up help tab with fixed-width key columns. - Removed redundant UI — instruction headers in workflows/logs tabs (status bar already shows same hints), reclaiming vertical space.
Net diff: -97 lines (1287 added, 1384 removed). The UI got better *and* smaller.
Test plan
-
cargo buildcompiles cleanly -
cargo test— all 16 UI tests + full workspace tests pass -
cargo run -- tui— visually verify all 4 tabs render correctly -
cargo run -- validate .github/workflows/— verify colored CLI output -
cargo run -- list --jobs— verify tree-style colored listing - Test in both wide (120+ col) and narrow (80 col) terminals
- Verify spinner animates for running workflows