Skip to content

fix(windows): harden path and URI handling (batch 1) - #4103

Merged
sxlijin merged 16 commits into
BoundaryML:canaryfrom
jubjub727:codex/fix-windows-portability
Aug 14, 2026
Merged

sxlijin merged 16 commits into
BoundaryML:canaryfrom
jubjub727:codex/fix-windows-portability

Conversation

@jubjub727

@jubjub727 jubjub727 commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Author Comment

Went through and made the first 3 Windows fixes. Codex found what imo looks like a really elegant solution for replacing walkdir. Happy to make any requested changes. It looks good to me :)

Codex Summary

This PR addresses the first batch of findings from a Windows path and URI audit across CLI discovery, the native LSP/VFS boundary, and the browser editor.

BAML file discovery previously used walkdir, skipped excluded directories only after they had already been yielded, followed directory links, and silently discarded traversal errors. It now uses ignore::WalkBuilder to prune ignored and hidden directories before descending, respect standard ignore files and negation rules, avoid following directory links, and return traversal failures to callers with context.

Native filesystem paths and internal VFS paths were also being treated as interchangeable strings. This introduces a shared utils_windows crate containing a type-safe native path wrapper and the conversion contract between native paths and slash-oriented VFS paths. The conversion preserves Windows drive and UNC roots and is consumed directly by both bex_project and baml_lsp_server.

The remote Monaco editor previously created a file URI from the server workspace root but continued comparing and joining files using the original native path string. The editor now converts the workspace root to a URI once and derives file URIs, sandbox containment, watcher paths, ancestor directories, and relative filenames from that representation. Workspace-relative file keys are normalized and absolute or escaping paths are rejected.

Path casing is deliberately preserved. Filesystem identity and case-only path aliases are a separate concern and are not addressed by this batch.

Regression coverage verifies:

  • Standard ignore files, negation rules, hidden entries, missing roots, and linked directories.
  • Windows drive, mixed-separator, verbatim, and UNC native/VFS path conversion.
  • Native LSP project loading, discovery, watcher paths, and saves.
  • Monaco drive and UNC roots, spaces, %, separator variants, containment boundaries, traversal attempts, and URI authority.

Tested with the relevant Rust unit and integration suites, WASM checks, TypeScript tests and typechecks, and a production webview build.

Summary by CodeRabbit

  • New Features

    • Added cross-platform workspace path handling for Windows, UNC, and non-Windows environments.
    • Improved workspace file discovery with ignore rules, symlink traversal, and deterministic results.
    • Enhanced editor workspace initialization, file opening, watching, and path validation.
  • Bug Fixes

    • Prevented invalid or unsafe paths from escaping the workspace.
    • Improved handling of missing files, directories, encoded paths, and conversion errors.
  • Tests

    • Added coverage for path normalization, sandbox containment, workspace discovery, and editor behavior.

@vercel

vercel Bot commented Jul 21, 2026

Copy link
Copy Markdown

@jubjub727 is attempting to deploy a commit to the Boundary Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8f18b96f-be99-4e74-8a2f-2c2f96ff872a

📥 Commits

Reviewing files that changed from the base of the PR and between 09c1dbc and ad6a1fe.

