plumbbob 0.9.5 → 0.10.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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +89 -87
- package/dist/cli-core.js +18 -8
- package/dist/cli.js +1 -1
- package/dist/lib/agents.js +26 -26
- package/dist/lib/buildlog.js +21 -11
- package/dist/lib/buildlogsync.js +8 -8
- package/dist/lib/check.js +14 -14
- package/dist/lib/commitbody.js +72 -0
- package/dist/lib/commitmsg.js +7 -7
- package/dist/lib/git.js +44 -15
- package/dist/lib/intent.js +20 -19
- package/dist/lib/latch.js +16 -16
- package/dist/lib/orient.js +36 -17
- package/dist/lib/reentry.js +3 -3
- package/dist/lib/settings.js +16 -16
- package/dist/lib/sidecar.js +70 -54
- package/dist/lib/templates.js +1 -1
- package/dist/verbs/abandon.js +122 -0
- package/dist/verbs/agent.js +25 -25
- package/dist/verbs/build.js +9 -9
- package/dist/verbs/check.js +6 -6
- package/dist/verbs/checkpoint.js +48 -47
- package/dist/verbs/doctor.js +35 -29
- package/dist/verbs/finish.js +27 -40
- package/dist/verbs/handoff.js +9 -8
- package/dist/verbs/init.js +9 -9
- package/dist/verbs/park.js +3 -3
- package/dist/verbs/recover.js +12 -12
- package/dist/verbs/revert.js +12 -12
- package/dist/verbs/spike.js +21 -21
- package/dist/verbs/start.js +49 -19
- package/dist/verbs/status.js +8 -8
- package/dist/verbs/turn.js +16 -16
- package/dist/verbs/use.js +4 -4
- package/node_modules/checkride/.claude-plugin/plugin.json +1 -1
- package/node_modules/checkride/CHANGELOG.md +401 -0
- package/node_modules/checkride/README.md +27 -9
- package/node_modules/checkride/dist/adapters.d.ts +12 -4
- package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
- package/node_modules/checkride/dist/adapters.js +21 -1
- package/node_modules/checkride/dist/adapters.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/cursor.d.ts +9 -1
- package/node_modules/checkride/dist/agent-setup/cursor.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/cursor.js +59 -1
- package/node_modules/checkride/dist/agent-setup/cursor.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/harness.d.ts +1 -1
- package/node_modules/checkride/dist/agent-setup/harness.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/harness.js +10 -1
- package/node_modules/checkride/dist/agent-setup/harness.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/scripts.d.ts +23 -0
- package/node_modules/checkride/dist/agent-setup/scripts.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/scripts.js +387 -82
- package/node_modules/checkride/dist/agent-setup/scripts.js.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.js +2 -2
- package/node_modules/checkride/dist/baseline/fingerprint.d.ts +14 -5
- package/node_modules/checkride/dist/baseline/fingerprint.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/fingerprint.js +58 -5
- package/node_modules/checkride/dist/baseline/fingerprint.js.map +1 -1
- package/node_modules/checkride/dist/baseline/history.d.ts +98 -0
- package/node_modules/checkride/dist/baseline/history.d.ts.map +1 -0
- package/node_modules/checkride/dist/baseline/history.js +232 -0
- package/node_modules/checkride/dist/baseline/history.js.map +1 -0
- package/node_modules/checkride/dist/baseline/index.d.ts +4 -2
- package/node_modules/checkride/dist/baseline/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/index.js +2 -1
- package/node_modules/checkride/dist/baseline/index.js.map +1 -1
- package/node_modules/checkride/dist/baseline/store.d.ts +30 -7
- package/node_modules/checkride/dist/baseline/store.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/store.js +50 -16
- package/node_modules/checkride/dist/baseline/store.js.map +1 -1
- package/node_modules/checkride/dist/cli.d.ts +5 -1
- package/node_modules/checkride/dist/cli.d.ts.map +1 -1
- package/node_modules/checkride/dist/cli.js +98 -25
- package/node_modules/checkride/dist/cli.js.map +1 -1
- package/node_modules/checkride/dist/config.d.ts +33 -4
- package/node_modules/checkride/dist/config.d.ts.map +1 -1
- package/node_modules/checkride/dist/config.js +21 -6
- package/node_modules/checkride/dist/config.js.map +1 -1
- package/node_modules/checkride/dist/digest/digest.js +1 -1
- package/node_modules/checkride/dist/doctor.d.ts +2 -0
- package/node_modules/checkride/dist/doctor.d.ts.map +1 -1
- package/node_modules/checkride/dist/doctor.js +39 -1
- package/node_modules/checkride/dist/doctor.js.map +1 -1
- package/node_modules/checkride/dist/gate.d.ts +49 -4
- package/node_modules/checkride/dist/gate.d.ts.map +1 -1
- package/node_modules/checkride/dist/gate.js +143 -16
- package/node_modules/checkride/dist/gate.js.map +1 -1
- package/node_modules/checkride/dist/init.d.ts +8 -1
- package/node_modules/checkride/dist/init.d.ts.map +1 -1
- package/node_modules/checkride/dist/init.js +68 -7
- package/node_modules/checkride/dist/init.js.map +1 -1
- package/node_modules/checkride/dist/node-pin.d.ts +1 -1
- package/node_modules/checkride/dist/node-pin.js +1 -1
- package/node_modules/checkride/dist/orchestrator.d.ts +13 -0
- package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
- package/node_modules/checkride/dist/orchestrator.js +118 -13
- package/node_modules/checkride/dist/orchestrator.js.map +1 -1
- package/node_modules/checkride/dist/pm/index.d.ts +1 -0
- package/node_modules/checkride/dist/pm/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/index.js.map +1 -1
- package/node_modules/checkride/dist/pm/launch.d.ts +23 -2
- package/node_modules/checkride/dist/pm/launch.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/launch.js +16 -0
- package/node_modules/checkride/dist/pm/launch.js.map +1 -1
- package/node_modules/checkride/dist/pm/translate.js +1 -1
- package/node_modules/checkride/dist/pm/translate.js.map +1 -1
- package/node_modules/checkride/dist/qa/mutation.d.ts +4 -4
- package/node_modules/checkride/dist/qa/mutation.js +4 -4
- package/node_modules/checkride/dist/recover.d.ts +48 -0
- package/node_modules/checkride/dist/recover.d.ts.map +1 -0
- package/node_modules/checkride/dist/recover.js +220 -0
- package/node_modules/checkride/dist/recover.js.map +1 -0
- package/node_modules/checkride/dist/smoke.d.ts +1 -1
- package/node_modules/checkride/dist/smoke.js +1 -1
- package/node_modules/checkride/dist/snippets.d.ts +1 -1
- package/node_modules/checkride/package.json +3 -2
- package/node_modules/checkride/schema/checkride.config.schema.json +9 -1
- package/node_modules/checkride/skills/check/SKILL.md +9 -1
- package/node_modules/checkride/templates/shared/styles/Repo/Drift.yml +41 -0
- package/node_modules/checkride/templates/shared/styles/Repo/Latin.yml +14 -0
- package/node_modules/checkride/templates/shared/styles/Repo/LyHyphen.yml +28 -0
- package/node_modules/checkride/templates/shared/styles/Repo/Minted.yml +33 -0
- package/node_modules/checkride/templates/shared/styles/Repo/ThereIs.yml +16 -0
- package/node_modules/checkride/templates/shared/styles/Repo/Weasel.yml +26 -0
- package/node_modules/checkride/templates/shared/vale.ini +34 -0
- package/package.json +13 -11
- package/skills/abandon/SKILL.md +20 -0
- package/skills/build/SKILL.md +69 -64
- package/skills/doctor/SKILL.md +11 -11
- package/skills/finish/SKILL.md +20 -19
- package/skills/harvest/SKILL.md +13 -12
- package/skills/park/SKILL.md +10 -10
- package/skills/plan/SKILL.md +63 -54
- package/skills/recover/SKILL.md +7 -7
- package/skills/refine/SKILL.md +18 -16
- package/skills/revert/SKILL.md +6 -6
- package/skills/spike/SKILL.md +9 -9
- package/skills/status/SKILL.md +5 -5
- package/skills/step/SKILL.md +17 -12
- package/skills/verify/SKILL.md +45 -40
- package/templates/build-log.md +7 -7
- package/templates/intent.md +49 -39
- package/templates/spike-report.md +10 -10
|
@@ -4,6 +4,400 @@ All notable changes to this project are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
5
5
|
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.12.2] - 2026-08-12
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **A `prose-voice` example** under `examples/`: the `prose` slot end to end —
|
|
12
|
+
a legacy doc grandfathered at eight findings, violations that trip
|
|
13
|
+
`Repo.Drift` in fresh markdown and `Repo.ThereIs`/`Repo.Latin` inside a
|
|
14
|
+
TypeScript doc comment, a ratchet scenario pruning the baseline, and the
|
|
15
|
+
`docs/voice` exemplars the AGENTS.md stanza points writing sessions at. The
|
|
16
|
+
e2e harness grows a `proseRules` violation field so an example asserts
|
|
17
|
+
*which* vale rule fired, not merely that `prose` went red.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- The `prose` exemplars pre-flight now says `is a file, not a directory` when
|
|
22
|
+
a file sits at the configured path, instead of the false `does not exist`.
|
|
23
|
+
- Re-resolved `nanoid` to 3.3.18 for GHSA-2v37-7h3g-55p8 (high severity;
|
|
24
|
+
dev-only, via vitest → vite → postcss). No override entry — postcss's own
|
|
25
|
+
range already permits the patched line.
|
|
26
|
+
|
|
27
|
+
### Internal
|
|
28
|
+
|
|
29
|
+
- New tests pin the default runner's exemplars pre-flight wiring, and the rule
|
|
30
|
+
that a run whose vale output is unreadable masks nothing and prunes nothing
|
|
31
|
+
while the slots the run did observe still ratchet.
|
|
32
|
+
|
|
33
|
+
## [0.12.1] - 2026-08-07
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **A `prose` slot for writing-style linting**, powered by `vale`. Opt-in like
|
|
38
|
+
`format`, it checks markdown and TypeScript doc comments (via a JS format
|
|
39
|
+
mapping, so code and string literals stay untouched) for doubled words,
|
|
40
|
+
Latin abbreviations (`e.g.`/`i.e.`/`etc.`), hyphenated `-ly` adverbs,
|
|
41
|
+
sentence-initial "There is", weasel words (off by default — the one
|
|
42
|
+
subjective rule), and the lexical fingerprints of AI-generated prose:
|
|
43
|
+
overused vocabulary like `delve`/`tapestry`/`meticulous`, stock frames like
|
|
44
|
+
"it's not just X — it's Y", and the minted corporate dialect (`the ask`,
|
|
45
|
+
`learnings`, `leverage`/`utilize` as verbs). `init --add prose` scaffolds a
|
|
46
|
+
hermetic, repo-owned vale config and six house-style rule files under
|
|
47
|
+
`.vale/styles/Repo/` — no upstream package, no `vale sync` needed on the
|
|
48
|
+
default path. Findings ratchet through the shared baseline the same way
|
|
49
|
+
`lint`/`struct`/`spell` already do. `spell` keeps sole ownership of
|
|
50
|
+
spelling; the scaffold disables vale's own dictionary and vocabulary
|
|
51
|
+
checks to avoid a second, conflicting wordlist.
|
|
52
|
+
- **An `exemplars` config key on the `prose` slot**, for anchoring voice
|
|
53
|
+
rather than just policing vocabulary. Point it at a directory of
|
|
54
|
+
hand-written prose and the generated AGENTS.md stanza tells writing
|
|
55
|
+
sessions to read and imitate it before touching markdown or doc comments —
|
|
56
|
+
and never to edit or add to it, since a generated "improvement" would
|
|
57
|
+
replace the human original with a copy of the model's own register. The
|
|
58
|
+
check itself fails if the named directory is missing or empty, so a stale
|
|
59
|
+
config can't stay green; checkride never scores prose against the
|
|
60
|
+
exemplars, since judging voice deliberately stays a human call.
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
|
|
64
|
+
- The README's slot table, its opt-in-slots sentence, the cheat sheet's
|
|
65
|
+
pipeline table, and the config schema's `checks` description had all
|
|
66
|
+
drifted out of sync with the slot registry over several releases (missing
|
|
67
|
+
the publish-ready bundle, missing `dupes`/`health`, undercounting opt-in
|
|
68
|
+
slots). Brought current and pinned by a new test that fails whenever a
|
|
69
|
+
slot is added without updating all four surfaces.
|
|
70
|
+
|
|
71
|
+
### Internal
|
|
72
|
+
|
|
73
|
+
- checkride now dogfoods its own `prose` slot: 112 initial findings fixed by
|
|
74
|
+
hand (11 subject-first rewrites, 28 Latin substitutions, 21 `-ly`-hyphen
|
|
75
|
+
drops), landing at zero findings with no baseline grandfathering needed.
|
|
76
|
+
|
|
77
|
+
## [0.12.0] - 2026-08-07
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
|
|
81
|
+
- **`checkride recover` — restore a clobbered baseline from git history.** The
|
|
82
|
+
motivating incident: checkride landed in a large monorepo, other open PRs
|
|
83
|
+
merged the trunk back, and `checkride.baseline.json` came out of the merges
|
|
84
|
+
with many entries silently deleted (an agent resolving a conflict by removing
|
|
85
|
+
the "problem" lines, most likely). Missing entries fail closed, so the team
|
|
86
|
+
hit a wall of red with no tooling to diagnose or undo it — the remedy was
|
|
87
|
+
manual git archaeology, and the tempting wrong move, re-running
|
|
88
|
+
`checkride baseline`, would have grandfathered every genuinely-new finding
|
|
89
|
+
introduced since the damage.
|
|
90
|
+
|
|
91
|
+
`checkride recover` does the dig instead: it walks the baseline file's recent
|
|
92
|
+
commits (`--depth`, default 25), dedupes them into at most five distinct
|
|
93
|
+
snapshots plus one synthesized union, and lists them with `+restored/−absent`
|
|
94
|
+
deltas against the current file. `--pick <n|sha|union>` applies one by writing
|
|
95
|
+
the file directly — never `git checkout` — so the restore is an ordinary
|
|
96
|
+
working-tree edit to review and commit. The default write is the union of the
|
|
97
|
+
candidate and the current file: nothing is removed, and a stale resurrected
|
|
98
|
+
key is pruned by the ratchet on the next full green run. `--exact` writes the
|
|
99
|
+
snapshot verbatim (refused while the file has uncommitted changes), `--dry-run`
|
|
100
|
+
previews the per-slot delta, `--json` emits the machine shape. Shallow clones
|
|
101
|
+
list with a truncation note; a repo with no committed baseline history says so
|
|
102
|
+
at exit 0.
|
|
103
|
+
|
|
104
|
+
- **A mangled or plundered baseline now explains itself.** A committed
|
|
105
|
+
`checkride.baseline.json` that no longer parses (a botched merge, usually)
|
|
106
|
+
used to be indistinguishable from having no baseline: every grandfathered
|
|
107
|
+
finding reported red with no hint why. A run now prints one stderr line under
|
|
108
|
+
the summary naming the file as present-but-unparseable and pointing at
|
|
109
|
+
`checkride recover`; `checkride doctor` grows an advisory workspace row with
|
|
110
|
+
the same diagnosis (and the key count when the file is healthy). And when the
|
|
111
|
+
file parses but a merge silently dropped entries, a red run probes git history
|
|
112
|
+
(best-effort, bounded at 750 ms, silent on any failure) and prints one hint —
|
|
113
|
+
`N of M new finding(s) were grandfathered until <sha>` — naming
|
|
114
|
+
`checkride recover` as the remedy, so a wall of red arrives with its diagnosis
|
|
115
|
+
attached.
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
|
|
119
|
+
- **The baseline file is canonical on disk.** `writeBaseline` now sorts the
|
|
120
|
+
top-level slots (keys within a slot were already sorted), so two branches that
|
|
121
|
+
grandfather the same debt produce byte-identical files instead of
|
|
122
|
+
insertion-order diff churn — the README's "the file is canonical" claim is now
|
|
123
|
+
true on disk, not just in comparisons.
|
|
124
|
+
|
|
125
|
+
- **`DoctorEnv` gained a required `readText` probe** (it feeds doctor's new
|
|
126
|
+
baseline row). The type sits outside the promised programmatic surface, but a
|
|
127
|
+
TypeScript consumer injecting a custom `env` into `runDoctor` adds one field
|
|
128
|
+
on upgrade.
|
|
129
|
+
|
|
130
|
+
### Contract
|
|
131
|
+
|
|
132
|
+
- New command `checkride recover` with `--pick <n|sha|union>`, `--exact`,
|
|
133
|
+
`--dry-run`, `--depth <n>`, and `--json` (docs/contract.md §CLI). List mode is
|
|
134
|
+
a reader: Markdown on stdout, exit 0. Apply mode writes
|
|
135
|
+
`checkride.baseline.json` atomically and never mutates git state. Exit codes
|
|
136
|
+
are 0 and 2 only — never 1. Additive; every existing command and flag is
|
|
137
|
+
unchanged.
|
|
138
|
+
|
|
139
|
+
### Internal
|
|
140
|
+
|
|
141
|
+
- The website caught up with the product and can no longer drift: a new
|
|
142
|
+
`agents.html` covers the bundled plugin, the Claude Code / Cursor
|
|
143
|
+
asymmetries, and the "could not run" verdict; the command reference gained
|
|
144
|
+
`recover`, `hooks`, `gate`, `triage`, and `qa`; and `test/site.test.ts` +
|
|
145
|
+
cspell now hold `site/` under `pnpm check` (inline scripts must parse, the
|
|
146
|
+
command and slot tables must track `CLI_COMMANDS` and `SLOTS`, internal links
|
|
147
|
+
must resolve). Every baseline-adjacent doc (README, getting-started, CI,
|
|
148
|
+
cheatsheet, plugin skill) now routes a clobbered baseline to `recover`.
|
|
149
|
+
|
|
150
|
+
## [0.11.2] - 2026-08-04
|
|
151
|
+
|
|
152
|
+
### Changed
|
|
153
|
+
|
|
154
|
+
- **A Cursor stand-down now reaches the user, exactly once.** The promise since
|
|
155
|
+
0.11.0 was that a stand-down is never silent: Claude Code gets a
|
|
156
|
+
`systemMessage`, Cursor gets stderr. Those were never equivalent, and the
|
|
157
|
+
Cursor half does not hold — Cursor documents no channel that shows hook stderr
|
|
158
|
+
to a user, mentioning only a Hooks output panel under **Customize** that
|
|
159
|
+
someone has to go and open. So on the one verdict whose entire purpose is to
|
|
160
|
+
name a fix only a human can apply (`pnpm install`, an `engines` pin), the human
|
|
161
|
+
saw nothing.
|
|
162
|
+
|
|
163
|
+
`followup_message` is the field that reaches the chat, and the reason it was
|
|
164
|
+
avoided is real: it *submits a new turn*, so a stand-down spending it every
|
|
165
|
+
turn rebuilds the unbounded loop 0.11.0 removed. It is therefore rationed to
|
|
166
|
+
one. The generated hook script already reads `loop_count` to bound `block`, and
|
|
167
|
+
that same guard now bounds `stand_down` — one nudge naming the fix, silence
|
|
168
|
+
after. The guard errs toward quiet: Cursor's `loop_count` counts every
|
|
169
|
+
auto-follow-up in a conversation rather than the consecutive ones, so an
|
|
170
|
+
over-count costs a silent stand-down and never a loop.
|
|
171
|
+
|
|
172
|
+
- **`CHECKRIDE_GATE_RETRY`, a new environment variable the generated gate script
|
|
173
|
+
sets.** checkride's own stand-down — a refusal it detects from inside, such as
|
|
174
|
+
an `engines` pin the hook's Node fails — needs the same one-shot bound and
|
|
175
|
+
cannot compute it, because the stop payload reaches the hook script and never
|
|
176
|
+
the child process. The script now exports `0` when the one message is unspent
|
|
177
|
+
and `1` when it is not, and `checkride gate --harness cursor` emits a followup
|
|
178
|
+
only on an explicit `0`.
|
|
179
|
+
|
|
180
|
+
**Absence is not `0`.** A hook script generated before this release exports
|
|
181
|
+
neither value and keeps the older stderr-only behavior. That asymmetry is the
|
|
182
|
+
point: it is what stops a refreshed checkride from looping under an
|
|
183
|
+
unrefreshed script, given the `loop_limit: null` the gate's own hook entry
|
|
184
|
+
asks for. Run `checkride agent-setup` to pick up the new script.
|
|
185
|
+
|
|
186
|
+
The variable is an internal contract between the two halves checkride
|
|
187
|
+
generates, not a knob — setting it by hand only suppresses or unlocks one
|
|
188
|
+
message.
|
|
189
|
+
|
|
190
|
+
## [0.11.1] - 2026-08-04
|
|
191
|
+
|
|
192
|
+
### Fixed
|
|
193
|
+
|
|
194
|
+
- **The Cursor stop gate no longer writes package-manager noise to the channel
|
|
195
|
+
Cursor parses as protocol.** The two generated gate scripts were asymmetric,
|
|
196
|
+
and accidentally so: the Claude Code script captured the run, so a failed
|
|
197
|
+
launch wrote into a variable it could then decline to print, while the Cursor
|
|
198
|
+
script ran the launcher uncaptured in order to let checkride's own JSON pass
|
|
199
|
+
straight through. A *failed* launch writes to that same stdout, and nothing
|
|
200
|
+
filtered it — so in a repo whose dependencies were never installed, two lines
|
|
201
|
+
of pnpm resolution error landed on stdout while the correct stand-down
|
|
202
|
+
explanation went to stderr.
|
|
203
|
+
|
|
204
|
+
The turn still ended as intended, because Cursor does not parse that text as a
|
|
205
|
+
hook body. The reason to fix it anyway is what happens if it ever does: a
|
|
206
|
+
bare-text followup would submit a new turn on every stand-down, rebuilding the
|
|
207
|
+
unbounded loop 0.11.0 removed, and doing it on the one cause an agent can do
|
|
208
|
+
nothing about. It also muddies the gate's own diagnostic — a maintainer
|
|
209
|
+
reading a Cursor transcript sees a dependency-resolution error on the protocol
|
|
210
|
+
channel and a different, correct explanation beside it on stderr.
|
|
211
|
+
|
|
212
|
+
Both scripts now capture, and each re-prints that body only on the two exit
|
|
213
|
+
statuses checkride answers with by design. Anything else is the launcher's
|
|
214
|
+
error rather than a verdict, and `block`/`stand_down` own stdout there alone.
|
|
215
|
+
|
|
216
|
+
### Internal
|
|
217
|
+
|
|
218
|
+
- The marketing site under `site/` picks up Fathom analytics and Open Graph plus
|
|
219
|
+
Twitter Card metadata across all three pages. The published package is
|
|
220
|
+
unchanged.
|
|
221
|
+
|
|
222
|
+
## [0.11.0] - 2026-08-04
|
|
223
|
+
|
|
224
|
+
### Added
|
|
225
|
+
|
|
226
|
+
- **`gate.preflight` — a supported seam for wrapping the stop gate.** checkride
|
|
227
|
+
owns the generated hook scripts and overwrites them on every refresh, so a repo
|
|
228
|
+
with something to say before the gate had nowhere to say it: editing the script
|
|
229
|
+
lost the edit, and re-pointing the harness config lost it to the next
|
|
230
|
+
`hooks add`. A `"preflight"` under `gate` in checkride.config.json names a
|
|
231
|
+
repo-relative script the generated gate runs, from the repo root, before
|
|
232
|
+
checkride is started — which is what lets it answer for a repo where checkride
|
|
233
|
+
*cannot* start.
|
|
234
|
+
|
|
235
|
+
Its exit code is read in the gate's own vocabulary rather than a second
|
|
236
|
+
convention: `0` runs the gate, `2` blocks the turn, anything else stands the
|
|
237
|
+
gate down. Both non-zero branches use the script's output as the message and
|
|
238
|
+
never start checkride. A configured path that does not exist **blocks**, so a
|
|
239
|
+
typo cannot quietly disarm the gate.
|
|
240
|
+
|
|
241
|
+
It is a config key rather than a `hooks add --preflight` flag for one reason:
|
|
242
|
+
the path is re-read on every write, so a teammate running the bare command
|
|
243
|
+
restores the wiring instead of silently dropping it. A preflight narrows
|
|
244
|
+
nothing, so it never adds the "NOT the full check" clause to a verdict.
|
|
245
|
+
|
|
246
|
+
### Contract
|
|
247
|
+
|
|
248
|
+
- **A could-not-run gate now blocks only when blocking could lead to a fix.**
|
|
249
|
+
Previously every could-not-run verdict blocked, in both harnesses, on the
|
|
250
|
+
reasoning that a gate which stops gating is a vacuous green. That reasoning
|
|
251
|
+
holds only while the block can *cause* the fix, and for a whole class of causes
|
|
252
|
+
it cannot: the harness re-prompts the same agent, which has no lever to pull.
|
|
253
|
+
The observed end of that road is an unbounded retry against an impossible
|
|
254
|
+
remedy, and then a contributor removing the gate.
|
|
255
|
+
|
|
256
|
+
Launch refusals are now classified by who can clear them. A **repo** refusal —
|
|
257
|
+
no `check` script, no package.json — blocks exactly as before, because an agent
|
|
258
|
+
holding the edit tools can fix it. (A missing `check` script stays blocking for
|
|
259
|
+
a second reason: it is the one refusal an agent could otherwise *create* to
|
|
260
|
+
escape the gate.) An **environment** refusal — an `engines` pin the hook's Node
|
|
261
|
+
fails, a corepack that will not verify the package manager, a package manager
|
|
262
|
+
absent from `PATH` — stands down: exit 0, no `decision`, `green: false`.
|
|
263
|
+
|
|
264
|
+
Two properties are promised about the stand-down and neither may be weakened:
|
|
265
|
+
it is never silent (Claude Code gets a `systemMessage`, Cursor gets stderr,
|
|
266
|
+
both stating that nothing was verified), and it is never reported as green.
|
|
267
|
+
`docs/contract.md` and `test/contract/gate-verdict.contract.test.ts` are
|
|
268
|
+
updated deliberately; a hook script that reads only the exit status will now
|
|
269
|
+
let a turn end on an environment refusal, which is the intended change.
|
|
270
|
+
|
|
271
|
+
### Changed
|
|
272
|
+
|
|
273
|
+
- **`init` now pins markdownlint-cli2 0.23.2 for the `docs` slot**, up from
|
|
274
|
+
0.23.1 — the version that resolves a vulnerable `js-yaml`
|
|
275
|
+
(GHSA-pm4m-ph32-ghv5) transitively into every repo it sets up. An existing
|
|
276
|
+
repo keeps whatever it installed; re-run `checkride init` or bump it yourself.
|
|
277
|
+
|
|
278
|
+
### Fixed
|
|
279
|
+
|
|
280
|
+
- **An uninstalled repo no longer traps the agent in an unbreakable loop.** A
|
|
281
|
+
developer who pulled a branch that newly added checkride — or cloned fresh —
|
|
282
|
+
and started a session before `<pm> install` got a gate that blocked every turn
|
|
283
|
+
with `checkride gate is not resolvable in this repo. Install checkride (or
|
|
284
|
+
re-run checkride agent-setup)`. Every part of that was a dead end: the
|
|
285
|
+
suggested remedy needs the missing binary, and in a repo with a customized
|
|
286
|
+
AGENTS.md stanza `agent-setup` would refuse and exit 2 even if it could run.
|
|
287
|
+
The actual fix, `<pm> install`, was never named. Nothing bounded the retry.
|
|
288
|
+
|
|
289
|
+
The generated gate now distinguishes the two ways checkride can fail to answer.
|
|
290
|
+
Dependencies never installed → it names `<pm> install`, says checkride is a
|
|
291
|
+
devDependency, and stands down. Installed but not answering → it blocks, as
|
|
292
|
+
before, since there is no remedy to name. Yarn PnP is recognized, so a healthy
|
|
293
|
+
PnP repo is not misread as uninstalled.
|
|
294
|
+
|
|
295
|
+
- **Both generated gates bound every could-not-run cause.** The scripts now read
|
|
296
|
+
the Stop payload from stdin and consult Claude Code's `stop_hook_active` and
|
|
297
|
+
Cursor's `loop_count`. On the second consecutive could-not-run, whatever the
|
|
298
|
+
cause, the gate stands down instead of blocking again — the previous script
|
|
299
|
+
read no stdin at all, so `stop_hook_active` was discarded and
|
|
300
|
+
`"loop_limit": null` left the Cursor gate unbounded by design. A **red**
|
|
301
|
+
pipeline is deliberately still unbounded: that loop is the gate working.
|
|
302
|
+
|
|
303
|
+
- **The claude gate no longer forwards the launcher's error as a hook body.** On
|
|
304
|
+
a missing install pnpm writes `ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL` to *stdout*
|
|
305
|
+
— ahead of a stray `undefined` on pnpm 11 — which the script captured into
|
|
306
|
+
`$body` and printed where Claude Code expects JSON. The status is now checked
|
|
307
|
+
before the body is forwarded, so a body travels only when checkride wrote it.
|
|
308
|
+
|
|
309
|
+
- **A refusal the repo can fix is no longer explained by the hook's Node.** The
|
|
310
|
+
`nodeClause` paragraph rode on every refusal, so "this repo has no `check`
|
|
311
|
+
script" was followed by an account of non-login shells and interpreter
|
|
312
|
+
alignment. It is now attached to environment refusals only.
|
|
313
|
+
|
|
314
|
+
- **A red run could be reported as "could not run" on Linux.** `isFresh` judged
|
|
315
|
+
the summary this run wrote by comparing its mtime against a `Date.now()`
|
|
316
|
+
reading taken just before the check spawned — and those are not the same
|
|
317
|
+
clock. Linux mtimes come from the kernel's coarse timer-tick clock, so a
|
|
318
|
+
summary written *after* `startedAt` routinely landed a few milliseconds behind
|
|
319
|
+
it: 934 of 2000 writes in a container, and 0 of 2000 on APFS. When it misfired
|
|
320
|
+
the gate read its own summary as a previous run's, believed an `engines`-pin
|
|
321
|
+
marker the check had merely printed, and blamed the environment for broken
|
|
322
|
+
code. `MTIME_TOLERANCE_MS` already guarded the same comparison in `triage/`;
|
|
323
|
+
the gate's own copy had dropped it. This is what turned the Linux CI legs red
|
|
324
|
+
on v0.10.2 and v0.10.3 while both macOS legs stayed green.
|
|
325
|
+
|
|
326
|
+
- **A green run that skipped most of its slots says so.** `✔ all checks passed`
|
|
327
|
+
is a true sentence about the checks that ran and a misleading one about the
|
|
328
|
+
repo, and the gap was invisible exactly where it matters: a repo configuring
|
|
329
|
+
almost nothing reported the same confident green as one configuring
|
|
330
|
+
everything. The line now reads `✔ all checks passed in 13ms — only 1 of 8
|
|
331
|
+
checks ran, 7 skipped` whenever any slot sat out. `--strict` is unchanged; its
|
|
332
|
+
floor is *zero* checks, which an always-available slot like `links` keeps a
|
|
333
|
+
repo off by itself.
|
|
334
|
+
|
|
335
|
+
### Internal
|
|
336
|
+
|
|
337
|
+
- CI dumps a failing slot's captured streams into collapsible log groups and
|
|
338
|
+
keeps `.check/` as an artifact. A red run logged `✘ test` and nothing else,
|
|
339
|
+
and on a hosted runner the directory holding the reason died with the
|
|
340
|
+
workspace — so the Linux-only gate failure above had to be reproduced in a
|
|
341
|
+
container before it could be read at all.
|
|
342
|
+
|
|
343
|
+
- Dependency audit cleared and mostly retired. Two high advisories were open
|
|
344
|
+
(`fast-uri` GHSA-7p8r-x3mc-p8w7, `brace-expansion` GHSA-rgw5-rvv9-x895), both
|
|
345
|
+
already carrying an override whose range the advisory had since outgrown.
|
|
346
|
+
Re-resolving showed four of the five overrides were dead weight — the parents'
|
|
347
|
+
own ranges reach patched versions — so they were removed rather than widened,
|
|
348
|
+
leaving one. No runtime `dependencies` are declared, so none of this ever
|
|
349
|
+
reached the tarball.
|
|
350
|
+
|
|
351
|
+
## [0.10.3] - 2026-08-01
|
|
352
|
+
|
|
353
|
+
### Added
|
|
354
|
+
|
|
355
|
+
- **Both Cursor guards now cover the shell.** `protect` and `dirty` each take a
|
|
356
|
+
second `.cursor/hooks.json` entry — on `beforeShellExecution` and
|
|
357
|
+
`afterShellExecution` — whose matchers run against the command string rather
|
|
358
|
+
than a tool name. This closes the older of the two documented Cursor gaps:
|
|
359
|
+
`echo … > checkride.baseline.json` is a shell call, not a `Write`, so no
|
|
360
|
+
file-tool matcher could ever see it, and a turn that wrote only through the
|
|
361
|
+
shell used to skip the gate entirely.
|
|
362
|
+
|
|
363
|
+
The standing objection was that matching the shell means parsing arbitrary
|
|
364
|
+
command lines, and a guard that fires on a wrong parse is worse than one with
|
|
365
|
+
a known hole. That objection is answered rather than dropped. `protect`'s
|
|
366
|
+
matcher admits only commands already naming an accounting path — reads
|
|
367
|
+
included — and the script then denies solely on demonstrated write intent: a
|
|
368
|
+
`>`/`>>` redirect target, or a positional argument of `rm`, `mv`, `tee`,
|
|
369
|
+
`sed -i`, `dd of=` and kin. Anything it cannot read that way is allowed, so
|
|
370
|
+
`cat`, `jq`, `grep` and `cp .check/summary.json /tmp/x` keep working, as
|
|
371
|
+
triage requires. `dirty` decides from its matcher alone and biases the other
|
|
372
|
+
way, toward marking a turn dirty, because there the recoverable error is one
|
|
373
|
+
extra pipeline run.
|
|
374
|
+
|
|
375
|
+
Both entries share their sibling's name and script: one guard, one
|
|
376
|
+
`--remove-hook protect`, one `.cjs` branching on `hook_event_name`. The gate
|
|
377
|
+
takes no shell entry — it is not per-call. Claude Code's half of the gap stays
|
|
378
|
+
open; `permissions.deny` is a file-path list, and a `Bash` matcher there would
|
|
379
|
+
mean shipping a generated script that harness does not currently need.
|
|
380
|
+
|
|
381
|
+
### Changed
|
|
382
|
+
|
|
383
|
+
- **The AGENTS.md stanza no longer promises the gate ran everything.** It said
|
|
384
|
+
the stop-gate hook "runs the full `pnpm check`" and told the agent to "let the
|
|
385
|
+
hook run the authoritative pipeline once at the end" — written before gate
|
|
386
|
+
profiles existed, and false in any repo that declares one. The cost of that is
|
|
387
|
+
specific: the stanza is what an agent reads *first*, so it pre-authorized
|
|
388
|
+
reading a profiled `✔ green` as done, and the `NOT the full check` clause
|
|
389
|
+
arrived after the agent had already been told the hook was the last word. The
|
|
390
|
+
disclosure and the contract disagreed, and the contract was the one being read
|
|
391
|
+
in advance.
|
|
392
|
+
|
|
393
|
+
The paragraph now sends the reader to the gate's own verdict — "read the
|
|
394
|
+
gate's verdict rather than assuming it covered everything" — and says plainly
|
|
395
|
+
that a narrowed green is not the "done" defined above. It names no profile
|
|
396
|
+
deliberately: a repo can add `gate` to `checkride.config.json` without
|
|
397
|
+
re-running `agent-setup`, so any stanza that spelled out a specific profile
|
|
398
|
+
would drift back into over-promising, while the verdict is generated per run
|
|
399
|
+
and cannot.
|
|
400
|
+
|
|
7
401
|
## [0.10.2] - 2026-07-31
|
|
8
402
|
|
|
9
403
|
### Added
|
|
@@ -1453,6 +1847,13 @@ The first real release. (`0.0.0` was a name-claim placeholder.)
|
|
|
1453
1847
|
- Flags: `--only`, `--skip`, `--bail`, `--json`, `--changed`, `--all`,
|
|
1454
1848
|
`--include`.
|
|
1455
1849
|
|
|
1850
|
+
[0.12.2]: https://www.npmjs.com/package/checkride/v/0.12.2
|
|
1851
|
+
[0.12.1]: https://www.npmjs.com/package/checkride/v/0.12.1
|
|
1852
|
+
[0.12.0]: https://www.npmjs.com/package/checkride/v/0.12.0
|
|
1853
|
+
[0.11.2]: https://www.npmjs.com/package/checkride/v/0.11.2
|
|
1854
|
+
[0.11.1]: https://www.npmjs.com/package/checkride/v/0.11.1
|
|
1855
|
+
[0.11.0]: https://www.npmjs.com/package/checkride/v/0.11.0
|
|
1856
|
+
[0.10.3]: https://www.npmjs.com/package/checkride/v/0.10.3
|
|
1456
1857
|
[0.10.2]: https://www.npmjs.com/package/checkride/v/0.10.2
|
|
1457
1858
|
[0.10.1]: https://www.npmjs.com/package/checkride/v/0.10.1
|
|
1458
1859
|
[0.10.0]: https://www.npmjs.com/package/checkride/v/0.10.0
|
|
@@ -155,6 +155,12 @@ checkride init Set up a project (new or existing — auto-detected).
|
|
|
155
155
|
checkride doctor Verify environment + every slot's status (read-only, exit 0/1).
|
|
156
156
|
checkride fix Run every active adapter's fix command (oxlint --fix, ...).
|
|
157
157
|
checkride baseline Record current diagnostics as a committed baseline.
|
|
158
|
+
checkride recover Rebuild checkride.baseline.json candidates from git history
|
|
159
|
+
and restore one (bare `recover` lists them with deltas).
|
|
160
|
+
--pick <n|sha|union> apply a candidate — additive union with the current file
|
|
161
|
+
--exact write the picked snapshot verbatim instead of the union
|
|
162
|
+
--dry-run preview the per-slot delta; write nothing
|
|
163
|
+
--depth <n> commits of file history to walk (default 25)
|
|
158
164
|
checkride agent-setup Add the "check" alias, AGENTS.md stanza + agent hooks to a repo.
|
|
159
165
|
--hook <a,b> write only these hooks (gate | dirty | protect)
|
|
160
166
|
--no-hook skip the hooks (write only the stanza)
|
|
@@ -178,8 +184,8 @@ default run leaves stdout empty.
|
|
|
178
184
|
## The pipeline: slots and adapters
|
|
179
185
|
|
|
180
186
|
A **slot** is a role in the pipeline (order matters — cheapest first). An
|
|
181
|
-
**adapter** is a concrete tool that fills a slot.
|
|
182
|
-
|
|
187
|
+
**adapter** is a concrete tool that fills a slot. Each slot has one blessed
|
|
188
|
+
default; alternates are wired so checkride can run them, but `init` only
|
|
183
189
|
generates config for the blessed default.
|
|
184
190
|
|
|
185
191
|
| Slot | Role | Blessed default | Alternates |
|
|
@@ -195,10 +201,15 @@ generates config for the blessed default.
|
|
|
195
201
|
| `docs` | Markdown lint | `markdownlint-cli2` | — |
|
|
196
202
|
| `links` | Relative markdown links resolve | built-in | — |
|
|
197
203
|
| `spell` | Spelling | `cspell` | — |
|
|
204
|
+
| `prose` | Writing style (opt-in) | `vale` | — |
|
|
198
205
|
| `mutation` | Mutation testing (opt-in) | `stryker` | — |
|
|
199
206
|
| `security` | Dependency audit (opt-in) | `pnpm audit` | — |
|
|
207
|
+
| `build` | Runs the consumer's build script (opt-in) | `<pm> run build` | — |
|
|
200
208
|
| `publint` | Package publishing lint (opt-in) | `publint` | — |
|
|
201
209
|
| `attw` | Type resolution across module systems (opt-in) | `attw --pack`| — |
|
|
210
|
+
| `pack` | Tarball ships the right files (opt-in) | built-in | — |
|
|
211
|
+
| `smoke` | Built package imports cleanly (opt-in) | built-in | — |
|
|
212
|
+
| `snippets` | Tagged doc fences type-check (opt-in) | built-in (`tsc`) | — |
|
|
202
213
|
|
|
203
214
|
Most of these tools you already know. The one unfamiliar name, `fallow`, is a
|
|
204
215
|
Rust-native codebase-analysis tool covering dead code, duplication, and
|
|
@@ -210,16 +221,17 @@ exists, and skips slots with no detected tool. The core has **no runtime
|
|
|
210
221
|
dependency** on any checked tool — it spawns `<pm> exec <tool>`; the project
|
|
211
222
|
owns the pinned tool versions.
|
|
212
223
|
|
|
213
|
-
**Opt-in slots** (`format`, `
|
|
224
|
+
**Opt-in slots** (`format`, `dupes`, `health`, `prose`, `mutation`, `security`, `build`,
|
|
225
|
+
`publint`, `attw`, `pack`, `smoke`, `snippets`) stay out of the
|
|
214
226
|
default run so adopting checkride — or bumping its version — never turns a repo red on a
|
|
215
227
|
check it didn't ask for. Turn one on with `--include <slot>` (or `--all`), or by **naming
|
|
216
228
|
it in `checks`**: an explicit entry like `"format": "prettier"` opts the slot into every
|
|
217
|
-
run. `checkride fix` then runs its write form (
|
|
229
|
+
run. `checkride fix` then runs its write form (for example `prettier --write`) alongside the
|
|
218
230
|
other fixers. `format` sits before `lint` so the tree is tidy before the linters look.
|
|
219
231
|
|
|
220
232
|
To **configure a slot without opting it in** — say, give `attw` a `--profile` but keep it
|
|
221
233
|
in the full sweep only — add `"optIn": true` to its entry: it stays out of the default run
|
|
222
|
-
and runs solely under `--all`/`--include <slot>`. The same field demotes a normally
|
|
234
|
+
and runs solely under `--all`/`--include <slot>`. The same field demotes a normally default
|
|
223
235
|
slot (or a heavy custom check like `test:integration`) to full-sweep-only; `"optIn": false`
|
|
224
236
|
does the opposite, forcing a slot into the default run.
|
|
225
237
|
|
|
@@ -475,7 +487,13 @@ keys are sorted), so parallel branches usually merge cleanly; when they do
|
|
|
475
487
|
conflict, resolve by keeping both sides' entries and running a full
|
|
476
488
|
`checkride` — the ratchet prunes anything already fixed, so an over-generous
|
|
477
489
|
union self-heals, while a dropped entry that still fails simply resurfaces as
|
|
478
|
-
a red check.
|
|
490
|
+
a red check. When a merge went badly anyway — entries deleted wholesale, or a
|
|
491
|
+
file so mangled it no longer parses (a run says so on stderr and treats it as
|
|
492
|
+
no baseline at all) — the run diagnoses what it can: a red run whose "new"
|
|
493
|
+
findings were grandfathered until a recent commit prints a `hint:` line naming
|
|
494
|
+
that commit. `checkride recover` then rebuilds candidate states from the
|
|
495
|
+
file's git history and restores one additively; see `checkride recover --help`.
|
|
496
|
+
**Deliberate re-baseline:** `checkride baseline` re-records
|
|
479
497
|
*everything* currently failing — including brand-new debt you might rather
|
|
480
498
|
fix — so treat re-running it as a reviewed change: do it deliberately (say,
|
|
481
499
|
after adopting a stricter rule set) and read the `checkride.baseline.json`
|
|
@@ -508,9 +526,9 @@ At runtime, checkride itself is workspace-agnostic: whatever the shape, it runs
|
|
|
508
526
|
each tool **once, from the repo root** — one pipeline, one `.check/`. Workspace
|
|
509
527
|
awareness comes from the tools' own configs, which is what the monorepo scaffold
|
|
510
528
|
sets up: `tsc --build` follows the root tsconfig's project references, and
|
|
511
|
-
vitest, oxlint, ast-grep, and the rest walk the whole tree.
|
|
512
|
-
per-package orchestration and no way to check a single package —
|
|
513
|
-
with `--only`/`--changed`, not per-directory.
|
|
529
|
+
vitest, oxlint, ast-grep, and the rest walk the whole tree. checkride itself
|
|
530
|
+
does no per-package orchestration and offers no way to check a single package —
|
|
531
|
+
narrow a run with `--only`/`--changed`, not per-directory.
|
|
514
532
|
|
|
515
533
|
## Conventions
|
|
516
534
|
|
|
@@ -25,7 +25,7 @@ export type OrderString = 'first' | 'last' | 'middle' | 'single' | 'any';
|
|
|
25
25
|
export type Order = number | OrderString;
|
|
26
26
|
/** A role in the pipeline. */
|
|
27
27
|
export type Slot = {
|
|
28
|
-
/** Stable slot name,
|
|
28
|
+
/** Stable slot name, for example `'lint'`. Used by `--only`/`--skip` and the report. */
|
|
29
29
|
name: string;
|
|
30
30
|
/**
|
|
31
31
|
* Opt-in slots are excluded from the default run. Enable one with
|
|
@@ -41,9 +41,9 @@ export type Slot = {
|
|
|
41
41
|
};
|
|
42
42
|
/** A concrete tool that can fill a slot. */
|
|
43
43
|
export type Adapter = {
|
|
44
|
-
/** Adapter name,
|
|
44
|
+
/** Adapter name, for example `'oxlint'`. Recorded as `adapter` in the report. */
|
|
45
45
|
name: string;
|
|
46
|
-
/** The slot this adapter fills,
|
|
46
|
+
/** The slot this adapter fills, for example `'lint'`. */
|
|
47
47
|
slot: string;
|
|
48
48
|
/** Human description for the report. */
|
|
49
49
|
description: string;
|
|
@@ -74,7 +74,7 @@ export type Adapter = {
|
|
|
74
74
|
fixArgs?: string[];
|
|
75
75
|
/** Per-check timeout in seconds; `0` disables the cap. Falls back to the config-level `timeout`, then the built-in 600s default. */
|
|
76
76
|
timeout?: number;
|
|
77
|
-
/** In-process check id (
|
|
77
|
+
/** In-process check id (for example `'links'`); when set, the orchestrator runs it directly. */
|
|
78
78
|
builtin?: string;
|
|
79
79
|
/**
|
|
80
80
|
* Consumed by the `links` built-in only: extra directory names to skip while
|
|
@@ -88,6 +88,14 @@ export type Adapter = {
|
|
|
88
88
|
* config entry's `allowlist` and validated at config load; ignored elsewhere.
|
|
89
89
|
*/
|
|
90
90
|
allowlist?: string[];
|
|
91
|
+
/**
|
|
92
|
+
* Consumed by the `prose` slot only: repo-relative directory of hand-written
|
|
93
|
+
* voice exemplars, carried from a config entry's `exemplars`. The orchestrator
|
|
94
|
+
* fails the check when the directory is missing or holds no files — the
|
|
95
|
+
* exemplars are load-bearing anchor texts, and a config that points at nothing
|
|
96
|
+
* must not stay green. Ignored by every other adapter.
|
|
97
|
+
*/
|
|
98
|
+
exemplars?: string;
|
|
91
99
|
/**
|
|
92
100
|
* When set, checkride derives this adapter's pass/fail from its parsed JSON
|
|
93
101
|
* output instead of its process exit code. Only `'fallow'` today: fallow's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AACzE,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,MAAM,IAAI,GAAG;IACjB,
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AACzE,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,MAAM,IAAI,GAAG;IACjB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,OAAO,GAAG;IACpB,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oIAAoI;IACpI,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAqBhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,EAgYtC,CAAC"}
|
|
@@ -31,6 +31,7 @@ export const SLOTS = [
|
|
|
31
31
|
{ name: 'docs' },
|
|
32
32
|
{ name: 'links' },
|
|
33
33
|
{ name: 'spell' },
|
|
34
|
+
{ name: 'prose', optIn: true },
|
|
34
35
|
{ name: 'mutation', optIn: true, order: 'single' },
|
|
35
36
|
{ name: 'security', optIn: true },
|
|
36
37
|
{ name: 'build', optIn: true, order: 10 },
|
|
@@ -251,7 +252,7 @@ export const ADAPTERS = [
|
|
|
251
252
|
args: ['exec', 'markdownlint-cli2'],
|
|
252
253
|
outputFile: null,
|
|
253
254
|
fixArgs: ['exec', 'markdownlint-cli2', '--fix'],
|
|
254
|
-
devDeps: { 'markdownlint-cli2': '0.23.
|
|
255
|
+
devDeps: { 'markdownlint-cli2': '0.23.2' },
|
|
255
256
|
},
|
|
256
257
|
{
|
|
257
258
|
name: 'links',
|
|
@@ -282,6 +283,25 @@ export const ADAPTERS = [
|
|
|
282
283
|
outputFile: null,
|
|
283
284
|
devDeps: { cspell: '10.0.1' },
|
|
284
285
|
},
|
|
286
|
+
{
|
|
287
|
+
name: 'vale',
|
|
288
|
+
slot: 'prose',
|
|
289
|
+
description: 'Vale: writing style (prose linting)',
|
|
290
|
+
// Vale's own config-discovery names, and the whole detection signal: no
|
|
291
|
+
// `detectDeps`, because vale hard-errors (E100, exit 2) with no config file
|
|
292
|
+
// — it is not configless-capable, so a repo that installed the tool but never
|
|
293
|
+
// wrote its config must not be opted in.
|
|
294
|
+
detect: ['.vale.ini', '_vale.ini'],
|
|
295
|
+
command: 'pnpm',
|
|
296
|
+
// `--no-global` keeps the verdict off ~/.vale.ini, so a check means the same
|
|
297
|
+
// thing on every machine. The trailing `.` is load-bearing: vale lints
|
|
298
|
+
// nothing at all without a path argument. It also reads no .gitignore and
|
|
299
|
+
// skips no hidden directory, so a repo narrows the walk by overriding
|
|
300
|
+
// `args` with explicit paths — the same way this one already does for lint.
|
|
301
|
+
args: ['exec', 'vale', '--no-global', '--output=JSON', '.'],
|
|
302
|
+
outputFile: 'prose.json',
|
|
303
|
+
devDeps: { '@vvago/vale': '3.17.0' },
|
|
304
|
+
},
|
|
285
305
|
{
|
|
286
306
|
name: 'stryker',
|
|
287
307
|
slot: 'mutation',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
|