//! Workspace and project discovery for `haz`.
//!
//! This crate is the first I/O-touching layer. Its job is to walk
//! the filesystem upward from a starting directory, locate the
//! workspace root, load `.haz/workspace.yml` (delegating to
//! [`haz_config`]), expand the project glob list against the
//! filesystem, load each project's `haz.yml`, validate cross-project
//! invariants, and assemble a [`haz_domain::workspace::Workspace`].
//!
//! Symlinks are followed during discovery, but with hard
//! boundaries: a symlink whose canonical target escapes the
//! workspace root is rejected, and when resolving a relative path
//! inside a project, a symlink whose canonical target escapes that
//! project's root is rejected. Cycles are detected via a visited
//! set of canonical paths.
//!
//! All filesystem access flows through the [`Filesystem`] trait
//! defined in the sibling [`haz_vfs`] crate. A real implementation
//! backed by [`std::fs`] and an in-memory implementation for tests
//! both ship from there.
//!
//! [`Filesystem`]: haz_vfs::Filesystem

#![deny(missing_docs)]

pub mod bearing;
pub mod discover;
pub mod discovery;
pub mod overlays;
pub mod path;
pub mod projects;
pub mod root;
pub mod workspace;
