Skip to content
rlsbl.commands.dev_sync
On this page

Local editable overlays for `rlsbl dev sync`, installing sibling project checkouts as editable packages without committing path dependencies.

#rlsbl.commands.dev_sync

#rlsbl.commands.dev_sync

Local editable overlays for rlsbl dev sync, installing sibling project checkouts as editable packages without committing path dependencies.

Overlays sibling checkouts (e.g. ../strictcli/python) onto the project's locked environment without committing machine-local [tool.uv.sources] path dependencies. Driven by a git-invisible TOML file at the project root (dev-sources.toml.local-only -- the scaffold gitignore ignores *.local-only).

Why a wrapper is required (verified against uv 0.9.17):

  • uv pip install -e ../x alone is wiped by the next uv sync: exact sync

reinstalls the locked registry wheel even at equal versions.

  • uv sync --inexact --no-install-package <name> preserves a pre-existing

editable install; neither flag has an env-var equivalent.

  • Bare uv run auto-syncs (and wipes overlays) unless UV_NO_SYNC=1 is set,

hence the hard gate below.

#_repo_root

python
def _repo_root(project_root)

The git repository project_root is in, or None when it is in none.

The scope guard below is about THIS REPOSITORY, so it asks git rather than comparing against the project directory: a member of a workspace is inside the repository without being inside the sub-project, and a checkout that is its own repository is outside it however close by it sits on disk.

#_is_inside

python
def _is_inside(path, root)

Is path the same directory as root, or under it?

#_member_spellings

python
def _member_spellings(project_root)

Every name a member of this workspace can be installed under.

Its workspace name and the registry_name it publishes as, normalized the way uv normalizes a distribution name, mapped to the member path that declared it. Empty when the project is not in a workspace.

#_scope_refusal

python
def _scope_refusal(project_root, package, path)

The refusal for an overlay that names something inside this repository.

An overlay puts a SIBLING repository's checkout in front of the registry wheel this project locked. Two things it therefore cannot name, each with its own reason:

  • a package this workspace itself builds. The member IS that package's

source, so an editable second copy of it means the code under test is decided by install order rather than by declaration -- and what the overlay would shadow is not a released wheel at all.

  • a path inside this repository. uv pip install -e on it makes the

environment depend on a tree that ships with the repository, which is the hazard the committed-path-source ban exists for, in a different medium: it resolves here and nowhere else.

Returns the message, or None when the overlay names neither.

#_load_overlays

python
def _load_overlays(project_root)

Parse and validate the overlay file. Returns a list of {"package": str, "path": str (absolute), "version": str | None} dicts, or None after printing a hard error. Never a silent no-op.

#_write_sentinel

python
def _write_sentinel(project_root, overlays)

Atomically record the intended overlay state after a successful sync.

Writes SENTINEL_FILENAME alongside the overrides file (gitignored via the *.local-only pattern), capturing per overlaid package: its distribution name, the editable checkout path, and the overlaid version (read from the checkout's pyproject at sync time). The drift check and rlsbl dev status read this to detect when a later bare uv sync/uv run reinstalled the locked registry wheel over the overlay -- a silent wipe that would run the consuming project's tests against stale RELEASED dependency code.

Atomic write (tmp + os.replace) per the codebase convention for shared state. overlays is the list returned by _load_overlays.

#run_status

python
def run_status(project_root)

Entry point for rlsbl dev status. Prints the declared overlays and their actual venv state, then returns a process exit code: 1 if any declared overlay was wiped or is missing (scriptable), 0 otherwise -- including when no overlays are declared (no sentinel).

#run_sync

python
def run_sync(project_root)

Entry point for rlsbl dev sync. Returns a process exit code.

More tools from this site

  • claudestream Drive Claude Code from Python: run it as a subprocess and read its output as typed events, with async and sync sessions, sandbox policies, and tools you define in Python
  • claudewheel A TUI Claude Code Launcher that lets you have more than one profile, manage sessions lifecycle, pick the exact CC version, model to use (even older unlisted ones), pick which GitHub account to use, etc.
  • dirstat Fast, single-binary directory statistics CLI: every file under a tree grouped by format, with counts, sizes, and lines of code, as a colored terminal table or as JSON
  • fastware A batteries-included ASGI framework: msgspec JSON, a managed Granian server, dependency injection, SSE, WebSockets, auth, and a test client
  • go-toml-edit Zero-dep TOML editing library for Go with comment preservation
  • howmuchleft The fastest Claude Code statusline: context window, 5-hour, and weekly limit usage as three customizable gradient bars, rendering in about 6 ms
  • orxtra
  • pgdesign
  • predraw Declarative rendering pipeline: describe a scene in JSON and get SVG, PNG and WebP out, with light and dark style tokens, reusable components and text converted to path outlines
  • reposummary Turn a git repository's history into a Markdown journal: pick a time window or revision range and get a readable digest of what changed, optionally narrated by an LLM
  • safegit git wrapper CLI that gives each commit its own temporary index and retries ref updates on conflict, so concurrent agents share one repository
  • saferm Command-line replacement for rm that archives every deletion with a mandatory reason and the context it ran in, so deleted files can be listed, inspected and restored
  • selfdoc Static Site Generator that builds a project's documentation site directly from its source code, so the docs can never drift from the code they describe, with SEO/AEO, first-class blog, search, and cross-project linking built in
  • strictcli
  • stricttest An always-on test-isolation floor: a pytest plugin and a Go env-hygiene module that make a test suite structurally unable to reach real credentials, the real HOME, the network, or the development repository.
  • wesktop A Python framework that turns an ASGI web app into a desktop application, serving it from a local Granian server and displaying it in a native OS window via pywebview
Search