Skip to content

release: 0.7.1 - #62

Merged
lorem-dev merged 40 commits into
mainfrom
release/0.7.1
Sep 9, 2026
Merged

release: 0.7.1#62
lorem-dev merged 40 commits into
mainfrom
release/0.7.1

Conversation

@lorem-dev

Copy link
Copy Markdown
Owner

Promotes the second release candidate to the final 0.7.1 and carries the release branch into main. The final tag is cut from here afterwards -- scripts/check-tag-branch.mjs enforces that as the release pipeline's first job.

The release commit

Every manifest moves from 0.7.1-rc.2 to 0.7.1. CHANGES.md's section heading is renamed rather than promoted: the release candidate contained exactly this content, and one section per shipped version is what the rest of the file does. ## Development stays empty.

$ node scripts/check-version.mjs v0.7.1
check-version: all packages at 0.7.1, matches v0.7.1

$ node scripts/release-notes.mjs v0.7.1
### Changed
- Adding a repository that fails now keeps the dialog open and states the
  reason, instead of closing and leaving only a notification.

Twelve ## Version sections, one heading for 0.7.1, no duplicate; ## Development still parses where bump-version expects it.

What the release contains

One changelog bullet, and that is accurate -- it is the only thing in this release a user can see. Behind it:

  • Security tooling. CodeQL code scanning (security-and-quality) and Dependabot, both aimed at develop. Every workflow job now declares its own token scope, and third-party actions are pinned to commit SHAs -- dtolnay/rust-toolchain@1.97.1 turned out to be an unprotected branch, so the job that signs and publishes releases had been running whatever its head happened to be.
  • Dependency updates. Six landed, including the sha2 0.11, argon2 0.6, toml 1.1 and aes majors. Each was checked against the golden vectors that guard skill content hashes and PPK key derivation, so existing hashes and keys read exactly as before. Two updates were closed rather than merged, with reasons on the pull requests.
  • An end-to-end suite for the desktop interface. Twenty specs across the twelve flows the documentation describes, driven through the real renderer against a scripted backend, blocking on every pull request. 190/190 over --repeat-each=10 with retries: 0.
  • Six defects found and fixed, none of them in the tests. The most reachable: adding an already-tracked repository reported success instead of the error -- that is the bullet above.
  • A gap in the gate itself. pnpm format:check existed as a script that no workflow ran, which is why eight files had drifted unnoticed. It now runs in CI.

Two candidates, both retired

v0.7.1-rc.1 and v0.7.1-rc.2 were cut, published as pre-releases, and deleted. Each earned its keep. rc.1 exercised tauri-action v1.0.0 across all six targets, upload-artifact v7, download-artifact v8 under its new strict digest checking, and the X.Y.Z-rc.N to X.Y.Z.N mapping the MSIX packaging does by hand -- a code path that never executes on a final tag, so a release candidate is the only way to test it. rc.2 confirmed the changelog rules block cannot leak into release notes.

What tagging will do

A final tag triggers docs.yml as well as release.yml: it publishes the versioned documentation and moves the latest alias. Release candidates skip that by tag filter; this one will not. It also makes 0.7.1 the release that releases/latest/download/... resolves to, which is what both one-line installers read.

lorem-dev and others added 30 commits September 8, 2026 23:31
chore: back-merge main into develop
Bumps the cargo-minor-and-patch group with 1 update: [toml](https://github.com/toml-rs/toml).


Updates `toml` from 1.1.4+spec-1.1.0 to 1.1.5+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.4...toml-v1.1.5)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 1.1.5+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.6.0 to 10.0.1.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@37802ad...20cfd1b)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 10.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Lorem Dev <158839528+lorem-dev@users.noreply.github.com>
download-artifact v7 -> v8 and tauri-action v0.6.2 -> v1.0.0, landed in
one commit because they only ever run together and each one's Dependabot
pull request went stale the moment the other merged. upload-artifact
v6 -> v7 went ahead of them in #54.

Neither is exercised by any pull request: release.yml runs on a tag and
nothing else. What follows is the compatibility review that stands in
for a check, per change.

download-artifact v8 has the one real breaking change of the three. A
digest mismatch is now an error rather than a warning, and the action no
longer unzips a download whose Content-Type says it is not a zip. Both
exist to support v7's direct (unzipped) uploads; this pipeline uploads
ordinary zipped artifacts and downloads them in the same run, so the
second is inert and the first is a straight gain -- a corrupted transfer
now fails the release instead of publishing a damaged asset.

