Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
db656aa
Introduce the package universe domain types
JPDuchesne Sep 2, 2026
b10516d
Add per-integration VersionScheme domain services
JPDuchesne Sep 2, 2026
35bafa6
Add Repository#find(PackageId) -> Package
JPDuchesne Sep 2, 2026
c35d84d
Give PackageVersion install-fact metadata and find a locator filter
JPDuchesne Sep 2, 2026
e0de081
FicsitRepository#find: the mod's full version universe
JPDuchesne Sep 2, 2026
9d98de1
LuaRocksRepository#find: the manifest's version universe, facts only
JPDuchesne Sep 2, 2026
0a0461b
BrewRepository#find: the moving registry's singleton universe
JPDuchesne Sep 2, 2026
6a4f392
GhRepository#find: the declared tag as a singleton universe
JPDuchesne Sep 2, 2026
c7ec925
PipRepository#find: the PyPI JSON API's version universe
JPDuchesne Sep 2, 2026
252e17c
Pin-universe repositories gain find: git, steam, xcode, url
JPDuchesne Sep 2, 2026
fbf88c6
Extract BundlerLocker; BundlerRepository#find over the lockfile pins
JPDuchesne Sep 2, 2026
9e4d4c4
Root scheme parse errors in a shared VersionScheme hierarchy
JPDuchesne Sep 2, 2026
99b6373
Cut the Resolver over to find + VersionScheme; delete fetch/prepare
JPDuchesne Sep 3, 2026
13469ee
Wire schemes and lockers through the Registry and update-deps
JPDuchesne Sep 3, 2026
e8b6aa4
Document the deps architecture: ontology, layers, integrity, extension
JPDuchesne Sep 3, 2026
3194049
Merge main: #140's review-feedback polish into the deps redesign
JPDuchesne Sep 5, 2026
f9ba5c0
test: cover the last uncovered patch lines
JPDuchesne Sep 5, 2026
43b7377
Key the resolver's resolved set by PackageId
JPDuchesne Sep 5, 2026
3fbfa65
Nest lockfile entries by integration
JPDuchesne Sep 5, 2026
f3553f9
Document the (integration, name) lockfile identity
JPDuchesne Sep 5, 2026
0191754
Drop redundant T.must on untyped Dependency#version
JPDuchesne Sep 5, 2026
57483c3
Point the lockfile legacy-read shim at its removal ticket (#146)
JPDuchesne Sep 5, 2026
138500c
Add resolve and install sequence diagrams to deps architecture doc
JPDuchesne Sep 5, 2026
2bd61f1
Split DependencyDeclaration into Declaration + Scope + ScopedDeclaration
JPDuchesne Sep 6, 2026
8bca137
Kill DependencyEdge: version facts reuse Declaration, normalized at t…
JPDuchesne Sep 6, 2026
2335616
Add Declarations: a sealed sum type for a version's declared-deps claim
JPDuchesne Sep 6, 2026
11c7ced
PackageVersion#dependencies becomes #declarations, a Declarations claim
JPDuchesne Sep 6, 2026
70375a1
Every repository states its transitive regime by construction
JPDuchesne Sep 6, 2026
ff29709
Rename DependencyInstaller to Installer
JPDuchesne Sep 6, 2026
34f4889
Docs: rewrite the deps ontology and add the transitive-regimes reference
JPDuchesne Sep 6, 2026
49113cf
Restore typed: strict across the deps bootstrap chain
JPDuchesne Sep 6, 2026
808af75
Cover the remote-tap branch and CliUI availability memo
JPDuchesne Sep 6, 2026
38bb5b2
Give Declaration a source field and ScopedDeclaration a materializati…
JPDuchesne Sep 6, 2026
84f0570
Make VersionScheme fact-aware and give it a pin extraction hook
JPDuchesne Sep 6, 2026
4629028
Retire Repository#find's filter: probe contract, per-ecosystem scheme…
JPDuchesne Sep 6, 2026
7338396
Cover the new schemes and the steam platform mapping directly
JPDuchesne Sep 6, 2026
fc4151d
Docs: probe contract, per-ecosystem schemes, materialization channel,…
JPDuchesne Sep 6, 2026
8b1c05c
Rubocop: layout autocorrect in exact scheme test
JPDuchesne Sep 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor/rules/separation-of-concerns.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ end

# GOOD: separate classes for separate layers
class DependencyResolver # resolve + lock layer
class DependencyInstaller # install layer
class Installer # install layer
```

## Integration-specific logic stays in its integration
Expand Down
2 changes: 1 addition & 1 deletion .cursor/rules/strong-types.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ end

# GOOD: parser returns domain object immediately
def parse(path)
DependencyDeclaration.new(name: yaml["name"], version: yaml["version"])
Declaration.new(name: yaml["name"], integration: :cmake, constraint: yaml["constraint"])
end
```

Expand Down
18 changes: 1 addition & 17 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,9 @@ Sorbet/StrictSigil:
- src/**/*
- lib/**/*
Exclude:
# The pre-bundle bootstrap chain (dependencies.rb -> dev/deps -> ...,
# plus ensure_bundler) is loaded by bin/setup.rb and bin/test.rb BEFORE
# the bundle exists, so it must stay stdlib-only: `sig` blocks would
# require sorbet-runtime at load time. These files cap at `typed: true`
# (or `typed: false` where noted).
- lib/ensure_bundler.rb
- lib/dev/deps.rb
- lib/dev/deps/cli_ui.rb
- lib/dev/deps/config.rb
- lib/dev/deps/lockfile.rb
- lib/dev/deps/tap.rb
- lib/dev/deps/dependency_installer.rb
# `typed: false` holdouts: Data.define with a keyword-args initialize
# `typed: false` holdouts. Data.define with a keyword-args initialize
# override is rejected by Sorbet (error 4010)...
- lib/dev/deps/dependency.rb
- lib/dev/deps/dependency_declaration.rb
# ...method_missing dispatch into a required-keyword method needs
# T.unsafe, which the pre-bundle constraint forbids...
- lib/dev/deps/dsl.rb
# ...and Fetcher consumes a consumer-repo Lockfile API (parse,
# runtime_ref_map) that doesn't resolve against this repo's Lockfile.
- lib/dev/deps/fetcher.rb
Expand Down
2 changes: 1 addition & 1 deletion bin/install-build-deps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def install_brew_entry(entry)
when Hash
entry.each do |name, opts|
# Host-gated entries (e.g. brew "xcodes", host: :darwin) skip
# non-matching hosts — mirrors DependencyInstaller#filter_by_host.
# non-matching hosts — mirrors Installer#filter_by_host.
host = opts["host"]
if host && host.to_s != HOST
puts ">>> Skipping #{name} (host: #{host})"
Expand Down
3 changes: 1 addition & 2 deletions bin/rbi.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,13 @@

CLI::UI::StdoutRouter.enable

load File.join(DEV_ROOT, "dependencies.rb")
require "ensure_bundler"

class TapiocaGemError < StandardError; end

CLI::UI.frame("Regenerating gem RBI files...") do
CLI::UI.spinner("Ensuring bundler is installed...") do
ensure_bundler!(DEV_ROOT)
EnsureBundler.ensure!(DEV_ROOT)
end

CLI::UI.spinner("Generating gem RBI files...") do
Expand Down
2 changes: 1 addition & 1 deletion bin/setup.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
class BundleInstallError < StandardError; end

CLI::UI.frame("Setting up dev environment...") do
unless CLI::UI.spinner("Installing bundler...") { ensure_bundler!(DEV_ROOT) }
unless CLI::UI.spinner("Installing bundler...") { EnsureBundler.ensure!(DEV_ROOT) }
exit 1
end

Expand Down
4 changes: 1 addition & 3 deletions bin/tc.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@
DEV_ROOT = File.expand_path("..", __dir__)
$LOAD_PATH.unshift(File.join(DEV_ROOT, "lib")) unless $LOAD_PATH.include?(File.join(DEV_ROOT, "lib"))

load File.join(DEV_ROOT, "dependencies.rb")

ENV["BUNDLE_GEMFILE"] ||= File.join(DEV_ROOT, "Gemfile")
require "bundler/setup"

Expand All @@ -41,7 +39,7 @@ class RbiOutOfDateError < StandardError; end
# CLI::UI.spinner returns false when the task fails (debrief prints exceptions
# but never re-raises), so we check each return value explicitly.
CLI::UI.frame("Type checking...") do
unless CLI::UI.spinner("Install Bundler") { ensure_bundler!(DEV_ROOT) }
unless CLI::UI.spinner("Install Bundler") { EnsureBundler.ensure!(DEV_ROOT) }
exit 1
end

Expand Down
4 changes: 1 addition & 3 deletions bin/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@
DEV_ROOT = File.expand_path("..", __dir__)
$LOAD_PATH.unshift(File.join(DEV_ROOT, "lib")) unless $LOAD_PATH.include?(File.join(DEV_ROOT, "lib"))

load File.join(DEV_ROOT, "dependencies.rb")

ENV["BUNDLE_GEMFILE"] ||= File.join(DEV_ROOT, "Gemfile")
require "bundler/setup"

Expand All @@ -47,7 +45,7 @@ class TestError < StandardError; end
def main
requested_files = ARGV
CLI::UI.frame("Running tests...") do
unless CLI::UI.spinner("Install Bundler") { ensure_bundler!(DEV_ROOT) }
unless CLI::UI.spinner("Install Bundler") { EnsureBundler.ensure!(DEV_ROOT) }
exit 1
end

Expand Down
8 changes: 4 additions & 4 deletions dependencies.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@

# dev's own dependency manifest. Loaded in two ways:
# - by dev itself (before every command) to read the project toolchain;
# - by bin/setup.rb and bin/test.rb BEFORE the bundle exists, for the
# bootstrap constants below. The dev/deps require chain is stdlib-only,
# so this file must stay loadable pre-bundle (both callers put lib/ on
# the load path first). The guard keeps re-loads idempotent.
# - by EnsureBundler (for the bin/ scripts), for the bootstrap constants
# below. Every caller activates gems first (bundler/setup or plain
# RubyGems), so the dev/deps require chain is free to use sorbet-runtime.
# The guard keeps re-loads idempotent.
require "dev/deps"

Dev::Deps.define do
Expand Down
Loading
Loading