logs.gokuls.in

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() in blogr-themes that 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 serve should work without error

bahdotsh/wrkflw

  • Step outputs were not propagated between composite action stepsexecute_composite_action always passed an empty HashMap for step_outputs, so ${{ steps.<id>.outputs.<key> }} always resolved to empty strings within composite actions.
  • Step env values with ${{ }} expressions were not resolved — values like toolchain: ${{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 --check passes
  • cargo clippy --workspace --all-features -- -D warnings passes
  • All 396 existing tests pass
  • wrkflw validate passes on project workflows
  • wrkflw run --runtime emulation .github/workflows/ci.yml now 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-toolchain that use complex expressions (e.g. ${{ steps.parse.outputs.toolchain == 'nightly' && inputs.components && ' --allow-downgrade' || '' }})
  • Replaces the hardcoded evaluate_job_condition pattern-matcher with the expression evaluator for if: conditions
  • Adds missing inputs.*, github.*, runner.* context substitution and RUNNER_OS/RUNNER_ARCH env vars

What changed

FileChange
crates/executor/src/expression.rsNew — recursive-descent expression evaluator (tokenizer, parser, context resolution, built-in functions)
crates/executor/src/substitution.rsAdded inputs.*/github.*/runner.* regex patterns, evaluator-powered fallback for complex expressions
crates/executor/src/engine.rsReplaced evaluate_job_condition with expression evaluator, fixed command display to show resolved expressions
crates/executor/src/environment.rsAdded RUNNER_OS, RUNNER_ARCH, RUNNER_NAME, RUNNER_ENVIRONMENT
crates/executor/src/lib.rsAdded 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 to macOS correctly
  • 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 hardcoded Color:: 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 (Frame generics removed, Table::new signature, 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 raw println! 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 build compiles 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