@descent-vtt/spec-brief 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +25 -7
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -11,6 +11,28 @@ release that can turn a run red. This is the family's policy, recorded in
11
11
  releases up to 0.2.7 came before it, and several of their patches changed
12
12
  what a run reports.
13
13
 
14
+ ## 0.5.1
15
+
16
+ The README's commands gave `npx` the command's bare name, which on npm is
17
+ not this project's package. spec-brief itself is unchanged.
18
+
19
+ ### Security
20
+
21
+ - Every command in the README gives `npx` the package's full name behind
22
+ `--no-install`, as in `npx --no-install @descent-vtt/spec-brief ...`.
23
+ `spec-brief` without the scope belongs to nobody on npm (2026-10-07), so
24
+ anyone can register it.
25
+ `npx` given a name the project has not installed fetches the package of
26
+ that name and runs it, unasked when no terminal is attached: a fresh
27
+ clone, a worktree before `npm ci`, a CI job with no install step.
28
+ The CI examples install first, and [Names](README.md#names) says whose the
29
+ names are; what was measured is in the family's
30
+ [adopting guide](https://github.com/DescentVTT/spec-core/blob/main/docs/adopting.md#names).
31
+ Upgrading: where a CI job or a script gives `npx` the command's name
32
+ alone, write `npx --no-install @descent-vtt/spec-brief`. `--no-install`
33
+ before the bare name is not enough: npm still runs a copy of that name's
34
+ package an earlier fetch left in its cache.
35
+
14
36
  ## 0.5.0
15
37
 
16
38
  Five defects a reading of every surviving mutant found, none of which a test
package/README.md CHANGED
@@ -8,11 +8,23 @@ spec-brief is one of the [spec-\* tools](https://github.com/DescentVTT/spec-core
8
8
 
9
9
  ```bash
10
10
  npm install --save-dev @descent-vtt/spec-brief
11
- npx spec-brief init
12
- npx spec-brief new "Rotate session tokens on privilege change" --wave 1
13
- npx spec-brief lint
11
+ npx --no-install @descent-vtt/spec-brief init
12
+ npx --no-install @descent-vtt/spec-brief new "Rotate session tokens on privilege change" --wave 1
13
+ npx --no-install @descent-vtt/spec-brief lint
14
14
  ```
15
15
 
16
+ ## Names
17
+
18
+ The package is `@descent-vtt/spec-brief`, and the command it installs is `spec-brief`. The name without the scope is not this project: on npm, `spec-brief` belonged to nobody on 2026-10-07, and whoever registers it decides what it runs.
19
+
20
+ `npx` fetches and runs the package of whatever name it is given when the project has none installed - a fresh clone, a worktree before `npm ci`, a CI job without the install step - and without a terminal it does not ask first. So give `npx` the full name:
21
+
22
+ - `npx --no-install @descent-vtt/spec-brief` in a project that installed it: it runs that install, the version the lockfile pins, and where there is none it stops with an error that names this package.
23
+ - `npx @descent-vtt/spec-brief`, without `--no-install`, where nothing is installed: it fetches this package and runs it.
24
+
25
+ <!-- bare-name: the two forms in the next sentence are shown as what not to write -->
26
+ Never `npx spec-brief`, and not `npx --no-install spec-brief` either: `--no-install` stops a download, and npm still runs a copy of the bare name's package that an earlier fetch left in its cache. A `package.json` script names the command alone, as in `"briefs": "spec-brief lint"`, because npm fetches nothing for a script. The family's [adopting guide](https://github.com/DescentVTT/spec-core/blob/main/docs/adopting.md#names) has what was measured, under npm 10, 11 and 12.
27
+
16
28
  ## Why
17
29
 
18
30
  Repositories that run agents on briefs end up doing the same ceremony by hand, and getting it wrong in the same places:
@@ -357,12 +369,16 @@ How a heading fills a section, and what counts as a heading, a task or a link, i
357
369
 
358
370
  ## In CI
359
371
 
372
+ After the job has installed the project, with `npm ci`:
373
+
360
374
  ```yaml
361
- - run: npx spec-brief lint --format github
362
- - run: npx spec-brief matrix --format github
363
- - run: npx spec-brief schedule --format github
375
+ - run: npx --no-install @descent-vtt/spec-brief lint --format github
376
+ - run: npx --no-install @descent-vtt/spec-brief matrix --format github
377
+ - run: npx --no-install @descent-vtt/spec-brief schedule --format github
364
378
  ```
365
379
 
380
+ Each gives `npx` the package's [full name](#names) and `--no-install`: a job that lost its install step then stops, where the command's name alone would fetch whatever package has that name.
381
+
366
382
  | Format | What it writes |
367
383
  | --- | --- |
368
384
  | `github` | Workflow commands, which annotate the pull request with no upload and no permission. |
@@ -372,7 +388,9 @@ How a heading fills a section, and what counts as a heading, a task or a link, i
372
388
 
373
389
  ```yaml
374
390
  spec-brief:
375
- script: npx spec-brief lint --format gitlab > gl-code-quality.json
391
+ script:
392
+ - npm ci
393
+ - npx --no-install @descent-vtt/spec-brief lint --format gitlab > gl-code-quality.json
376
394
  artifacts:
377
395
  reports:
378
396
  codequality: gl-code-quality.json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descent-vtt/spec-brief",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Lifecycle management for task briefs: lint the contract, map parallel collisions, and archive a round in one atomic command.",
5
5
  "keywords": [
6
6
  "agents",