Skip to content
Musher Docs

Bundle Structure

Reference for the three resources that make up a bundle — the bundle itself, its assets, and its published versions. Each section lists the fields you see in API responses.

How the Resources Relate

A bundle is a named container you create. You add assets (text files) to it. When ready, you publish a version — an immutable snapshot of all current assets.

  1. Create a bundle with a unique slug in your namespace.
  2. Add one or more assets — each is a text file at a logical path.
  3. Publish a version to freeze the current assets into a snapshot that consumers can resolve.

For the full lifecycle, see the Bundles overview.

Entity Reference

Bundle

The top-level container you create to hold related assets. Each bundle is identified by a slug unique within its namespace.

FieldTypeConstraintsDescription
idUUIDPK, auto-generatedUnique identifier
namespacestringmax 40 chars, NOT NULLOwning namespace
slugstringmax 100 chars, unique per namespaceURL-safe, CLI-friendly identifier
namestringmax 255 chars, NOT NULLHuman-readable display name
descriptionstring | nullmax 1000 charsOptional longer description
visibilitystringNOT NULL, default privateOne of private, workspace, or public. Default private.
created_atdatetimeNOT NULL, UTCCreation timestamp
updated_atdatetime | nullUTCLast modification timestamp
deleted_atdatetime | nullUTCSoft-delete timestamp

BundleAsset

A single text file you add to a bundle. Each asset has a logical path that must be unique within the bundle. You classify it with an asset type — see Asset Types.

FieldTypeConstraintsDescription
idUUIDPK, auto-generatedUnique identifier
bundle_idUUIDFK, NOT NULLParent bundle
asset_typestringmax 50 chars, NOT NULLClassification label (free-form, not an enum). See Asset Types.
logical_pathstringmax 500 chars, unique per bundleFilesystem-like path, e.g. prompts/summarize.md
content_textstringNOT NULL, max 512 KBThe asset body (text only)
content_sha256string64 chars (hex), NOT NULLSHA-256 hash of content_text, computed on write
created_atdatetimeNOT NULL, UTCCreation timestamp
updated_atdatetime | nullUTCLast modification timestamp
deleted_atdatetime | nullUTCSoft-delete timestamp

BundleVersion

A frozen snapshot created when you publish a bundle. Once published, contents cannot change. See Publishing for the full workflow.

FieldTypeConstraintsDescription
idUUIDPK, auto-generatedUnique identifier
bundle_idUUIDFK, NOT NULLParent bundle
versionstringmax 50 chars, unique per bundleSemver-style version string
statestringNOT NULL, default publishedEither published or yanked. Default published.
oci_refstring | nullFull OCI reference, e.g. registry/namespace/slug:1.0.0. See Publishing > OCI Integration.
oci_digeststring | nullmax 100 charsOCI content digest. See Publishing > OCI Integration.
manifest_jsonobject | nullJSONBFrozen manifest at publish time. See Publishing > Manifest Schema.
published_bystring | nullmax 255 charsActor who published (user ID or API key label)
yanked_bystring | nullmax 255 charsActor who yanked
yanked_atdatetime | nullUTCWhen the version was yanked
yank_reasonstring | nullmax 500 charsHuman-readable reason for yanking
created_atdatetimeNOT NULL, UTCPublish timestamp
deleted_atdatetime | nullUTCSoft-delete timestamp

Enums

Visibility

ValueDescription
"private"Only the creating user or API key can access
"workspace"All workspace members can access
"public"Anyone can resolve and download (no auth required)

Version State

ValueDescription
"published"Active — included in resolution
"yanked"Withdrawn — excluded from resolution

Limits and Constraints

LimitValue
Max asset content size524,288 bytes (512 KB)
Max assets per bundle200
Max slug length100 characters
Max name length255 characters
Max description length1,000 characters
Max version string length50 characters
Max asset type length50 characters
Max logical path length500 characters
Max yank reason length500 characters

Guarantees

The platform enforces these rules. The API returns an error if any are violated.

  1. Slug unique per namespace — you cannot create two bundles with the same slug in the same namespace. The API returns a 409 Conflict.
  2. Logical path unique per bundle — you cannot add two assets with the same logical path to the same bundle. The API returns a 409 Conflict.
  3. Version unique per bundle — you cannot publish two versions with the same version string in the same bundle. The API returns a 409 Conflict.
  4. Empty bundles cannot be published — a bundle must have at least one asset before you can publish a version. The API returns a 422 Unprocessable Entity.
  5. Published versions are immutable — once created, a version's manifest, content hashes, and version string cannot be modified. The only allowed state transition is published → yanked.

Design Rationale

Why are assets restricted to text content?

Text enables deterministic diffing, transparent auditing, and simple integrity verification via SHA-256 hashing. Binary blobs would complicate content-addressable storage, make diffs opaque, and introduce encoding ambiguities. If binary assets are needed in the future, they can be added as a separate asset type with different storage semantics.

Related Pages