Skip to content

v0.28.0 - 2026-05-07

Choose a tag to compare

@github-actions github-actions released this 07 May 21:09

Release Notes

🚀 Features

  • (git/config) add breadcrumb when origin section has no extractable url (ERR-7 TASK-0966) - (f876c69) - @rsvalerio
  • expose find_workspace_root_with_depth + MAX_ANCESTOR_DEPTH (ARCH-2 TASK-0963) - (5068db6) - @rsvalerio

🐛 Bug Fixes

  • (about) use Debug for io::Error tracing fields to prevent log injection (ERR-7 TASK-0999) - (1617adc) - @rsvalerio
  • (about/text_util) pad_to_width_plain delegates to display_width (PERF-3 TASK-1001) - (cd0f906) - @rsvalerio
  • (cli) sort available-extensions list in unknown-extension error (PATTERN-1 TASK-0990) - (4a34d07) - @rsvalerio
  • (config/loader) use Debug for path tracing fields to prevent log injection (ERR-7 TASK-0965) - (a846694) - @rsvalerio
  • (core/style) gate ANSI helpers on TTY and NO_COLOR (READ-9 TASK-0950) - (ab99e9e) - @rsvalerio
  • (duckdb) scope create_ingest_dir 0o700 to leaf; restrict validate_path_chars to ASCII (SEC-25 TASK-1000, READ-5 TASK-1002) - (447513c) - @rsvalerio
  • (duckdb/ingestor) rename JSON to .done before unlink for crash-safe cleanup (ARCH-2 TASK-1008) - (6a0ef98) - @rsvalerio
  • (duckdb/ingestor) log debug on NotFound JSON during cleanup_artifacts (ARCH-2 TASK-1005) - (345ead7) - @rsvalerio
  • (git/config) typed SectionHeaderError so malformed remote sections log a reason (READ-5 TASK-1006) - (a639d89) - @rsvalerio
  • (go) tighten looks_like_module_version to numeric MAJOR.MINOR (PATTERN-1 TASK-0976) - (db2ba43) - @rsvalerio
  • (go/about) is_block_opener accepts trailing inline comment (PATTERN-1 TASK-0994) - (6ceafb9) - @rsvalerio
  • (hook-common/git) emit breadcrumbs on canonicalize failure in gitdir resolution (ERR-1 TASK-1004) - (f818d0a) - @rsvalerio
  • (python) wrap email-only authors in angle brackets to match node format_person (ERR-2 TASK-0980) - (5dc92c7) - @rsvalerio
  • (python) include manifest path in pyproject parse warns (ERR-7 TASK-0974) - (cd2228b) - @rsvalerio
  • (runner) output_byte_cap peak warning reuses clamped OPS_MAX_PARALLEL (PERF-3 TASK-0995) - (768e7d4) - @rsvalerio
  • (runner/parallel) count terminal events per id so duplicates pair correctly (PATTERN-1 TASK-0997) - (052eb7e) - @rsvalerio
  • (rust/about) short-circuit non-UTF-8 cwd in coverage provider (READ-5 TASK-0986) - (76a4922) - @rsvalerio
  • (rust/cargo-toml) find_workspace_root surfaces EACCES instead of treating as missing (ERR-1 TASK-0988) - (0045d75) - @rsvalerio
  • (rust/deps) clamp separator slices to char boundaries; surface non-JSON deny stderr (ERR-1 TASK-0960, TASK-0958) - (11a7dbd) - @rsvalerio
  • (rust/metadata) compare manifest paths by component; retain path intra-workspace deps (PATTERN-1 TASK-0952, TASK-0982) - (873e6c7) - @rsvalerio
  • (rust/test-coverage) flatten_coverage_json drops rows with missing filename (ERR-1 TASK-0984) - (76954b9) - @rsvalerio
  • (tools/probe) use Debug for subprocess stderr fields to prevent log injection (ERR-7 TASK-0979) - (432d7b8) - @rsvalerio
  • sanitise untrusted strings in tracing breadcrumbs and ui::emit (wave 70) - (187fefc) - @rsvalerio
  • drop whitespace-only URLs in pyproject pick_url (ERR-2 TASK-0964) - (83841ca) - @rsvalerio
  • emit warn on every typed_manifest_cache poison recovery (ARCH-2 TASK-0962) - (30fc6c3) - @rsvalerio
  • keep keywords/categories Inherited when workspace declares no value (PATTERN-1 TASK-0961) - (bc36f70) - @rsvalerio
  • clamp negative per-crate i64 values to 0 with warn (ERR-1 TASK-0959) - (1990de6) - @rsvalerio
  • reject trailing tokens in cargo-update Adding/Removing lines (ERR-1 TASK-0949) - (1ce6a17) - @rsvalerio

