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