Skip to content

rk 0.1.15

Latest

Choose a tag to compare

@danReynolds danReynolds released this 12 Oct 02:20
· 1 commit to main since this release
f99d5ed
  • rk use local and rk install local reuse 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; --clean still 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.txt beside
    their license and README when the application package supplies it.

  • rk stage and rk release carry 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 local compiles the checkout for fast command startup. Run it again
    after source edits to rebuild; a failed build keeps the previous commands
    usable. --clean preserves 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 stage and rk release refuse uncommitted
    changes for every unit and a directory outside Git (RK-GIT-001,
    "commit first"); RK-SRC-001 and RK-SRC-002 are gone.
    rk stage no longer needs HEAD on origin; only the tag rk release pushes
    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-013 and RK-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-003 and
    RK-TAG-004 are gone).
  • The release tag is made on the staged commit. rk signs it when
    tag.gpgSign asks, 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 release publishes 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 as v1.0 under v{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 stage says 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 login runs 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 stage and
    rk release read every unit's destinations at once.
  • Pub resolves each package once, the way its consumers will, through its
    normal cache, in one dart 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 with RK-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, as git archive leaves 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 .rk that is a symbolic link, such as one on another disk, is used
    where it leads; rk clean still removes a stage that is a link without
    following it. RK-STAGE-001 no longer reports "the release stage path is
    unsafe".
  • A dependency written with no constraint (foo:, foo: ~ or foo: null)
    allows any version, as Pub reads it (RK-DEP-002 is gone). A comma inside
    a quoted list item in release.toml no 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-018 and RK-SIGN-019 are 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 status and rk release read a unit through one shared snapshot, so
    they agree on it. rk status lists 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 stage and rk release of 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, and rk target without a name lists the targets.
    rk --version --json prints {"version": ...}. A closed stdout or
    stderr, as in rk --help | head -1, ends rk quietly.
  • rk init with a release.toml already there points to rk status instead
    of reporting a problem (RK-INIT-002 is gone).
  • --json drops keys that never carried anything: took_ms, the plan's
    constant source_only and destinations_inspected, and each status
    target's source_binding and source_comparison. rk plan --json drops
    dependency_candidates; requires_units and the node graph carry the
    order.
  • rk clean removes 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 plan on Fleury's four
    packages reads them in about 0.03s instead of 0.1s.

  • rk status and rk release check 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 use does 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-001 RK-CONF-002
    RK-CONF-008, RK-CONF-016, RK-CONF-038 RK-CONF-003
    RK-CONF-004, 006, 007, 010, 013, 014, 015, 017, 018, 020, 022, 023, 027, 028, 029, 032, 033, 037, 040, 042, 043; RK-CONF-041 for a malformed list RK-CONF-005
    RK-CONF-012, 019, 024, 025, 036, 039, 044, 045; RK-CONF-041 without binary_platforms RK-CONF-009
    RK-CONF-011 removed: it only followed another refusal
    RK-CONF-034 RK-SRC-003
    RK-RES-012 RK-CONF-009, refused before any manifest is read
    RK-RES-014 RK-RES-003
    RK-RES-005, RK-RES-015 RK-RES-004
    RK-RES-007 RK-RES-006
    RK-RES-017 RK-RES-009, once for a unit whose release several projects build
    RK-YAML-001 RK-PKG-001
    RK-PKG-003 RK-RES-002
    RK-CHG-002 RK-CHG-001
    RK-CLI-001 RK-CLI-005
    RK-CLI-008, RK-CLI-009 RK-CLI-003
    RK-CLEAN-001, RK-CLEAN-002 RK-STAGE-006
    RK-CLEAN-004 RK-AUTH-001
    RK-GIT-002 RK-GIT-003
    RK-SRC-004 RK-GIT-001
    RK-INIT-005 RK-INIT-004

rk use

  • rk use opens 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's opt link 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.md shows 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 uninstall refuses 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; run rk use once to move it to the new launchers. Then what
    0.1.14 kept under ~/.local/share/rk, managers and projects, can be
    deleted.
  • Local is the checkout itself: rk install local prepares 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-002 is
    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 use no longer says to put it there.
  • Bare rk install and rk uninstall open the rk use table.
  • rk use local runs Dart commands whose dependencies have build hooks
    (native assets) from any directory, through a small bootstrap. Select
    Local again to prepare it.
  • rk use finds local commands in projects that depend on path or Git
    packages.