tauri-action v1.0.0 carries eight breaking changes and none of them
reach this workflow:

  - The step passes `projectPath` and `args`, nothing else. The renamed
    inputs (assetNamePattern, includeUpdaterJson) and the removed ones
    (includeRelease, includeDebug, updaterJsonKeepUniversal, project
    auto-init) are all unused.
  - No `tagName`, so this is the build-only path and the new "update the
    name and body of an existing release" behaviour cannot fire. The
    publish job still owns the release and its CHANGES.md notes.
  - `.app.tar.gz` and its signature now carry the version. Nothing here
    reads them: "Stage release assets" collects an explicit extension
    allowlist (dmg, deb, rpm, AppImage, msi, exe, msix, and the two
    skillkeeper-cli archives), which never included the updater bundles.
  - Tauri v1 and unstable v2 support is dropped; this app is on 2.11.5.

Two v1 changes do land on this layout, and the workflow already
satisfies both. Runner detection now fails loudly when a lockfile is
present but its package manager is not installed -- corepack and
`pnpm install --frozen-lockfile` both run before this step. And lockfile
detection now walks up the tree, so with `projectPath: apps/desktop` and
the only pnpm-lock.yaml at the repository root, v1 finds a lockfile
where v0.6.2 found none. The worst case there is a redundant install.

The real check is a release candidate: RC tags are cut from develop,
publish as a pre-release, and releases/latest/download never resolves to
a pre-release, so one cannot reach install.sh users.
The updates were all chore/ci commits, which CONTRIBUTING reserves from
the changelog, so Development stood empty. It cannot stay that way
through a release: bump-version promotes that section verbatim and
release-notes.mjs exits non-zero on an empty one, which would fail the
publish job after all six matrix legs had already built and signed.

The bullet is also true on its own terms. A patch release whose entire
content is a dependency refresh should say so, and say what did not
change with it.
The Version column of LICENSE's Third-Party Notices table names what a
release actually ships, and today's updates left nine rows behind: aes,
argon2, interprocess, toml, uuid and the two tauri plugins on the cargo
side, plus motion and the clipboard plugin on the npm side.

Only the versions moved. Every one of these is still MIT OR Apache-2.0,
0BSD OR Apache-2.0, or plain MIT, so the licence and copyright columns
are unchanged and nothing about the policy check changed with them.

Checked the whole direct set rather than only the rows that moved: 30
direct cargo dependencies and 8 npm production dependencies, none
carrying a licence on CONTRIBUTING's disallowed list.
Scenario now carries every field the renderer's bridge types define
(imported straight from the generated/hand-written sources instead of
hand-rolled approximations), and withScenario/the app fixture let a spec
declare one and drive it through a scripted backend. defaultScenario
answers terminal_start and app_update_check so a boot is complete, and
the fixture fails loudly if any command ever reaches the backend
unmocked again.
Move the animation-zeroing stylesheet into a page.addInitScript so it
lands before the app's own scripts on every navigation instead of after
page.goto resolves, closing a window where an entrance animation could
start and finish before the zeroing style arrived. Add self-tests that
drive app.emit and app.clipboard through the same wire shapes the real
event and clipboard-manager plugins use, so their wiring is proven
rather than only reasoned about.
Adds the data-testid convention later tasks reuse (repositories-page,
repo-add-*, repo-row/data-repo-name, repo-row-branch), the two flow-1/
flow-9 specs, and their scenario fixtures.

RepoAddButton now awaits the add-then-clone chain to tell an add-level
failure from success and surfaces it inline instead of closing blind.
Repositories is not the default view, so a nav-<view> testid was added
to the sidebar (App.tsx, SidebarItem.tsx) for the spec to reach it; the
row's name/branch testids landed on RepositoryCard, the only place that
content actually renders. harness.spec.ts's placeholder assertion is
tightened onto the now-real repo-row.
The add form inferred success from any repository row matching the
submitted URL, which a pre-existing duplicate satisfies just as well
as a genuine new row -- so the backend's "duplicate" error (the most
reachable real failure) closed the modal silently instead of showing
repo-add-error. Require the matched row's id to be new since the
submit started; add a regression spec and its duplicateFails scenario.
Add an expectUnmocked fixture option so one spec can name exactly
which commands the harness's "nothing went unmocked" guard should
record instead of failing the test outright, then write the spec
that uses it: an add-repository flow with repositories_add left
genuinely unmocked, asserting both the on-screen error and the
recorded message carry UNKNOWN_COMMAND_PREFIX plus the command name.
Every other spec keeps asserting emptiness unchanged, and the hatch
requires an exact match (wrong count or an empty recording both still
fail), so it cannot become a place future silence hides.
Add a desktop-e2e job that installs Chromium and runs the Playwright
suite, add a prettier check to the existing ci job (never run in CI
before), and widen test:e2e to chain the CLI and desktop suites.
Document both suites under the end-to-end section.
The e2e job ran the widened `pnpm test:e2e`, which now also drives
Playwright, but that job never installs Chromium -- only the new
desktop-e2e job does. Run `pnpm test:e2e:cli` there instead, so the
desktop half runs exactly once, in the job that sets it up.

