* feat(package-manager): implement the `update` command in pacquet
Port pnpm's `update` (aliases `up`/`upgrade`) onto pacquet's
always-fresh-resolve install path.
- Compatible bump: withhold matched names' lockfile pins from the
preferred-versions seed (new `UpdateSeedPolicy`) so they re-resolve
to highest-in-range; `package.json` is left untouched. This is what
distinguishes `update` from `install`.
- `--latest`: fetch each matched direct dep's `latest` tag and rewrite
the manifest range (`^v`, or exact under `--save-exact`), like `add`.
- Selectors: bare-name/glob patterns (`depth>0`, no `--latest`) match
every locked package name at any depth; versioned (`foo@2`) or
`--latest` selectors match direct deps only; `--latest` + spec is
rejected with `ERR_PNPM_LATEST_WITH_SPEC`.
- CLI flags: `-L/--latest`, `-E/--save-exact`, `-P/-D/--no-optional`
(faithful `makeIncludeDependenciesFromCLI`), `--depth`,
`--lockfile-only`, `-i/--interactive` (dialoguer + inline outdated
check).
- `--global` and `--workspace` error out for now: the global-dir and
workspace-version-linking subsystems are not ported yet.
The resolver's `UpdateBehavior` tri-state and the npm resolver's
`include_latest_tag` already existed; this change drives them from a
CLI command.
Written by an agent (Claude Code, claude-opus-4-8).
* feat(package-manager): port more pnpm update tests + fix selector parsing
Reviewing pnpm's `update` test suite surfaced gaps:
- Fix `parse_update_param` to match pnpm's `parseUpdateParam`: search
for the version `@` starting at index 2 for `!`-negated patterns (1
otherwise), so `!@scope/pkg-*` is no longer wrongly split into
pattern `!` + version `scope/pkg-*`. Negation selectors now work.
- Add `--no-save`: the range rewrites still drive resolution (lockfile
updates) but `package.json` is not persisted. Mirrors pnpm's
`updatePackageManifest: opts.save !== false`.
- Add `ERR_PNPM_NO_PACKAGE_IN_DEPENDENCIES`: a selector that matches no
direct dependency under `--depth 0` (without `--latest`) now errors,
matching pnpm; `--latest` with an unmatched selector is a no-op.
Ports the negation-pattern, `--no-save`, and no-package-in-deps tests
from pnpm's `installing/commands/test/update/update.ts`.
Written by an agent (Claude Code, claude-opus-4-8).
* perf(package-manager): avoid per-snapshot String alloc in update seed filter
`UpdateSeedPolicy::DropOnly`'s snapshot filter allocated a `String` for
every lockfile snapshot key. Parse the (small) update-target set to
`PkgName` once and compare against `key.name` directly. Addresses a
review comment on #12102.
Written by an agent (Claude Code, claude-opus-4-8).