Commit Graph
21 Commits
Author SHA1 Message Date
Zoltan KochanandClaude Opus 5.5 6f95957063 docs: lint prose with Vale (#17238)
* docs: lint prose with Vale

Add Vale with an in-repo style, .vale/styles/pnpm, that turns the
writing rules in AGENTS.md and the Google developer documentation style
guide into lint rules. The stock Vale packages (Google, Microsoft,
RedHat, write-good) were too noisy to block on, for example 1,300
passive-voice hits in the v12 docs alone, so the rules are written for
this repo, following the GitLab model. Each one links the guideline it
enforces.

Levels:
- error, fails CI: dashes, plain-word substitutions, condescending
  words, "please", "note that", hedges, puffery, optional plurals,
  exclamation marks, ellipses, curly quotes, generic link text, product
  spellings, sentence-case headings, repeated words, double spaces,
  implementation history in comments; in changesets, bold or italic
  emphasis, internal names and release-line names.
- warning: future tense, sentences over 30 words, "instead of" and
  "so that" tails in changesets.
- suggestion: passive voice.

.vale.ini scopes the rules. Docs get every rule. Contributor Markdown
and code comments keep dashes and headings as warnings until their
roughly 8,100 em dashes are rewritten. Released changesets stay in
.changeset/ and are not rewritten, so lint-prose.mjs lints only the
changesets added since PROSE_BASE (the PR base in CI).

The prose workflow installs a pinned, checksum-verified Vale release and
runs `pnpm lint:prose`. The rest of this change rewrites the existing
docs, READMEs, contributor Markdown, and code comments to pass the
error-level rules. Only prose and comment text changed. Renamed
headings keep their anchors.

Spelling stays with cspell, which checks identifiers that Vale does not
see.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: keep prose lint from flattening meaning

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 21:48:09 +02:00
Zoltan Kochan 7c3153b8a5 revert: "docs(security): direct vulnerability reports to public bug tracker (#16603)" (#16605)
This reverts commit c0135c5ab0.
2026-10-05 16:13:36 +02:00
Zoltan Kochan c0135c5ab0 docs(security): direct vulnerability reports to public bug tracker (#16603)
Update the Reporting a Vulnerability section in SECURITY.md to clarify that GitHub Security Advisories and private vulnerability reporting are not used, and that security vulnerabilities should be filed as regular public bug reports in this repository.
2026-10-05 15:25:09 +02:00
Zoltan Kochan 20e77aa3a2 docs(security): clarify that static repository transport config is out of scope (#16599)
Clarify that static configuration settings in repository-level .npmrc or
pnpm-workspace.yaml (such as strict-ssl=false, cafile, registry, or proxies)
are standard package manager configuration supported by npm and Yarn for
enterprise and intranet deployments. Suppressing or ignoring these literal
settings would be a breaking change and diverges from upstream package managers,
so these configurations are considered out of scope.
2026-10-05 13:12:38 +02:00
徐天成 a9bed439d3 docs(security): list pnpm v12 as supported (#14674) 2026-09-09 13:17:35 +02:00
Lazizbek ErgashevandZoltan Kochan a634b1c16e fix(workspace): discover projects declared above the workspace root (#13887)
A packages: entry pointing outside the workspace root (../shared,
../../docs/*) was silently dropped from the project list.
normalize_manifest_patterns turns it into ../shared/package.json and
hands it to wax, whose globs cannot express parent traversal, so a walk
rooted at the workspace root matched nothing and raised no error.

The declared project never reached the install's project list, which is
what trusted_importer_ids is built from, so a lockfile pnpm 11 wrote for
the same workspace failed with
ERR_PNPM_PACKAGE_MANAGER_UNSAFE_IMPORTER_PATH on its ../shared importer
key. pnpm list -r and --filter did not see the package either.

Discovery now strips the leading ../ components off each normalized
pattern and starts the walk from the ancestor they name, keeping the
glob handed to wax traversal free. A pattern that climbs past the
filesystem root matches nothing. A walk can therefore start above the
workspace root, while a ! pattern stays written relative to the
workspace root, so user negations moved out of Walk::not and are matched
against each entry's path from the workspace root instead.

pacquet only: the TypeScript CLI globs through tinyglobby, which handles
the parent-relative form already.

Closes pnpm/pnpm#13880.

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2026-08-21 03:08:20 +02:00
Zoltan Kochan 2d10d1f88c docs(security): state the untrusted-repository trust boundary (#13601)
* docs(security): state the untrusted-repository trust boundary

The threat model section only described the filesystem-permissions tier,
so it was silent on the tier that reports actually target: a repository
the user clones and then runs pnpm inside.

pnpm defends part of that tier — a plain install must not send
credentials to a repository-chosen host, and must not run unapproved
dependency build scripts — which is why environment variable expansion
in repository-controlled configuration is gated for request destinations
and auth values. Because that gate is real but partial, a setting
missing from it reads as an oversight rather than as a setting that was
never in scope. A recent advisory reported exactly that about
`nodeOptions`, which only takes effect for `pnpm run` and `pnpm exec` —
commands that execute repository-chosen code regardless, and which
honor a literal value with no placeholder at all.

Name the boundary, list the two out-of-scope classes it implies, and ask
reporters of gate-coverage gaps for the counterfactual: what the gap
buys an attacker beyond what they could already do without it.

* docs(security): correct what a plain install defends

The previous wording claimed installing from an untrusted repository is
a defended act, distinct from running its code. It is not: a plain
`pnpm install` runs the project's own preinstall/install/postinstall/
prepare scripts, gated only by `ignoreScripts` (default false) at
installing/deps-installer/src/install/index.ts. The build approval
mechanism never reaches runLifecycleHooksConcurrently — `allowBuild` is
passed to buildModules and `_rebuild` only, so it gates dependencies'
build scripts and not the installed project's own.

Describe the env expansion restrictions as what they are: hardening that
narrows silent credential exfiltration in the --ignore-scripts case and
in review workflows where a config diff draws less scrutiny than a new
postinstall script, rather than a boundary whose coverage gaps are
vulnerabilities by themselves.
2026-08-06 11:26:29 +02:00
Zoltan Kochan 8e17c3d366 refactor: rename the pacquet/ directory to pnpm/ (#12913)
Pure directory move plus path fixups: the Rust port ships as pnpm v12,
so the source tree now lives at pnpm/ (alongside pnpm11/, the frozen
TypeScript line). No identifiers change in this pass — crate names
(pacquet-*), the pacquet bin, PACQUET_VERSION, the @pacquet/* npm
package names v11's runPacquet spawns, the .pacquet virtual-store dir,
the benchmark harness's clone dir, and the pacquet-*.yml workflow
filenames (npm trusted publishing is bound to them) all stay for a
follow-up.

Also removes the root /pnpm/ .gitignore entry (build detritus in the
pre-pnpm11 package location): pnpm/ is real source now and must not be
ignored. Developers with a stale generated pnpm/ dir should delete it
before checking out this change.
2026-07-10 18:06:56 +02:00
Zoltan Kochan b789d81127 docs: clarify support timeline for version 11.x (#12839)
Updated support information for version 11.x to include end date.
2026-07-07 14:58:50 +02:00
Zoltan Kochan c74d4e161a docs: document threat model and trust boundaries in security policy (#12269)
* docs: document threat model and trust boundaries in security policy

Clarify that pnpm's security boundary is filesystem permissions and that
reports assuming pre-existing write access to the store, lockfile,
node_modules, or config files are out of scope. Explain that the
content-addressable store's integrity check is corruption detection, not
tamper resistance against a write-capable local adversary, since the
recorded hashes live in the same trust domain as the files.

* docs: route pacquet and pnpr security reports to regular issues
2026-06-08 20:46:44 +02:00
Zoltan Kochan 3420457e44 docs: clarify support end date for version 10.x
Updated support information for version 10.x.
2026-05-02 09:48:00 +02:00
Zoltan Kochan 7f7c581ce2 docs: revise supported versions in SECURITY.md
Updated supported versions for security policy.
2026-05-02 09:45:36 +02:00
Zoltan Kochan b0cba9fa77 docs: update SECURITY.md 2025-07-29 14:19:01 +02:00
Zoltan Kochan 9976b8e29c docs: update SECURITY.md 2025-04-28 21:38:29 +02:00
Zoltan Kochan df63e8b388 docs: update SECURITY.md
close #8981
2025-01-30 00:10:19 +01:00
Zoltan Kochan b7ac82ea3c docs: update SECURITY.md 2024-04-27 21:50:55 +02:00
Isaac TurnerandZoltan Kochan 742ceb4050 docs: add 9.x to supported versions in SECURITY.md (#7933)
* Add 9.x to supported versions

* docs: drop pnpm v7 support

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2024-04-16 13:43:06 +02:00
Zoltan Kochan f53a29d76f docs: update SECURITY.md 2023-03-21 00:41:59 +02:00
Zoltan Kochan 81bf16af7a docs(security): deprecate pnpm v5 2022-04-29 17:34:56 +03:00
Zoltan Kochan 36e51a9c81 docs(security): update email 2022-01-11 15:43:25 +02:00
Zoltan Kochan 5ebbdd89bc Create SECURITY.md 2021-04-24 19:08:06 +03:00