⛔ Files ignored due to path filters (2)
  • baml_language/Cargo.lock is excluded by !**/*.lock
  • typescript2/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (20)
  • baml_language/Cargo.toml
  • baml_language/crates/baml_lsp_server/Cargo.toml
  • baml_language/crates/baml_lsp_server/src/native_vfs.rs
  • baml_language/crates/baml_path/Cargo.toml
  • baml_language/crates/baml_path/src/lib.rs
  • baml_language/crates/baml_path/src/native.rs
  • baml_language/crates/baml_path/src/native/non_windows.rs
  • baml_language/crates/baml_path/src/native/windows.rs
  • baml_language/crates/baml_workspace/Cargo.toml
  • baml_language/crates/baml_workspace/src/discovery.rs
  • baml_language/crates/bex_project/Cargo.toml
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/mod.rs
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/request.rs
  • baml_language/crates/bex_project/src/fs.rs
  • typescript2/biome.json
  • typescript2/pkg-editor/package.json
  • typescript2/pkg-editor/src/MonacoEditor.tsx
  • typescript2/pkg-editor/src/workspace-path.ts
  • typescript2/pkg-editor/tests/workspace-path.test.ts
  • typescript2/pkg-editor/vitest.config.ts
🚧 Files skipped from review as they are similar to previous changes (19)
  • baml_language/Cargo.toml
  • baml_language/crates/bex_project/Cargo.toml
  • typescript2/biome.json
  • typescript2/pkg-editor/vitest.config.ts
  • baml_language/crates/baml_workspace/Cargo.toml
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/request.rs
  • typescript2/pkg-editor/tests/workspace-path.test.ts
  • baml_language/crates/baml_workspace/src/discovery.rs
  • baml_language/crates/baml_path/src/native.rs
  • baml_language/crates/baml_lsp_server/Cargo.toml
  • baml_language/crates/baml_path/src/lib.rs
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/mod.rs
  • baml_language/crates/baml_path/src/native/windows.rs
  • typescript2/pkg-editor/src/workspace-path.ts
  • typescript2/pkg-editor/src/MonacoEditor.tsx
  • baml_language/crates/bex_project/src/fs.rs
  • baml_language/crates/baml_path/Cargo.toml
  • baml_language/crates/baml_lsp_server/src/native_vfs.rs
  • baml_language/crates/baml_path/src/native/non_windows.rs

📝 Walkthrough

Walkthrough

The PR adds cross-platform native/VFS path types, ignore-aware BAML discovery, native LSP filesystem access, explicit BEX path conversion, and a URI-based workspace path model for the TypeScript editor.

Changes

Rust native paths and discovery

Layer / File(s) Summary
Native and VFS path foundations
baml_language/crates/baml_path/*, baml_language/Cargo.toml
Adds validated VfsPathBuf and NativePathBuf types with platform conversions, error handling, and round-trip tests.
Ignore-aware BAML discovery
baml_language/crates/baml_workspace/*
Replaces walkdir with ignore::WalkBuilder, supports ignore rules and directory links, skips traversal errors, sorts results, and adds coverage.
Native VFS filesystem adapter
baml_language/crates/baml_lsp_server/*
Makes NativeVfs stateless, converts absolute VFS paths to native paths, propagates filesystem errors, and tests encoded paths and workspace initialization.

BEX native and VFS path plumbing

Layer / File(s) Summary
BEX path-resolution helpers
baml_language/crates/bex_project/src/fs.rs
Separates VFS-path and platform-path resolution, validates joins, maps failures to LspError::InvalidPath, and exposes FsPath::as_str().
BEX LSP path integration
baml_language/crates/bex_project/src/bex_lsp/multi_project/*, baml_language/crates/bex_project/Cargo.toml
Updates workspace discovery, URI handling, playground operations, command requests, and test helpers to use explicit VFS/platform conversions.

TypeScript editor workspace paths

Layer / File(s) Summary
Workspace URI path model
typescript2/pkg-editor/src/workspace-path.ts, typescript2/pkg-editor/tests/*, typescript2/pkg-editor/package.json, typescript2/pkg-editor/vitest.config.ts
Adds URI normalization, containment checks, relative filename validation, ancestor derivation, and Vitest coverage.
Monaco workspace integration
typescript2/pkg-editor/src/MonacoEditor.tsx, typescript2/biome.json
Uses the workspace model for URI construction, sandbox checks, file setup, document mapping, watcher events, previews, and filesystem read-back.

Estimated code review effort: 4 (Complex) | ~60 minutes

Merge Risk: ⚪ Minimal · up to ad6a1

The changes harden Windows path discovery, filesystem/VFS conversion, and editor URI handling with corresponding regression coverage; no actionable merge-blocking risk remains after normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant LSPWorkspace
  participant BamlVFS
  participant NativePathBuf
  participant BamlDiscovery
  participant NativeVfs
  LSPWorkspace->>BamlVFS: resolve workspace root from platform path
  BamlVFS->>NativePathBuf: convert VFS root to native path
  NativePathBuf-->>BamlVFS: validated native root
  LSPWorkspace->>BamlDiscovery: discover BAML files
  BamlDiscovery-->>LSPWorkspace: sorted discovered paths
  LSPWorkspace->>NativeVfs: read workspace files
  NativeVfs-->>LSPWorkspace: file contents
Loading
sequenceDiagram
  participant MonacoEditor
  participant WorkspacePathModel
  participant MonacoUri
  participant FileSystem
  MonacoEditor->>WorkspacePathModel: normalize filename
  WorkspacePathModel->>MonacoUri: create contained file URI
  MonacoUri-->>MonacoEditor: workspace file URI
  MonacoEditor->>FileSystem: write and watch workspace files
  FileSystem-->>MonacoEditor: URI-based file events
  MonacoEditor->>WorkspacePathModel: extract relative filename
  WorkspacePathModel-->>MonacoEditor: normalized relative filename
Loading

Possibly related PRs

Suggested reviewers: rossirpaulo

Poem

A rabbit maps each path with care,
From VFS roots to folders there.
Ignore rules mark files to find,
URI boundaries stay aligned.
Native trails and editors agree—
Safe paths hop happily.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 67.59% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes to Windows path and URI handling.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@baml_language/crates/baml_workspace/src/discovery.rs`:
- Around line 18-19: Update the WalkBuilder configuration in discovery to call
require_git(false) alongside standard_filters(true), so .gitignore rules are
applied even when the root is not inside a Git repository, including the
.jj-only repository case.

In `@baml_language/crates/utils_windows/src/lib.rs`:
- Around line 62-68: Update native_path_from_vfs_path on the non-Windows path to
reject "." and ".." traversal components before constructing the PathBuf,
matching the Windows validation behavior while preserving existing invalid-path
handling.

In `@typescript2/pkg-editor/src/MonacoEditor.tsx`:
- Around line 668-669: Update the firstFile initialization in MonacoEditor so an
empty fileNames array produces a safe string fallback before calling
workspacePaths.fileUri. Preserve the existing firstFileIndex selection for
available text files, and ensure the fallback satisfies normalizeFilename’s
string requirement.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ec4345a1-84a2-4c0d-a3c8-442f2296add3

📥 Commits

Reviewing files that changed from the base of the PR and between 070b3a3 and 3ba59b8.

⛔ Files ignored due to path filters (2)
  • baml_language/Cargo.lock is excluded by !**/*.lock
  • typescript2/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (24)
  • baml_language/Cargo.toml
  • baml_language/crates/baml_cli/src/format.rs
  • baml_language/crates/baml_cli/src/project_load.rs
  • baml_language/crates/baml_lsp_server/Cargo.toml
  • baml_language/crates/baml_lsp_server/src/native_vfs.rs
  • baml_language/crates/baml_tests/benches/compiler_benchmark.rs
  • baml_language/crates/baml_tests/tests/emit_determinism.rs
  • baml_language/crates/baml_tests/tests/link_units_oracle.rs
  • baml_language/crates/baml_workspace/Cargo.toml
  • baml_language/crates/baml_workspace/src/discovery.rs
  • baml_language/crates/bex_project/Cargo.toml
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/mod.rs
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/request.rs
  • baml_language/crates/bex_project/src/fs.rs
  • baml_language/crates/tools_compile_profile/src/main.rs
  • baml_language/crates/tools_onionskin/src/compiler.rs
  • baml_language/crates/utils_windows/Cargo.toml
  • baml_language/crates/utils_windows/src/lib.rs
  • baml_language/sdk_tests/harness_setup/src/lib.rs
  • typescript2/pkg-editor/package.json
  • typescript2/pkg-editor/src/MonacoEditor.tsx
  • typescript2/pkg-editor/src/workspace-path.ts
  • typescript2/pkg-editor/tests/workspace-path.test.ts
  • typescript2/pkg-editor/vitest.config.ts

