Changelog
Unreleased
v0.3.0 β 2026-03-02
Complete architecture rewrite. Each package now runs in its own Ruby::Box with constants resolved lazily at runtime via const_missing. Reads standard Packwerk package.yml files without requiring Packwerk.
Added
-
Package isolation β each package runs in its own
Ruby::Box; constants from undeclared dependencies and private constants raiseNameErrorat runtime. -
Per-package gems β packages can declare their own
gems.rb/Gemfilewith independent gem versions; auto-require mirrors Bundlerβs default behaviour (respectsrequire: false,require: 'path'). -
Zeitwerk autoloading β constants discovered via Zeitwerk conventions; default autoload roots:
lib/andpublic/. -
Privacy enforcement β
enforce_privacy,public_path,private_constants, and# pack_public: truefile sigil. -
Boxwerk.packageβ returns aPackageContextin per-packageboot.rbwithname,root?,config,root_path, andautoloader. -
Boxwerk.globalβ returns aGlobalContextfrom any box context. -
Autoloader API β
push_dir,collapse,ignore,setupon bothPackageContext::AutoloaderandGlobalContext::Autoloader; shared viaAutoloaderMixin.push_dirandcollapseauto-callsetupso constants are available immediately in boot scripts. -
global/boot.rbβ runs in the root box before package boxes; shared constants defined here are inherited by all packages. -
eager_load_global/eager_load_packagesboxwerk.yml options. -
Package name normalization β leading
./and trailing/stripped;packs/foo,./packs/foo, andpacks/foo/are equivalent. -
CLI commands β
exec,run,console,install,info. -
boxwerk installβ installs gems for all packages; works on a fresh clone without pre-installed gems. -
boxwerk infoβ shows config, global context, and per-package autoload/collapse/ignore dirs (with eager-load status), enforcements, dependencies, gems, and boot script presence. Boots the application (RUBY_BOX=1required). -
NameError hints β improved error messages like
(defined in 'packs/baz', not a dependency of '.')in child package contexts. -
Circular dependency detection in
boxwerk infotree output. -
collapse/ignorein boot.rb β collapses intermediate namespaces (e.g.Analytics::FormattersβAnalytics::*); ignores dirs from autoloading. -
Missing lockfile warning β graceful message directing to
boxwerk installwhen a Gemfile exists but no lockfile is found. -
Monkey patch isolation β patches defined in one package box are not visible in other packages or the root context.
-
examples/complexandexamples/minimaldemonstrating all features. -
E2E test suite (74 tests) alongside unit tests (120 tests).
-
GitHub Pages API documentation published from
lib/via RDoc.
Removed
-
Custom file-to-constant mapping (
Boxwerk.camelize), replaced by Zeitwerk. -
Namespace wrapping.
v0.2.0 β 2026-01-06
Changed
-
Simplified implementation (~370 lines removed)
-
Consolidated cycle detection in Graph (removed redundant methods)
-
Added class-level documentation to all modules
-
Simplified example application
Removed
-
Removed
Gemfile.lockfrom git (library best practice) -
Removed
sig/boxwerk.rbs
v0.1.0 β 2026-01-05
Initial release.