paperlint 10.1.1 → 10.3.0
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/README.md +2 -0
- package/dist/adapters/study-registry/index.d.ts +357 -0
- package/dist/adapters/study-registry/index.d.ts.map +1 -0
- package/dist/adapters/study-registry/index.js +221 -0
- package/dist/adapters/study-registry/index.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +42 -2
- package/dist/cli.js.map +1 -1
- package/dist/domain/repro-layout.d.ts +12 -4
- package/dist/domain/repro-layout.d.ts.map +1 -1
- package/dist/domain/repro-layout.js +49 -18
- package/dist/domain/repro-layout.js.map +1 -1
- package/dist/domain/scaffold-layout.d.ts +4 -3
- package/dist/domain/scaffold-layout.d.ts.map +1 -1
- package/dist/domain/scaffold-layout.js +7 -4
- package/dist/domain/scaffold-layout.js.map +1 -1
- package/dist/domain/study-registry.d.ts +372 -0
- package/dist/domain/study-registry.d.ts.map +1 -0
- package/dist/domain/study-registry.js +593 -0
- package/dist/domain/study-registry.js.map +1 -0
- package/dist/ports/study-registry-codec.d.ts +15 -0
- package/dist/ports/study-registry-codec.d.ts.map +1 -0
- package/dist/ports/study-registry-codec.js +2 -0
- package/dist/ports/study-registry-codec.js.map +1 -0
- package/dist/repro-layout-rule.d.ts.map +1 -1
- package/dist/repro-layout-rule.js +4 -3
- package/dist/repro-layout-rule.js.map +1 -1
- package/dist/studies.d.ts +27 -0
- package/dist/studies.d.ts.map +1 -0
- package/dist/studies.js +163 -0
- package/dist/studies.js.map +1 -0
- package/dist/study-registry-rule.d.ts +24 -0
- package/dist/study-registry-rule.d.ts.map +1 -0
- package/dist/study-registry-rule.js +145 -0
- package/dist/study-registry-rule.js.map +1 -0
- package/docs/design/study-registry.md +246 -0
- package/docs/layout.md +51 -46
- package/docs/rules/paper/allowed-files-only.md +3 -2
- package/docs/rules/repro/allowed-files-only.md +40 -30
- package/docs/rules/repro/study-plan-name.md +70 -0
- package/docs/rules/repro/study-registered.md +320 -0
- package/docs/rules/study/declare-sample.md +1 -1
- package/docs/rules.md +53 -51
- package/package.json +1 -1
- package/skills/build-benchmark/SKILL.md +39 -8
- package/skills/build-benchmark/SKILL.md.spec.ts +38 -7
- package/skills/build-label-page/SKILL.md +14 -9
- package/skills/build-label-page/SKILL.md.spec.ts +13 -8
- package/skills/paper-pipeline/references/artifact-checklist.md +2 -1
- package/skills/paper-pipeline/references/pipeline-status-template.md +5 -3
- package/skills/run-agent-grid/SKILL.md +13 -1
- package/skills/run-agent-grid/SKILL.md.spec.ts +12 -0
- package/src/adapters/study-registry/index.test.ts +484 -0
- package/src/adapters/study-registry/index.ts +328 -0
- package/src/cli.ts +53 -2
- package/src/domain/paper-layout.test.ts +1 -1
- package/src/domain/repro-layout.test.ts +18 -9
- package/src/domain/repro-layout.ts +58 -18
- package/src/domain/scaffold-layout.ts +7 -4
- package/src/domain/study-measurements.test.ts +629 -0
- package/src/domain/study-registry.test.ts +666 -0
- package/src/domain/study-registry.ts +1044 -0
- package/src/folder-layout-hook.test.ts +10 -0
- package/src/new-paper.test.ts +29 -2
- package/src/ports/study-registry-codec.ts +15 -0
- package/src/repro-layout-rule.ts +4 -3
- package/src/rule-cases.test.ts +68 -0
- package/src/studies-cli.test.ts +113 -0
- package/src/studies.test.ts +359 -0
- package/src/studies.ts +268 -0
- package/src/study-registry-rule.test.ts +456 -0
- package/src/study-registry-rule.ts +239 -0
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE STUDY REGISTRY — `repro/studies.json`: one row per study, each with a stable id, a plain name and
|
|
3
|
+
* its status. The design is docs/design/study-registry.md; the rule is `repro/study-registered`
|
|
4
|
+
* (docs/rules/repro/study-registered.md).
|
|
5
|
+
*
|
|
6
|
+
* A paper's `repro/` once reached 79 study folders named `<slug>-YYYY-MM-DD`, and nobody could tell
|
|
7
|
+
* which was which, which had ended, or which a number in the paper came from. Now every study folder is
|
|
8
|
+
* `<id>-<slug>` (`P1-S03-baseline`), and its row says what it asks, where it stands and what it found.
|
|
9
|
+
*
|
|
10
|
+
* ── JSON, NEVER MARKDOWN ─────────────────────────────────────────────────────────
|
|
11
|
+
* The registry is data: its text is parsed once, where it enters, against the schema in
|
|
12
|
+
* `src/adapters/study-registry/` (`StudyRegistryCodec`). The index in `repro/README.md` is OUTPUT: it is
|
|
13
|
+
* generated from the registry and compared as a string, between two fixed markers. Nothing parses it.
|
|
14
|
+
*
|
|
15
|
+
* Pure: the caller lists `repro/`, reads the registry and the README, and says which result files exist.
|
|
16
|
+
*/
|
|
17
|
+
import { isAbsolute, posix, win32 } from "node:path";
|
|
18
|
+
import { STUDIES_FILE, STUDY_SLUG } from "./repro-layout.js";
|
|
19
|
+
/** The registry, at the top of the paper's `repro/`; the layout allows it there. */
|
|
20
|
+
export { STUDIES_FILE };
|
|
21
|
+
export const STUDY_KINDS = [
|
|
22
|
+
"measurement",
|
|
23
|
+
"spike",
|
|
24
|
+
"tooling",
|
|
25
|
+
"data",
|
|
26
|
+
"artifact",
|
|
27
|
+
"salvage",
|
|
28
|
+
];
|
|
29
|
+
export const STUDY_STATUSES = [
|
|
30
|
+
"designing",
|
|
31
|
+
"running",
|
|
32
|
+
"done",
|
|
33
|
+
"stopped",
|
|
34
|
+
"superseded",
|
|
35
|
+
"dropped",
|
|
36
|
+
];
|
|
37
|
+
/** `registry`: listed in the registry only, not in the paper's text. */
|
|
38
|
+
export const IN_PAPER = ["yes", "no", "registry"];
|
|
39
|
+
/** A title is a plain name, not a sentence. */
|
|
40
|
+
export const MAX_TITLE_WORDS = 8;
|
|
41
|
+
/** A paper's prefix: a capital letter, then capitals or digits (`P1`). */
|
|
42
|
+
export const PREFIX_PATTERN = /^[A-Z][A-Z0-9]*$/u;
|
|
43
|
+
/** The kind `paperlint studies new` gives a study when none is named. */
|
|
44
|
+
export const DEFAULT_KIND = "measurement";
|
|
45
|
+
/** The markers around the generated index in `repro/README.md`. Fixed: the rule finds the block by them. */
|
|
46
|
+
export const INDEX_BEGIN = "<!-- studies:begin — generated from studies.json by `paperlint studies index`; do not edit -->";
|
|
47
|
+
export const INDEX_END = "<!-- studies:end -->";
|
|
48
|
+
/** The README written when `repro/` has none. */
|
|
49
|
+
const INDEX_HEADING = "# Reproduction index";
|
|
50
|
+
/** What a measurement is to the paper: the claim it carries, or what that claim is compared with. */
|
|
51
|
+
export const MEASUREMENT_ROLES = ["headline", "baseline"];
|
|
52
|
+
/**
|
|
53
|
+
* The statuses of a study that has run: its plan was due before the first run. A `designing` study
|
|
54
|
+
* has not run yet, and a `dropped` one never will.
|
|
55
|
+
*/
|
|
56
|
+
export const RAN_STATUSES = [
|
|
57
|
+
"running",
|
|
58
|
+
"done",
|
|
59
|
+
"stopped",
|
|
60
|
+
"superseded",
|
|
61
|
+
];
|
|
62
|
+
/** The file `paperlint studies new` writes a study's plan to, beside its README.md. */
|
|
63
|
+
export const PLAN_FILE = "plan.json";
|
|
64
|
+
/** The plan's name before it was a plan: still read as one, and reported by `repro/study-plan-name`. */
|
|
65
|
+
export const LEGACY_PLAN_FILE = "prereg.json";
|
|
66
|
+
/** The top-level fields of a plan: none of them may be a key of `extra`. */
|
|
67
|
+
export const PLAN_FIELDS = [
|
|
68
|
+
"question",
|
|
69
|
+
"population",
|
|
70
|
+
"arms",
|
|
71
|
+
"primary_outcome",
|
|
72
|
+
"author_check",
|
|
73
|
+
"extra",
|
|
74
|
+
];
|
|
75
|
+
/** The texts a plan must fill before the study runs, in the order they are named. */
|
|
76
|
+
export const PLAN_TEXT_FIELDS = [
|
|
77
|
+
"question",
|
|
78
|
+
"population.source",
|
|
79
|
+
"population.draw.method",
|
|
80
|
+
"primary_outcome",
|
|
81
|
+
];
|
|
82
|
+
/**
|
|
83
|
+
* The plan `paperlint studies new` writes: every field present, its value to fill. Its draw is of
|
|
84
|
+
* all the population (a census); a sampled study changes it to `{ "kind": "seeded", "method", "seed" }`.
|
|
85
|
+
*/
|
|
86
|
+
export const planTemplate = () => ({
|
|
87
|
+
question: "",
|
|
88
|
+
population: { source: "", draw: { kind: "all", method: "" } },
|
|
89
|
+
arms: [],
|
|
90
|
+
primary_outcome: "",
|
|
91
|
+
author_check: null,
|
|
92
|
+
});
|
|
93
|
+
/** A plan's text as `paperlint studies new` writes it: JSON, two-space indented, a final newline. */
|
|
94
|
+
export const planText = (p) => `${JSON.stringify(p, null, 2)}\n`;
|
|
95
|
+
/** The findings `repro/study-plan-name` reports, a warning; every other is `repro/study-registered`'s. */
|
|
96
|
+
export const PLAN_NAME_PROBLEMS = [
|
|
97
|
+
"legacy-plan",
|
|
98
|
+
];
|
|
99
|
+
/** The number of an id of `prefix` (`P1-S07` → 7); null for an id of another shape. */
|
|
100
|
+
function idNumber(prefix, id) {
|
|
101
|
+
const m = new RegExp(`^${prefix}-S(\\d{2,})$`, "u").exec(id);
|
|
102
|
+
return m === null ? null : Number(m[1]);
|
|
103
|
+
}
|
|
104
|
+
/** The id after the highest one in `r`, at least two digits: `P1-S01` in an empty registry. */
|
|
105
|
+
export function nextStudyId(r) {
|
|
106
|
+
const numbers = r.studies
|
|
107
|
+
.map((s) => idNumber(r.prefix, s.id))
|
|
108
|
+
.filter((n) => n !== null);
|
|
109
|
+
const next = Math.max(0, ...numbers) + 1;
|
|
110
|
+
return `${r.prefix}-S${String(next).padStart(2, "0")}`;
|
|
111
|
+
}
|
|
112
|
+
/** The slug of a title: lowercase Latin letters and digits, words joined by single hyphens; "" when none. */
|
|
113
|
+
export const studySlug = (title) => title
|
|
114
|
+
.normalize("NFKD")
|
|
115
|
+
.replace(/\p{M}/gu, "")
|
|
116
|
+
.toLowerCase()
|
|
117
|
+
.replace(/[^a-z0-9]+/gu, "-")
|
|
118
|
+
.replace(/^-+|-+$/gu, "");
|
|
119
|
+
/** The number of words in a title. */
|
|
120
|
+
export const titleWords = (title) => title.split(/\s+/u).filter((w) => w !== "").length;
|
|
121
|
+
/**
|
|
122
|
+
* Whether `path` stays inside the folder it is relative to. A backslash or a Windows absolute path
|
|
123
|
+
* is refused outright: `posix.normalize` does not resolve `..\\`, while the host's `join` may.
|
|
124
|
+
*/
|
|
125
|
+
const isInside = (path) => {
|
|
126
|
+
if (path.includes("\\") || isAbsolute(path) || win32.isAbsolute(path))
|
|
127
|
+
return false;
|
|
128
|
+
const n = posix.normalize(path);
|
|
129
|
+
return n !== ".." && !n.startsWith("../");
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* The `<folder>/<plan>` of each row whose plan lies inside its folder: the files the judge needs read
|
|
133
|
+
* (`StudyInput.plans`). A plan outside its folder is reported without being read.
|
|
134
|
+
*/
|
|
135
|
+
export const planKeys = (r) => r.studies.flatMap((s) => s.plan !== undefined && isInside(s.plan) ? [`${s.folder}/${s.plan}`] : []);
|
|
136
|
+
/** Whether the row is the first of the registry with its value of `key`. */
|
|
137
|
+
const isFirst = ({ r, s, i }, key) => r.studies.findIndex((o) => key(o) === key(s)) === i;
|
|
138
|
+
const badId = ({ r, s }) => idNumber(r.prefix, s.id) === null
|
|
139
|
+
? { problem: "bad-id", id: s.id, prefix: r.prefix }
|
|
140
|
+
: null;
|
|
141
|
+
/** Reported once, on the first row that holds the id. */
|
|
142
|
+
const duplicateId = (row) => row.r.studies.filter((o) => o.id === row.s.id).length > 1 &&
|
|
143
|
+
isFirst(row, (o) => o.id)
|
|
144
|
+
? { problem: "duplicate-id", id: row.s.id }
|
|
145
|
+
: null;
|
|
146
|
+
/** Reported once, on the first row that names the folder. */
|
|
147
|
+
const twoRows = (row) => {
|
|
148
|
+
const { r, s } = row;
|
|
149
|
+
const ids = r.studies.filter((o) => o.folder === s.folder).map((o) => o.id);
|
|
150
|
+
return ids.length > 1 && isFirst(row, (o) => o.folder)
|
|
151
|
+
? { problem: "two-rows", folder: s.folder, ids }
|
|
152
|
+
: null;
|
|
153
|
+
};
|
|
154
|
+
/** A bad id is reported once, as an id: no folder can match it. */
|
|
155
|
+
const folderName = ({ r, s }) => idNumber(r.prefix, s.id) === null ||
|
|
156
|
+
(s.folder.startsWith(`${s.id}-`) &&
|
|
157
|
+
STUDY_SLUG.test(s.folder.slice(s.id.length + 1)))
|
|
158
|
+
? null
|
|
159
|
+
: { problem: "folder-name", id: s.id, folder: s.folder };
|
|
160
|
+
const noFolder = ({ s, input }) => input.folders.includes(s.folder)
|
|
161
|
+
? null
|
|
162
|
+
: { problem: "no-folder", id: s.id, folder: s.folder };
|
|
163
|
+
const longTitle = ({ s }) => {
|
|
164
|
+
const words = titleWords(s.title);
|
|
165
|
+
return words > MAX_TITLE_WORDS
|
|
166
|
+
? { problem: "long-title", id: s.id, words }
|
|
167
|
+
: null;
|
|
168
|
+
};
|
|
169
|
+
const noResult = ({ s }) => {
|
|
170
|
+
const missing = [
|
|
171
|
+
...(s.result === undefined ? ["result"] : []),
|
|
172
|
+
...(s.result_file === undefined ? ["result_file"] : []),
|
|
173
|
+
];
|
|
174
|
+
return s.status === "done" && missing.length > 0
|
|
175
|
+
? { problem: "no-result", id: s.id, missing }
|
|
176
|
+
: null;
|
|
177
|
+
};
|
|
178
|
+
/** A `result_file` on any status must be a file inside the study's folder. */
|
|
179
|
+
const resultFile = ({ s, input }) => {
|
|
180
|
+
const path = s.result_file;
|
|
181
|
+
if (path === undefined)
|
|
182
|
+
return null;
|
|
183
|
+
if (!isInside(path))
|
|
184
|
+
return { problem: "result-file", id: s.id, path, why: "outside" };
|
|
185
|
+
return input.existingResults.has(`${s.folder}/${path}`)
|
|
186
|
+
? null
|
|
187
|
+
: { problem: "result-file", id: s.id, path, why: "missing" };
|
|
188
|
+
};
|
|
189
|
+
const noSuccessor = ({ r, s }) => {
|
|
190
|
+
const by = s.superseded_by ?? null;
|
|
191
|
+
return s.status === "superseded" &&
|
|
192
|
+
(by === null || !r.studies.some((o) => o.id === by))
|
|
193
|
+
? { problem: "no-successor", id: s.id, superseded_by: by }
|
|
194
|
+
: null;
|
|
195
|
+
};
|
|
196
|
+
/** A row's `measurement`, when the registry declares its measurements, names one of them. */
|
|
197
|
+
const unknownMeasurement = ({ r, s }) => r.measurements === undefined ||
|
|
198
|
+
s.measurement === undefined ||
|
|
199
|
+
r.measurements.some((m) => m.id === s.measurement)
|
|
200
|
+
? null
|
|
201
|
+
: { problem: "unknown-measurement", id: s.id, measurement: s.measurement };
|
|
202
|
+
/** The state of the plan the row names (absent when outside its folder); null when it names none. */
|
|
203
|
+
const planOf = ({ s, input }) => {
|
|
204
|
+
if (s.plan === undefined)
|
|
205
|
+
return null;
|
|
206
|
+
return isInside(s.plan)
|
|
207
|
+
? (input.plans.get(`${s.folder}/${s.plan}`) ?? { kind: "absent" })
|
|
208
|
+
: { kind: "absent" };
|
|
209
|
+
};
|
|
210
|
+
const hasRun = (s) => RAN_STATUSES.includes(s.status);
|
|
211
|
+
/** The finding for the plan `path` of `s`, in the state its folder holds it; null when it stands. */
|
|
212
|
+
const planFinding = (s, path, state) => {
|
|
213
|
+
const at = { problem: "bad-plan", id: s.id, path };
|
|
214
|
+
switch (state.kind) {
|
|
215
|
+
case "absent":
|
|
216
|
+
return { ...at, why: "missing" };
|
|
217
|
+
case "unreadable":
|
|
218
|
+
return { ...at, why: "unreadable", reasons: state.why };
|
|
219
|
+
case "draft":
|
|
220
|
+
return hasRun(s)
|
|
221
|
+
? { ...at, why: "unfilled", fields: state.empty, status: s.status }
|
|
222
|
+
: null;
|
|
223
|
+
case "ready":
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
/** The plan a row names is a file inside its folder, of the schema, and ready once the study has run. */
|
|
228
|
+
const badPlan = ({ s, input }) => {
|
|
229
|
+
const path = s.plan;
|
|
230
|
+
if (path === undefined)
|
|
231
|
+
return null;
|
|
232
|
+
if (!isInside(path))
|
|
233
|
+
return { problem: "bad-plan", id: s.id, path, why: "outside" };
|
|
234
|
+
return planFinding(s, path, input.plans.get(`${s.folder}/${path}`) ?? { kind: "absent" });
|
|
235
|
+
};
|
|
236
|
+
/** A plan under its old name: read, and named for renaming. */
|
|
237
|
+
const legacyPlan = ({ s }) => s.plan !== undefined && posix.basename(s.plan) === LEGACY_PLAN_FILE
|
|
238
|
+
? { problem: "legacy-plan", id: s.id, path: s.plan }
|
|
239
|
+
: null;
|
|
240
|
+
/**
|
|
241
|
+
* A study of a headline measurement that has run carries the author's check of its drawn units in
|
|
242
|
+
* its plan, by the registry's author when it names one. A plan that cannot be read is `badPlan`'s.
|
|
243
|
+
*/
|
|
244
|
+
const authorCheck = (row) => {
|
|
245
|
+
const { r, s } = row;
|
|
246
|
+
const m = r.measurements?.find((o) => o.id === s.measurement);
|
|
247
|
+
if (m?.role !== "headline" || !hasRun(s))
|
|
248
|
+
return null;
|
|
249
|
+
const at = {
|
|
250
|
+
problem: "author-check",
|
|
251
|
+
id: s.id,
|
|
252
|
+
measurement: m.id,
|
|
253
|
+
status: s.status,
|
|
254
|
+
};
|
|
255
|
+
const state = planOf(row);
|
|
256
|
+
if (state === null)
|
|
257
|
+
return { ...at, why: "no-plan" };
|
|
258
|
+
const wrong = state.kind === "ready" || state.kind === "draft"
|
|
259
|
+
? checkProblem(r, state.plan)
|
|
260
|
+
: null;
|
|
261
|
+
return wrong === null ? null : { ...at, ...wrong };
|
|
262
|
+
};
|
|
263
|
+
/** What a read plan's author check lacks: it is not there, or it is not the registry's author's. */
|
|
264
|
+
const checkProblem = (r, plan) => {
|
|
265
|
+
const check = plan.author_check;
|
|
266
|
+
if (check === null)
|
|
267
|
+
return { why: "missing" };
|
|
268
|
+
return r.author === undefined || check.by === r.author
|
|
269
|
+
? null
|
|
270
|
+
: { why: "not-author", by: check.by, author: r.author };
|
|
271
|
+
};
|
|
272
|
+
/** The checks of a row, in the order their findings are reported. */
|
|
273
|
+
const ROW_CHECKS = [
|
|
274
|
+
badId,
|
|
275
|
+
duplicateId,
|
|
276
|
+
twoRows,
|
|
277
|
+
folderName,
|
|
278
|
+
noFolder,
|
|
279
|
+
longTitle,
|
|
280
|
+
noResult,
|
|
281
|
+
resultFile,
|
|
282
|
+
noSuccessor,
|
|
283
|
+
unknownMeasurement,
|
|
284
|
+
badPlan,
|
|
285
|
+
legacyPlan,
|
|
286
|
+
authorCheck,
|
|
287
|
+
];
|
|
288
|
+
/** A headline measurement's approval: missing, or not the registry's author's; null when it stands. */
|
|
289
|
+
const headlineApproval = (r, m) => {
|
|
290
|
+
if (m.role !== "headline")
|
|
291
|
+
return null;
|
|
292
|
+
const author = r.author ?? null;
|
|
293
|
+
if (m.approval === undefined)
|
|
294
|
+
return {
|
|
295
|
+
problem: "headline-approval",
|
|
296
|
+
measurement: m.id,
|
|
297
|
+
why: "missing",
|
|
298
|
+
author,
|
|
299
|
+
};
|
|
300
|
+
return author === null || m.approval.by === author
|
|
301
|
+
? null
|
|
302
|
+
: {
|
|
303
|
+
problem: "headline-approval",
|
|
304
|
+
measurement: m.id,
|
|
305
|
+
why: "not-author",
|
|
306
|
+
by: m.approval.by,
|
|
307
|
+
author,
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
/** What is wrong with one measurement: no study, a requirement not held, a headline not approved. */
|
|
311
|
+
const judgeMeasurement = (r, m) => {
|
|
312
|
+
const approval = headlineApproval(r, m);
|
|
313
|
+
return [
|
|
314
|
+
...(r.studies.some((s) => s.measurement === m.id)
|
|
315
|
+
? []
|
|
316
|
+
: [{ problem: "empty-measurement", measurement: m.id }]),
|
|
317
|
+
...(m.requirements ?? [])
|
|
318
|
+
.filter((id) => !(r.requirements ?? []).some((q) => q.id === id))
|
|
319
|
+
.map((requirement) => ({
|
|
320
|
+
problem: "unknown-requirement",
|
|
321
|
+
measurement: m.id,
|
|
322
|
+
requirement,
|
|
323
|
+
})),
|
|
324
|
+
...(approval === null ? [] : [approval]),
|
|
325
|
+
];
|
|
326
|
+
};
|
|
327
|
+
/** What is wrong with a row, in a fixed order. */
|
|
328
|
+
const judgeRow = (row) => ROW_CHECKS.map((check) => check(row)).filter((f) => f !== null);
|
|
329
|
+
/** Whether the README's index is the one `r` generates; the finding when not. */
|
|
330
|
+
function judgeIndex(r, readme) {
|
|
331
|
+
if (readme === null)
|
|
332
|
+
return { problem: "stale-index", why: "no-readme" };
|
|
333
|
+
const block = embeddedIndex(readme);
|
|
334
|
+
if (block === null)
|
|
335
|
+
return { problem: "stale-index", why: "no-markers" };
|
|
336
|
+
return indexInSync(readme, r)
|
|
337
|
+
? null
|
|
338
|
+
: { problem: "stale-index", why: "differs" };
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Every defect of a paper's study registry, in a fixed order: the registry itself; the unregistered
|
|
342
|
+
* folders; each row's; the index. Pure.
|
|
343
|
+
*/
|
|
344
|
+
export function judgeStudies(input) {
|
|
345
|
+
const state = input.registry;
|
|
346
|
+
if (state.kind === "absent")
|
|
347
|
+
return input.folders.length === 0
|
|
348
|
+
? []
|
|
349
|
+
: [{ problem: "no-registry", folders: input.folders }];
|
|
350
|
+
if (state.kind === "unreadable")
|
|
351
|
+
return [{ problem: "unreadable", why: state.why }];
|
|
352
|
+
const r = state.registry;
|
|
353
|
+
const next = nextStudyId(r);
|
|
354
|
+
const index = judgeIndex(r, input.readme);
|
|
355
|
+
return [
|
|
356
|
+
...input.folders
|
|
357
|
+
.filter((f) => !r.studies.some((s) => s.folder === f))
|
|
358
|
+
.map((folder) => ({
|
|
359
|
+
problem: "unregistered",
|
|
360
|
+
folder,
|
|
361
|
+
next,
|
|
362
|
+
})),
|
|
363
|
+
...r.studies.flatMap((s, i) => judgeRow({ r, s, i, input })),
|
|
364
|
+
...(r.measurements ?? []).flatMap((m) => judgeMeasurement(r, m)),
|
|
365
|
+
...(index === null ? [] : [index]),
|
|
366
|
+
];
|
|
367
|
+
}
|
|
368
|
+
// ── the index ─────────────────────────────────────────────────────────────────────
|
|
369
|
+
/** A cell's text: one line, a backslash and then a pipe escaped, so `a\\|b` stays one cell. */
|
|
370
|
+
const cell = (s) => s.replace(/\r?\n/gu, " ").replace(/\\/gu, "\\\\").replace(/\|/gu, "\\|");
|
|
371
|
+
/** The columns of the index: each one's header, and its cell for a study. */
|
|
372
|
+
const COLUMNS = [
|
|
373
|
+
{ head: "id", of: (s) => s.id },
|
|
374
|
+
{ head: "title", of: (s) => cell(s.title) },
|
|
375
|
+
{ head: "status", of: (s) => s.status },
|
|
376
|
+
{ head: "result", of: (s) => cell(s.result ?? "—") },
|
|
377
|
+
{ head: "in paper", of: (s) => s.in_paper },
|
|
378
|
+
{ head: "folder", of: (s) => `[${s.folder}/](${s.folder}/)` },
|
|
379
|
+
];
|
|
380
|
+
/** The width a cell takes: its code points. */
|
|
381
|
+
const widthOf = (s) => Array.from(s).length;
|
|
382
|
+
/** `t` padded to `width`. */
|
|
383
|
+
const padded = (t, width) => t + " ".repeat(width - widthOf(t));
|
|
384
|
+
/**
|
|
385
|
+
* The index of `r`: a markdown table, a row per study in registry order, each column padded to its
|
|
386
|
+
* widest cell (at least 3), the way prettier writes a table — so formatting the README leaves it as
|
|
387
|
+
* it is.
|
|
388
|
+
*/
|
|
389
|
+
export function studyIndex(r) {
|
|
390
|
+
const sized = COLUMNS.map((c) => ({
|
|
391
|
+
...c,
|
|
392
|
+
width: Math.max(3, widthOf(c.head), ...r.studies.map((s) => widthOf(c.of(s)))),
|
|
393
|
+
}));
|
|
394
|
+
const line = (cells) => `| ${cells.join(" | ")} |`;
|
|
395
|
+
return [
|
|
396
|
+
line(sized.map((c) => padded(c.head, c.width))),
|
|
397
|
+
line(sized.map((c) => "-".repeat(c.width))),
|
|
398
|
+
...r.studies.map((s) => line(sized.map((c) => padded(c.of(s), c.width)))),
|
|
399
|
+
].join("\n");
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* What a markdown table says, whatever its padding: its rows, each cell trimmed, a separator cell as
|
|
403
|
+
* `---`. The index is judged on this, because the padding belongs to the formatter: prettier sizes a
|
|
404
|
+
* column by display width, so a wide character pads differently from a code-point count.
|
|
405
|
+
*/
|
|
406
|
+
const cellsOf = (table) => table
|
|
407
|
+
.trim()
|
|
408
|
+
.split("\n")
|
|
409
|
+
.map((line) => line
|
|
410
|
+
.trim()
|
|
411
|
+
.replace(/^\||\|$/gu, "")
|
|
412
|
+
.split(/(?<!\\)\|/u)
|
|
413
|
+
.map((c) => c.trim().replace(/^:?-{3,}:?$/u, "---"))
|
|
414
|
+
.join("|"))
|
|
415
|
+
.join("\n");
|
|
416
|
+
/** Whether `readme` holds the index of `r`, whatever padding a formatter gave its table. */
|
|
417
|
+
export function indexInSync(readme, r) {
|
|
418
|
+
const block = readme === null ? null : embeddedIndex(readme);
|
|
419
|
+
return block !== null && cellsOf(block) === cellsOf(studyIndex(r));
|
|
420
|
+
}
|
|
421
|
+
/** The index between its markers, a blank line on each side. */
|
|
422
|
+
export const indexBlock = (r) => `${INDEX_BEGIN}\n\n${studyIndex(r)}\n\n${INDEX_END}`;
|
|
423
|
+
/**
|
|
424
|
+
* Where `marker` stands alone on a line of `text`, at or after `from`; -1 when it does not. A marker
|
|
425
|
+
* counts only there, where the generator writes it: prose can mention it and a cell can carry it, but
|
|
426
|
+
* neither puts it alone on a line.
|
|
427
|
+
*/
|
|
428
|
+
const markerAt = (text, marker, from = 0) => {
|
|
429
|
+
const literal = marker.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
430
|
+
const m = new RegExp(`^${literal}$`, "mu").exec(text.slice(from));
|
|
431
|
+
return m === null ? -1 : from + m.index;
|
|
432
|
+
};
|
|
433
|
+
/** The text between the markers of `readme`; null when it has no begin marker followed by an end one. */
|
|
434
|
+
export function embeddedIndex(readme) {
|
|
435
|
+
const begin = markerAt(readme, INDEX_BEGIN);
|
|
436
|
+
const end = begin === -1 ? -1 : markerAt(readme, INDEX_END, begin);
|
|
437
|
+
return end === -1 ? null : readme.slice(begin + INDEX_BEGIN.length, end);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* `readme` with its index regenerated from `r`: the block replaced in place, appended when the README
|
|
441
|
+
* has none, a README of its own when there is none.
|
|
442
|
+
*/
|
|
443
|
+
export function withIndex(readme, r) {
|
|
444
|
+
if (readme === null)
|
|
445
|
+
return `${INDEX_HEADING}\n\n${indexBlock(r)}\n`;
|
|
446
|
+
const block = embeddedIndex(readme);
|
|
447
|
+
if (block === null)
|
|
448
|
+
return `${readme.trimEnd()}\n\n${indexBlock(r)}\n`;
|
|
449
|
+
const begin = markerAt(readme, INDEX_BEGIN);
|
|
450
|
+
const after = begin + INDEX_BEGIN.length + block.length + INDEX_END.length;
|
|
451
|
+
return `${readme.slice(0, begin)}${indexBlock(r)}${readme.slice(after)}`;
|
|
452
|
+
}
|
|
453
|
+
/** The registry's text as `paperlint studies new` writes it: JSON, two-space indented, a final newline. */
|
|
454
|
+
export const registryText = (r) => `${JSON.stringify(r, null, 2)}\n`;
|
|
455
|
+
// ── the messages ──────────────────────────────────────────────────────────────────
|
|
456
|
+
const REGISTRY = "`repro/studies.json`";
|
|
457
|
+
const NEW_STUDY = '`npx paperlint studies new <paper-dir> "<title>"`';
|
|
458
|
+
const RUN_INDEX = "What to do: run `npx paperlint studies index <paper-dir>`; the block is generated, never edited by hand.";
|
|
459
|
+
const RENAME = "give each other row the next free id and rename its folder to match";
|
|
460
|
+
const tick = (s) => `\`${s}\``;
|
|
461
|
+
/** `a`, `b` and `c`: names in backticks, the last joined by "and". */
|
|
462
|
+
const listed = (names) => {
|
|
463
|
+
const t = names.map(tick);
|
|
464
|
+
return [t.slice(0, -1).join(", "), ...t.slice(-1)]
|
|
465
|
+
.filter((part) => part !== "")
|
|
466
|
+
.join(" and ");
|
|
467
|
+
};
|
|
468
|
+
const STALE_HEAD = {
|
|
469
|
+
differs: `The index in \`repro/README.md\` (between the \`studies:begin\` and \`studies:end\` markers) is not the one ${REGISTRY} generates.`,
|
|
470
|
+
"no-markers": "`repro/README.md` has no index of the studies (the `studies:begin` and `studies:end` markers).",
|
|
471
|
+
"no-readme": "`repro/README.md`, the index of the studies, does not exist.",
|
|
472
|
+
};
|
|
473
|
+
/** The first part of each finding's text: what is wrong, and what to do. */
|
|
474
|
+
const HEADS = {
|
|
475
|
+
"no-registry": (f) => `\`repro/\` holds study folders (${f.folders.map((d) => tick(`${d}/`)).join(", ")}) but no ${REGISTRY}, the registry that gives every study an id, a plain name and a status. What to do: write ${REGISTRY} with the paper's prefix — \`{ "prefix": "P1", "studies": [] }\` — then give each folder its row and rename it to \`<id>-<slug>\`; a new study is created with ${NEW_STUDY}.`,
|
|
476
|
+
unreadable: (f) => `${REGISTRY} is not a study registry: ${f.why}. Its shape is on the rule's page.`,
|
|
477
|
+
unregistered: (f) => `\`repro/${f.folder}/\` has no row in ${REGISTRY}, and every study folder has exactly one. What to do: add its row with the next free id, ${tick(f.next)}, and rename the folder to \`${f.next}-<slug>\`; a new study is created with ${NEW_STUDY}, which does both.`,
|
|
478
|
+
"no-folder": (f) => `${REGISTRY}: the row ${tick(f.id)} names the folder \`repro/${f.folder}/\`, which does not exist. What to do: rename the study's folder to it, or correct the row's \`folder\`.`,
|
|
479
|
+
"two-rows": (f) => `${REGISTRY}: the rows ${f.ids.map(tick).join(", ")} all name the folder \`repro/${f.folder}/\`, and a study folder has exactly one row. What to do: keep one row for it.`,
|
|
480
|
+
"bad-id": (f) => `${REGISTRY}: the id ${tick(f.id)} is not \`${f.prefix}-S\` followed by two or more digits (\`${f.prefix}-S01\`). What to do: give the row the next free id and rename its folder to match.`,
|
|
481
|
+
"duplicate-id": (f) => `${REGISTRY}: the id ${tick(f.id)} is on more than one row, and an id names one study. What to do: ${RENAME}.`,
|
|
482
|
+
"folder-name": (f) => `${REGISTRY}: the row ${tick(f.id)} names the folder ${tick(f.folder)}, which is not \`${f.id}-<slug>\` — the id, then lowercase letters and digits in words joined by hyphens. What to do: rename the folder and the row's \`folder\` together.`,
|
|
483
|
+
"long-title": (f) => `${REGISTRY}: the title of ${tick(f.id)} has ${String(f.words)} words; a title is a plain name of at most ${String(MAX_TITLE_WORDS)}. What to do: shorten it, and put the detail in \`question\`.`,
|
|
484
|
+
"no-result": (f) => `${REGISTRY}: ${tick(f.id)} is \`done\` without ${f.missing.map(tick).join(" and ")}. What to do: write the one-line result and the file it is read from (\`result\`, \`result_file\`), or set the status it really has.`,
|
|
485
|
+
"result-file": (f) => `${REGISTRY}: the \`result_file\` of ${tick(f.id)}, ${tick(f.path)}, ${f.why === "missing" ? "is not a file in its folder" : "is outside its folder"}. What to do: name a file that exists, relative to the study's folder.`,
|
|
486
|
+
"no-successor": (f) => `${REGISTRY}: ${tick(f.id)} is \`superseded\` ${f.superseded_by === null ? "without `superseded_by`" : `by ${tick(f.superseded_by)}, which is no study in the registry`}. What to do: name the id of the study that replaced it.`,
|
|
487
|
+
"stale-index": (f) => `${STALE_HEAD[f.why]} ${RUN_INDEX}`,
|
|
488
|
+
"unknown-measurement": (f) => `${REGISTRY}: the row ${tick(f.id)} names the measurement ${tick(f.measurement)}, which is not in \`measurements\`. What to do: add the measurement to \`measurements\`, or correct the row's \`measurement\`.`,
|
|
489
|
+
"empty-measurement": (f) => `${REGISTRY}: no row names the measurement ${tick(f.measurement)}, and a measurement is made of studies. What to do: set \`"measurement": "${f.measurement}"\` on the rows of its studies, or remove the measurement.`,
|
|
490
|
+
"unknown-requirement": (f) => `${REGISTRY}: the measurement ${tick(f.measurement)} must meet the requirement ${tick(f.requirement)}, which is not in \`requirements\`. What to do: add the requirement — the author's words verbatim in \`text\`, with its \`date\` and \`source\` — or correct the measurement's \`requirements\`.`,
|
|
491
|
+
"headline-approval": (f) => f.why === "missing"
|
|
492
|
+
? `${REGISTRY}: the measurement ${tick(f.measurement)} is a \`headline\` one and has no \`approval\`. What to do: record ${f.author === null ? "the author's approval" : `the approval of ${f.author}, the registry's \`author\``} — \`by\`, \`date\`, and their words in \`quote\` — or make it a \`baseline\`.`
|
|
493
|
+
: `${REGISTRY}: the measurement ${tick(f.measurement)} is a \`headline\` one, and its \`approval\` is by ${f.by}, not by the registry's \`author\`, ${f.author}. What to do: only the author approves a headline measurement; record their own approval.`,
|
|
494
|
+
"bad-plan": (f) => {
|
|
495
|
+
const of = `the \`plan\` of ${tick(f.id)}, ${tick(f.path)},`;
|
|
496
|
+
const plan = `The plan of ${tick(f.id)}, ${tick(f.path)} in its folder,`;
|
|
497
|
+
switch (f.why) {
|
|
498
|
+
case "missing":
|
|
499
|
+
return `${REGISTRY}: ${of} is not a file in its folder. What to do: write the plan there (its fields are on the rule's page), or correct the row's \`plan\`.`;
|
|
500
|
+
case "outside":
|
|
501
|
+
return `${REGISTRY}: ${of} is outside its folder. What to do: keep the plan in the study's folder, as \`${PLAN_FILE}\`, and name it relative to the folder.`;
|
|
502
|
+
case "unreadable":
|
|
503
|
+
return `${plan} is not a study plan: ${f.reasons}. What to do: give it the fields on the rule's page — \`question\`, \`population\`, \`arms\`, \`primary_outcome\`.`;
|
|
504
|
+
case "unfilled":
|
|
505
|
+
return `${plan} leaves ${listed(f.fields)} empty, and the study is ${tick(f.status)}: a plan is written before the runs. What to do: fill them in, or set the study back to \`designing\`.`;
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
"author-check": (f) => {
|
|
509
|
+
const head = `${tick(f.id)} is ${tick(f.status)} in the headline measurement ${tick(f.measurement)}, and`;
|
|
510
|
+
switch (f.why) {
|
|
511
|
+
case "no-plan":
|
|
512
|
+
return `${head} its row names no plan to hold the author's check of the drawn units. What to do: write its plan (\`${PLAN_FILE}\` in its folder, named in the row's \`plan\`) with \`author_check\` — \`by\`, \`date\`, and the author's words in \`quote\`.`;
|
|
513
|
+
case "missing":
|
|
514
|
+
return `${head} its plan has no \`author_check\`. What to do: show the author the drawn units, then record their answer in the plan's \`author_check\` — \`by\`, \`date\`, and their words in \`quote\`.`;
|
|
515
|
+
case "not-author":
|
|
516
|
+
return `${head} the \`author_check\` in its plan is by ${f.by}, not by the registry's \`author\`, ${f.author}. What to do: only the author approves the drawn units of a headline measurement; record their own answer.`;
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
"legacy-plan": (f) => `The plan of ${tick(f.id)} is ${tick(f.path)}, its old name; it is read as the plan. What to do: rename it to \`${PLAN_FILE}\` in the study's folder (\`git mv\`) and set the row's \`plan\` to \`${PLAN_FILE}\`.`,
|
|
520
|
+
};
|
|
521
|
+
/** The head of finding `f` of problem `p`: the lookup, typed by the problem. */
|
|
522
|
+
const headOf = (p, f) => HEADS[p](f);
|
|
523
|
+
/** The rule that reports finding `f`. */
|
|
524
|
+
const ruleOf = (f) => PLAN_NAME_PROBLEMS.includes(f.problem)
|
|
525
|
+
? "repro/study-plan-name"
|
|
526
|
+
: "repro/study-registered";
|
|
527
|
+
/** The one text a finding is reported with: what is wrong, what to do, and the rule's page. */
|
|
528
|
+
export const studyMessage = (f) => `${headOf(f.problem, f)}\nRule ${ruleOf(f)}: https://github.com/zernie/paperlint/blob/main/docs/rules/${ruleOf(f)}.md`;
|
|
529
|
+
// ── a new study ───────────────────────────────────────────────────────────────────
|
|
530
|
+
/** Whether `s` names a kind of study. */
|
|
531
|
+
export const isStudyKind = (s) => STUDY_KINDS.some((k) => k === s);
|
|
532
|
+
/** Why `title` cannot name a study; null when it can. */
|
|
533
|
+
function titleProblem(title) {
|
|
534
|
+
const words = titleWords(title);
|
|
535
|
+
if (words === 0)
|
|
536
|
+
return "the title is empty";
|
|
537
|
+
if (words > MAX_TITLE_WORDS)
|
|
538
|
+
return `the title has ${String(words)} words; a title is a plain name of at most ${String(MAX_TITLE_WORDS)} — the detail goes in the row's \`question\``;
|
|
539
|
+
return studySlug(title) === ""
|
|
540
|
+
? "the title has no Latin letter or digit to name the folder by; give it one (an English title, or a word such as the method's name)"
|
|
541
|
+
: null;
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* `r` with a new study appended: the next id, the folder `<id>-<slug>`, `status: designing`,
|
|
545
|
+
* `in_paper: no`, an empty question and its plan, `plan.json`; or why the title cannot make one.
|
|
546
|
+
*/
|
|
547
|
+
export function addStudy(r, n) {
|
|
548
|
+
const title = n.title.trim().replace(/\s+/gu, " ");
|
|
549
|
+
const why = titleProblem(title);
|
|
550
|
+
if (why !== null)
|
|
551
|
+
return { ok: false, why };
|
|
552
|
+
const id = nextStudyId(r);
|
|
553
|
+
const study = {
|
|
554
|
+
id,
|
|
555
|
+
folder: `${id}-${studySlug(title)}`,
|
|
556
|
+
title,
|
|
557
|
+
question: "",
|
|
558
|
+
kind: n.kind,
|
|
559
|
+
status: "designing",
|
|
560
|
+
date: n.date,
|
|
561
|
+
in_paper: "no",
|
|
562
|
+
plan: PLAN_FILE,
|
|
563
|
+
};
|
|
564
|
+
return {
|
|
565
|
+
ok: true,
|
|
566
|
+
registry: { ...r, studies: [...r.studies, study] },
|
|
567
|
+
study,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
/** The `README.md` a new study's folder starts with: its id and title in frontmatter, then the sections. */
|
|
571
|
+
export const studyReadme = (s) => [
|
|
572
|
+
"---",
|
|
573
|
+
`id: ${s.id}`,
|
|
574
|
+
`title: ${JSON.stringify(s.title)}`,
|
|
575
|
+
"---",
|
|
576
|
+
"",
|
|
577
|
+
`# ${s.id} — ${s.title}`,
|
|
578
|
+
"",
|
|
579
|
+
`Its row in \`../${STUDIES_FILE}\` holds its status. When the study ends, set \`status\`, \`result\`,`,
|
|
580
|
+
"`result_file` and `in_paper` there, then run `npx paperlint studies index <paper-dir>`.",
|
|
581
|
+
"",
|
|
582
|
+
`Its plan is \`${PLAN_FILE}\`: what it measures, the population and the draw, the arms and the primary`,
|
|
583
|
+
"outcome, filled in before the first run; the author's check of the drawn units goes in its",
|
|
584
|
+
"`author_check`.",
|
|
585
|
+
"",
|
|
586
|
+
"## Question",
|
|
587
|
+
"",
|
|
588
|
+
"## How to run",
|
|
589
|
+
"",
|
|
590
|
+
"## Result",
|
|
591
|
+
"",
|
|
592
|
+
].join("\n");
|
|
593
|
+
//# sourceMappingURL=study-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"study-registry.js","sourceRoot":"","sources":["../../src/domain/study-registry.ts"],"names":[],"mappings":"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"}
|