⚡ Performance

  • (duckdb) ingest_mutex_for keyed by &'static str to eliminate per-call alloc (PERF-3 TASK-1007) - (15b8f91) - @rsvalerio
  • (python/about) normalise URL keys once per extract_urls (PERF-3 TASK-0991) - (429e37f) - @rsvalerio
  • pre-size read_optional_text buffer from file metadata (PERF-1 TASK-0971) - (4a04566) - @rsvalerio
  • return Cow from cargo-update strip_ansi to skip alloc on common path (PERF-3 TASK-0970) - (e654b2c) - @rsvalerio
  • build per-crate placeholders without intermediate Vec (PERF-3 TASK-0968) - (72bf4a0) - @rsvalerio
  • cache TMPDIR as Arc in Variables::from_env (PERF-3 TASK-0967) - (95aca2f) - @rsvalerio
  • avoid per-line String alloc in ProgressState::record_stderr (PERF-3 TASK-0948) - (94f03bc) - @rsvalerio

📚 Documentation

🧪 Testing

  • (cli) isolate user env, assert error messages, kill flaky sleep (TEST-11/15/18/25 TASKS-0953/0954/0955/0957) - (31cfaf9) - @rsvalerio
  • (tools) drop assertions for removed ToolStatus::Unknown variant - (30bdeb3) - @rsvalerio
  • pin resolved-members amortisation via typed_manifest_cache (PERF-3 TASK-0969) - (027c17d) - @rsvalerio

🚜 Refactoring

  • (about) extract shared manifest_cache from node/python (DUP-1 TASK-0973, TEST-18 TASK-0956) - (9112219) - @rsvalerio
  • (about) inline parse_package_metadata shims at call sites (DUP-3 TASK-0987) - (6923215) - @rsvalerio
  • (about) share Debug-escape assertion via ops_about::test_support (DUP-3 TASK-0985) - (0324c3e) - @rsvalerio
  • (deps) unify is_actionable predicates behind a relax_warning param (DUP-3 TASK-0989) - (ad8648b) - @rsvalerio
  • (deps) collapse severity_icon/colorize_severity onto SeverityClass enum (DUP-3 TASK-0972) - (0a97460) - @rsvalerio
  • (extension/data) collapse provider_names_iter into provider_names (API-3 TASK-0996) - (eefdca8) - @rsvalerio
  • (project_identity) make stack_emoji defer to language_emoji canonical table (DUP-3 TASK-0983) - (1bb9c51) - @rsvalerio
  • (runner) merge_alias_for routes through Entry API (PATTERN-1 TASK-0998) - (1278620) - @rsvalerio
  • (theme) unify strip_ansi and visible_width behind one ANSI parser (DUP-1 TASK-0978) - (f0f962b) - @rsvalerio
  • (tokei) tokei_languages_view_sql returns String via TableName::from_static (ERR-5 TASK-1003) - (42f1d64) - @rsvalerio
  • (tools) remove dead ToolStatus::Unknown variant (READ-7 TASK-0992) - (f8462cb) - @rsvalerio

⚙️ Miscellaneous


Install ops 0.28.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/rsvalerio/ops/releases/download/v0.28.0/ops-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install rsvalerio/tap/ops

Download ops 0.28.0

File Platform Checksum
ops-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ops-x86_64-apple-darwin.tar.gz Intel macOS checksum
ops-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ops-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum