mirror of
https://github.com/max-sixty/worktrunk.git
synced 2026-09-14 20:00:38 +08:00
36f201b36e7b905eb0158ee25b5045342e5832f3
4991 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
36f201b36e | docs: link the canonical home-page install anchor, not the deindexed duplicate | ||
|
|
ce57d2d997 |
Name the unconfigured source when a hook filter matches nothing (#3997)
A source filter with no command name (`wt hook pre-merge user:`) reported `No command named user:` when that source configured no hooks — a message about a name the user never gave. `HookSourceNotConfigured` says what is true and points at the source that does have hooks, when one does. The rest corrects claims the hook and step reference pages had drifted from: `--foreground` for a post-hook, `pre-commit` running before every Worktrunk commit rather than only the merge's, which commands accept `--no-hooks`, that a preview leaves a whole `vars` expression alone including its filters, the `wt hook show` approval glyph, `wt step commit --branch`, that hooks fire on `wt step commit` and `wt step squash`, `wt step copy-ignored`'s `--from` / `--to` and its primary-worktree default, and that `wt step prune` removes branches as well as worktrees with `--min-age` guarding both. Two `worktree-path` recipes give way to a link to the config page that owns them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XAUYWFN9d9oh6jyoQiouHb |
||
|
|
43b2f8ef86 |
Route delayed-stream output through anstream (#3995)
`Cmd::delayed_stream` wrote its progress line and every relayed child line through raw `writeln!(std::io::stderr(), …)`, bypassing the anstream layer that strips ANSI when stderr isn't a terminal and honors `NO_COLOR`. The progress message arrives pre-rendered, which made it the only colored line in a redirected `wt switch` log. All three writes go through anstream's `eprintln!`. The static guard scans for macro names, so a write naming no macro was invisible to it; `check_raw_stderr_writes_go_through_anstream` refuses those shapes too, exempting only the tty-gated spinner that holds a lock across a frame. Also covers the delayed-stream buffer drain, which no test reached: the neighbouring cases either stream before the child writes or write after the switch. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XAUYWFN9d9oh6jyoQiouHb |
||
|
|
469d73e904 |
Drop config keys a migration's destination cannot hold (#3994)
`wt config update` moved `[select]` to `[switch.picker]` and `[commit-generation]` to `[commit.generation]` as whole tables, carrying along any key the destination struct has no field for. That key then warned as unknown on every later command, at a path the user never typed, and `wt config update` — the command the warning points at — rewrote it rather than clearing it. `drop_unsupported_keys` removes and reports those keys, and a removal that empties a per-project section removes the section too. A key that is merely misplaced, valid in the other config file, stays with its redirect warning; that is why the destination's schemas are taken as a union across config kinds. `schema_property_names` is factored out of `schema_top_level_keys` for section types. Both wholesale-move rules go through one `migrate_section_doc`, which holds the contract they share. `test_warning_fires_iff_update_changes` now pins that what the update writes raises neither a deprecation nor an unknown-field warning. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XAUYWFN9d9oh6jyoQiouHb |
||
|
|
10cb25901e |
Warn when wt list can't parse the project config (#3993)
A `.config/wt.toml` that doesn't parse left no trace on `wt list`, which reads project config only through accessors that degrade to `None`, so a broken file could sit in a repo indefinitely. `ProjectConfig::load` now returns the typed `LoadError::File` the user-config layer already uses, and `wt list` warns before collection so the message lands above the rows. Commands that run project config still fail hard. `wt hook show` and `resolve_copy_ignored_config` drop a `.context()` that duplicated the header `project_config()` already adds, and `LoadError::File` says `@` before the path like the warning that renders it. One `emit_config_load_warning` serves both config kinds. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XAUYWFN9d9oh6jyoQiouHb |
||
|
|
3e86e5824b |
Report an empty listing in a bare repo instead of nothing (#3992)
`wt list` in a bare repository with no linked worktrees printed nothing and exited 0. Collection returned early on an empty worktree list, before branch rows were built. It now carries on: `--branches` lists the repo's branches, `--format json` returns its envelope with an empty `items`, and a listing with no rows reports `No worktrees` on stderr with a hint, leaving stdout empty for pipes. The main-worktree lookup returns `Option` rather than erroring when nothing can be the main worktree. The hint follows the branch inventory. A `git clone --bare` reaches this listing with its branches intact, where `wt switch --create <branch>` errors, so it points at `wt list --branches` and `wt switch <branch>` instead; a branchless repo keeps `--create`. Dropping the early return exposed the stale-default-branch check to a repo with no branches at all, where `symbolic-ref HEAD` names a branch that `refs/heads/` doesn't carry. The warning is gated on a non-empty branch inventory; the drop that keeps downstream tasks off the missing branch follows the missing value instead, so a detached HEAD whose last branch was deleted no longer ends in three `Needed a single revision` failures. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XAUYWFN9d9oh6jyoQiouHb |
||
|
|
fd10235f75 |
chore: bump fast-uri from 3.1.5 to 3.1.7 in /docs (#3991)
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.5 to 3.1.7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/fastify/fast-uri/releases">fast-uri's releases</a>.</em></p> <blockquote> <h2>v3.1.7</h2> <h2>⚠️ Security Warning</h2> <p>This is a security release that fixes the following high-severity security advisories:</p> <ul> <li><a href="https://github.com/fastify/fast-uri/security/advisories/GHSA-qw65-cvwx-89v3">GHSA-qw65-cvwx-89v3</a> — authority injection via an unvalidated port in <code>serialize()</code></li> <li><a href="https://github.com/fastify/fast-uri/security/advisories/GHSA-58mr-gqgx-xq4g">GHSA-58mr-gqgx-xq4g</a> — host confusion via unbalanced or misplaced IP-literal brackets</li> </ul> <p>Users of the v3.x release line should upgrade to v3.1.7.</p> <p><strong>Full Changelog</strong>: <a href="https://github.com/fastify/fast-uri/compare/v3.1.6...v3.1.7">https://github.com/fastify/fast-uri/compare/v3.1.6...v3.1.7</a></p> <h2>v3.1.6</h2> <h2>⚠️ Security Warning</h2> <p>This release addresses the following high-severity security advisories:</p> <ul> <li><a href="https://github.com/fastify/fast-uri/security/advisories/GHSA-5jgf-p345-68v8">GHSA-5jgf-p345-68v8</a> — host confusion via skipped IDN canonicalization on scheme-relative references</li> <li><a href="https://github.com/fastify/fast-uri/security/advisories/GHSA-fph4-wmhf-6fwf">GHSA-fph4-wmhf-6fwf</a> — server-side request forgery via repeated hostname percent-decoding</li> <li><a href="https://github.com/fastify/fast-uri/security/advisories/GHSA-f65p-4m7j-42xc">GHSA-f65p-4m7j-42xc</a> — server-side request forgery via malformed IPv6 normalization</li> <li><a href="https://github.com/fastify/fast-uri/security/advisories/GHSA-jqff-g426-hqxp">GHSA-jqff-g426-hqxp</a> — host confusion via percent-encoded scheme normalization</li> </ul> <p>Users of the v3.x release line should upgrade to v3.1.6.</p> <p><strong>Full Changelog</strong>: <a href="https://github.com/fastify/fast-uri/compare/v3.1.5...v3.1.6">https://github.com/fastify/fast-uri/compare/v3.1.5...v3.1.6</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/fastify/fast-uri/commit/412e40abd4eb8beabfb952d80abf949a2baf27a3"><code>412e40a</code></a> Bumped v3.1.7</li> <li><a href="https://github.com/fastify/fast-uri/commit/9f4c943e4d2133e8d78e0941203879216255bb01"><code>9f4c943</code></a> fix: backport port and IP-literal validation to v3.x (<a href="https://redirect.github.com/fastify/fast-uri/issues/216">#216</a>)</li> <li><a href="https://github.com/fastify/fast-uri/commit/1eb3ce436fe050807caba79f886ab894f485a588"><code>1eb3ce4</code></a> fix: treat unterminated bracket hosts as reg-names again (<a href="https://redirect.github.com/fastify/fast-uri/issues/214">#214</a>)</li> <li><a href="https://github.com/fastify/fast-uri/commit/6f970b2951fd896aa0f3a7ff28eeb6640c137d33"><code>6f970b2</code></a> Bumped v3.1.6</li> <li><a href="https://github.com/fastify/fast-uri/commit/d941579a84273ec7e96bde596b1f7a8be447df2a"><code>d941579</code></a> fix: never run IDN canonicalization on bracketed IP literals</li> <li><a href="https://github.com/fastify/fast-uri/commit/c0f0279cf370cb89ee56b04bbcde2a7afbe81aba"><code>c0f0279</code></a> test: adapt decoded-scheme handler assertion to 3.x (no mailto scheme)</li> <li><a href="https://github.com/fastify/fast-uri/commit/37f3417c82994279656854f83ce938acd81c3862"><code>37f3417</code></a> Merge commit from fork</li> <li><a href="https://github.com/fastify/fast-uri/commit/607bfbe953f28a14c2e06ae64aff38c81ca2937f"><code>607bfbe</code></a> Merge commit from fork</li> <li><a href="https://github.com/fastify/fast-uri/commit/ae92a4c5d8c4b6c9e447f048d5fcbde7eebd5514"><code>ae92a4c</code></a> Merge commit from fork</li> <li><a href="https://github.com/fastify/fast-uri/commit/444ecdad447db2cc23c4d422acc6f0daa6fa8eef"><code>444ecda</code></a> Merge commit from fork</li> <li>Additional commits viewable in <a href="https://github.com/fastify/fast-uri/compare/v3.1.5...v3.1.7">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/max-sixty/worktrunk/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
03d1a4dd3c |
chore: bump taiki-e/install-action from 2.87.1 to 2.87.2 (#3986)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.87.1 to 2.87.2. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/taiki-e/install-action/releases">taiki-e/install-action's releases</a>.</em></p> <blockquote> <h2>2.87.2</h2> <ul> <li> <p>Update <code>typos@latest</code> to 1.50.0.</p> </li> <li> <p>Update <code>tombi@latest</code> to 1.5.0.</p> </li> <li> <p>Update <code>shfmt@latest</code> to 3.14.0.</p> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md">taiki-e/install-action's changelog</a>.</em></p> <blockquote> <h2>[2.87.2] - 2026-08-30</h2> <ul> <li> <p>Update <code>typos@latest</code> to 1.50.0.</p> </li> <li> <p>Update <code>tombi@latest</code> to 1.5.0.</p> </li> <li> <p>Update <code>shfmt@latest</code> to 3.14.0.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/taiki-e/install-action/commit/1ed6d7be6168f6c9046541087ff549b6bc581fdf"><code>1ed6d7b</code></a> Release 2.87.2</li> <li><a href="https://github.com/taiki-e/install-action/commit/0fbfc5b541ba726278965a75a3fd222af703b279"><code>0fbfc5b</code></a> Update <code>typos@latest</code> to 1.50.0</li> <li><a href="https://github.com/taiki-e/install-action/commit/5f68cef2c452eb3fcb5dccbbcd5f6d192a13a892"><code>5f68cef</code></a> Update <code>tombi@latest</code> to 1.5.0</li> <li><a href="https://github.com/taiki-e/install-action/commit/d46a5ec40dd3eef68104c5b342f24e599519675f"><code>d46a5ec</code></a> Update <code>shfmt@latest</code> to 3.14.0</li> <li>See full diff in <a href="https://github.com/taiki-e/install-action/compare/v2.87.1...v2.87.2">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
7ac6357f92 | docs: correct three stale code references found in the nightly survey (#3989) | ||
|
|
c63311db61 |
Collapse the remaining generated mirrors in PR diffs (#3990)
A help-text edit in `src/cli/mod.rs` regenerates three mirrors of the same paragraphs, and `.gitattributes` collapsed only one of them. So a PR touching help text — most of the docs-survey PRs — showed the text three times over. This marks the plugin skills tree and `dev/*.example.toml` generated as well, each with a comment naming what rewrites it. The command pages under `docs/src/content/docs/` deliberately stay visible: a reviewer should read the rendered help once, and the rest of that directory is hand-written primaries. Snapshots stay visible too — they are asserted content, not a mirror. Verified with `git check-attr linguist-generated` over a generated file and a primary in each group, including the plugin mirror's copies of the skill-only pages (`troubleshooting.md`, `shell-integration.md`), which collapse there while their primaries under `skills/worktrunk/reference/` stay exempt. <details> <summary>Considered and left alone: <code>docs/public/schema/list-v2.json</code></summary> It is generated by the same sync test, but `sync_json_schema`'s docstring says a schemars upgrade rewriting it "should be a reviewed diff" — collapsing it by default works against that. </details> > _This was written by Claude Code on behalf of max-sixty_ Co-authored-by: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
7a3ad6bb3d |
Scope the branch-inventory staleness contract to membership (#3988)
`Repository::local_branches` scans `refs/heads/` once and caches the result for the lifetime of the `Repository`. Its docstring already scoped a staleness contract to `commit_sha` — "a snapshot at scan time", resolve through a `RefSnapshot` instead — but then said of the inventory itself: > The inventory itself is used for branch listing and upstream-tracking metadata, both of > which are stable for the duration of a command. That holds only for a command that runs no hooks. Hooks run *inside* a command, so a `pre-switch` or `pre-remove` hook that adds, deletes, or renames a branch leaves the cached membership stale, not just the SHAs. ## Where it shows up The behaviour is intended — one scan per command is the point — but the docstring said membership was stable, which sends a reader looking for a bug when they hit it. Two consumers see it: - `detect_branch_namespace_conflict` (`src/commands/worktree/switch.rs`) reads the inventory to name the branch blocking a `git worktree add -b`. A hook that deletes `feature/nested` and creates `feature` in the same command yields "collides with existing branch feature/nested" where "already exists" is the truth. Cosmetic. - `wt step prune` iterates `all_branches()` to choose what to prune, so a branch created by a hook mid-command isn't considered. Conservative, but a selection difference rather than a message one — which is why the note says membership rather than "messages can be wrong". ## What this changes The docstring, and nothing else. No behaviour change, no new test. This came out of reviewing #3984, where the same staleness was flagged against the namespace-conflict mapping. A doc entry was considered and dropped: the FAQ's questions sit a level up from one cache's staleness, and there's no broader question this is a detail of. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
a9bf06a0bc |
test: refresh snapshot metadata headers (#3987)
Header-only refresh of every insta snapshot, no behavior change. The `info.env` block the test harness records (`GIT_CONFIG_*`, `WORKTRUNK_TEST_PROBE_TIMEOUT_MS`, …) had only reached snapshots rewritten since those keys were added, so any branch that re-accepts an older snapshot drags the header refresh into its diff. With the ~2,800 lines of that churn landed here, follow-up PRs show only content changes. How it was produced: `cargo insta test --force-update-snapshots --all-features` on a fresh `main` worktree (4715 tests green, PTY tests included), then a script compared each changed file's body (the text after the frontmatter) against HEAD and reverted any that differed — none did, so the CI-generated picker snapshot that renders differently on macOS is untouched. Force-update also rewrote inline snapshots in nine source files, only their delimiter style; those were reverted so the diff is `.snap` files only. > _This was written by Claude Code on behalf of max-sixty_ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> |
||
|
|
ccb22a6c77 |
Stop a failed fork PR switch from deleting the user's branch (#3984)
## The bug
`wt switch pr:N` / `mr:N` against a **fork** PR/MR took the
`CreationMethod::ForkRef`
path, which built the branch, its tracking config, and its worktree as
four separate
git calls and compensated for that decomposition on any error:
```rust
if let Err(e) = setup_result {
// Cleanup: try to delete the branch if it was created
let _ = repo.run_command(&["branch", "-D", "--", &branch]);
return Err(e);
}
```
The rollback was only ever valid if the *first* call — `git branch --
<b> FETCH_HEAD` —
had succeeded. Its likeliest failure is git refusing a name that is
already taken, and
in that case `wt` force-deleted a branch it had not created, discarding
the result of
the deletion.
## The reachability window
The branch name comes from the PR's head ref. Whether it is free is
decided in
`resolve_fork_ref`, which runs during `resolve_ref_shortcut_target` —
**before** the
`pre-switch` hooks and before `plan_switch`. The branch is created
later, inside
`execute_switch`. Anything that claims the name in between selects the
fork path and
then fails it: a `pre-switch` hook, or another session in another
worktree of the same
repo.
When that happened, `git branch -D` dropped the branch, and with it any
commits only
that branch held — the reflog goes too, so recovery is `git fsck
--lost-found`. The
error printed immediately *afterwards* was:
```
✗ Failed to create local branch feature-fix from PR #42
fatal: a branch named 'feature-fix' already exists
```
which reads as though nothing happened, and the obvious response —
re-run — succeeds
the second time, erasing the evidence.
## The fix: remove the rollback, don't guard it
The rollback existed only to compensate for a decomposition that
shouldn't exist. The
sibling `CreationMethod::Regular` arm already builds a single
`git worktree add -b <branch> -- <path> <ref>` and has no rollback at
all, because git
owns the atomicity. `ForkRef` now uses the same shape:
```
git worktree add -b <branch> -- <path> FETCH_HEAD
```
Git writes nothing when the name is taken (verified: the branch keeps
its SHA and no
directory is left behind), so on the one failure that lands on a branch
`wt` did not
create there is nothing to roll back. Guarding the delete with "only if
we created it"
would have kept a destructive path alive to fix a case where the
destructive path was
never needed.
This is not a claim that `git worktree add -b` is atomic in general —
with the
destination path occupied it creates the branch and *then* dies on the
path (verified on
git 2.55). That leftover is a stray branch at the PR head, which the
`Regular` arm
already accepts, and it is not someone's work. It does carry the same
follow-on cost as
a failed tracking write below — no config written, so the next `wt
switch pr:N` takes
the prefixed-branch path or errors — and the docstring now says so in
both places. The
old code rolled back cleanly in this one case, its own branch being the
only thing it
could have deleted, but distinguishing it needs the very
did-we-create-it reasoning that
produced the bug.
Tracking config (`branch.<b>.remote` / `.merge` / `.pushRemote`) now
follows the
worktree instead of preceding it, and the ordering is load-bearing:
writing tracking
first would rewrite the *existing* branch's upstream on exactly the
collision above —
the same class of bug as the rollback. If a tracking write fails, the
user is left with
a branch plus worktree at the PR head and incomplete config. Nothing is
lost, and a
re-run is non-destructive: `branch_tracks_ref` reads the branch as
tracking something
else, so the next `wt switch pr:N` takes the prefixed-branch path
(GitHub/Gitea) or
reports `BranchTracksDifferentRef` (GitLab/Azure DevOps). That is
strictly better than
deleting their branch. This matches the repo's stated rules: *prefer
failure over silent
loss*, *no implicit destructive side effects*, and one canonical path
for worktree
creation.
`branch.autoSetupMerge` is inert on this path — git sets up tracking
only where the
start point resolves under `refs/heads/` or `refs/remotes/`, and
`FETCH_HEAD` resolves
as itself, so no value of it (`true`, `always`, `inherit`, `simple`,
`false`) writes
tracking config here. The `-c branch.autoSetupMerge=simple` the
`Regular` arm needs
would be redundant.
`git worktree add -b` also has a known DWIM footgun where a bare
remote-only start point
creates the remote's branch name instead of `-b`'s; `FETCH_HEAD` is not
a
remote-tracking ref, and the new test covers the case rather than
assuming it.
## Test
`test_switch_pr_fork_failure_keeps_existing_branch` pins the safety
property: **a
pre-existing branch survives a failed `pr:N` switch.** It uses the
existing mock-`gh`
fork-PR fixture, plus a `pre-switch` hook that renames a never-pushed
local branch onto
the PR's branch name — occupying it after the forge answered (which is
what selects the
fork path) and before the worktree is created, standing in for the
concurrent session
that does the same in real use. The test then asserts the switch failed
*and* that
`refs/heads/feature-fix` still points at the unpushed commit.
Against the old code it fails at exactly that assertion, with the branch
gone.
## The same failure mapping as `Regular`
Creating the branch with `git worktree add -b` means the fork path now
hits the one
failure the `Regular` arm already translates: git stores refs as file
paths, so a fork
PR whose head ref is `feature-fix` can't create a branch in a repo that
already has
`feature-fix/nested`, and git says `fatal: cannot lock ref
'refs/heads/feature-fix'`.
The arm routes that through `detect_branch_namespace_conflict`, exactly
as `Regular`
does, so the user is told which local branch is in the way. It matters
more here than
there: a PR's head ref isn't the user's to rename, so the only
actionable move is to
rename the local branch, and the raw git text doesn't name it.
`test_switch_pr_fork_namespace_conflict` covers it — same mock-`gh`
fixture, with
`feature-fix/nested` created before the switch. It asserts
`BranchNamespaceConflict`'s own wording, `collides with existing
branch`, rather than
just the conflicting branch name: git's raw `cannot lock ref` text names
that branch
too, so the looser assertion passed against the unmapped error. Verified
by reverting
the mapping — the test fails.
## Validation
- `cargo run -- hook pre-merge --yes` — 4,715 tests passed, 1 skipped;
clippy, fmt,
doc-sync, snapshot and lockfile checks green
- No help text or `after_long_help` changed, so no doc regeneration was
needed
- The FAQ's ["What can Worktrunk
delete?"](https://github.com/max-sixty/worktrunk/blob/main/docs/src/content/docs/faq.md)
never listed this `branch -D`, so no doc update is
needed — and its absence is more evidence the deletion was never
intended behaviour
> _This was written by Claude Code on behalf of max-sixty_
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
||
|
|
de0052d8db |
Release v0.76.0 (#3983)
Cuts 0.76.0. `cargo semver-checks` fails ten lints, so the bump is minor. ## Changelog filing fix Five entries had been appended to the already-tagged `## 0.75.0` section after v0.75.0 shipped (#3977/#2860, #3949 ×2, #3959, #3945). They describe changes that ship *here*, and GitHub's 0.75.0 release notes — built from the tag — never showed them. They are moved into `## 0.76.0` and rewritten to the length ceiling; `## 0.75.0` is restored byte-identical to `git show v0.75.0:CHANGELOG.md`. The mechanism is systemic: a PR appends under whatever heading is currently top, so every post-release PR lands in the shipped section until the next release opens a new one. ## `--execute` template guidance `#3977` switched `--execute` expansion to `ShellEscapeMode::Literal`, which is correct for an argv model. But the migration that v0.53.0–v0.75.0's deprecation warning *printed* — `-x sh -- -c '<old body>'` — splices a template variable into text `sh` re-parses, so a value with spaces word-splits where the old POSIX-escaped model kept it intact. Worst case is `rm -rf` against unintended paths. `--execute`'s help now documents passing the variable as a separate argument and referencing it positionally. `extending.md` already modelled that form, so no recipe changed. ## Validation - `nightly` on the cut-from tip (`baf161bf6`): all 14 jobs green — [run 33538866753](https://github.com/max-sixty/worktrunk/actions/runs/33538866753) - `wt hook pre-merge --yes`: 4713 passed - Data-loss surface reviewed across the 45-commit diff by four independent finders; adjudication in the release thread. No new destructive path — `#3977` removes one, deleting the EXEC directive file from all five shell wrappers. > _This was written by Claude Code on behalf of max-sixty_v0.76.0 |
||
|
|
baf161bf60 |
Run switch --execute as literal argv (#3977)
## Summary - Treat `wt switch -x` as one program plus arguments that bypass Worktrunk shell parsing; program lookup and argument decoding use native operating-system behavior. - Launch the program from `wt` in the selected worktree, preserving terminal access, signals, and exit status. - Remove the shell exec directive, shell-specific escaping, and implicit `sh` dependency. Shell wrappers now carry only the directory change. - Make the Nushell wrapper recognize clustered execute flags such as `-cx`, stop scanning at `--`, and warn when a retired exec-file wrapper buffers stdout away from the terminal. Shell syntax remains explicit: `-x sh -- -c 'code . && test -f Cargo.toml'`. On Windows, shell shims need their extension (`-x code.cmd`) or an explicit shell such as `-x cmd.exe -- /C code`. This completes the argv cutover proposed in #2860 and removes the remaining Nushell-on-Windows problem in #3944. It adds no PATHEXT lookup, custom Windows quoting, or PowerShell launcher path, and still removes 597 lines from `src` and `templates` on net. ## Validation - `cargo run -- hook pre-merge --yes` - 4,712 tests passed; one skipped - Formatting, clippy, docs, doctests, lockfile, and snapshot checks passed Thanks @omgreenfield for testing the migration path in #2860. Closes #2860 Closes #3944 > _This was written by Codex on behalf of @max-sixty_ |
||
|
|
cf3c67b03b |
chore: bump the patch group with 7 updates (#3966)
Bumps the patch group with 7 updates: | Package | From | To | | --- | --- | --- | | [log](https://github.com/rust-lang/log) | `0.4.33` | `0.4.34` | | [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) | `0.26.12` | `0.26.13` | | [which](https://github.com/harryfei/which-rs) | `8.0.5` | `8.0.6` | | [termimad](https://github.com/Canop/termimad) | `0.35.1` | `0.35.2` | | [skim](https://github.com/skim-rs/skim) | `5.6.5` | `5.6.6` | | [open](https://github.com/Byron/open-rs) | `5.4.1` | `5.4.2` | | [vergen-gitcl](https://github.com/rustyhorde/vergen) | `10.0.2` | `10.0.3` | Updates `log` from 0.4.33 to 0.4.34 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rust-lang/log/releases">log's releases</a>.</em></p> <blockquote> <h2>0.4.34</h2> <h2>What's Changed</h2> <ul> <li>doc: Add context-logger utility to README by <a href="https://github.com/alekseysidorov"><code>@alekseysidorov</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/735">rust-lang/log#735</a></li> <li>Add alloc support for boxed loggers by <a href="https://github.com/malezjaa"><code>@malezjaa</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/737">rust-lang/log#737</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/alekseysidorov"><code>@alekseysidorov</code></a> made their first contribution in <a href="https://redirect.github.com/rust-lang/log/pull/735">rust-lang/log#735</a></li> <li><a href="https://github.com/malezjaa"><code>@malezjaa</code></a> made their first contribution in <a href="https://redirect.github.com/rust-lang/log/pull/737">rust-lang/log#737</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rust-lang/log/compare/0.4.33...0.4.34">https://github.com/rust-lang/log/compare/0.4.33...0.4.34</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rust-lang/log/blob/master/CHANGELOG.md">log's changelog</a>.</em></p> <blockquote> <h2>[0.4.34] - 2026-08-22</h2> <h2>What's Changed</h2> <ul> <li>doc: Add context-logger utility to README by <a href="https://github.com/alekseysidorov"><code>@alekseysidorov</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/735">rust-lang/log#735</a></li> <li>Add alloc support for boxed loggers by <a href="https://github.com/malezjaa"><code>@malezjaa</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/737">rust-lang/log#737</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/alekseysidorov"><code>@alekseysidorov</code></a> made their first contribution in <a href="https://redirect.github.com/rust-lang/log/pull/735">rust-lang/log#735</a></li> <li><a href="https://github.com/malezjaa"><code>@malezjaa</code></a> made their first contribution in <a href="https://redirect.github.com/rust-lang/log/pull/737">rust-lang/log#737</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rust-lang/log/compare/0.4.33...0.4.34">https://github.com/rust-lang/log/compare/0.4.33...0.4.34</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rust-lang/log/commit/8034743dd9d7f7583bd9a670271483d176130911"><code>8034743</code></a> Merge pull request <a href="https://redirect.github.com/rust-lang/log/issues/738">#738</a> from rust-lang/cargo/0.4.34</li> <li><a href="https://github.com/rust-lang/log/commit/7d1e24e3506d4ffa1badf6c9ea357779877adaf0"><code>7d1e24e</code></a> prepare for 0.4.34 release</li> <li><a href="https://github.com/rust-lang/log/commit/3b939b6714616dc32193c12019861c7c518c5edb"><code>3b939b6</code></a> Merge pull request <a href="https://redirect.github.com/rust-lang/log/issues/737">#737</a> from malezjaa/master</li> <li><a href="https://github.com/rust-lang/log/commit/b88266cfed8b287f8c35b2015808b09b056f61af"><code>b88266c</code></a> Add alloc support for boxed loggers</li> <li><a href="https://github.com/rust-lang/log/commit/037d7a58f6ad184abb3afc4db81d37c43a5696ec"><code>037d7a5</code></a> doc: Add context-logger utility to README</li> <li>See full diff in <a href="https://github.com/rust-lang/log/compare/0.4.33...0.4.34">compare view</a></li> </ul> </details> <br /> Updates `tree-sitter-highlight` from 0.26.12 to 0.26.13 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tree-sitter/tree-sitter/releases">tree-sitter-highlight's releases</a>.</em></p> <blockquote> <h2>v0.26.13</h2> <h2>What's Changed</h2> <ul> <li>fix(query): correctly identify <code>MISSING</code> nodes in queries by <a href="https://github.com/tree-sitter-ci-bot"><code>@tree-sitter-ci-bot</code></a>[bot] in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5835">tree-sitter/tree-sitter#5835</a></li> <li>fix(query): correctly set a state's <code>skipped_quantifier</code> flag when a by <a href="https://github.com/tree-sitter-ci-bot"><code>@tree-sitter-ci-bot</code></a>[bot] in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5842">tree-sitter/tree-sitter#5842</a></li> <li>fix(generate): fold case-insensitive patterns at the AST leaves by <a href="https://github.com/WillLillis"><code>@WillLillis</code></a> in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5854">tree-sitter/tree-sitter#5854</a></li> <li>fix(parser): avoid wide error nodes on unparseable input by <a href="https://github.com/tree-sitter-ci-bot"><code>@tree-sitter-ci-bot</code></a>[bot] in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5855">tree-sitter/tree-sitter#5855</a></li> <li>fix(ci): run all workspace tests by <a href="https://github.com/WillLillis"><code>@WillLillis</code></a> in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5867">tree-sitter/tree-sitter#5867</a></li> <li>build(deps): bump wasmtime-c-api to v36.0.14 by <a href="https://github.com/clason"><code>@clason</code></a> in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5870">tree-sitter/tree-sitter#5870</a></li> <li>fix(rust): remove <code>must_use</code> attribute from <code>Tree::changed_ranges</code> by <a href="https://github.com/tree-sitter-ci-bot"><code>@tree-sitter-ci-bot</code></a>[bot] in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5877">tree-sitter/tree-sitter#5877</a></li> <li>release v0.26.13 by <a href="https://github.com/clason"><code>@clason</code></a> in <a href="https://redirect.github.com/tree-sitter/tree-sitter/pull/5873">tree-sitter/tree-sitter#5873</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/tree-sitter/tree-sitter/compare/v0.26.12...v0.26.13">https://github.com/tree-sitter/tree-sitter/compare/v0.26.12...v0.26.13</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/d97971e24500218865c05ed1febdee2acf41bae1"><code>d97971e</code></a> release v0.26.13</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/d2436dc57c5939f1fa14ab26d493c38d18caeffc"><code>d2436dc</code></a> fix(rust): remove <code>must_use</code> attribute from <code>Tree::changed_ranges</code></li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/e323709b8da941b8c34991bc728edec3a3e4f66e"><code>e323709</code></a> build(deps): bump wasmtime-c-api to v36.0.14</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/c7a65b67d1da933f8bc02b76a45f99a3d640ff49"><code>c7a65b6</code></a> fix(ci): run all workspace tests</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/9d1f31602ce1d583f9c893d67a799d6f0ed381b7"><code>9d1f316</code></a> fix(parser): nest error children during recovery</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/f837fc9813279928faacff287d5e9675b0492dfd"><code>f837fc9</code></a> fix(lib): accumulate error costs through hidden error nodes</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/15adfa9e51b58fb550d824620a301cc695ae1e7c"><code>15adfa9</code></a> fix(generate): fold case-insensitive patterns at the AST leaves</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/063f8f886b44e8471928241e6c4dedbdc691a0e5"><code>063f8f8</code></a> fix(query): correctly set a state's <code>skipped_quantifier</code> flag when a</li> <li><a href="https://github.com/tree-sitter/tree-sitter/commit/632016551504745421c883b58720d46b2b77a992"><code>6320165</code></a> fix(query): correctly identify <code>MISSING</code> nodes in queries</li> <li>See full diff in <a href="https://github.com/tree-sitter/tree-sitter/compare/v0.26.12...v0.26.13">compare view</a></li> </ul> </details> <br /> Updates `which` from 8.0.5 to 8.0.6 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/harryfei/which-rs/releases">which's releases</a>.</em></p> <blockquote> <h2>8.0.6</h2> <h2>What's Changed</h2> <ul> <li>fix: resolve relative PATH entries against the provided cwd by <a href="https://github.com/RSS1102"><code>@RSS1102</code></a> in <a href="https://redirect.github.com/harryfei/which-rs/pull/128">harryfei/which-rs#128</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/RSS1102"><code>@RSS1102</code></a> made their first contribution in <a href="https://redirect.github.com/harryfei/which-rs/pull/128">harryfei/which-rs#128</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/harryfei/which-rs/compare/8.0.5...8.0.6">https://github.com/harryfei/which-rs/compare/8.0.5...8.0.6</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/harryfei/which-rs/blob/master/CHANGELOG.md">which's changelog</a>.</em></p> <blockquote> <h2>8.0.6</h2> <ul> <li>Bug fix: <a href="https://redirect.github.com/harryfei/which-rs/pull/128">#128</a> Resolve relative PATH entries against the user provided CWD when available, rather than the process CWD. Thanks <a href="https://github.com/RSS1102"><code>@RSS1102</code></a> for your contribution to which!</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/harryfei/which-rs/commit/17fde4abb85f24d39954b012067c14f9f809ed27"><code>17fde4a</code></a> prepare patch release</li> <li><a href="https://github.com/harryfei/which-rs/commit/48e49d554b7a7c2812644d8d4950f50e995a9ecc"><code>48e49d5</code></a> Resolve relative PATH entries against cwd (<a href="https://redirect.github.com/harryfei/which-rs/issues/128">#128</a>)</li> <li>See full diff in <a href="https://github.com/harryfei/which-rs/compare/8.0.5...8.0.6">compare view</a></li> </ul> </details> <br /> Updates `termimad` from 0.35.1 to 0.35.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Canop/termimad/blob/main/CHANGELOG.md">termimad's changelog</a>.</em></p> <blockquote> <h3>v0.35.2 - 2026-08-21</h3> <ul> <li>fix code blocks overflowing the available width when a line is wider than it, instead of being wrapped - Fix <a href="https://redirect.github.com/Canop/termimad/issues/80">#80</a> - Thanks <a href="https://github.com/youdie006"><code>@youdie006</code></a></li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/Canop/termimad/commits">compare view</a></li> </ul> </details> <br /> Updates `skim` from 5.6.5 to 5.6.6 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/skim-rs/skim/releases">skim's releases</a>.</em></p> <blockquote> <h2>5.6.6 - 2026-08-22</h2> <h2>Release Notes</h2> <h3>🐛 Bug Fixes</h3> <ul> <li><em>(matcher)</em> An inverse query only checks the first --nth field (<a href="https://redirect.github.com/skim-rs/skim/issues/1159">#1159</a>)</li> <li>Do not feed items through a fifo in zsh completions (<a href="https://redirect.github.com/skim-rs/skim/issues/1164">#1164</a>)</li> <li><em>(filter)</em> --filter hangs when the query is below --min-query-length (<a href="https://redirect.github.com/skim-rs/skim/issues/1158">#1158</a>)</li> <li>Path_name_offset returns bytes while Rank::begin is a char index (<a href="https://redirect.github.com/skim-rs/skim/issues/1160">#1160</a>)</li> </ul> <h3>🤖 CI</h3> <ul> <li>Automatically update PRs on pushes to master</li> <li>Fix auto update branch</li> </ul> <h3>⚙️ Miscellaneous Tasks</h3> <ul> <li>Clippy & fmt after cargo update</li> </ul> <h2>Install skim 5.6.6</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-installer.sh | sh </code></pre> <h3>Install prebuilt binaries via powershell script</h3> <pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c "irm https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-installer.ps1 | iex" </code></pre> <h2>Download skim 5.6.6</h2> <table> <thead> <tr> <th>File</th> <th>Platform</th> <th>Checksum</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-aarch64-apple-darwin.tar.xz">skim-aarch64-apple-darwin.tar.xz</a></td> <td>Apple Silicon macOS</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-aarch64-apple-darwin.tar.xz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-apple-darwin.tar.xz">skim-x86_64-apple-darwin.tar.xz</a></td> <td>Intel macOS</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-apple-darwin.tar.xz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-pc-windows-msvc.zip">skim-x86_64-pc-windows-msvc.zip</a></td> <td>x64 Windows</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-pc-windows-msvc.msi">skim-x86_64-pc-windows-msvc.msi</a></td> <td>x64 Windows</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-pc-windows-msvc.msi.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-aarch64-unknown-linux-gnu.tar.xz">skim-aarch64-unknown-linux-gnu.tar.xz</a></td> <td>ARM64 Linux</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-aarch64-unknown-linux-gnu.tar.xz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-unknown-linux-gnu.tar.xz">skim-x86_64-unknown-linux-gnu.tar.xz</a></td> <td>x64 Linux</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-unknown-linux-gnu.tar.xz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-aarch64-unknown-linux-musl.tar.xz">skim-aarch64-unknown-linux-musl.tar.xz</a></td> <td>ARM64 MUSL Linux</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-aarch64-unknown-linux-musl.tar.xz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-unknown-linux-musl.tar.xz">skim-x86_64-unknown-linux-musl.tar.xz</a></td> <td>x64 MUSL Linux</td> <td><a href="https://github.com/skim-rs/skim/releases/download/v5.6.6/skim-x86_64-unknown-linux-musl.tar.xz.sha256">checksum</a></td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/skim-rs/skim/blob/master/CHANGELOG.md">skim's changelog</a>.</em></p> <blockquote> <h2>[5.6.6] - 2026-08-22</h2> <h3>🐛 Bug Fixes</h3> <ul> <li><em>(matcher)</em> An inverse query only checks the first --nth field (<a href="https://redirect.github.com/skim-rs/skim/issues/1159">#1159</a>)</li> <li>Do not feed items through a fifo in zsh completions (<a href="https://redirect.github.com/skim-rs/skim/issues/1164">#1164</a>)</li> <li><em>(filter)</em> --filter hangs when the query is below --min-query-length (<a href="https://redirect.github.com/skim-rs/skim/issues/1158">#1158</a>)</li> <li>Path_name_offset returns bytes while Rank::begin is a char index (<a href="https://redirect.github.com/skim-rs/skim/issues/1160">#1160</a>)</li> </ul> <h3>🤖 CI</h3> <ul> <li>Automatically update PRs on pushes to master</li> <li>Fix auto update branch</li> </ul> <h3>⚙️ Miscellaneous Tasks</h3> <ul> <li>Clippy & fmt after cargo update</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/skim-rs/skim/commit/4b962af9ede6f3fdda608bdce8031c352a4effb4"><code>4b962af</code></a> release: v5.6.6 (<a href="https://redirect.github.com/skim-rs/skim/issues/1163">#1163</a>)</li> <li><a href="https://github.com/skim-rs/skim/commit/e8f5b3ae65529688668860ded3fa8355d23d606d"><code>e8f5b3a</code></a> fix: path_name_offset returns bytes while Rank::begin is a char index (<a href="https://redirect.github.com/skim-rs/skim/issues/1160">#1160</a>)</li> <li><a href="https://github.com/skim-rs/skim/commit/d6997330537c999ae9a473d104c5e846a24d11c2"><code>d699733</code></a> fix(filter): --filter hangs when the query is below --min-query-length (<a href="https://redirect.github.com/skim-rs/skim/issues/1158">#1158</a>)</li> <li><a href="https://github.com/skim-rs/skim/commit/756b08484121e93afaf5cd65ecb2c56d1a6ba81b"><code>756b084</code></a> ci: fix auto update branch</li> <li><a href="https://github.com/skim-rs/skim/commit/52275d3a3e61f5a8e770baa4fbfe44b9c5787b01"><code>52275d3</code></a> chore(deps): bump frizbee from 0.12.0 to 0.13.0 in the cargo-prod group (<a href="https://redirect.github.com/skim-rs/skim/issues/1162">#1162</a>)</li> <li><a href="https://github.com/skim-rs/skim/commit/2ec03e630cf6f1dbd484d84e800aa41960527e99"><code>2ec03e6</code></a> ci: automatically update PRs on pushes to master</li> <li><a href="https://github.com/skim-rs/skim/commit/c0786aa9d3d1e3839366ada492bdf3ca8e64e1c4"><code>c0786aa</code></a> chore: clippy & fmt after cargo update</li> <li><a href="https://github.com/skim-rs/skim/commit/bb80ac138e13d3c6ba0fe42e15fa6c95e2244778"><code>bb80ac1</code></a> fix: do not feed items through a fifo in zsh completions (<a href="https://redirect.github.com/skim-rs/skim/issues/1164">#1164</a>)</li> <li><a href="https://github.com/skim-rs/skim/commit/9de4825e5151b6fbe917800a20e29f2b675525ca"><code>9de4825</code></a> fix(matcher): an inverse query only checks the first --nth field (<a href="https://redirect.github.com/skim-rs/skim/issues/1159">#1159</a>)</li> <li>See full diff in <a href="https://github.com/skim-rs/skim/compare/v5.6.5...v5.6.6">compare view</a></li> </ul> </details> <br /> Updates `open` from 5.4.1 to 5.4.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Byron/open-rs/releases">open's releases</a>.</em></p> <blockquote> <h2>v5.4.2</h2> <h3>Bug Fixes</h3> <ul> <li>wait in that_detached instead of double-fork On macOS /usr/bin/open already detaches via LaunchServices. spawn_detached() adds another fork and leaves zombie children. Align that_detached with with_detached (PR <a href="https://redirect.github.com/Byron/open-rs/issues/119">#119</a>).</li> </ul> <h3>Commit Statistics</h3> <ul> <li>4 commits contributed to the release over the course of 18 calendar days.</li> <li>19 days passed between releases.</li> <li>1 commit was understood as <a href="https://www.conventionalcommits.org">conventional</a>.</li> <li>0 issues like '(#ID)' were seen in commit messages</li> </ul> <h3>Commit Details</h3> <!-- raw HTML omitted --> <!-- raw HTML omitted --> <ul> <li><strong>Uncategorized</strong> <ul> <li>Merge pull request <a href="https://redirect.github.com/Byron/open-rs/issues/130">#130</a> from s00d/fix/macos-that-detached-zombies (7468760)</li> <li>Review (351bb54)</li> <li>Wait in that_detached instead of double-fork (c4369c5)</li> <li>Merge pull request <a href="https://redirect.github.com/Byron/open-rs/issues/129">#129</a> from Byron/fix-wsl (beb6a3f)</li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Byron/open-rs/blob/main/changelog.md">open's changelog</a>.</em></p> <blockquote> <h2>5.4.2 (2026-08-24)</h2> <h3>Bug Fixes</h3> <ul> <li><!-- raw HTML omitted --> wait in that_detached instead of double-fork On macOS /usr/bin/open already detaches via LaunchServices. spawn_detached() adds another fork and leaves zombie children. Align that_detached with with_detached (PR <a href="https://redirect.github.com/Byron/open-rs/issues/119">#119</a>).</li> </ul> <h3>Commit Statistics</h3> <!-- raw HTML omitted --> <ul> <li>4 commits contributed to the release over the course of 18 calendar days.</li> <li>19 days passed between releases.</li> <li>1 commit was understood as <a href="https://www.conventionalcommits.org">conventional</a>.</li> <li>0 issues like '(#ID)' were seen in commit messages</li> </ul> <h3>Commit Details</h3> <!-- raw HTML omitted --> <!-- raw HTML omitted --> <ul> <li><strong>Uncategorized</strong> <ul> <li>Merge pull request <a href="https://redirect.github.com/Byron/open-rs/issues/130">#130</a> from s00d/fix/macos-that-detached-zombies (<a href="https://github.com/Byron/open-rs/commit/7468760c0b149db984ca3ab35624ff028a9830dd"><code>7468760</code></a>)</li> <li>Review (<a href="https://github.com/Byron/open-rs/commit/351bb54bcdbdd61ff8509fcb3bdb6712ed69ad4e"><code>351bb54</code></a>)</li> <li>Wait in that_detached instead of double-fork (<a href="https://github.com/Byron/open-rs/commit/c4369c5af39633a17a79c471605ef1a7f9143243"><code>c4369c5</code></a>)</li> <li>Merge pull request <a href="https://redirect.github.com/Byron/open-rs/issues/129">#129</a> from Byron/fix-wsl (<a href="https://github.com/Byron/open-rs/commit/beb6a3f3fe16d0c9054230cb8b8b57031727fdfb"><code>beb6a3f</code></a>)</li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Byron/open-rs/commit/1a3ef5d5f981ed344fc3f08ca52b35efbb0b890a"><code>1a3ef5d</code></a> Release open v5.4.2</li> <li><a href="https://github.com/Byron/open-rs/commit/7468760c0b149db984ca3ab35624ff028a9830dd"><code>7468760</code></a> Merge pull request <a href="https://redirect.github.com/Byron/open-rs/issues/130">#130</a> from s00d/fix/macos-that-detached-zombies</li> <li><a href="https://github.com/Byron/open-rs/commit/351bb54bcdbdd61ff8509fcb3bdb6712ed69ad4e"><code>351bb54</code></a> review</li> <li><a href="https://github.com/Byron/open-rs/commit/c4369c5af39633a17a79c471605ef1a7f9143243"><code>c4369c5</code></a> fix(macos): wait in that_detached instead of double-fork</li> <li><a href="https://github.com/Byron/open-rs/commit/beb6a3f3fe16d0c9054230cb8b8b57031727fdfb"><code>beb6a3f</code></a> Merge pull request <a href="https://redirect.github.com/Byron/open-rs/issues/129">#129</a> from Byron/fix-wsl</li> <li>See full diff in <a href="https://github.com/Byron/open-rs/compare/v5.4.1...v5.4.2">compare view</a></li> </ul> </details> <br /> Updates `vergen-gitcl` from 10.0.2 to 10.0.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rustyhorde/vergen/releases">vergen-gitcl's releases</a>.</em></p> <blockquote> <h2>vergen-git2 1.0.7</h2> <h2>What's Changed</h2> <ul> <li>Updated MSRV to 1.78.0 by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/388">rustyhorde/vergen#388</a></li> <li>Fixed broken tests by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/389">rustyhorde/vergen#389</a></li> <li>Removed unnecessary hashes in string literals by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/390">rustyhorde/vergen#390</a></li> <li>removed coverage_attribute as it is now supported by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/391">rustyhorde/vergen#391</a></li> <li>Added coverage_attribute feature to support llvm-cov by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/392">rustyhorde/vergen#392</a></li> <li>Dependency updates by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/394">rustyhorde/vergen#394</a></li> <li>Added back coverage_attribute feature for coverage by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/396">rustyhorde/vergen#396</a></li> <li>Bump library dependencies by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/397">rustyhorde/vergen#397</a></li> <li>Updated to latest deps to clear rustsec from gix by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/401">rustyhorde/vergen#401</a></li> <li>Removed lint by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/403">rustyhorde/vergen#403</a></li> <li>Fixed lint issues by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/404">rustyhorde/vergen#404</a></li> <li>Lint fixes, fixed macos builds by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/407">rustyhorde/vergen#407</a></li> <li>gitcl: log output of failed <code>git</code> commands. by <a href="https://github.com/aznashwan"><code>@aznashwan</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/409">rustyhorde/vergen#409</a></li> <li>Dependency updates by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/419">rustyhorde/vergen#419</a></li> <li>git: Ensure no backend ever takes an index lock by <a href="https://github.com/bgw"><code>@bgw</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/406">rustyhorde/vergen#406</a></li> <li>Fix lint issues with new mtime tests by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/420">rustyhorde/vergen#420</a></li> <li>Implement dirty for gix by <a href="https://github.com/yodaldevoid"><code>@yodaldevoid</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/412">rustyhorde/vergen#412</a></li> <li>Fixed lint issues in gix by <a href="https://github.com/CraZySacX"><code>@CraZySacX</code></a> in <a href="https://redirect.github.com/rustyhorde/vergen/pull/421">rustyhorde/vergen#421</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/aznashwan"><code>@aznashwan</code></a> made their first contribution in <a href="https://redirect.github.com/rustyhorde/vergen/pull/409">rustyhorde/vergen#409</a></li> <li><a href="https://github.com/bgw"><code>@bgw</code></a> made their first contribution in <a href="https://redirect.github.com/rustyhorde/vergen/pull/406">rustyhorde/vergen#406</a></li> <li><a href="https://github.com/yodaldevoid"><code>@yodaldevoid</code></a> made their first contribution in <a href="https://redirect.github.com/rustyhorde/vergen/pull/412">rustyhorde/vergen#412</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rustyhorde/vergen/compare/vergen_pretty_0.3.6...vergen_git2_1.0.7">https://github.com/rustyhorde/vergen/compare/vergen_pretty_0.3.6...vergen_git2_1.0.7</a></p> <h2>vergen-git2 1.0.2</h2> <ul> <li>Dependency Updates to help fix some compilation issues that arose on MacOS.</li> </ul> <h2>vergen-git2 1.0.1</h2> <ul> <li>Dependency updates</li> </ul> <h2>vergen-git2 1.0.0</h2> <ul> <li>Release 1 of the <code>vergen-git2</code> tool.</li> </ul> <h2>vergen-git2: v1.0.0-beta.2</h2> <ul> <li>Doc tweaks</li> <li>Workflow updates</li> <li>Feature fixes</li> </ul> <h2>vergen-git2 v1.0.0-beta.1</h2> <ul> <li>Mostly documentation updates</li> </ul> <h2>vergen-git2 - v1.0.0-beta.0</h2> <ul> <li>First beta release of the <code>vergen-git2</code> library.</li> <li>This library uses <code>git2</code> internally to generate the git based instructions.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/rustyhorde/vergen/commits">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
fcb9b63bdb |
chore: bump jsonschema from 0.50.0 to 0.52.0 (#3967)
Bumps [jsonschema](https://github.com/Stranger6667/jsonschema) from 0.50.0 to 0.52.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Stranger6667/jsonschema/releases">jsonschema's releases</a>.</em></p> <blockquote> <h2>[CLI] Release 0.52.0</h2> <p>No release notes provided.</p> <h2>[Python] Release 0.52.0</h2> <h3>Added</h3> <ul> <li>The <code>offline</code> argument, refusing to fetch references outside <code>registry</code>.</li> </ul> <h3>Fixed</h3> <ul> <li>Canonicalization not idempotent where a <code>patternProperties</code> <code>$ref</code> matches a key <code>properties</code> names.</li> <li>Type stubs omitting <code>ValidationError.absolute_keyword_location</code>.</li> <li>The <code>draft</code> argument and the <code>Draft201909Validator</code> / <code>Draft202012Validator</code> classes gating keywords on the vocabularies of the <code>$schema</code> they override, so the validator accepted every instance.</li> <li><code>is_valid</code> disagreeing with <code>validate</code>, <code>iter_errors</code>, and <code>evaluate</code> on a schema that reaches its own <code>$ref</code> twice, one of them under <code>not</code>.</li> </ul> <h2>[Ruby] Release 0.52.0</h2> <h3>Added</h3> <ul> <li>The <code>offline:</code> keyword argument, refusing to fetch references outside <code>registry:</code>.</li> </ul> <h3>Fixed</h3> <ul> <li>Canonicalization not idempotent where a <code>patternProperties</code> <code>$ref</code> matches a key <code>properties</code> names.</li> <li>The <code>draft:</code> keyword argument and the <code>Draft201909Validator</code> / <code>Draft202012Validator</code> classes gating keywords on the vocabularies of the <code>$schema</code> they override, so the validator accepted every instance.</li> <li><code>valid?</code> disagreeing with <code>validate!</code>, <code>each_error</code>, and <code>evaluate</code> on a schema that reaches its own <code>$ref</code> twice, one of them under <code>not</code>.</li> </ul> <h2>[Rust] Release 0.52.0</h2> <h3>Added</h3> <ul> <li><code>Evaluation::is_valid</code>.</li> <li><code>Location::is_empty</code>.</li> <li><code>Display</code> for <code>ErrorEntry</code>.</li> <li><code>ValidationOptions::offline</code> and <code>canonical::CanonicalizeOptions::offline</code>, refusing to fetch references outside the registry.</li> <li><code>idna</code> Cargo feature, enabled by default, gating the <code>idn-hostname</code> and <code>idn-email</code> formats. <a href="https://redirect.github.com/Stranger6667/jsonschema/issues/1313">#1313</a></li> <li><strong>CLI</strong>: the <code>--offline</code> flag of <code>jsonschema validate</code>, <code>jsonschema bundle</code> and <code>jsonschema dereference</code>.</li> </ul> <h3>Changed</h3> <ul> <li><code>ValidationErrors</code>' <code>Display</code> gained the instance path of each error.</li> <li><strong>BREAKING</strong>: With <code>default-features = false</code>, the <code>idn-hostname</code> and <code>idn-email</code> formats now require the new <code>idna</code> feature. Without it they are unknown formats, which are accepted by default, or rejected at build time under <code>should_ignore_unknown_formats(false)</code>. Add <code>idna</code> to the feature list to keep the previous behavior.</li> </ul> <h3>Fixed</h3> <ul> <li>Canonicalization not idempotent where a <code>patternProperties</code> <code>$ref</code> matches a key <code>properties</code> names.</li> <li><code>is_valid</code> disagreeing with <code>validate</code>, <code>iter_errors</code>, and <code>evaluate</code> on a schema that reaches its own <code>$ref</code> twice, one of them under <code>not</code>.</li> <li><code>format: email</code> and <code>format: idn-email</code> rejecting an empty quoted string as the local part (it should be accepted).</li> <li><code>format: email</code> and <code>format: idn-email</code> rejecting an address literal whose <code>IPv6:</code> tag is not written in that exact case (the tag is case-insensitive).</li> <li><code>format: email</code> accepting a non-ASCII character in the local part (it should be rejected).</li> <li><code>ValidationOptions::with_draft</code> gating keywords on the vocabularies of the <code>$schema</code> it overrides, so the validator accepted every instance.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Stranger6667/jsonschema/blob/master/CHANGELOG.md">jsonschema's changelog</a>.</em></p> <blockquote> <h2>[0.52.0] - 2026-08-26</h2> <h3>Added</h3> <ul> <li><code>Evaluation::is_valid</code>.</li> <li><code>Location::is_empty</code>.</li> <li><code>Display</code> for <code>ErrorEntry</code>.</li> <li><code>ValidationOptions::offline</code> and <code>canonical::CanonicalizeOptions::offline</code>, refusing to fetch references outside the registry.</li> <li><code>idna</code> Cargo feature, enabled by default, gating the <code>idn-hostname</code> and <code>idn-email</code> formats. <a href="https://redirect.github.com/Stranger6667/jsonschema/issues/1313">#1313</a></li> <li><strong>CLI</strong>: the <code>--offline</code> flag of <code>jsonschema validate</code>, <code>jsonschema bundle</code> and <code>jsonschema dereference</code>.</li> </ul> <h3>Changed</h3> <ul> <li><code>ValidationErrors</code>' <code>Display</code> gained the instance path of each error.</li> <li><strong>BREAKING</strong>: With <code>default-features = false</code>, the <code>idn-hostname</code> and <code>idn-email</code> formats now require the new <code>idna</code> feature. Without it they are unknown formats, which are accepted by default, or rejected at build time under <code>should_ignore_unknown_formats(false)</code>. Add <code>idna</code> to the feature list to keep the previous behavior.</li> </ul> <h3>Fixed</h3> <ul> <li>Canonicalization not idempotent where a <code>patternProperties</code> <code>$ref</code> matches a key <code>properties</code> names.</li> <li><code>is_valid</code> disagreeing with <code>validate</code>, <code>iter_errors</code>, and <code>evaluate</code> on a schema that reaches its own <code>$ref</code> twice, one of them under <code>not</code>.</li> <li><code>format: email</code> and <code>format: idn-email</code> rejecting an empty quoted string as the local part (it should be accepted).</li> <li><code>format: email</code> and <code>format: idn-email</code> rejecting an address literal whose <code>IPv6:</code> tag is not written in that exact case (the tag is case-insensitive).</li> <li><code>format: email</code> accepting a non-ASCII character in the local part (it should be rejected).</li> <li><code>ValidationOptions::with_draft</code> gating keywords on the vocabularies of the <code>$schema</code> it overrides, so the validator accepted every instance.</li> </ul> <h3>Performance</h3> <ul> <li><code>iter_errors</code> collects into a single buffer instead of allocating and re-boxing an iterator at every schema node.</li> </ul> <h2>[0.51.0] - 2026-08-23</h2> <h3>Added</h3> <ul> <li><code>ValidationOptions::with_vocabulary</code> and the <code>vocabularies</code> attribute on <code>jsonschema::validator</code>, declaring support for a vocabulary this crate does not implement.</li> <li>The <code>--vocabulary</code> flag of <code>jsonschema validate</code>.</li> </ul> <h3>Changed</h3> <ul> <li><code>Vocabulary</code> gained the <code>FormatAssertion</code> variant, which its Draft 2020-12 URI parses to instead of <code>Vocabulary::Custom</code>, and is marked <code>non_exhaustive</code>.</li> </ul> <h3>Fixed</h3> <ul> <li>The <code>uniqueItems</code> length ceiling not reading an <code>items</code> or <code>contains</code> schema written as a <code>$ref</code>.</li> <li>The Draft 2020-12 Format-Assertion vocabulary read as an annotation, so a meta-schema requiring it accepted values its <code>format</code> rejects.</li> <li>An unrecognized <code>format</code> accepted under a meta-schema requiring the Format-Assertion vocabulary (it should be rejected).</li> <li>A meta-schema requiring a vocabulary this crate does not implement accepted (it should be rejected).</li> <li>The Draft 2019-09 Format vocabulary declared <code>true</code> read as an annotation, so a meta-schema requiring it accepted values its <code>format</code> rejects.</li> <li>The bundled <code>https://json-schema.org/draft/2020-12/meta/format-assertion</code> meta-schema not declaring its vocabulary, so a schema written against it annotated <code>format</code> instead of asserting it.</li> <li>A meta-schema without <code>$id</code> keeping its <code>$vocabulary</code> unread, so a schema written against it got every Draft 2020-12 vocabulary.</li> <li>A schema naming a bundled vocabulary meta-schema as its <code>$schema</code> rejected as an unknown meta-schema (it should build).</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Stranger6667/jsonschema/commit/edeb4f2af95ddcf632dd8349de72cab04e48ae68"><code>edeb4f2</code></a> chore(ruby): Release 0.52.0</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/c3080258c8de7339188a3246c5c25792611411bc"><code>c308025</code></a> chore(rust): Release 0.52.0</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/7d8465cf8bb0ab4479eb370535a739639e6b1cca"><code>7d8465c</code></a> feat(cli): the <code>--offline</code> flag of <code>jsonschema validate</code>, <code>jsonschema bundle</code>...</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/5015aa66ef5fbe7bfb038e8498d7d0f16bc0365d"><code>5015aa6</code></a> docs: Update docs</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/84048dd0d4e6196987bdbcd944b59601e1637375"><code>84048dd</code></a> fix: <code>is_valid</code> disagreeing with <code>validate</code>, <code>iter_errors</code>, and <code>evaluate</code> on...</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/610aa6bec667262b04a2dfb39e9f0d261d061436"><code>610aa6b</code></a> fix(python): Type stubs omitting <code>ValidationError.absolute_keyword_location</code></li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/63b8dfaac2873ea8be7918e82a8a7e82aa8f280a"><code>63b8dfa</code></a> fix: <code>ValidationOptions::with_draft</code> gating keywords on the vocabularies of t...</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/8fc6ff7335df31a7830c709a5a76a9c8ad33d829"><code>8fc6ff7</code></a> fix: Canonicalization not idempotent where a <code>patternProperties</code> <code>$ref</code> match...</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/7368dcf1a62a311b85008dd861b80c0ffd6751a3"><code>7368dcf</code></a> test: Generate random json schemas with hegel</li> <li><a href="https://github.com/Stranger6667/jsonschema/commit/e6e8b8d8882f7f58c785b9bd7d4562ea2d02b1dc"><code>e6e8b8d</code></a> fix: Misc <code>email</code> format fixes</li> <li>Additional commits viewable in <a href="https://github.com/Stranger6667/jsonschema/compare/cli-v0.50.0...cli-v0.52.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
6237f5b6eb |
docs(readme): refresh status stamp to September 2026 (#3979)
The README's intro blockquote still opened with **August 2026**; today is 2026-09-01, so the stamp is a month stale. This bumps it to **September 2026** — the same monthly refresh as #3686 (August), #3347 (July), and #2972 (June). Line 16 sits above the first `<!-- AUTO-GENERATED -->` marker (line 28), so it is a hand-edited primary rather than generated content. It has two mirrors, which behave differently: `skills/worktrunk/reference/README.md` is a symlink to the root `README.md` and picks the change up for free, while `plugins/worktrunk/skills/worktrunk/reference/README.md` is a generated *file copy* and needs its own sync — that second commit is here because `test_docs_are_in_sync` caught the stale copy on the first push. No regression test: the stamp is prose with no behavioral surface, and its correctness is time-dependent rather than assertable. <details><summary>Nightly sweep context</summary> Found by the rolling survey (bucket 5/28) together with the README date check in the repo's `running-tend` skill. The rest of the sweep was clean: - **tend config** — `tend check` all PASS; bot PAT carries every required scope. - **Conflicts** — #3129 (bot) and #3966/#3967/#3978 (Dependabot) all test-merge clean against `main` via `git merge-tree`; no deferral comments to clear. - **Workflow regen** — `uvx tend@latest init` produced no diff; the committed workflows are already at tend 0.1.24. - **Recent commits** — the 7 commits in the last 24h reviewed; no findings. The `for_action_branchless` → `for_action_loading_config` rename in #3970 left no stale references, and #3976's `append_call_line` change carries its own regression test. - **Survey** — `src/cache.rs`, `src/config/user/path.rs`, `src/config/user/sections.rs`, `src/styling/line.rs`, `docs/src/content/docs/claude-code.md`, the two `.config/clawpatch/features/*.json` files (every referenced path still resolves), and the skill/plugin pages. No findings. </details> --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
a02df64ffe |
chore: bump taiki-e/install-action from 2.86.7 to 2.87.1 (#3978)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.86.7 to 2.87.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/taiki-e/install-action/releases">taiki-e/install-action's releases</a>.</em></p> <blockquote> <h2>2.87.1</h2> <ul> <li> <p>Update <code>uv@latest</code> to 0.12.7.</p> </li> <li> <p>Update <code>typos@latest</code> to 1.49.1.</p> </li> <li> <p>Update <code>syft@latest</code> to 1.51.1.</p> </li> <li> <p>Update <code>prek@latest</code> to 0.5.0.</p> </li> <li> <p>Update <code>d2@latest</code> to 0.8.2.</p> </li> <li> <p>Update <code>cargo-zigbuild@latest</code> to 0.23.3.</p> </li> <li> <p>Update <code>cargo-rdme@latest</code> to 2.2.2.</p> </li> <li> <p>Update <code>biome@latest</code> to 2.5.11.</p> </li> </ul> <h2>2.87.0</h2> <ul> <li> <p>Support <code>kache</code>. (<a href="https://redirect.github.com/taiki-e/install-action/pull/1980">#1980</a>, thanks <a href="https://github.com/ChrisJr404"><code>@ChrisJr404</code></a>)</p> </li> <li> <p>Update <code>vacuum@latest</code> to 0.30.1.</p> </li> <li> <p>Update <code>uv@latest</code> to 0.12.6.</p> </li> <li> <p>Update <code>mise@latest</code> to 2026.8.14.</p> </li> <li> <p>Update <code>editorconfig-checker@latest</code> to 3.11.2.</p> </li> </ul> <h2>2.86.8</h2> <ul> <li> <p>Update <code>wasmtime@latest</code> to 48.0.1.</p> </li> <li> <p>Update <code>wasm-tools@latest</code> to 1.258.0.</p> </li> <li> <p>Update <code>oxfmt@latest</code> to 1.80.0.</p> </li> <li> <p>Update <code>mise@latest</code> to 2026.8.12.</p> </li> <li> <p>Update <code>kingfisher@latest</code> to 2.0.0.</p> </li> <li> <p>Update <code>cargo-zigbuild@latest</code> to 0.23.2.</p> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md">taiki-e/install-action's changelog</a>.</em></p> <blockquote> <h2>[2.87.1] - 2026-08-29</h2> <ul> <li> <p>Update <code>uv@latest</code> to 0.12.7.</p> </li> <li> <p>Update <code>typos@latest</code> to 1.49.1.</p> </li> <li> <p>Update <code>syft@latest</code> to 1.51.1.</p> </li> <li> <p>Update <code>prek@latest</code> to 0.5.0.</p> </li> <li> <p>Update <code>d2@latest</code> to 0.8.2.</p> </li> <li> <p>Update <code>cargo-zigbuild@latest</code> to 0.23.3.</p> </li> <li> <p>Update <code>cargo-rdme@latest</code> to 2.2.2.</p> </li> <li> <p>Update <code>biome@latest</code> to 2.5.11.</p> </li> </ul> <h2>[2.87.0] - 2026-08-27</h2> <ul> <li> <p>Support <code>kache</code>. (<a href="https://redirect.github.com/taiki-e/install-action/pull/1980">#1980</a>, thanks <a href="https://github.com/ChrisJr404"><code>@ChrisJr404</code></a>)</p> </li> <li> <p>Update <code>vacuum@latest</code> to 0.30.1.</p> </li> <li> <p>Update <code>uv@latest</code> to 0.12.6.</p> </li> <li> <p>Update <code>mise@latest</code> to 2026.8.14.</p> </li> <li> <p>Update <code>editorconfig-checker@latest</code> to 3.11.2.</p> </li> </ul> <h2>[2.86.8] - 2026-08-26</h2> <ul> <li> <p>Update <code>wasmtime@latest</code> to 48.0.1.</p> </li> <li> <p>Update <code>wasm-tools@latest</code> to 1.258.0.</p> </li> <li> <p>Update <code>oxfmt@latest</code> to 1.80.0.</p> </li> <li> <p>Update <code>mise@latest</code> to 2026.8.12.</p> </li> <li> <p>Update <code>kingfisher@latest</code> to 2.0.0.</p> </li> <li> <p>Update <code>cargo-zigbuild@latest</code> to 0.23.2.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/taiki-e/install-action/commit/742a3317eac7bd62f91cd888b4eead5e784ba833"><code>742a331</code></a> Release 2.87.1</li> <li><a href="https://github.com/taiki-e/install-action/commit/c5b69cd73ba573d80324cdcd0b052ca509084b22"><code>c5b69cd</code></a> Update <code>uv@latest</code> to 0.12.7</li> <li><a href="https://github.com/taiki-e/install-action/commit/85e6400c85d74d612698536feafd9e20f40aa257"><code>85e6400</code></a> Update <code>typos@latest</code> to 1.49.1</li> <li><a href="https://github.com/taiki-e/install-action/commit/91f3a12371baac5722df4e5c6d42937d16656ffe"><code>91f3a12</code></a> Update tombi manifest</li> <li><a href="https://github.com/taiki-e/install-action/commit/160f8b13c099dc3c9067e0658c0da7ac925a00ff"><code>160f8b1</code></a> Update <code>syft@latest</code> to 1.51.1</li> <li><a href="https://github.com/taiki-e/install-action/commit/aa48d3e72e94215619c754df53a143cdaabefc8b"><code>aa48d3e</code></a> Update shfmt manifest</li> <li><a href="https://github.com/taiki-e/install-action/commit/06671d277ce58cccc6fe7f9d6509e0327c53f4f3"><code>06671d2</code></a> Update <code>prek@latest</code> to 0.5.0</li> <li><a href="https://github.com/taiki-e/install-action/commit/8060a83f169920516f09e1cf1c58677cec39b6c7"><code>8060a83</code></a> Update <code>d2@latest</code> to 0.8.2</li> <li><a href="https://github.com/taiki-e/install-action/commit/74cae3c341a52a9e510e2f660ed813b801bff6dd"><code>74cae3c</code></a> Update <code>cargo-zigbuild@latest</code> to 0.23.3</li> <li><a href="https://github.com/taiki-e/install-action/commit/a65402f15d24476e19123aafa105daa804db68c0"><code>a65402f</code></a> Update <code>cargo-rdme@latest</code> to 2.2.2</li> <li>Additional commits viewable in <a href="https://github.com/taiki-e/install-action/compare/v2.86.7...v2.87.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
6bb421c9ef | fix(testing): write each mock call-log entry in one append (#3976) | ||
|
|
126f022416 |
ci: bump Windows runner images from windows-2022 to windows-2025 (#3974)
## Summary `windows-2022` was deliberately held back, and the reason recorded in `ci.yaml`'s header no longer holds. The comment reads "Pinned because windows-2025 lacks D: drive" — but GitHub reversed that removal: [actions/runner-images#12744](https://github.com/actions/runner-images/issues/12744) announced that from 2025-08-18 the Windows Server 2025 image again exposes a `D:\` drive, with the working directory back on `D:\`, explicitly reversing [#12416](https://github.com/actions/runner-images/issues/12416). `windows-2022` has also fallen off the `windows-latest` label, so the pin is due on the ordinary weekly rule too. This moves the four `windows-2022` matrix entries to `windows-2025` and rewrites the header comment, which no longer needs a hold-back line. Split from the week's other pin bumps ([#3971](https://github.com/max-sixty/worktrunk/pull/3971)) so a red Windows matrix decides only this bump. The `D:\` drive is what prompted the change because the workflows use it: `ci.yaml`, `affected.yaml`, and `nightly.yaml` each run a `Use fast D: drive for temp files (Windows)` step that creates `D:\tmp` and points `TEMP`/`TMP` at it. Those steps are unchanged and keep working, since #12744 restored exactly that drive. ## The label also swaps the MSVC toolset `D:\` is not the only variable this bump moves. `windows-2025` is no longer the Visual Studio 2022 image: [actions/runner-images#14017](https://github.com/actions/runner-images/issues/14017) moved `windows-latest` and `windows-2025` onto the Windows Server 2025 + VS 2026 image in June 2026. The availability table now carries a single Windows Server 2025 row whose three labels — `windows-latest`, `windows-2025`, `windows-2025-vs2026` — all resolve to `Windows2025-VS2026-Readme.md`. So CI's Windows legs compile with the VS 2026 toolset after this PR. The second-order effect is that CI and the release build no longer share a toolset. `dist` computes the release matrix itself and is untouched here: v0.69.2 built `x86_64-pc-windows-msvc` on `build-local-artifacts (windows-2022, …)`, and `windows-2022` is not deprecated, so `dist` keeps picking it. Nothing now exercises the toolset the shipped binary is compiled and linked with. That is a real gap, but a low-risk one and a separate decision from this bump — nothing in the tree pins a VS path (`build.rs` is vergen-only; the `cc` / `find-msvc-tools` route discovers VS through vswhere), and `affected tests (windows, advisory)` is green on this head. Aligning the release runner is a release-matrix change that belongs in its own PR. ## Verification This PR's own `test (windows)`, `full-tests (windows-2025, windows)`, and `affected tests (windows, advisory)` legs are the only place this gets tested — the weekly runner is Linux. Two failure shapes to look for if Windows goes red, not one: - **`D:`-shaped** — the `D:\tmp` step fails to create the directory, meaning #12744's restoration doesn't apply to this repo's runners and the pin should go back. - **Toolset-shaped** — a compile or link failure from the VS 2026 move. [#14004](https://github.com/actions/runner-images/issues/14004) is an open report of this same label swap breaking hardcoded VS 2022 paths; nothing here hardcodes one, but a future Windows-only break is as likely to be this shape as the first. The throughput question this description originally left open is answered: no measurable regression. Every Windows leg here lands inside the same-day `windows-2022` spread from the sibling pin PRs, and the advisory leg is the fastest of the five — durations are tabulated in [the first review](https://github.com/max-sixty/worktrunk/pull/3974#pullrequestreview-5064565794). The remaining bias runs against this PR, not for it: `save-if` gates the rust-cache write to `main`, so this run restored a cache written on `windows-2022`. [#12647](https://github.com/actions/runner-images/issues/12647)'s reported slowdown does not reproduce here. `ci.yaml`'s header comment now keeps each pin on its own line, so this PR's edit and [#3973](https://github.com/max-sixty/worktrunk/pull/3973)'s `macos-15` → `macos-26` edit stay on separate lines. They are still adjacent lines, so whichever lands second needs a one-hunk resolution keeping both — details in [this comment](https://github.com/max-sixty/worktrunk/pull/3974#issuecomment-5476167137). The three matrix files auto-merge clean. <details><summary>Availability table rows this reads from</summary> From `actions/runner-images` `README.md`: - Windows Server 2025 — `windows-latest`, `windows-2025`, `windows-2025-vs2026`; Included Software links `images/windows/Windows2025-VS2026-Readme.md` - Windows Server 2022 — `windows-2022` (no `-latest`), linking `images/windows/Windows2022-Readme.md` `windows-2022` is not badged `deprecated` yet, but it is now the older of the two GA images, which the weekly rule treats as next due. That it is undeprecated is also why `dist` still selects it for the release build. </details> --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
78552b700f |
docs(commands): name CommandEnv's two constructors after what actually differs (#3970)
Surfaced by tonight's nightly survey of `src/commands/context.rs`. `CommandEnv::for_action_branchless` is documented as "load the command environment without requiring a branch", but `for_action` doesn't require one either — both resolve `branch` from the same `WorkingTree::branch()` call, which returns `Ok(None)` in detached HEAD, and both leave the requirement to a later `require_branch()`. The only actual difference is where `UserConfig` comes from: `for_action` takes one from the caller, the other reads the repository's cached load. The claim has been stale since #1750, which changed `for_action`'s branch from a hard requirement to an `Option`. It survives in three places that all steer a reader the same wrong way — the constructor's name, its doc comment, and a comment at each of the two call sites (`branch-optional for CI compatibility`, `Uses branchless mode`). This renames it to `for_action_loading_config` and rewrites the three comments to state the config-source distinction. No behavior change, so there's no regression test to add: the rename is mechanical (two call sites, both in `hook_commands.rs`) and the rest is comments. `cargo clippy --all-targets --all-features` and `cargo fmt --check` are clean, and `cargo test --test integration hook_show` (21) plus `cargo test --lib --bins` pass. <details><summary>Why the two constructors are equivalent on branches</summary> Both call `repo.current_worktree().branch()`, which resolves via `rev-parse --symbolic-full-name HEAD` and returns `Ok(None)` when detached rather than erroring ([`working_tree.rs`](https://github.com/max-sixty/worktrunk/blob/40fab76812a9dd08d76b58f4ea5b8fd5bd7d54f5/src/git/repository/working_tree.rs#L435-L454)). `Repository::user_config()` is a cached `UserConfig::load_with_warnings()` on `RepoCache`, so the two paths also agree on config content — they differ only in who supplies it. Renaming rather than only correcting the doc, because a name that says "branchless" next to a sibling that is equally branchless is the part a reader trusts without opening the doc comment. </details> Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
94e609c8fb |
ci: bump macOS runner images from macos-15 to macos-26 (#3973)
## Summary `macos-15` has fallen off the `macos-latest` label — `actions/runner-images` now resolves it to macOS 26 Arm64 — so the pin is due under the weekly rule that bumps any image the availability table no longer lists against `-latest`. This moves the four `macos-15` matrix entries to `macos-26` and the one `macos-15-intel` release runner to `macos-26-intel`. Split from the week's other pin bumps ([#3971](https://github.com/max-sixty/worktrunk/pull/3971)) so a red macOS matrix decides only this bump. The architecture split is preserved exactly: `macos-26` is the arm64 image (what `macos-latest` now points at, matching `macos-15`'s old role), and `macos-26-intel` is the x64 image that `nightly.yaml`'s `x86_64-apple-darwin` release target needs. ## Verification This PR's own `test (macos)`, `full-tests (macos-26, macos)`, `affected tests (macos, advisory)`, and `release-target (x86_64-apple-darwin)` legs are the only place this gets tested — the weekly runner is Linux. Worth reading those results before merging rather than treating the label swap as mechanical: a runner image bump moves Xcode, the system toolchain, and the preinstalled git, any of which the PTY and shell-integration suites can notice. <details><summary>Availability table rows this reads from</summary> From `actions/runner-images` `README.md`: - macOS 26 Arm64 — `macos-latest`, `macos-26`, `macos-26-xlarge` - macOS 26 — `macos-latest-large`, `macos-26-intel`, `macos-26-large` - macOS 15 Arm64 — `macos-15`, `macos-15-xlarge` (no `-latest`) - macOS 15 — `macos-15-large`, `macos-15-intel` (no `-latest`) - macOS 14 — badged `deprecated` macOS 15 is not badged deprecated yet, but it is now the older of the two GA images, which is what the weekly rule treats as next due. `ubuntu-24.04` is untouched here: it is still exactly what `ubuntu-latest` resolves to. </details> Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
9bcc071222 |
ci: bump pinned Nushell to 0.115.1 (#3972)
## Summary Weekly pin bump: Nushell 0.115.0 → 0.115.1 across all seven pinned sites. Split from the week's other pin bumps ([#3971](https://github.com/max-sixty/worktrunk/pull/3971)) because the shell-integration suite runs `--all-features`, so a Nushell version change can move PTY snapshots — on its own branch, a red matrix decides only this bump. Sites moved together, per the weekly checklist: the five `hustcer/setup-nu` `version:` inputs (`coverage.yaml`, `nightly.yaml`, `benchmarks.yaml`, and both `.github/actions/{test,tend}-setup/action.yaml`), plus the two places that pin Nushell outside `.github/` and are kept level with `test-setup` — `.codex/cloud.sh`'s `NU_VERSION` and `Taskfile.yaml`'s `setup-web`. ## Verification The version is the current upstream release (`nushell/nushell` `0.115.1`, published 2026-08-23). This PR's own `test (linux|macos|windows)` and `full-tests` legs are where the snapshot question actually gets answered — I have not run the PTY suite against 0.115.1 locally, since the weekly runner installs no Nushell. <details><summary>Upstream changes in 0.115.1</summary> A patch release, mostly completion and config fixes. Nothing that obviously touches the prompt or wrapper surfaces worktrunk's snapshots capture, but the completion and REPL changes are the ones to watch if a snapshot does move: - `fix(config): merge keybindings by name and key instead of name alone` (#18870) - `feat(completions): add a background-completions opt-out` (#18764) - `fix(completions): keep the REPL usable when a completer runs fzf or input list` (#18881) - `Completor Fixes` (#18868) - `allow $ans to still work after invalid operation` (#18863) - `fix update to work better with custom values` (#18865) - `allow boolean comparison with semver` (#18854) - `Update h2 do to RUSTSEC-2026-0258` (#18875) </details> Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
5f06e55332 |
chore(ci): weekly renovation 2026-08-31 (#3971)
## Summary Weekly CI renovation. One cargo-install pin had drifted; everything else in the weekly checklist is already current. Rust stable is 1.98.0, so MSRV and the development toolchain stay at 1.97 (latest stable − 1) — last week's bump already landed them there. - **`worktrunk`: 0.74.0 → 0.75.0** — `ci.yaml` ×2, `nightly.yaml` ×1. `rust-version` 1.97, exactly the pinned toolchain. Toolchain compatibility for every pinned crate against 1.97.0: `cargo-affected` 0.4.0 (1.94), `cargo-insta` 1.48.0 (1.66.0), `cargo-nextest` 0.9.143 (1.91), `cargo-llvm-cov` 0.9.0 (1.87), `cargo-msrv` 0.19.3 (1.91.1), `lychee` 0.24.2 (1.88.0), `worktrunk` 0.75.0 (1.97), `cargo-udeps` 0.1.61 (unspecified). All build under 1.97.0. <details><summary>Everything else the weekly pass checked, and why it isn't here</summary> - **MSRV + toolchain** — stable is 1.98.0 (released 2026-08-18), so the target is 1.97. `Cargo.toml`, `tests/helpers/wt-perf/Cargo.toml`, and `rust-toolchain.toml` are all already at 1.97. No change, so no `flake.lock` refresh either. - **Pinned nightlies** — `nightly-2026-08-01` ×2 in `nightly.yaml`. One month old; the rule bumps only past three months. - **Other cargo-install pins** — `cargo-affected`, `cargo-insta`, `cargo-nextest`, `cargo-llvm-cov`, `cargo-msrv`, `cargo-udeps`, `lychee` all match their current crates.io release. - **Codex Cloud / `setup-web`** — `pre-commit` 4.6.2, `cargo-insta` 1.48.0, `cargo-nextest` 0.9.143, PowerShell 7.6.5 all current. Nushell has drifted and is handled separately, below. - **`ubuntu-24.04`** — still what `ubuntu-latest` resolves to, so it stays. Ubuntu 26.04 is badged `preview`, which is not a bump target. - **Dependabot's `typescript` major ignore** — stays. `@astrojs/check` still declares `peer typescript@"^5.0.0 || ^6.0.0"` and the current `typescript` major is 7, so the entry is still the only thing keeping a TypeScript 7 lockfile from breaking `npm ci`. - **LLM model pins in docs** — `claude-haiku-4.5` and `gpt-5.6-luna` are both still the fastest/smallest in their vendor's current family. OpenAI's models page describes Luna as "fast and affordable … at the lowest cost in the family"; the only smaller Codex model, `gpt-5.3-codex-spark`, is a Pro-only research preview and not a good default recommendation. - **Statusline cache-check** — clean. `wt config state logs profile` reports `same_context_duplicates: []` and 0 extra calls on a `wt list statusline --format=claude-code` render. </details> Three findings from this pass are **not** in this PR, because each can turn a whole CI leg red and belongs on its own branch: the Nushell bump (moves PTY snapshots) and the two runner-image bumps (`macos-15` and `windows-2022` have both fallen off their `-latest` label). Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
cf734e3b33 |
chore: update tend workflows (0.1.22 → 0.1.24) (#3969)
Nightly regeneration of tend's workflow files, picking up two upstream releases. **tend version:** 0.1.22 → 0.1.24 ### Notable changes - **The frequent poll now repairs conflicted bot PRs**, not just unread notifications — the `tend-notifications` boot gate gained a GraphQL query that test-merges open bot PRs and looks for deferral markers in recent comments, so a conflicted PR wakes the queue instead of waiting for the nightly sweep ([max-sixty/tend#1108](https://github.com/max-sixty/tend/pull/1108)). - **Review gating tightened**: `APPROVE` is now conditioned on the author stating merge readiness rather than the draft flag alone, the posting preflight is bound to the outward action, and the code-review pass became its own step gated at submit ([max-sixty/tend#1087](https://github.com/max-sixty/tend/pull/1087), [max-sixty/tend#1107](https://github.com/max-sixty/tend/pull/1107), [max-sixty/tend#1080](https://github.com/max-sixty/tend/pull/1080)). - **Generator fixes that change this repo's YAML**: an adopter's `prompt:` may now span more than one line (the `|2` block-indent markers in the diff), pre-check setup guards are preserved, and the `concurrency.queue` actionlint ignore is written out ([max-sixty/tend#1103](https://github.com/max-sixty/tend/pull/1103), [max-sixty/tend#1106](https://github.com/max-sixty/tend/pull/1106), [max-sixty/tend#1095](https://github.com/max-sixty/tend/pull/1095)). - **`uv` is provisioned for agent sessions**, and Gist-backed Claude memory ships as experimental ([max-sixty/tend#1109](https://github.com/max-sixty/tend/pull/1109), [max-sixty/tend#1110](https://github.com/max-sixty/tend/pull/1110)). - Pinned harness versions moved with the releases: Claude 2.1.251, Codex 0.151.0, uv 0.12.7. ### A second commit, outside the usual regen `tend init` now also writes `.github/actionlint.yaml` (the `concurrency.queue` ignore from max-sixty/tend#1095). The nightly recipe stages only `.github/workflows` and `.config`, so it landed untracked and would be re-created on every future run — the second commit tracks it. This repo runs no actionlint job or pre-commit hook, so the file is inert here; it only suppresses a false positive for anyone linting these workflows locally. Full compare: https://github.com/max-sixty/tend/compare/0.1.22...0.1.24 --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
40fab76815 |
chore: bump the docs-site group in /docs with 2 updates (#3968)
Bumps the docs-site group in /docs with 2 updates: [@astrojs/starlight](https://github.com/withastro/starlight/tree/HEAD/packages/starlight) and [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `@astrojs/starlight` from 0.41.7 to 0.41.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/withastro/starlight/releases">@astrojs/starlight's releases</a>.</em></p> <blockquote> <h2><code>@astrojs/starlight</code><a href="https://github.com/0"><code>@0</code></a>.41.9</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/withastro/starlight/pull/4145">#4145</a> <a href="https://github.com/withastro/starlight/commit/1c90d69b424aedef096e12577e9e7ec96bed4efc"><code>1c90d69</code></a> Thanks <a href="https://github.com/pyxelr"><code>@pyxelr</code></a>! - Adds 1 new icon: <code>goodreads</code></li> </ul> <h2><code>@astrojs/starlight</code><a href="https://github.com/0"><code>@0</code></a>.41.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/starlight/pull/4142">#4142</a> <a href="https://github.com/withastro/starlight/commit/cacbc9ff45c551c2f20c6b307800f7ff7ee07db2"><code>cacbc9f</code></a> Thanks <a href="https://github.com/alebelcor"><code>@alebelcor</code></a>! - Adds 1 new icon: <code>whatsApp</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/starlight/pull/4133">#4133</a> <a href="https://github.com/withastro/starlight/commit/3944311bed46f956e12e79a8eb0c32084eeeaea6"><code>3944311</code></a> Thanks <a href="https://github.com/delucis"><code>@delucis</code></a>! - Internal refactor: numbered <code>id</code> attributes in the <code><Tabs></code> component are now page-specific instead of using a global counter</p> </li> <li> <p><a href="https://redirect.github.com/withastro/starlight/pull/4138">#4138</a> <a href="https://github.com/withastro/starlight/commit/cd4b6655f3235220cded12f0567e0dad1bf5adac"><code>cd4b665</code></a> Thanks <a href="https://github.com/delucis"><code>@delucis</code></a>! - Fixes localisation of code block UI elements when using the Sätteri Markdown processor</p> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/withastro/starlight/blob/main/packages/starlight/CHANGELOG.md">@astrojs/starlight's changelog</a>.</em></p> <blockquote> <h2>0.41.9</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/withastro/starlight/pull/4145">#4145</a> <a href="https://github.com/withastro/starlight/commit/1c90d69b424aedef096e12577e9e7ec96bed4efc"><code>1c90d69</code></a> Thanks <a href="https://github.com/pyxelr"><code>@pyxelr</code></a>! - Adds 1 new icon: <code>goodreads</code></li> </ul> <h2>0.41.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/starlight/pull/4142">#4142</a> <a href="https://github.com/withastro/starlight/commit/cacbc9ff45c551c2f20c6b307800f7ff7ee07db2"><code>cacbc9f</code></a> Thanks <a href="https://github.com/alebelcor"><code>@alebelcor</code></a>! - Adds 1 new icon: <code>whatsApp</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/starlight/pull/4133">#4133</a> <a href="https://github.com/withastro/starlight/commit/3944311bed46f956e12e79a8eb0c32084eeeaea6"><code>3944311</code></a> Thanks <a href="https://github.com/delucis"><code>@delucis</code></a>! - Internal refactor: numbered <code>id</code> attributes in the <code><Tabs></code> component are now page-specific instead of using a global counter</p> </li> <li> <p><a href="https://redirect.github.com/withastro/starlight/pull/4138">#4138</a> <a href="https://github.com/withastro/starlight/commit/cd4b6655f3235220cded12f0567e0dad1bf5adac"><code>cd4b665</code></a> Thanks <a href="https://github.com/delucis"><code>@delucis</code></a>! - Fixes localisation of code block UI elements when using the Sätteri Markdown processor</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/withastro/starlight/commit/bc6b188463c82a58466ad0c9339d62e30977d807"><code>bc6b188</code></a> [ci] release (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4153">#4153</a>)</li> <li><a href="https://github.com/withastro/starlight/commit/1c90d69b424aedef096e12577e9e7ec96bed4efc"><code>1c90d69</code></a> Add Goodreads icon (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4145">#4145</a>)</li> <li><a href="https://github.com/withastro/starlight/commit/e81fedf2ed47fc6ca5b7c1bcb4094e514dc1dade"><code>e81fedf</code></a> [ci] release (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4137">#4137</a>)</li> <li><a href="https://github.com/withastro/starlight/commit/cd4b6655f3235220cded12f0567e0dad1bf5adac"><code>cd4b665</code></a> Fix localisation of Expressive Code UI (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4138">#4138</a>)</li> <li><a href="https://github.com/withastro/starlight/commit/cacbc9ff45c551c2f20c6b307800f7ff7ee07db2"><code>cacbc9f</code></a> Add WhatsApp icon (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4142">#4142</a>)</li> <li><a href="https://github.com/withastro/starlight/commit/3944311bed46f956e12e79a8eb0c32084eeeaea6"><code>3944311</code></a> Use a page-specific counter for <code>\<Tabs></code> IDs (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4133">#4133</a>)</li> <li><a href="https://github.com/withastro/starlight/commit/9b8221c0d85903437a26c81d1de5bd9a95a9baa2"><code>9b8221c</code></a> Remove Vitest native config loader warnings (<a href="https://github.com/withastro/starlight/tree/HEAD/packages/starlight/issues/4129">#4129</a>)</li> <li>See full diff in <a href="https://github.com/withastro/starlight/commits/@astrojs/starlight@0.41.9/packages/starlight">compare view</a></li> </ul> </details> <br /> Updates `astro` from 7.2.4 to 7.2.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/withastro/astro/releases">astro's releases</a>.</em></p> <blockquote> <h2>astro@7.2.9</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17846">#17846</a> <a href="https://github.com/withastro/astro/commit/b44118001c8f9b4f05ccd004cc3b4d42a8da8bfc"><code>b441180</code></a> Thanks <a href="https://github.com/Princesseuh"><code>@Princesseuh</code></a>! - Fixes importing <code>.html</code> files not being typed outside of <code>.astro</code> files</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17831">#17831</a> <a href="https://github.com/withastro/astro/commit/32e8b44c25a80759f0ed0b47551351331584f779"><code>32e8b44</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes a crash when requesting <code>/index.html</code> against a dynamic page route like <code>[slug].astro</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17841">#17841</a> <a href="https://github.com/withastro/astro/commit/c35448ec8e53fc0f93798840953185c9facaa39b"><code>c35448e</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes SSR manifest containing stale <code>entryModules</code> references to prerender-only chunks that no longer exist in the final build output</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17847">#17847</a> <a href="https://github.com/withastro/astro/commit/eb87a2391679ffa6fa25c61701569a474aa2e548"><code>eb87a23</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes <code>set:text</code> escaping in MDX script and style elements</p> </li> </ul> <h2>astro@7.2.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17837">#17837</a> <a href="https://github.com/withastro/astro/commit/ecb4082131490b4fe9a56aa44fda84b54ef8967b"><code>ecb4082</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Updates the minimum supported version of Sharp to 0.35.4</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17786">#17786</a> <a href="https://github.com/withastro/astro/commit/db7c53b1707856866e06cdeeef1aa4ae3598b1f2"><code>db7c53b</code></a> Thanks <a href="https://github.com/gameroman"><code>@gameroman</code></a>! - Replaces the internal <code>find-process</code> dependency with a smaller, lighter alternative</p> </li> </ul> <h2>astro@7.2.7</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17415">#17415</a> <a href="https://github.com/withastro/astro/commit/55d38c868b7cbf2266649929c60ddf442abe674f"><code>55d38c8</code></a> Thanks <a href="https://github.com/iseraph-dev"><code>@iseraph-dev</code></a>! - Deserializes each route once when loading the SSR manifest</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17772">#17772</a> <a href="https://github.com/withastro/astro/commit/023b48b139a2c40420b340f61b53a62b47a557e5"><code>023b48b</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes route selection for normalized request paths in adapter and development request handling</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17819">#17819</a> <a href="https://github.com/withastro/astro/commit/633855b0cabd55cc7b913eb556a739a6a2d93dd2"><code>633855b</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Updates generated and default Cloudflare <code>compatibility_date</code> values to match the installed runtime and requires Wrangler <code>^4.125.0</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17813">#17813</a> <a href="https://github.com/withastro/astro/commit/ae26d18c71515c47ecbd7e1ffe5c5dfc29fbd613"><code>ae26d18</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes <code>rewrite()</code> and <code>next(payload)</code> for GET and HEAD requests with host-provided bodies</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17816">#17816</a> <a href="https://github.com/withastro/astro/commit/a0d2fe3af25a25bc9b808070f25886c37d5be6fc"><code>a0d2fe3</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes the experimental <code>svgOptimizer</code> not generating unique per-file ID prefixes when using SVGO's <code>prefixIds</code> plugin</p> </li> </ul> <h2>astro@7.2.6</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/withastro/astro/pull/17812">#17812</a> <a href="https://github.com/withastro/astro/commit/29af6da5c11aff673133f96df029f40345674f0e"><code>29af6da</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes a bug where <code>new FetchState(request)</code> could fail in development when server dependencies were optimized</li> </ul> <h2>astro@7.2.5</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17758">#17758</a> <a href="https://github.com/withastro/astro/commit/5f419e25c570002a2ce0e10a973aa13336016b0c"><code>5f419e2</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes a bug where <code>experimental_getFontFileURL()</code> rejected valid font URLs when using the Cloudflare adapter</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17416">#17416</a> <a href="https://github.com/withastro/astro/commit/493796b4c318b19985eccaac7a11aa7b787e1efe"><code>493796b</code></a> Thanks <a href="https://github.com/iseraph-dev"><code>@iseraph-dev</code></a>! - Skips no-op pathname writes when normalizing SSR request URLs</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17712">#17712</a> <a href="https://github.com/withastro/astro/commit/bd374b7507de8d706c845946fd847e76de6fc06b"><code>bd374b7</code></a> Thanks <a href="https://github.com/fkatsuhiro"><code>@fkatsuhiro</code></a>! - Updates deprecation messages target from Astro 7 to 8</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17719">#17719</a> <a href="https://github.com/withastro/astro/commit/dac17688f691c6cecdff969aa48523bf17fc0657"><code>dac1768</code></a> Thanks <a href="https://github.com/astrobot-houston"><code>@astrobot-houston</code></a>! - Fixes session ID validation to reject non-UUID cookie values before using them as storage keys</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17770">#17770</a> <a href="https://github.com/withastro/astro/commit/84eb7e7db99573b80c339efe0392d959e7a9b6cf"><code>84eb7e7</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes <code>--mode</code>, <code>--site</code>, <code>--base</code>, <code>--out-dir</code>, <code>--verbose</code>, <code>--silent</code>, and <code>--open</code> flags being silently dropped when using <code>astro dev --background</code> or <code>astro preview --background</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17713">#17713</a> <a href="https://github.com/withastro/astro/commit/d035290a14afac8834885b727327a7f44d3a3a48"><code>d035290</code></a> Thanks <a href="https://github.com/wakqasahmed"><code>@wakqasahmed</code></a>! - Fixes <code>content-modules.mjs</code> not removing entries for deleted or renamed content files, which could cause Vite to attempt to resolve non-existent modules</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md">astro's changelog</a>.</em></p> <blockquote> <h2>7.2.9</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17846">#17846</a> <a href="https://github.com/withastro/astro/commit/b44118001c8f9b4f05ccd004cc3b4d42a8da8bfc"><code>b441180</code></a> Thanks <a href="https://github.com/Princesseuh"><code>@Princesseuh</code></a>! - Fixes importing <code>.html</code> files not being typed outside of <code>.astro</code> files</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17831">#17831</a> <a href="https://github.com/withastro/astro/commit/32e8b44c25a80759f0ed0b47551351331584f779"><code>32e8b44</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes a crash when requesting <code>/index.html</code> against a dynamic page route like <code>[slug].astro</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17841">#17841</a> <a href="https://github.com/withastro/astro/commit/c35448ec8e53fc0f93798840953185c9facaa39b"><code>c35448e</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes SSR manifest containing stale <code>entryModules</code> references to prerender-only chunks that no longer exist in the final build output</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17847">#17847</a> <a href="https://github.com/withastro/astro/commit/eb87a2391679ffa6fa25c61701569a474aa2e548"><code>eb87a23</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes <code>set:text</code> escaping in MDX script and style elements</p> </li> </ul> <h2>7.2.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17837">#17837</a> <a href="https://github.com/withastro/astro/commit/ecb4082131490b4fe9a56aa44fda84b54ef8967b"><code>ecb4082</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Updates the minimum supported version of Sharp to 0.35.4</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17786">#17786</a> <a href="https://github.com/withastro/astro/commit/db7c53b1707856866e06cdeeef1aa4ae3598b1f2"><code>db7c53b</code></a> Thanks <a href="https://github.com/gameroman"><code>@gameroman</code></a>! - Replaces the internal <code>find-process</code> dependency with a smaller, lighter alternative</p> </li> </ul> <h2>7.2.7</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17415">#17415</a> <a href="https://github.com/withastro/astro/commit/55d38c868b7cbf2266649929c60ddf442abe674f"><code>55d38c8</code></a> Thanks <a href="https://github.com/iseraph-dev"><code>@iseraph-dev</code></a>! - Deserializes each route once when loading the SSR manifest</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17772">#17772</a> <a href="https://github.com/withastro/astro/commit/023b48b139a2c40420b340f61b53a62b47a557e5"><code>023b48b</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes route selection for normalized request paths in adapter and development request handling</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17819">#17819</a> <a href="https://github.com/withastro/astro/commit/633855b0cabd55cc7b913eb556a739a6a2d93dd2"><code>633855b</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Updates generated and default Cloudflare <code>compatibility_date</code> values to match the installed runtime and requires Wrangler <code>^4.125.0</code></p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17813">#17813</a> <a href="https://github.com/withastro/astro/commit/ae26d18c71515c47ecbd7e1ffe5c5dfc29fbd613"><code>ae26d18</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes <code>rewrite()</code> and <code>next(payload)</code> for GET and HEAD requests with host-provided bodies</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17816">#17816</a> <a href="https://github.com/withastro/astro/commit/a0d2fe3af25a25bc9b808070f25886c37d5be6fc"><code>a0d2fe3</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes the experimental <code>svgOptimizer</code> not generating unique per-file ID prefixes when using SVGO's <code>prefixIds</code> plugin</p> </li> </ul> <h2>7.2.6</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/withastro/astro/pull/17812">#17812</a> <a href="https://github.com/withastro/astro/commit/29af6da5c11aff673133f96df029f40345674f0e"><code>29af6da</code></a> Thanks <a href="https://github.com/matthewp"><code>@matthewp</code></a>! - Fixes a bug where <code>new FetchState(request)</code> could fail in development when server dependencies were optimized</li> </ul> <h2>7.2.5</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17758">#17758</a> <a href="https://github.com/withastro/astro/commit/5f419e25c570002a2ce0e10a973aa13336016b0c"><code>5f419e2</code></a> Thanks <a href="https://github.com/apps/astro-factory"><code>@astro-factory</code></a>! - Fixes a bug where <code>experimental_getFontFileURL()</code> rejected valid font URLs when using the Cloudflare adapter</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17416">#17416</a> <a href="https://github.com/withastro/astro/commit/493796b4c318b19985eccaac7a11aa7b787e1efe"><code>493796b</code></a> Thanks <a href="https://github.com/iseraph-dev"><code>@iseraph-dev</code></a>! - Skips no-op pathname writes when normalizing SSR request URLs</p> </li> <li> <p><a href="https://redirect.github.com/withastro/astro/pull/17712">#17712</a> <a href="https://github.com/withastro/astro/commit/bd374b7507de8d706c845946fd847e76de6fc06b"><code>bd374b7</code></a> Thanks <a href="https://github.com/fkatsuhiro"><code>@fkatsuhiro</code></a>! - Updates deprecation messages target from Astro 7 to 8</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/withastro/astro/commit/ad7a33229efec04c8ff6c7b450e480ec8e9d2c57"><code>ad7a332</code></a> [ci] release (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17845">#17845</a>)</li> <li><a href="https://github.com/withastro/astro/commit/eb87a2391679ffa6fa25c61701569a474aa2e548"><code>eb87a23</code></a> Escape set:text values in Astro JSX (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17847">#17847</a>)</li> <li><a href="https://github.com/withastro/astro/commit/b44118001c8f9b4f05ccd004cc3b4d42a8da8bfc"><code>b441180</code></a> fix(astro): type .html imports outside of .astro files (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17846">#17846</a>)</li> <li><a href="https://github.com/withastro/astro/commit/32e8b44c25a80759f0ed0b47551351331584f779"><code>32e8b44</code></a> Guard against stripping /index.html when stripped pathname no longer matches ...</li> <li><a href="https://github.com/withastro/astro/commit/c35448ec8e53fc0f93798840953185c9facaa39b"><code>c35448e</code></a> fix(build): strip prerender-only entry specifiers from SSR manifest (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17841">#17841</a>)</li> <li><a href="https://github.com/withastro/astro/commit/7cadf1055a61c85d0b05f3c7d8c709f7faa5cf0d"><code>7cadf10</code></a> [ci] release (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17826">#17826</a>)</li> <li><a href="https://github.com/withastro/astro/commit/ecb4082131490b4fe9a56aa44fda84b54ef8967b"><code>ecb4082</code></a> Update Sharp to 0.35.4 (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17837">#17837</a>)</li> <li><a href="https://github.com/withastro/astro/commit/8bf6f1af679947ffbc702db26425f3f13a7f3040"><code>8bf6f1a</code></a> chore: split v5/v6 changelogs (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17825">#17825</a>)</li> <li><a href="https://github.com/withastro/astro/commit/db7c53b1707856866e06cdeeef1aa4ae3598b1f2"><code>db7c53b</code></a> chore(deps): replace "find-process" with a smaller, lighter alternative (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17786">#17786</a>)</li> <li><a href="https://github.com/withastro/astro/commit/eface15c86b38d44e94b841c9d1e27394c470600"><code>eface15</code></a> [ci] release (<a href="https://github.com/withastro/astro/tree/HEAD/packages/astro/issues/17815">#17815</a>)</li> <li>Additional commits viewable in <a href="https://github.com/withastro/astro/commits/astro@7.2.9/packages/astro">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
964533f89f |
Simplify hook and list task execution (#3964)
Two internal execution paths maintained duplicate type layers: background hooks projected prepared commands into pipeline-only DTOs and rebuilt their context, while list collection paired each runtime task kind with a trait and zero-sized marker type. This PR removes those parallel models so each subsystem has one canonical representation. Background pipeline JSON now carries `PreparedStep` directly in a small process envelope. The runner preserves each command's prepared context and derives its log directory from the reopened repository. List work items dispatch through an exhaustive `TaskKind::compute`; private computations return `anyhow::Result`, and the dispatch boundary attaches the task-specific error once. The change removes 311 net lines and the `pipeline_spec` module without changing CLI or configuration behavior. Verification: `cargo run -- hook pre-merge --yes` passed all 4,719 tests, with one skipped and no snapshot changes. Two direct unit tests cover the task-input preconditions that the refactor moved into the patch coverage window. > _This was written by Codex on behalf of max-sixty_ |
||
|
|
f483ae5735 |
Consolidate remote-ref forge dispatch (#3963)
Remote-reference handling represented each forge twice: as `ForgeKind`
and as a marker type implementing `RemoteRefProvider`. This removes the
marker layer and makes `ForgeKind` the only forge identity.
Dispatch now lives in `remote_ref::{fetch_info, ref_path,
tracking_ref}`, while the forge-specific modules expose uniform backend
functions that accept `&Repository`. `wt switch` passes `ForgeKind`
directly, and the provider-specific ref-path tests are consolidated into
one matrix.
Validated with the full pre-merge hook: formatting, strict Clippy, docs,
doctests, and 4,718 tests passed with one skipped test.
> _This was written by Codex on behalf of max-sixty_
|
||
|
|
ab5587de27 |
fix(shell_exec): stream rather than fail when delayed_stream's timed wait fails (#3881)
## Problem `Cmd::delayed_stream` waits out a delay threshold before it starts streaming a child's output. When that timed wait returned an error rather than a status, the function returned the error to the caller — but only after joining the two reader threads, and those sit in `read_to_end` until the child closes its pipes. So the caller waited out the child's full runtime and then got `Failed to wait for command` for a command that had already finished. That arm became reachable in #3857. `shared_child` allocates a pipe and registers a `SIGCHLD` handler on every timed wait, where `wait-timeout` set its self-pipe up once per process. A sandbox or an fd limit that used to abort the process (#3856) now surfaces as an `Err`. ## Change Phase 1's `Err` falls through to streaming, which is what an exceeded threshold already does. Phase 2's blocking `wait()` is a bare `waitid(WNOWAIT)` loop with neither a pipe nor a signal registration, so whatever broke the timed wait cannot reach it and the real exit status still comes back. A command whose deadline machinery fails now streams its output instead of failing. The two sites where the deadline bounds wall-clock, `run_with_timeout_impl` and the pager, fold `Err` into their teardown arm instead, because a wait they cannot observe bounds nothing. The threshold here only decides when output starts streaming, so it streams. The module docstring records that split. ## Testing `test_cmd_delayed_stream_crosses_the_threshold` is new, and it covers an arm nothing reached before. Of the thresholds the suite used, `0` streams without ever calling `wait_timeout`, `-1` disables phase 1, and `5_000` against a fast child returns `Ok(Some)` — so `Ok(None)` never happened. The child writes a line 450 ms after the threshold passes. That line is the discriminator: streaming sends it to stderr, so the error's buffer comes back empty, where a phase 1 that had returned a status would still have it buffered. Checked by raising the threshold above the child's runtime, which fails the assertion with `left: "late"`. Elapsed time would not have distinguished the two, since the child runs the same wall-clock either way. The `Err` arm itself stays untested: reaching it needs `pipe` or `sigaction` to fail inside the wait, and it shares every line with the fall-through the new test covers. Also run: `cargo run -- hook pre-merge --yes` (4677 tests, lints, doctests) and both rustdoc variants with `-D warnings`. > _This was written by Claude Code on behalf of max-sixty_ |
||
|
|
be7839f289 |
fix(picker): cap the preview pane at a line count skim can represent (#3959)
skim keeps the preview pane's line count in a `u16` and `unwrap()`s the conversion (`total_lines` in skim 5.6.5's `src/tui/preview.rs`), so a preview body over 65,535 lines aborts `wt` with exit 101 instead of rendering. The preview lands asynchronously, so the picker paints normally and dies a few seconds later — on screen it looks like the picker closing by itself, and no diagnostic bundle is written because the process aborts rather than returning an error. A `git diff <default>...<branch>` on a long-lived branch clears that line count on its own, so any repo with a big enough branch loses `wt switch` entirely. This caps every preview body at 60,000 lines in `render_preview`, the one point all panes converge on before `ItemPreview::AnsiText`, and prints `○ Preview truncated to 60000 lines` above the pane when a body was cut. The cap sits under the ceiling rather than at it because the body isn't the whole pane: the tab bar and the notice ride above it and count toward the same total. Verified with a unit test in `src/commands/picker/items.rs` that pushes a 70,000-line body through `render_preview`: before the change the pane came back 70,003 lines (the count that panics inside skim), after it stays under `u16::MAX` and carries the notice. The test also pins the two quiet cases — a short body and one exactly at the cap render notice-free. <details><summary>Notes</summary> - Reported in #3958 with a clean diagnosis, including the offending skim line and branch line counts (126,021 / 106,009 / 99,758 panic; a repo topping out at 39,547 never does). - The reporter's workaround (`pager = "delta --paging=never | head -n 20000"`) works but is per-user and silently caps every preview; this makes the picker survivable by default. - Truncating at the render chokepoint rather than in `compute_and_page_preview` covers the panes that never go through the pager too — the `comments` thread and a `--prs` row's forge `log`. - Worth reporting upstream as well: `skim-rs/skim` could clamp or widen `total_lines` instead of unwrapping the conversion. The issue author found no existing upstream issue, and I haven't filed one — that's a call for a maintainer. </details> --- Closes #3958 — automated triage --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
b4622edc62 |
docs(repository): list the worktree-registry lock among the process-level singletons (#3961)
The `# Caching` spec in `src/git/repository/mod.rs` enumerates every process-global singleton the module reasons about, split into two lists: caches under "Two layers, two scopes", and non-cache `OnceLock`/`LazyLock` singletons under "Other process-level singletons". `WORKTREE_REGISTRY_LOCKS`, added in #3954, is in neither — it lives in this file but holds locks rather than git data, so it fell between the cache list (which only covers in-file *caches*) and the singleton list (whose examples are all in other modules). This adds it to the singleton list, naming what it is keyed by and pointing at the static's own doc comment for the ordering rules. Docs only — no behavior change, so no regression test. `cargo check --lib` passes; the diff is five `//!` lines. <details><summary>Why it belongs in the singleton list rather than the cache list</summary> The singleton list is prefaced "process-global singletons that are *lazy initialization, not caches* — the container is initialized once and never replaced, with no underlying external state that could go stale". `WORKTREE_REGISTRY_LOCKS` fits exactly: the `DashMap` is created once, each entry is an `Arc<RwLock<()>>` handed to every `Repository` resolving to that canonical common dir ([`mod.rs`](https://github.com/max-sixty/worktrunk/blob/f0d14a338b1cdaad61f2d8dcd6a0bea2b31de069/src/git/repository/mod.rs#L830-L833)), and nothing it stores can go stale because it stores no git state. </details> Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
97d3adb7a5 |
chore: update tend workflows (0.1.20 → 0.1.22) (#3960)
Automated nightly regeneration of tend's workflow files. **tend version:** 0.1.20 → 0.1.22 ## Notable changes - **Notifications now run off a recovery queue** (max-sixty/tend#1074). The pre-check drops the old layered inbox sweep (shadowed-run and closed-bot-PR marking) in favour of a single paginated snapshot taken before a 10-minute cutoff, passes that cutoff through to the agent, and keeps repository watching enabled with an idempotent `PUT .../subscription` on every cycle. The job also gains a serial `tend-notifications` concurrency group. - **`tend-review` re-targets instead of skipping** (max-sixty/tend#1082). The "skip when the live HEAD is already examined" gate step and its `if:` guards are gone; a live session now re-targets when HEAD moves. The concurrency group adds `queue: max` so a push can't evict a pending `ready_for_review` run. - **Skills check the default branch for a landed fix before opening a PR** (max-sixty/tend#1070), and `review-runs` gains the run census as a second stranded-trigger drain input (max-sixty/tend#1073). - **Poll/rerun script fixes** (max-sixty/tend#1053, max-sixty/tend#1055): `tend-review` no longer gates the CI poll, and an unresolvable commit fails fast rather than passing silently. - **Generator fixes**: `watched_workflows` and `branches` are validated as string lists (max-sixty/tend#1076), and block prompts no longer get padded blank lines (max-sixty/tend#1090). Full upstream diff: https://github.com/max-sixty/tend/compare/0.1.20...0.1.22 Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
f0d14a3388 |
docs(list): correct the module docstring's claim that wt list caches nothing but the default branch (#3957)
The `wt list` module docstring opens a section headed **"Worktrunk's Only Cache: Default Branch"** and ends it with "All other data is fetched fresh on each `wt list` invocation." That is not what happens: a collect reads and writes seven persistent on-disk caches under `.git/wt/cache/`. This replaces the section with an accurate one that points at the `## Caching` table in `collect/mod.rs` instead of restating it, so the inventory stays in one place. Surfaced by the nightly survey of `src/commands/list/mod.rs`. ## Verification One `wt list` in a fresh two-worktree repo, against a build of `main` at `6a96ddfd7`, starting from no cache directory at all: ```console --- cache before list --- --- cache after list --- .git/wt/cache/ahead-behind/b1ed8e3d…-b1ed8e3d….json .git/wt/cache/diff-stats/b1ed8e3d…-b1ed8e3d….json .git/wt/cache/merge-add-probe/b1ed8e3d…-b1ed8e3d….json .git/wt/cache/is-ancestor/b1ed8e3d…-b1ed8e3d….json .git/wt/cache/merge-tree-conflicts/b1ed8e3d…-b1ed8e3d….json .git/wt/cache/has-added-changes/b1ed8e3d…-b1ed8e3d….json ``` No regression test: the change is a doc comment, and a test asserting that a docstring doesn't lie isn't a thing worth building. The structural guard is the one this PR applies — the section now defers to `collect/mod.rs`'s table rather than carrying a second copy that can drift again. <details><summary>How it drifted, and the two in-repo contradictions</summary> The wording predates the caches. The last edit to the section is [`10e89d059`](https://github.com/max-sixty/worktrunk/commit/10e89d059), which corrected it from `git remote set-head` to `git config worktrunk.default-branch` and carried the "all other data is fetched fresh" clause through unchanged. `sha_cache` arrived later, in #2109. Two places in the repo already describe the real behavior, which is what makes the docstring the odd one out rather than an open question: - [`src/commands/list/collect/mod.rs`](https://github.com/max-sixty/worktrunk/blob/6a96ddfd7df8c20d9e5ff96fe5d3d9412a6b28f5/src/commands/list/collect/mod.rs#L217-L234) carries the full `## Caching` table — nine directories with their key schemes and staleness rules. Seven are `sha_cache` kinds a collect populates. - The benchmark harness has a whole `CacheState::ProbeCold` mode built on the fact that a `wt` run repopulates `.git/wt/cache/`, and a comment explaining that criterion's `SmallInput` batching would otherwise measure a warm cache as cold ([`tests/helpers/wt-perf/src/lib.rs`](https://github.com/max-sixty/worktrunk/blob/6a96ddfd7df8c20d9e5ff96fe5d3d9412a6b28f5/tests/helpers/wt-perf/src/lib.rs#L246-L252)). The consequence is narrow but real: the section sits directly under the per-worktree git-command list, so it reads as "these commands run every time." They run on a cold cache. Anyone reading this header before touching list performance — the file's stated purpose — starts from the wrong model. Checks run locally: `cargo clippy --all-targets` with `RUSTFLAGS='-D warnings'`, and `cargo doc --no-deps --document-private-items` with `RUSTDOCFLAGS='-Dwarnings'` (the new `[`collect`]` intra-doc link resolves). `wt config state cache clear` verified against `--help`. </details> --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
9ae118fe6d |
Restore concurrent worktree staging in step prune (#3954)
`wt step prune` currently holds its worktree-registry lock across each complete removal to avoid Git's `.git/worktrees/` enumeration race. That also serializes safe work such as dirty checks, fsmonitor shutdown, and renaming the worktree into trash. This moves coordination into the dedicated `Repository` operations, keyed by canonical Git common directory. Fresh `git worktree list` calls take the read side, while targeted and direct `git worktree remove` calls take the write side. Removal staging remains concurrent, and the synthesized-`--force` submodule fallback keeps its final dirty check and destructive command in one critical section. The canonical `prune_e2e/live` benchmark improved from a 376.61 ms median on current main to 221.83 ms here, about 41%. Existing prune tests cover concurrent scheduling and serialized metadata teardown. Focused Rust tests verify lock sharing across distinct worktree discovery paths and that the fast-path rename precedes registry teardown serialization. Follow-up to #3661 and #3692. > _This was written by Codex on behalf of max-sixty_ |
||
|
|
6a96ddfd7d |
Pin Claude marker hooks to launch worktree (#3956)
Pins Claude activity-marker updates and cleanup to `CLAUDE_PROJECT_DIR`, so a shell `cd` cannot retarget them to another repository. Claude markers deliberately remain on the launch worktree after `EnterWorktree`, and sessions launched outside a repository have no marker. Codex and Gemini remain cwd-based until their hook harnesses expose a stable session project directory. The hook lifecycle was not exercised inside a live Claude session; tests cover the manifest wiring and cross-shell parsing. Part of #3921 > _This was written by Codex on behalf of max-sixty_ |
||
|
|
59211c6e64 |
docs(hook): fix the --base example in the pre-start upstream snippet (#3955)
`wt hook --help`'s `pre-start` example illustrated the `upstream` template variable with `wt switch --create feature origin/feature`, which the CLI rejects — `wt switch` takes no positional base: ```console $ wt switch --create feature origin/feature error: unexpected argument 'origin/feature' found ``` Now `--base origin/feature`. The template snippet it annotates is unaffected. > _This was written by Claude Code on behalf of max-sixty_ Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
5895c41fe1 |
Soften explicit command approval prompts (#3953)
Use a neutral heading when `wt config approvals add` reviews or records commands. Approval prompts that interrupt command execution keep the warning. > _This was written by Codex on behalf of max-sixty_ |
||
|
|
b2fcaf194f |
fix(switch): name a PR base under its remote when it has no local branch (#3951)
`wt switch --create X --base pr:N` (and `--base mr:N`) against a same-repo PR failed whenever the PR's source branch was not already a local branch — the usual shape when branching off someone else's PR: ```console $ wt switch --create feat/review --base pr:101 ◎ Fetching base PR #101... Fix authentication bug in login flow (#101) by @alice · open · feature-auth · https://github.com/owner/repo/pull/101 ◎ Fetching feature-auth from origin... ✗ No branch, tag, or commit named feature-auth ``` The fetch writes only `refs/remotes/<remote>/<branch>`, and git's rev-parse never expands a bare name to a remote-tracking ref, so the base validation rejected the very name the fetch had just made available. `resolve_remote_ref_as_base` now falls back to `<remote>/<branch>` when no local branch has that name, which is what `resolve_base_ref` already does for a remote-only base — and it earns its place for the same second reason documented there, since `git worktree add -b <name> <path> <bare-remote-only-branch>` drops the `-b` and creates the remote branch's own name. A source branch that does exist locally resolves exactly as before, so no previously-working invocation changes and both `--base pr:` snapshots are untouched. <details> <summary>Adjacent problems this deliberately leaves alone</summary> Found while reviewing the change, all pre-existing and none of them the reported defect: - `{{ base_worktree_path }}` is *undefined* rather than empty whenever the base branch has no worktree, and minijinja runs SemiStrict, so a hook or `--execute` template naming it dies with `undefined value` — after `git worktree add` has already run. The pre-flight can't catch it because it validates variable names against the available set, not resolution. General to every `--base`, not just `pr:`. - `--base pr:N` bases on the local branch when one exists, even if it sits behind the head just fetched, so the new branch can start from a stale copy of the PR. Always naming the remote-tracking ref would fix this, at the cost of the case above for every `pr:` base plus a changed success line and a changed `base_branch` in `--format json`. - A local branch literally named `origin/<pr-source-branch>` shadows the remote-tracking ref in the new fallback, so `git worktree add` fails with `ambiguous object name`. Same exposure the existing remote-only base path has, and it fails loudly rather than picking the wrong commit. </details> > _This was written by Claude Code on behalf of max-sixty_ --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
541f6d204d |
Revert "feat(list): add [list] sort for configurable row order" (#3952)
(not determinate, but want to rethink whether this is useful) |
||
|
|
1b4c492ee8 |
fix(switch): decide branch tracking for --create, whatever the git config says (#3950)
## Problem `wt switch --create <name> --base origin/<branch>` must not leave the new branch tracking a differently-named base: under `push.default = upstream` a bare `git push` then pushes the new work onto the base branch ([#713](https://github.com/max-sixty/worktrunk/issues/713)). Since #3913 that came from `-c branch.autoSetupMerge=simple`, injected only when the user had not set the key. So the outcome still depended on the user's git config, and two of git's five values reach a wrong answer: `true` and `always` track a differently-named base (the #713 footgun is still live), while `false` and `inherit` deny a *same*-named branch the tracking that is the point of it — including the DWIM `wt switch feature` from `origin/feature`, which the docs promise is a tracking branch. ## Solution Force the `-c` instead of defaulting it, on every `git worktree add` `wt switch` runs. `-c` outranks every config file, so one rule now decides the upstream whatever the user has configured: a new branch tracks the remote branch it starts from only when the two share a name. DWIM always shares it, so it always tracks; `--create` from a differently-named base gets no upstream. Tests: `test_switch_create_from_remote_base_upstream` becomes a matrix over all six `branch.autoSetupMerge` values (unset, simple, false, inherit, true, always) × three base spellings (`origin/release`, the bare `release` that resolves to it, and `refs/remotes/origin/staging`); `test_switch_dwim_from_remote_tracks` pins the DWIM half over the values that used to decline. ## Why not `--track` / `--no-track` The obvious alternative is for `wt` to pick git's explicit flags from a name comparison of its own. I built that first; it passed the full suite, and it is wrong twice over. <details> <summary>Three reproduced defects in the explicit-flags version</summary> **The predicate is wrong.** `strip_remote_prefix` splits `<remote>/<branch>` at the first slash, but git maps a remote-tracking ref back to its branch through the *fetch refspec*. With a remote named `team/fork`, the two disagree and the verdict inverts both ways: ```console $ git remote add team/fork <url> && git fetch team/fork $ wt switch --create fork/release --base team/fork/release $ git config branch.fork/release.merge refs/heads/release ``` A bare `git push` under `push.default = upstream` then lands on `release` — #713, reintroduced. The same base with `--create release` got *no* upstream, the opposite error. A refspec renaming into a sub-namespace (`+refs/heads/*:refs/remotes/origin/mirror/*`) does the same with no unusual remote name. **`--track` is a hard demand where `simple` is best-effort.** In a single-branch clone holding a hand-fetched ref, it fails the whole command — after the branch name has already been taken: ```console $ git clone --single-branch -b main <url> && git fetch origin release:refs/remotes/origin/release $ wt switch --create release --base origin/release fatal: cannot set up tracking information; starting point 'origin/release' is not a branch ``` That is the matching-name case, i.e. exactly what the feature exists for, and it is the same "fails outright" class #3913 had just removed. **Qualified spellings lose tracking.** `--base refs/remotes/origin/release` and `--base remotes/origin/release` name the same ref as `origin/release` but don't match `short_name`, so they got `--no-track`. </details> All three come from `wt` computing the name match itself, which it cannot do correctly — only git knows the refspec mapping. So `wt` decides the *rule* and git applies it. The first two are now regression tests (`test_switch_create_base_on_remote_with_slash`, `test_switch_create_base_outside_fetch_refspec`), so a future simplification to `--track` fails the suite rather than shipping. ## Verification Measured end-to-end on scratch clones across all six `branch.autoSetupMerge` values: a differing name gets no upstream and a matching name tracks, identically in every one. > _This was written by Claude Code on behalf of max-sixty_ --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
e9c839a194 |
feat(list): add [list] sort for configurable row order (#3933)
Row order in `wt list` and the `wt switch` picker was fixed — current worktree first, primary second, then committer date descending — while `[list] columns` already let a user pick and order the columns. This adds `[list] sort`, a list of column names (most significant first, `-` prefix for descending) that orders the rows, restricted to the columns whose value is known before the table paints, per the maintainer's call on #3922. ```toml [list] columns = ["path", "branch", "status"] sort = ["path"] # the reporter's case: the table mirrors the directory layout # sort = ["-age"] # oldest commit first # sort = ["branch", "-age"] ``` Verified with `cargo run -- hook pre-merge --yes`: 4725/4728 passed, the three failures being sandbox-environment artifacts that fail identically on the base commit (a PowerShell profile and a Nushell autoload dir this runner does have, and a `0664` umask). New coverage is 7 unit tests in `src/commands/list/sort.rs` and 7 integration tests in `tests/integration_tests/list_config.rs`. Closes #3922 <details><summary>Design decisions</summary> **Only skeleton-time columns are sortable** — `branch`, `path`, `commit`, `age`, `message`, i.e. exactly the built-ins with no background task. The rest (`status`, `ci`, `upstream`, the diff columns, custom columns) stream in behind the first frame, so ordering on one would mean either holding the table for a network round trip or reordering rows under the cursor, which the progressive table doesn't do. Naming one is an error that says why rather than a silently ignored setting. `test_sortable_keys_are_exactly_the_task_free_columns` pins the correspondence to `ColumnKind::required_tasks`, so a new task-free column can't quietly become unsortable (or a streamed one sortable). **A spec replaces the default order outright, pinned prefix included.** `sort = ["path"]` exists to make the table read in path order; keeping the current and primary worktrees pinned to the top would defeat exactly that. Newest-commit-first survives as the final tiebreak, which means the empty spec and the fallback are one code path — and rows a spec can't separate keep the order they have today, e.g. branch-only rows under `sort = ["path"]`, since only worktrees have a path. **`age` ascending is newest first.** The column counts up from the commit date, so the smallest age is the newest commit — the same direction as the default order — and `-age` puts the oldest on top. **Rows sort within their group, never across it**: worktrees, then branch-only rows, then remote rows, as before. **`--format json` follows `sort`**, unlike `columns`. The reasons `columns` is excluded are the every-field contract and not letting a display setting decide whether a machine-readable call reaches a forge (#3787); reordering an array narrows no payload and adds no fetch, so neither applies. **A bad key aborts `wt list` and degrades the picker**, the same fork `[list] columns` takes — the picker can't surface an abort mid-render, so it stashes a warning and falls back to the default order. </details> <details><summary>Changes</summary> - `src/commands/list/sort.rs` (new) — `SortKey`/`SortTerm`, `parse_sort_spec`, and the `compare` comparator over per-row `SortFacts`. - `src/commands/list/collect/mod.rs` — parse the spec before the sort, thread it through `sort_worktrees_with_cache` and the new `sort_branch_rows` (which replaces the generic `sort_by_timestamp_desc_with_cache`; both call sites passed the same `Vec<(String, String)>`). Facts are precomputed per row, so the commit-details lookup stays one per row rather than one per comparison. - `src/config/user/sections.rs` — `ListConfig::sort`, merging wholesale like `columns` (a spec is an ordering; merging terms across layers would invent an order neither layer asked for). - `src/cli/mod.rs` — a "Row order" section under `wt config`'s `[list]` docs; the mirrors under `docs/`, `skills/`, `plugins/`, `dev/config.example.toml`, and the help snapshots are regenerated. </details> --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
27c7308835 |
Clarify deliberate product-surface decisions
Make new user-facing concepts justify their code and documentation surface, and prefer consolidation before adding another special case. |
||
|
|
48b8b3802a |
Stabilize mature interfaces and remove retired config (#3949)
Marks the mature `wt step eval`, `wt step for-each`, `wt step prune`, LLM summary, config-state vars, and commit-template append interfaces as stable. Removes compatibility for the long-deprecated `template-file` and `squash-template-file` settings, and retires the special migration for the already-ignored `switch.picker.timeout-ms`. These keys now follow the ordinary unknown-field path; the troubleshooting guide explains how to move file contents into inline templates. The change also removes the redundant project CI-platform accessor. Validation: `cargo run -- hook pre-merge --yes` (4,710 tests passed; one skipped), plus a production documentation build. > _This was written by Codex on behalf of @max-sixty_ |
||
|
|
ec7db83136 |
docs(config): shorten default-branch override guidance (#3948)
Shortens the default-branch override guidance added in #3947 while keeping the clone-local scope, linked-worktree behavior, and local-branch requirement. > _This was written by Codex on behalf of max-sixty_ |
||
|
|
4e9f706e94 |
fix(switch): track a remote base only when the names match (#3913)
## Problem `wt switch --create <name> --base origin/<branch>` ran `git branch --unset-upstream` afterwards, so the new branch could not push to the base (#713). Nothing said so, and #3912 was the third thread to arrive at the manual `git push --set-upstream origin <branch>` step. Reviewing the docs for it (@max-sixty, [comment](https://github.com/max-sixty/worktrunk/pull/3913#issuecomment-5427192580)) surfaced the better question: should this just copy git? ## Solution Git already ships the rule the unset was approximating — `branch.autoSetupMerge = simple` sets tracking only when the start point is a remote-tracking branch **and** the new branch has the same name as the remote branch. `wt` now defaults to it on the `--create` paths instead of undoing git's `true` after the fact, and documents it in one paragraph of `wt switch`'s `after_long_help`. Three things follow: - **A same-named branch keeps its tracking.** `--create release --base origin/release` was getting unset too, though the tracking it lost was correct. - **An explicit `branch.autoSetupMerge` is honoured.** `wt` picks a different default; it no longer overrides the setting. - **`--create` off a remote base no longer fails outright** for anyone whose config left git no upstream to unset. Under `branch.autoSetupMerge = false` the command exited 128 — `fatal: branch 'feature' has no upstream information` — after creating the branch and the worktree. The DWIM paths (`wt switch release` when only `origin/release` exists) are unaffected: they create `feature` from `origin/feature`, where `simple` and `true` agree. `simple` needs git ≥ 2.37; `MINIMUM_GIT_VERSION` is 2.43. ## Testing `test_switch_create_from_remote_base_no_upstream` becomes `test_switch_create_from_remote_base_upstream`, covering the same #713 property plus the three cases above. Full suite via `cargo run -- hook pre-merge --yes`. <details><summary>Verification (git 2.55.0, debug <code>wt</code>, bare <code>origin</code> with <code>main</code> and <code>release</code>)</summary> Behavior, before and after, in a clone with no local `release`: ```console $ wt switch --create feature --base origin/release --no-cd # default config $ git branch -vv + feature 9e98944 (…/src.feature) r2 # no upstream — unchanged $ git config branch.autoSetupMerge false # before: exit 1 $ wt switch --create feature --base origin/release --no-cd ✓ Created branch feature from origin/release and worktree @ …/src.feature + feature 9e98944 (…/src.feature) r2 $ git config branch.autoSetupMerge always # before: unset anyway $ wt switch --create feature --base origin/release --no-cd + feature 9e98944 (…/src.feature) [origin/release] r2 $ wt switch release --no-cd # DWIM, unchanged + release 9e98944 (…/src.release) [origin/release] r2 ``` The failure this removes, on the pre-change binary: ```console $ git config branch.autoSetupMerge false $ wt switch --create feature --base origin/release --no-cd ✗ git branch --unset-upstream -- feature failed (exit 128) fatal: branch 'feature' has no upstream information $ git worktree list /tmp/asm2/src 257f014 [main] /tmp/asm2/src.feature 653f0dd [feature] # created, then the command failed ``` `branch.autoSetupMerge` semantics, straight from git, no `wt` involved: ```console $ git switch -c t-true origin/release # default `true` * t-true aeb85e2 [origin/release] r2 $ git -c branch.autoSetupMerge=simple switch -c t-simple origin/release * t-simple aeb85e2 r2 $ git -c branch.autoSetupMerge=simple switch -c release origin/release * release aeb85e2 [origin/release] r2 ``` And that `git worktree add -b` — the invocation `wt` actually runs — honours it the same way: ```console $ git -c branch.autoSetupMerge=simple worktree add -b wt-diff /tmp/asm/wt-diff origin/release + wt-diff aeb85e2 (/tmp/asm/wt-diff) r2 $ git -c branch.autoSetupMerge=simple worktree add -b foo /tmp/asm/foo origin/foo + foo aeb85e2 (/tmp/asm/foo) [origin/foo] r2 ``` </details> --- Refs #3912, #713 — automated triage --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
af04e80db0 |
docs(config): document the machine-local default-branch override (#3947)
## Problem `wt config state default-branch set` writes `worktrunk.default-branch` to the repository's *local* git config, so an override lives in `.git/config` — never committed, never pushed, and shared across every linked worktree of the clone. #3946 reports that nothing says so: the detection list names the config key, but the docs never state that setting it is a supported override. That matters for anyone working in a repository they don't own (a client's, an upstream project's) whose remote `HEAD` names a branch other than the one they integrate against — the file-based config the docs point at is exactly what they can't add. There is no default-branch key in `wt.toml` or user config either, so the git config key is the only route. ## Solution Two additions, no behavior change: - `src/cli/config.rs` — a new "Overriding without a config file" section in `wt config state default-branch`'s `after_long_help`, covering where the value is written, that it stays on one machine, that it applies to every linked worktree, that it's the only override there is, and that the branch has to be checked out locally or `set` and every subsequent `wt list` warn about it. The Detection section's existing drift sentence gains the "expected for a deliberate override, and inspection-only either way" qualifier rather than the new section restating it. - `docs/src/content/docs/tips-patterns.md` — a matching tip beside the existing "Reuse `default-branch`" section, which is where the reporter looked. The generated mirrors under `docs/`, `skills/`, and `plugins/` come from the sync test. ## Testing Verified against a scratch clone with the built binary: `wt config state default-branch set integration` writes `[worktrunk] default-branch = integration`, `git config --show-scope` reports `local`, and reading it back from a linked worktree returns `integration`. With `origin/integration` fetched but no local `integration`, `set` warns `▲ Branch integration does not exist locally` and every `wt list` repeats `▲ Configured default branch integration does not exist locally` with the `clear` hint; the summary line gains `1 ahead` only once `integration` is checked out. The console example's output line is the command's real success message. `cargo test --test integration test_docs_are_in_sync` (twice — regenerate, then clean), `cargo insta test --accept --test integration -- test_help`, and `cargo fmt --check` all pass. <details><summary>Scratch-repo verification</summary> ```console $ wt config state default-branch set integration ✓ Set default branch to integration $ git config --show-scope --get worktrunk.default-branch local integration $ git worktree add -q ../wt-int integration && cd ../wt-int && wt config state default-branch integration ``` Stale-override case, in a clone with only `origin/integration`: ```console $ wt config state default-branch set integration ▲ Branch integration does not exist locally ✓ Set default branch to integration $ wt list ▲ Configured default branch integration does not exist locally ↳ To reset, run wt config state default-branch clear ``` </details> --- Closes #3946 — automated triage --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |
||
|
|
5a5701b03a | refactor(list): drop unused_imports suppressions from the model re-exports (#3943) | ||
|
|
d971d03502 | fix(shell): propagate nushell wrapper exit codes without spawning sh (#3945) | ||
|
|
1133df8804 |
fix(switch): resolve pr:N before pre-switch hooks, and set pr_* for same-repo PRs (#3941)
Fixes #3934. `wt switch pr:<n>` resolved the PR through the forge inside `plan_switch`, which runs *after* `pre-switch` — so the hook got the raw `pr:3933` token as `branch` and `target`, and no `target_worktree_path` even when the PR's branch was already checked out. Separately, `pr_number` / `pr_url` were read back off `CreationMethod::ForkRef`, which a same-repo PR never produces, so the reporter's output shows both unset in *every* hook although the help text promises them. This resolves `pr:`/`mr:` before the hooks (the rule `-`/`@`/`^` already follow, #2310) and gives the PR identity its own field, carried from resolution through the plan into `pre-switch`, `pre-start`, `post-start`, and `post-switch` alike. Verified with two integration tests that fail on `main` (the `pre-switch` hook aborts the switch with `undefined value`) and pass here; full unit + integration suites, clippy `--all-targets --all-features`, rustdoc, and pre-commit are green locally. <details><summary>What each variable does now</summary> For `wt switch pr:3933` where the PR's branch is `feat/issue-3922-list-sort`: | Variable | Before | After | |---|---|---| | `branch` / `target` in `pre-switch` | `pr:3933` | `feat/issue-3922-list-sort` | | `target_worktree_path` in `pre-switch` | unset even when that branch had a worktree | set when it does | | `pr_number` / `pr_url` (same-repo PR, all hooks) | unset | `3933` / the PR URL | | `pr_number` / `pr_url` in `pre-switch` (fork PR) | unset | set | `worktree_path` in `pre-switch` is deliberately unchanged: on a switch that *creates* a worktree there is no destination directory yet, so it stays on the source. The help text claimed it was "the destination" without that caveat — [`src/cli/mod.rs`](https://github.com/max-sixty/worktrunk/blob/4c5e87eff3ebec31cdf6be1ad905bfda0bceeee8/src/cli/mod.rs#L1704) now says which case is which and points at `pre-start` for work that needs the new worktree (which is what the reporter's own `mise-trust` hook already does). </details> <details><summary>Ordering consequences</summary> The forge lookup and its `git fetch` now happen before `pre-switch` runs, so a hook that aborts the switch aborts it after the PR was fetched. That is inherent to the fix — the branch name is the forge's answer. The lookup is still bounded to the argument form that asked for it (`resolve_ref_shortcut_target` returns `None` for anything that isn't `pr:`/`mr:`), and the resolved target is threaded into `plan_switch`, so the forge is queried exactly once as before. The hook-approval gate used to be what surfaced a malformed `.config/wt.toml` before provider selection — `configured_forge_platform` reports an unparsable config as "unset", which would route an intended `forge.platform` override to the wrong CLI. With the resolution now first, that config load is explicit at the top of `resolve_ref_shortcut_target` rather than an accident of ordering (`test_switch_pr_malformed_project_config_bails_before_provider_selection` covers it and caught the regression). `CreationMethod::ForkRef::ref_url` became dead once the identity moved to its own field, so it is removed rather than left with an `#[allow]`. `SwitchResult::Created`'s `pr_number` / `pr_url` are removed for the same reason: the pipeline applies the identity from the resolved argument, which is the only channel that also serves a switch onto an existing worktree. </details> --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com> |