URI: scheme://authority/path?ref#fragment

Beagle employs Uniform Resource Identifiers (URIs) to uniformly identify all the revision controlled resources (surprise!). URIs address any repos, files, branches, revisions, blobs and any views/projections the system can produce. URI format is [scheme:][//authority][path][?ref][#fragment] and each component reflects one orthogonal aspect:

Shape changes semantics

Each populated URI slot adds its effect orthogonally, and the slot combination determines the operation shape, e.g. for PATCH where the ?/! shape selects the absorb scope while POST sets the provenance (see the dirty-words post).

Relative URIs

URIs as typed by the user can be context-dependent — relative or implied paths, tags, branches. For internal use and storage fully-resolved URIs are safer, so URIs get resolved at the entry point, to prevent any later ambiguity.

Path shapes: legacy, repo-relative, recursive, cwd-relative

URI paths specify paths in the tree objects that lead to the tree/blob/submodule of interest. In some cases (legacy/ssh:/file:), a path may also specify the file system path to the repo. (Beagle per se prefers one repo per host.) So, the cases are:

Ref shapes: resolved, absolute, project- & branch-relative

Beagle branches are tree-structured, the trunk is named as the project e.g. ?/beagle/submods. Cases are:

be CLI argument classification

Every non-flag argv token becomes one URI via DOGNormalizeArg; the token's markers decide the slot, so the common case needs no punctuation.