@jubjub727
jubjub727 force-pushed the codex/fix-windows-portability branch from 86894e2 to b85aa3c Compare July 21, 2026 12:21
@jubjub727

jubjub727 commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor Author

Addressed the good code rabbit suggestions and the 1 hallucinated suggestion. Patching together the commits nicely here so there's only 1 commit per bug fix making it easy to reference later on.

@jubjub727
jubjub727 force-pushed the codex/fix-windows-portability branch from b85aa3c to c3b0512 Compare July 21, 2026 12:24
}
}
let mut builder = WalkBuilder::new(root);
builder.standard_filters(true).follow_links(false);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we want to follow symlinks

if path.is_file() && path.extension().and_then(|s| s.to_str()) == Some("baml") {
files.push(path.to_path_buf());
for entry in builder.build() {
let entry = entry?;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should do our best to make progress in a scenario like this, the filter_map(Result::ok) before was deliberate

/// [`std::path::Path`]. Component casing is preserved; filesystem identity is
/// a separate policy owned by the project registry.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NativePathBuf(PathBuf);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what specifically does NativePathBuf as a newtype preclude, i.e. what states are unrepresentable because of NativePathBuf?

i'm wondering if having this as a trait makes more sense, since we end up using std::path::Path and PathBuf on both sides anyways

(i think there's two different ways to impl NativePathBuf that more obviously add type safety: (1) have it be NativePath::UnixPath | NativePath::WindowsPath, no cfg-only - this matters in e.g. the wasm case, where we run wasm on both windows and unix or (2) wrap VFS, ban direct access to it, and only allow using VFS through NativePathBuf)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The actual underlying behaviour here seems to be a bit sticky. It's hard to get a clean solution that also addresses the nuance needed to make Windows work properly. I had Codex have a crack at it and it doesn't look terrible. Its solution is basically just ignoring native paths completely for wasm and ingesting them as strings on that platform which matches what wasm wants here.

I do agree that type safety is important here so I think it is worth getting a proper solution here instead of just accepting an easy solution.

I'm also moving away from the cfg heavy implementation here because it's a bit too fragile and makes the code harder to read imo. Going to split the windows behaviour and non windows behaviour into their own files so it's clearer what's going on here at a glance.

Self {
root: self.root.clone(),
}
fn path_error(error: NativePathError) -> vfs::VfsError {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be possible to impl From<NativePathError> for VfsError

@@ -0,0 +1,24 @@
[package]
name = "utils_windows"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might want to call this something else e.g. utils_fs if we're going to use it on all platforms

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep agreed using the utils_fs name now

@jubjub727

Copy link
Copy Markdown
Contributor Author

I've implemented various changes and refactored things to minimize cfg spam and make things a bit more readable.

Follow up on the Windows portability changes so cargo fmt --check passes. This only groups and orders imports; it does not change behavior.
@jubjub727
jubjub727 force-pushed the codex/fix-windows-portability branch from 46a89d1 to 5606379 Compare July 24, 2026 13:46
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@typescript2/pkg-editor/src/MonacoEditor.tsx`:
- Around line 345-347: Update assertNotRoot in MonacoEditor.tsx to compare URI
identity using scheme, authority, and path rather than the full serialized URI,
so query or fragment decorations cannot bypass root protection. Preserve the
existing rejection behavior and add regression coverage for both delete and
rename operations using a decorated workspace root URI.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b5dfa1ae-a0b2-4033-bebc-43c0bfb6e197

📥 Commits

Reviewing files that changed from the base of the PR and between f0f7ccf and 04d6a95.

⛔ Files ignored due to path filters (2)
  • baml_language/Cargo.lock is excluded by !**/*.lock
  • typescript2/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (20)
  • baml_language/Cargo.toml
  • baml_language/crates/baml_lsp_server/Cargo.toml
  • baml_language/crates/baml_lsp_server/src/native_vfs.rs
  • baml_language/crates/baml_path/Cargo.toml
  • baml_language/crates/baml_path/src/lib.rs
  • baml_language/crates/baml_path/src/native.rs
  • baml_language/crates/baml_path/src/native/non_windows.rs
  • baml_language/crates/baml_path/src/native/windows.rs
  • baml_language/crates/baml_workspace/Cargo.toml
  • baml_language/crates/baml_workspace/src/discovery.rs
  • baml_language/crates/bex_project/Cargo.toml
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/mod.rs
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/request.rs
  • baml_language/crates/bex_project/src/fs.rs
  • typescript2/biome.json
  • typescript2/pkg-editor/package.json
  • typescript2/pkg-editor/src/MonacoEditor.tsx
  • typescript2/pkg-editor/src/workspace-path.ts
  • typescript2/pkg-editor/tests/workspace-path.test.ts
  • typescript2/pkg-editor/vitest.config.ts
🚧 Files skipped from review as they are similar to previous changes (10)
  • typescript2/pkg-editor/package.json
  • baml_language/crates/baml_workspace/Cargo.toml
  • typescript2/pkg-editor/vitest.config.ts
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/request.rs
  • typescript2/pkg-editor/tests/workspace-path.test.ts
  • typescript2/pkg-editor/src/workspace-path.ts
  • baml_language/crates/baml_workspace/src/discovery.rs
  • baml_language/crates/baml_lsp_server/src/native_vfs.rs
  • baml_language/crates/bex_project/src/fs.rs
  • baml_language/crates/bex_project/src/bex_lsp/multi_project/mod.rs

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@sxlijin
sxlijin added this pull request to the merge queue Aug 14, 2026
Merged via the queue into BoundaryML:canary with commit cafaf3b Aug 14, 2026
143 of 147 checks passed
meefs pushed a commit to meefs/baml that referenced this pull request Aug 15, 2026
## Summary

- add comprehensive release notes for the independent `baml_language`
0.17.0 release line
- separate user-facing features, breaking and compatibility changes,
fixes, performance work, and internal changes
- synchronize the canary version, SDK packages, bridge runtime
identities, generated Node loader guards, and VS Code extension to
`0.17.0`

## Verified comparison range

- previous release: `baml-language-0.16.0` at
`2e021b3429db8769656e9b8646657c1863789169`
- reviewed product target:
`baml-language-source-c0153b20108bc428b77a53128b9a59ddeb4e2b42` at
`c0153b20108bc428b77a53128b9a59ddeb4e2b42`
- the reviewed product target was also `origin/canary` when the updated
notes were prepared
- full product comparison:
BoundaryML/baml@baml-language-0.16.0...baml-language-source-c0153b20108bc428b77a53128b9a59ddeb4e2b42

The product range contains 43 monorepo commits. The notes cover every
merged PR in the range that touched `baml_language/`, plus the
baml_language-specific macOS test suppression and binary-size baseline
workflow update. The post-BoundaryML#4424 review added BoundaryML#4427, BoundaryML#4431, BoundaryML#4432, BoundaryML#4433,
BoundaryML#4434, BoundaryML#4103, and BoundaryML#4435. BoundaryML#3975 and BoundaryML#3510 are in the monorepo comparison
but are excluded because they change only the main engine/docs release
line. Other unrelated documentation, website, JetBrains, on-call, and
general monorepo changes are also excluded. The five commits in this PR
add and refine the changelog and mechanically prepare release metadata;
they do not add product behavior beyond the reviewed target.

## Release safety

This PR remains draft. Its `baml_language/release.toml` change is the
documented canary release request: merging it to `canary` after green CI
would dispatch the production 0.17.0 release workflow. Do not merge or
mark ready until Sam explicitly approves the release.

No package was published, no release tag was created or pushed, no
artifact was uploaded, and no production release workflow was triggered
during preparation.

## Validation

- `scripts/baml-language-version sync`
- `scripts/baml-language-version check`
- `scripts/baml-language-version show` → `0.17.0`
- `scripts/baml-language-version compute --channel canary` → `0.17.0`
- `python3 -m unittest scripts.tests.test_baml_language_version
scripts.tests.test_release_pipeline_contract` — 39 passed
- `cargo test --manifest-path baml_language/Cargo.toml -p baml_version`
- `mise run validate-markdown` from `baml_language/`
- changed-file `prek` hooks, including Cargo formatting, Clippy, C++
formatting, TOML checks, and Markdown validation
- `git diff --check`


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added system and filesystem capabilities, cryptography utilities, time
arithmetic, assertions, bitwise operations, improved indexing, toolchain
pinning, and LSP code actions.
  - Added stable merge sorting for array helpers.

- **Bug Fixes**
- Improved language behavior, diagnostics, CLI evaluation, playground
workflows, and language-server synchronization.

- **Breaking Changes**
- Updated string APIs, function field requirements, prompt syntax, and
type-checking behavior.

- **Documentation**
  - Added release notes for version 0.17.0.

- **Release**
  - Published version 0.17.0 across supported SDKs and tooling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants