Repository navigation
-
rk use localandrk install localreuse the exact completed release
bundle when it matches the clean checkout and host platform. Local installs
preserve signing and native assets without another build or SDK, remain
usable after stage cleanup, and show their stage provenance. Edits and
unstaged checkouts still build development snapshots;--cleanstill runs
source directly. -
Status and release snapshots share the GitHub release observation used by
GitHub and Homebrew targets. Publication checks still read fresh state. -
Switching command sources prepares every launcher before replacing any,
keeping the previous selection when launcher preparation fails or is cancelled. -
Pure Dart Local builds use the ordinary compiler with or without declarations;
native hooks retain the bundle builder. Installation status reuses one read of
command routing for its selection and warnings. -
Compiled Local installations show their build time, source commit and whether
the checkout had edits when compilation began. Inventory reads use the saved
build record without checking Git or rebuilding. -
Failed installation tools retain their complete output in JSON reports,
the picker's error details and.rk/diagnosis. Build errors now ask you to fix
the reported problem and retry rather than suggesting source execution. -
The source-execution option is now
rk use local --clean. It runs the
checkout directly; it does not delete build caches. -
Compiled Local builds now support native hooks together with configured Dart
declarations, using the same optional SDK helper as native releases. -
Binary archives and installations retain
THIRD_PARTY_NOTICES.txtbeside
their license and README when the application package supplies it. -
rk stageandrk releasecarry Dart native code assets through signing,
notarization, archives, GitHub installation and Homebrew. Dart hooks derive
the library inventory; no library lists or application-specific plugin is
needed. Native cross-target builds use an operator-supplied Linux image.
See CLI artifacts for the temporary SDK helper and
build environment requirements. Existing stage hashing and reuse boundaries
remain unchanged. -
An opt-in Dart native-build preview carries
the SDK patch for compile-time declarations and separate AOT output while
upstream support is pending. It uses stock Dart 3.13.5 on macOS ARM64;
the source helper can also be rebuilt for Linux ARM64 and x64. -
rk use localcompiles the checkout for fast command startup. Run it again
after source edits to rebuild; a failed build keeps the previous commands
usable.--cleanpreserves direct source execution during development.
Local builds retain native hook libraries and configured Dart defines. -
Binary archives use fixed gzip level 6: measured roughly three times
faster than level 9, with about 0.2% larger archives on Keybay and rk. -
GitHub installation uses the same archive extraction as identity checks,
applying the validated file modes in batches instead of per-file processes. -
Decoded binary archives keep compact immutable byte buffers, reducing
extraction time and peak memory without changing their contents. -
Native Pub archives are copied into the stage through the existing atomic
replacement boundary instead of being loaded into memory first. -
Registry responses release their bodies, allowing connection reuse. A
stalled body is cancelled within the existing response timeout; successful
responses still require complete valid data, and errors retain their status. -
Staging shares four build and package-validation slots across the
repository, preventing larger runs from starting a compiler for every
package at once. Notarization waits remain concurrent. -
Recording and verifying staged files hashes them in bounded chunks,
without loading an entire artifact into memory. -
Homebrew recovery keeps the tap state it already read while rendering the
replacement formula. The fresh clone still checks that exact state before
an update; recovery no longer reads the same formula twice.
rk now stages and releases a commit, reads each destination once, and asks
one question for the whole run. A fresh stage of Fleury's four packages takes
about 10s (2m 9s with 0.1.14), reusing it under a second (about 30s), and
releasing them and their two tags takes three trips to origin.
Stages an earlier rk saved are not reused, and rk clean removes them: a
release an earlier rk left partly published finishes with that rk.
Releasing
- A release is of a commit.
rk stageandrk releaserefuse uncommitted
changes for every unit and a directory outside Git (RK-GIT-001,
"commit first");RK-SRC-001andRK-SRC-002are gone.
rk stageno longer needs HEAD on origin; only the tagrk releasepushes
does. - A release reads public state once and asks one question for every unit's
remaining targets; the yes covers exactly those. rk signs in to pub.dev and
GitHub once a run, after the yes, and no longer logs out of a pub session
it created. The re-checks it made at a dozen boundaries are gone, with
RK-DEST-001,RK-AUTH-003,RK-SIGN-013andRK-STAGE-004. - Right before an upload rk reads the registry again and checks the staged
bytes. A run lists origin's tags once, and a tag push is confirmed by git,
which refuses to replace a tag origin has; a refused push reads origin's
tag and reports the conflict with the usual advice (RK-TAG-003and
RK-TAG-004are gone). - The release tag is made on the staged commit. rk signs it when
tag.gpgSignasks, as git does: a signing key alone, or an earlier signed
tag, no longer signs tags, and rk no longer verifies the signature git
made, so an expired or absent key no longer makes a published tag a
conflict (RK-TAG-006,RK-TAG-007). - A version on pub.dev counts as published: rk no longer compares a fresh
stage's archive with one already there. After its own upload it still
reads the archive back. After an upload pub.dev refused, it reads back for
ten seconds, not ten minutes; after one it accepted, a read that fails is
asked again until the version shows or ten minutes pass. It no longer
downloads each published package into a fresh Pub cache (RK-PUB-013,
RK-REL-004). - A stage is needed only while public bytes must match it: assets on a
GitHub release, or a Homebrew formula that names their hashes
(RK-STAGE-005). A published package no longer requires its original
stage. Without its stage, a Homebrew formula is rendered from the digests
GitHub reports for the published archives, and a formula already at the
release's version counts as published. rk releasepublishes a package's dependencies from this repository before
it. A named release whose package needs a sibling not on pub.dev yet says
to release them together (rk release) or the sibling first.- A GitHub release whose title or notes were edited after publishing is still
the release. A package pub.dev lists under another repository refuses
before anything is pushed, and says what to do when the repository moved
(RK-PUB-010). - A tag on origin that matches the release pattern without naming a version,
such asv1.0underv{version}, no longer refuses every release. A
release tag only this clone has, made by hand, is refused with
git tag -d <tag>as the fix, rather than as a public tag to leave alone. rk stagesays to push first when origin lacks the commit a release's tag
would name, rather than offering a release that would refuse.- With no pub session stored,
dart pub loginruns at once, not after
twenty silent seconds. - A release whose lanes ran at once no longer says nothing public changed
after one of them published.
Staging
- A stage is named by what it is built from: commit, tree, configuration and
origin. Updating rk, Dart or Xcode, or setting up a signing key, no longer
orphans a stage a partly published release needs. Reuse checks the
receipt and the size and digest of every published file; files the receipt
does not name are ignored. - Units stage side by side, from one read of the commit, and
rk stageand
rk releaseread every unit's destinations at once. - Pub resolves each package once, the way its consumers will, through its
normal cache, in onedart pub publish --to-archive. A sibling whose
version is not on pub.dev yet comes from the same commit, through a path
override Pub leaves out of the archive; everything else, including a
published sibling, comes from pub.dev. rk no longer downloads dependencies
itself or freezes their choices in a stage. A tracked dependency override
no longer refuses a package (RK-PUB-008,RK-PUB-016,RK-PUB-018), and
a Dart package in a workspace with Flutter packages stages with a
standalone Dart. - A stage holds only what rk publishes, and its receipt; it no longer keeps a
copy of the source, which was 148 MB for each of Fleury's packages. Each
producer builds in a directory of its own, with the source its build
reads: for a package's Pub archive, every package in the repository, the
files above it, what links lead to and the analysis options they include.
A binary, whose Dart source can import any file by its path, and a
project's own build get everything. rk's own memory during a fresh stage
of Fleury peaks at about 140 MB, down from 225 MB. - A repository that tracks a symbolic link, such as
CLAUDE.md -> AGENTS.md,
or a submodule stages. A link is exported as a link, with what it leads to.
A submodule, whose files the commit does not hold, or a link that leads out
of the commit, such as to an absolute path, refuses withRK-STAGE-003,
naming it, when a Dart package holds or links to it, or anywhere in a
repository whose project builds binaries or runs its own build; one no
build reads is left out, asgit archiveleaves out a submodule. - Staging offline reports that Pub could not reach the registry
(RK-PUB-019), not validation errors to fix. - The run that resumes an interrupted stage shows the warnings its recorded
work found, such as Pub's, before a release asks. - A stage that no longer validates (
RK-STAGE-002) names each file that is
wrong, by its path in the stage: missing from the completed stage, or
differing from the receipt in size or digest. - A
.rkthat is a symbolic link, such as one on another disk, is used
where it leads;rk cleanstill removes a stage that is a link without
following it.RK-STAGE-001no longer reports "the release stage path is
unsafe". - A dependency written with no constraint (
foo:,foo: ~orfoo: null)
allows any version, as Pub reads it (RK-DEP-002is gone). A comma inside
a quoted list item inrelease.tomlno longer breaks the list. Pubspecs
are read with package:yaml, as Pub reads them. - macOS signing uses the certificate the preflight chose and trusts
codesign's exit status (RK-SIGN-012,RK-SIGN-015,RK-SIGN-016,
RK-SIGN-018andRK-SIGN-019are gone). An accepted notarization no
longer fails when Apple's log cannot be fetched afterwards
(RK-NOTARY-003), and only the artifact's files are submitted. A
container runtime is asked for only when a smoke test needs one.
Status, plan and output
rk statusandrk releaseread a unit through one shared snapshot, so
they agree on it.rk statuslists units in release order, shows another
unit's package that releases first as "Releases after", lists the warnings
a stage recorded, and suggests the command that works: a unit stages
alone, and releases with the sibling it releases after. With one edited
file it reads the working tree once, in under half a second and 33 MB on
Fleury.rk stageandrk releaseof several units say what they stage once: one
heading, one Warnings section, one summary and one next step, with
warnings in release order whichever unit finishes first, or stops.
Piped output carries no times or counts. A long unit name is shortened
rather than stopping the run, and a release says it acted only once
something public changed.rk help [command]prints a command's help. A flag a command does not take
is refused in two lines, andrk targetwithout a name lists the targets.
rk --version --jsonprints{"version": ...}. A closed stdout or
stderr, as inrk --help | head -1, ends rk quietly.rk initwith a release.toml already there points tork statusinstead
of reporting a problem (RK-INIT-002is gone).--jsondrops keys that never carried anything:took_ms, the plan's
constantsource_onlyanddestinations_inspected, and each status
target'ssource_bindingandsource_comparison.rk plan --jsondrops
dependency_candidates;requires_unitsand the node graph carry the
order.rk cleanremoves what it showed, and leaves alone an entry that changed
while you answered.- A control character in a tool's or a destination's message shows as a
space in a progress row, rather than stopping rk.
Configuration and diagnostics
-
A clean commit's release inputs are read in two
git cat-file --batch
calls: release.toml with the root tree, then each project's directory,
pubspec.yaml, Cargo.toml and CHANGELOG.md.rk planon Fleury's four
packages reads them in about 0.03s instead of 0.1s. -
rk statusandrk releasecheck the changelog of the commit they
release, not the working tree's, and read one committed as a link the
way a stage does: through every link on the way, within the commit. One
rk cannot read, such as one that is not UTF-8 or a link out of the
commit, is reported on its own unit (RK-CHG-001) rather than stopping
rk;rk usedoes not read changelogs. -
A table header inside an array of tables, such as
[release.core.project.x], is a TOML error (RK-TOML-001). -
A diagnostic code names the kind of mistake; the message names the
setting, and the location its line. Codes that repeat another are merged,
and doc/codes.md lists 95 codes, down from 150:was now RK-CONF-001RK-CONF-002RK-CONF-008,RK-CONF-016,RK-CONF-038RK-CONF-003RK-CONF-004,006,007,010,013,014,015,017,018,020,022,023,027,028,029,032,033,037,040,042,043;RK-CONF-041for a malformed listRK-CONF-005RK-CONF-012,019,024,025,036,039,044,045;RK-CONF-041without binary_platformsRK-CONF-009RK-CONF-011removed: it only followed another refusal RK-CONF-034RK-SRC-003RK-RES-012RK-CONF-009, refused before any manifest is readRK-RES-014RK-RES-003RK-RES-005,RK-RES-015RK-RES-004RK-RES-007RK-RES-006RK-RES-017RK-RES-009, once for a unit whose release several projects buildRK-YAML-001RK-PKG-001RK-PKG-003RK-RES-002RK-CHG-002RK-CHG-001RK-CLI-001RK-CLI-005RK-CLI-008,RK-CLI-009RK-CLI-003RK-CLEAN-001,RK-CLEAN-002RK-STAGE-006RK-CLEAN-004RK-AUTH-001RK-GIT-002RK-GIT-003RK-SRC-004RK-GIT-001RK-INIT-005RK-INIT-004
rk use
rk useopens and lists in about 0.1s, down from about 1s with a Homebrew
installation, and switching a source takes about 0.2s.- A Homebrew selection keeps running after
brew upgrade: launchers go
through Homebrew'soptlink instead of a versioned keg. - Switching rk's own source no longer copies, or compiles, the running rk
first. If rk's own checkout stops compiling while Local is selected, run a
published rk by its path to switch back;doc/installations.mdshows how. - A GitHub update replaces the previous download, uninstall removes every
download, and an install or update interrupted after unpacking finishes
when it runs again, without downloading again. - rk reads the selection back from the launchers, each of which names its
project and source, and keeps GitHub downloads under
~/.local/share/rk/downloads/<package>, so adding or renaming a project's
GitHub remote no longer makes rk refuse its own commands or lose its
download. rk still refuses a command it selected for another project, and
rk uninstallrefuses a source any of the project's commands runs,
including through a launcher 0.1.14 wrote. A selection made by 0.1.14 keeps
running; runrk useonce to move it to the new launchers. Then what
0.1.14 kept under~/.local/share/rk,managersandprojects, can be
deleted. - Local is the checkout itself:
rk install localprepares it, and Local
shows as installed only while it is selected. - Cancelling a switch before its package manager starts installs nothing;
it used to install, then refuse to switch. - Installation files or metadata rk cannot read are reported as
RK-USE-001, like every other refused installation;RK-USE-002is
gone. Bad metadata reads "The installation metadata is invalid.", and a
command that cannot start is named instead of "the package manager". - A GitHub download keeps the archive's file modes (0755 for executables,
0644 otherwise) rather than 0700 and 0600. It follows the redirects GitHub
gives it, and is checked against the release manifest's size and SHA-256
as before; rk no longer limits which hosts it may be redirected to, caps
archive sizes, or verifies macOS code signatures again at install. - A
bin/script that links outside its package can be selected. - rk's bin directory on PATH written with a trailing slash, or through a
link, counts as first:rk useno longer says to put it there. - Bare
rk installandrk uninstallopen therk usetable. rk use localruns Dart commands whose dependencies have build hooks
(native assets) from any directory, through a small bootstrap. Select
Local again to prepare it.rk usefinds local commands in projects that depend on path or Git
packages.