Skip to content
rlsbl.workspace_types
On this page

Core workspace types and path-building utilities defining WorkspaceProject, Releasable, and directory resolution for monorepo workspace operations.

#rlsbl.workspace_types

#rlsbl.workspace_types

Core workspace types and path-building utilities defining WorkspaceProject, Releasable, and directory resolution for monorepo workspace operations.

This module contains the fundamental types (WorkspaceProject, Releasable) and pure path-building functions (get_releasable_dir, etc.) that are used across the codebase. It is intentionally free of imports from targets, workspace, context, or checks to break circular dependency cycles.

The workspace module re-exports everything from here so existing importers are unaffected.

#get_releasable_dir

python
def get_releasable_dir(workspace_root, releasable_name)

Return the directory path for a releasable's state files.

Path: <workspace_root>/.rlsbl-monorepo/releasables/<name>/

Args:

  • workspace_root: path to the monorepo root.
  • releasable_name: name of the releasable.

Returns:

  • Absolute path string to the releasable directory.

#get_releasable_changes_dir

python
def get_releasable_changes_dir(workspace_root, releasable_name)

Return the path to a releasable's changelog changes directory.

Path: <workspace_root>/.rlsbl-monorepo/releasables/<name>/changes/

Args:

  • workspace_root: path to the monorepo root.
  • releasable_name: name of the releasable.

Returns:

  • Absolute path string to the changes directory.

#get_releasable_version_path

python
def get_releasable_version_path(workspace_root, releasable_name)

Return the path to a releasable's version file.

Path: <workspace_root>/.rlsbl-monorepo/releasables/<name>/version

Args:

  • workspace_root: path to the monorepo root.
  • releasable_name: name of the releasable.

Returns:

  • Absolute path string to the version file.

#get_releasable_hook_path

python
def get_releasable_hook_path(workspace_root, releasable_name, hook_name)

Return the absolute path to a releasable-level hook script.

Path: <workspace_root>/.rlsbl-monorepo/releasables/<name>/hooks/<hook_name>

Args:

  • workspace_root: path to the monorepo root.
  • releasable_name: name of the releasable.
  • hook_name: hook file name (e.g. "pre-checks.sh").

Returns:

  • Absolute path string. The file may or may not exist on disk.

#Releasable

A named unit of versioning: a group of packages sharing version, changelog, and release.

Releasables are defined via [[releasables]] in workspace.toml.

tag_format is the DECLARED format and may be :data:TAG_FORMAT_ABSENT. Anything that needs a format to work with reads :attr:effective_tag_format, which resolves absence to :data:DEFAULT_TAG_FORMAT. The split is the point: the declared value answers "what does workspace.toml say", the effective value answers "what do this releasable's tags look like", and only the first can tell a workspace that meant the default from one that never thought about it.

#declares_tag_format

python
def declares_tag_format(self) -> bool

Did workspace.toml state a tag_format for this releasable?

#is_mirrored

python
def is_mirrored(self) -> bool

Is this releasable bound to a standalone subtree mirror?

The binding is the mirror's DESTINATION, and it belongs to the releasable rather than to a member package: a mirror carries one subtree's whole history, its tags and its GitHub Releases, and the unit that owns a version, a changelog and a tag scheme is the releasable. A releasable with more than one member therefore cannot declare one at all -- the loader refuses that outright, because there would be no one subtree to mirror.

#effective_tag_format

python
def effective_tag_format(self) -> str

The format this releasable's tags actually use.

:data:DEFAULT_TAG_FORMAT when none was declared -- the workspace scheme, which is right for every releasable except one that owns the repository root, and the loader refuses that case outright rather than letting it reach here.

#is_runtime_member_key

python
def is_runtime_member_key(key) -> bool

Is key runtime bookkeeping rather than a declared member key?

#WorkspaceProject

Typed wrapper over a workspace.toml project dict.

Provides typed property access for the member keys in :data:MEMBER_KEYS -- one accessor per key, plus the derived dev_node and is_releasable. The underlying dict is preserved for serialization. Dict-like [], get(), and in access is supported for code that treats projects as dicts.

#name

python
def name(self) -> str

#path

python
def path(self) -> str

#library

python
def library(self) -> bool

#dev_only

python
def dev_only(self) -> bool

#dev_node

python
def dev_node(self) -> bool

Derived shorthand: True when dev_only and outside every releasable.

Both halves are required, and both are declared: dev_only = true says what the member IS, releasable = false says it stands outside every releasable. There is no single key for the combination -- the dev_node key was deleted, and the loader refuses it by name.

#is_releasable

python
def is_releasable(self) -> bool

Whether this project can produce releases.

A project is releasable when it belongs to some releasable unit (releasable = "name"). Returns False when releasable = false is set explicitly, or when the project is a dev_node.

#depends_on

python
def depends_on(self) -> list[str]

#releasable

python
def releasable(self) -> 'str | bool | None'

The releasable this project belongs to.

Returns:

  • str: name of the releasable group this project belongs to.
  • False: project is explicitly unversioned (no releases).
  • None: field not set.

#import_name

python
def import_name(self) -> str

#registry_name

python
def registry_name(self) -> str

#description

python
def description(self) -> str

Free-text description, carried into the monorepo snapshot.

#test_only

python
def test_only(self) -> bool

Is this member test infrastructure? Carried into the snapshot.

#lint_allow

python
def lint_allow(self) -> list[str]

Imports the library-lint check allows for this member.

#get

python
def get(self, key, default=None)

Dict-like access for backward compatibility.

#to_dict

python
def to_dict(self) -> dict

Return the underlying dict for serialization.

#project_is_dev_only

python
def project_is_dev_only(proj) -> bool

Check if a project is dev_only (works with WorkspaceProject or dict).

#project_is_dev_node

python
def project_is_dev_node(proj) -> bool

Is proj a dev node (dev-only AND outside every releasable)?

Works with :class:WorkspaceProject or a raw dict. The two declared keys are the input; "dev node" is derived from them and never declared.

#project_is_releasable

python
def project_is_releasable(proj) -> bool

Check if a project is releasable (works with WorkspaceProject or dict).

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