Also fix a comment on the Playwright browser cache key: it says the
key is scoped to the Playwright version, but it hashes the whole
lockfile on purpose, to avoid a version-parsing gap silently reusing
a stale browser binary.
check-fixture-repo/SKILL.md still told the pre-release gate to run
the widened `pnpm test:e2e`, which now also drives Playwright -- not
what a fixture-repo check needs. Point it at `pnpm test:e2e:cli`, fix
its stale "51 tests" expectation to the current 67, and add the two
mcp-oauth/mcp-parameters specs missing from its per-spec table.

AGENTS.md and the CLI harness's build-check error carried the same
stale command; repoint those too, and note the desktop suite's
existence in AGENTS.md where the CLI suite is documented.
lorem-dev and others added 10 commits September 9, 2026 05:56
Reset submitting on cancel so dismissing an in-flight add no longer
leaves the Add button disabled forever, and key the post-submit error
lookup by the last notification's id instead of the log's length so a
full, capped log no longer swallows a genuine failure.
Toasts is generic cross-cutting UI, so its testid should name the kind
("toast"), not one caller's identity -- rename data-mcp-update-error
to data-testid=toast and let assertions scope by text instead. Give
skill-tree leaves and groups their own unique node id as the identity
attribute value, matching mcpTree.tsx's rule, instead of a bare name
or repo-relative path that two repositories (or Global vs. a project)
can legitimately share.
Assert mcp_apply's payload carries the chosen "Europe" option instead
of only counting the call, so a Select that always submitted its first
option would fail. Assert the agent-count badge's actual text so
agentCount: 2 is read back, not just its visibility. Rewrite a comment
that claimed proof of the instance surviving mcp_update: the scenario's
fixed mcp_installs answer cannot falsify that; the row being visible
only proves the skip message and call count, and the survival claim is
covered by update_inner's own Rust tests instead.
Post-split, "only pnpm test:e2e needs it" misleads: test:e2e:desktop
does not touch the fixture submodule at all.
Ten fixture and spec headers cited paths under `.superpowers/`, which is
git-ignored. For anyone but the author those references resolve to
nothing, so they were a dead end sitting at the top of the files a reader
opens first.

The prose around them was already self-contained: which flows the file
covers, why a command carries no default answer, how row identity works,
which sidebar shape the page has. Only the pointers are gone; nothing
that explained a decision was removed. Where a reference carried real
content -- why flow 12 is not a preflight refusal -- that content is now
stated inline instead of cited.

The remaining `.superpowers` mentions are deliberate and predate this
branch: the entries in .gitignore, .dockerignore and .prettierignore are
load-bearing, and AGENTS.md documents the workflow.
test: cover the desktop UI with end-to-end flows
The rules for this file lived in three places that had drifted apart:
CONTRIBUTING carried a word cap, check-changes asked for a bullet per
feat/fix/refactor/perf commit, and nothing anywhere said what does not
belong. So refactors, CI work and bugs that never shipped all got
entries, and the file drifted from a reason to upgrade toward a commit
log with worse formatting.

The rules now sit at the top of CHANGES.md, where someone about to add a
bullet is already looking, and everything else defers to them rather than
restating them. The one that changes most in practice: a fix earns an
entry only when the bug was BROKEN IN A RELEASED VERSION. A defect
introduced and fixed on the same branch never reached a user, so the
changelog has nothing to say about it -- which is most fixes on a long
branch, and the case check-changes was most likely to report as a gap.

check-docs learns that `## Development` is no longer the first line: the
block sits above it because release-notes.mjs extracts from a `## Version`
heading to the next `## `, so anything above the first one cannot reach a
GitHub release. Verified both ways.
@lorem-dev
lorem-dev merged commit ea293d9 into main Sep 9, 2026
8 checks passed
@lorem-dev
lorem-dev deleted the release/0.7.1 branch September 9, 2026 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant