@navbook/cli 0.1.2 → 0.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.
Files changed (167) hide show
  1. package/dist/commands/complete.js +124 -0
  2. package/dist/commands/complete.js.map +1 -0
  3. package/dist/{cli/commands → commands}/compose.js +5 -3
  4. package/dist/commands/compose.js.map +1 -0
  5. package/dist/commands/doctor.js +56 -0
  6. package/dist/commands/doctor.js.map +1 -0
  7. package/dist/commands/entity.js +252 -0
  8. package/dist/commands/entity.js.map +1 -0
  9. package/dist/commands/feature.js +202 -0
  10. package/dist/commands/feature.js.map +1 -0
  11. package/dist/commands/init.js +23 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/{cli/commands → commands}/install.js +1 -2
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/issue.js +89 -0
  16. package/dist/commands/issue.js.map +1 -0
  17. package/dist/commands/policy.js +49 -0
  18. package/dist/commands/policy.js.map +1 -0
  19. package/dist/commands/pr.js +311 -0
  20. package/dist/commands/pr.js.map +1 -0
  21. package/dist/context.js +21 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/{cli/editor.js → editor.js} +1 -1
  24. package/dist/editor.js.map +1 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/install/completions.js.map +1 -0
  27. package/dist/{cli/install → install}/hook.js +1 -1
  28. package/dist/install/hook.js.map +1 -0
  29. package/dist/{cli/main.js → main.js} +10 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/{cli/program.js → program.js} +162 -23
  32. package/dist/program.js.map +1 -0
  33. package/dist/{cli/prompt.js → prompt.js} +11 -0
  34. package/dist/prompt.js.map +1 -0
  35. package/dist/render/colors.js.map +1 -0
  36. package/dist/render/detail.js +197 -0
  37. package/dist/render/detail.js.map +1 -0
  38. package/dist/render/table.js.map +1 -0
  39. package/dist/sort.js +77 -0
  40. package/dist/sort.js.map +1 -0
  41. package/package.json +15 -21
  42. package/README.md +0 -165
  43. package/dist/cli/commands/complete.d.ts +0 -9
  44. package/dist/cli/commands/complete.js +0 -72
  45. package/dist/cli/commands/complete.js.map +0 -1
  46. package/dist/cli/commands/compose.d.ts +0 -27
  47. package/dist/cli/commands/compose.js.map +0 -1
  48. package/dist/cli/commands/doctor.d.ts +0 -14
  49. package/dist/cli/commands/doctor.js +0 -127
  50. package/dist/cli/commands/doctor.js.map +0 -1
  51. package/dist/cli/commands/entity.d.ts +0 -55
  52. package/dist/cli/commands/entity.js +0 -209
  53. package/dist/cli/commands/entity.js.map +0 -1
  54. package/dist/cli/commands/init.d.ts +0 -11
  55. package/dist/cli/commands/init.js +0 -39
  56. package/dist/cli/commands/init.js.map +0 -1
  57. package/dist/cli/commands/install.d.ts +0 -17
  58. package/dist/cli/commands/install.js.map +0 -1
  59. package/dist/cli/commands/issue.d.ts +0 -12
  60. package/dist/cli/commands/issue.js +0 -42
  61. package/dist/cli/commands/issue.js.map +0 -1
  62. package/dist/cli/commands/pr.d.ts +0 -64
  63. package/dist/cli/commands/pr.js +0 -466
  64. package/dist/cli/commands/pr.js.map +0 -1
  65. package/dist/cli/commit-flow.d.ts +0 -27
  66. package/dist/cli/commit-flow.js +0 -47
  67. package/dist/cli/commit-flow.js.map +0 -1
  68. package/dist/cli/context.d.ts +0 -39
  69. package/dist/cli/context.js +0 -93
  70. package/dist/cli/context.js.map +0 -1
  71. package/dist/cli/editor.d.ts +0 -23
  72. package/dist/cli/editor.js.map +0 -1
  73. package/dist/cli/errors.d.ts +0 -17
  74. package/dist/cli/errors.js.map +0 -1
  75. package/dist/cli/history-checks.d.ts +0 -21
  76. package/dist/cli/history-checks.js +0 -134
  77. package/dist/cli/history-checks.js.map +0 -1
  78. package/dist/cli/install/completions.d.ts +0 -19
  79. package/dist/cli/install/completions.js.map +0 -1
  80. package/dist/cli/install/hook.d.ts +0 -20
  81. package/dist/cli/install/hook.js.map +0 -1
  82. package/dist/cli/main.d.ts +0 -14
  83. package/dist/cli/main.js.map +0 -1
  84. package/dist/cli/program.d.ts +0 -23
  85. package/dist/cli/program.js.map +0 -1
  86. package/dist/cli/prompt.d.ts +0 -22
  87. package/dist/cli/prompt.js.map +0 -1
  88. package/dist/cli/render/colors.d.ts +0 -13
  89. package/dist/cli/render/colors.js.map +0 -1
  90. package/dist/cli/render/detail.d.ts +0 -10
  91. package/dist/cli/render/detail.js +0 -105
  92. package/dist/cli/render/detail.js.map +0 -1
  93. package/dist/cli/render/table.d.ts +0 -19
  94. package/dist/cli/render/table.js.map +0 -1
  95. package/dist/cli/resolve.d.ts +0 -17
  96. package/dist/cli/resolve.js +0 -68
  97. package/dist/cli/resolve.js.map +0 -1
  98. package/dist/cli/workspace.d.ts +0 -52
  99. package/dist/cli/workspace.js +0 -178
  100. package/dist/cli/workspace.js.map +0 -1
  101. package/dist/core/comments.d.ts +0 -31
  102. package/dist/core/comments.js +0 -80
  103. package/dist/core/comments.js.map +0 -1
  104. package/dist/core/files.d.ts +0 -88
  105. package/dist/core/files.js +0 -441
  106. package/dist/core/files.js.map +0 -1
  107. package/dist/core/frontmatter.d.ts +0 -63
  108. package/dist/core/frontmatter.js +0 -149
  109. package/dist/core/frontmatter.js.map +0 -1
  110. package/dist/core/id.d.ts +0 -46
  111. package/dist/core/id.js +0 -66
  112. package/dist/core/id.js.map +0 -1
  113. package/dist/core/index.d.ts +0 -19
  114. package/dist/core/index.js +0 -20
  115. package/dist/core/index.js.map +0 -1
  116. package/dist/core/json.d.ts +0 -18
  117. package/dist/core/json.js +0 -51
  118. package/dist/core/json.js.map +0 -1
  119. package/dist/core/ops.d.ts +0 -92
  120. package/dist/core/ops.js +0 -173
  121. package/dist/core/ops.js.map +0 -1
  122. package/dist/core/person.d.ts +0 -20
  123. package/dist/core/person.js +0 -50
  124. package/dist/core/person.js.map +0 -1
  125. package/dist/core/query.d.ts +0 -30
  126. package/dist/core/query.js +0 -106
  127. package/dist/core/query.js.map +0 -1
  128. package/dist/core/refs.d.ts +0 -12
  129. package/dist/core/refs.js +0 -36
  130. package/dist/core/refs.js.map +0 -1
  131. package/dist/core/slug.d.ts +0 -22
  132. package/dist/core/slug.js +0 -40
  133. package/dist/core/slug.js.map +0 -1
  134. package/dist/core/time.d.ts +0 -14
  135. package/dist/core/time.js +0 -37
  136. package/dist/core/time.js.map +0 -1
  137. package/dist/core/tree.d.ts +0 -94
  138. package/dist/core/tree.js +0 -237
  139. package/dist/core/tree.js.map +0 -1
  140. package/dist/core/validate.d.ts +0 -55
  141. package/dist/core/validate.js +0 -312
  142. package/dist/core/validate.js.map +0 -1
  143. package/dist/git/config.d.ts +0 -12
  144. package/dist/git/config.js +0 -27
  145. package/dist/git/config.js.map +0 -1
  146. package/dist/git/exec.d.ts +0 -35
  147. package/dist/git/exec.js +0 -58
  148. package/dist/git/exec.js.map +0 -1
  149. package/dist/git/history.d.ts +0 -35
  150. package/dist/git/history.js +0 -82
  151. package/dist/git/history.js.map +0 -1
  152. package/dist/git/index-ops.d.ts +0 -20
  153. package/dist/git/index-ops.js +0 -45
  154. package/dist/git/index-ops.js.map +0 -1
  155. package/dist/git/merge.d.ts +0 -27
  156. package/dist/git/merge.js +0 -57
  157. package/dist/git/merge.js.map +0 -1
  158. package/dist/git/refscan.d.ts +0 -32
  159. package/dist/git/refscan.js +0 -82
  160. package/dist/git/refscan.js.map +0 -1
  161. package/dist/git/repo.d.ts +0 -45
  162. package/dist/git/repo.js +0 -95
  163. package/dist/git/repo.js.map +0 -1
  164. /package/dist/{cli/errors.js → errors.js} +0 -0
  165. /package/dist/{cli/install → install}/completions.js +0 -0
  166. /package/dist/{cli/render → render}/colors.js +0 -0
  167. /package/dist/{cli/render → render}/table.js +0 -0
package/dist/core/tree.js DELETED
@@ -1,237 +0,0 @@
1
- /**
2
- * The in-memory model of a `.navbook/` tree — spec 02 §2.1.
3
- *
4
- * Input is a flat map of paths (relative to `.navbook/`) to file contents, so
5
- * the model works equally well over a working tree, a git index, or the blobs
6
- * of a branch that is not checked out.
7
- */
8
- import { parseCommentFileName } from "./comments.js";
9
- import { parseFile } from "./files.js";
10
- import { parseDirName } from "./slug.js";
11
- export const ISSUE_STATUSES = ["open", "closed"];
12
- export const PR_STATUSES = ["open", "merged", "closed"];
13
- /** Build a {@link Repo} from a flat path→content map. */
14
- export function parseTree(files, opts = {}) {
15
- const problems = [];
16
- const reserved = [];
17
- const drafts = new Map();
18
- for (const path of [...files.keys()].sort()) {
19
- classify(path, drafts, problems, reserved);
20
- }
21
- const issues = [];
22
- const prs = [];
23
- const byId = new Map();
24
- const orphans = [];
25
- for (const draft of [...drafts.values()].sort((a, b) => (a.dirPath < b.dirPath ? -1 : 1))) {
26
- const record = materialize(draft, files, problems, orphans);
27
- if (!record)
28
- continue;
29
- (record.kind === "issue" ? issues : prs).push(record);
30
- if (!byId.has(record.id))
31
- byId.set(record.id, record);
32
- }
33
- return {
34
- issues,
35
- prs,
36
- byId,
37
- problems,
38
- orphans,
39
- commentsLoaded: opts.commentsLoaded !== false,
40
- reserved,
41
- };
42
- }
43
- function classify(path, drafts, problems, reserved) {
44
- const segments = path.split("/");
45
- const base = segments[segments.length - 1];
46
- if (base === ".gitkeep")
47
- return;
48
- let rest = segments;
49
- let archived = false;
50
- let archiveYear;
51
- if (segments[0] === "archive") {
52
- if (segments.length < 2)
53
- return;
54
- archived = true;
55
- archiveYear = segments[1];
56
- rest = segments.slice(2);
57
- if (rest.length === 0)
58
- return;
59
- }
60
- const root = rest[0];
61
- if (root === undefined)
62
- return;
63
- if (root !== "issues" && root !== "prs") {
64
- // Reserved and unknown names are tolerated and preserved untouched (§2.10).
65
- reserved.push(path);
66
- return;
67
- }
68
- const kind = root === "issues" ? "issue" : "pr";
69
- const allowed = kind === "issue" ? ISSUE_STATUSES : PR_STATUSES;
70
- const status = rest[1];
71
- if (status === undefined)
72
- return;
73
- if (!allowed.includes(status)) {
74
- problems.push({
75
- path,
76
- message: `'${root}/' must contain only ${allowed.map((s) => `${s}/`).join(", ")} (§2.1)`,
77
- });
78
- return;
79
- }
80
- const dirName = rest[2];
81
- if (dirName === undefined)
82
- return;
83
- if (rest.length === 3) {
84
- problems.push({
85
- path,
86
- message: `'${root}/${status}/' must contain entity directories, not files (§2.1)`,
87
- });
88
- return;
89
- }
90
- if (!parseDirName(dirName)) {
91
- problems.push({
92
- path,
93
- message: `entity directory name '${dirName}' does not match <id>-<slug> (§2.3)`,
94
- });
95
- return;
96
- }
97
- const dirPath = segments.slice(0, segments.length - (rest.length - 3)).join("/");
98
- const key = dirPath;
99
- let draft = drafts.get(key);
100
- if (!draft) {
101
- draft = {
102
- kind,
103
- status: status,
104
- archived,
105
- archiveYear,
106
- dirPath,
107
- dirName,
108
- comments: new Map(),
109
- extraFiles: [],
110
- };
111
- drafts.set(key, draft);
112
- }
113
- const inner = rest.slice(3);
114
- const expectedFile = kind === "issue" ? "issue.md" : "pr.md";
115
- if (inner.length === 1 && inner[0] === expectedFile) {
116
- draft.entityFile = path;
117
- return;
118
- }
119
- if (inner.length === 2 && inner[0] === "comments") {
120
- const name = inner[1];
121
- if (!parseCommentFileName(name)) {
122
- problems.push({
123
- path,
124
- message: `comment filename '${name}' does not match <timestamp>-<id>.md (§2.6)`,
125
- });
126
- return;
127
- }
128
- draft.comments.set(name, path);
129
- return;
130
- }
131
- draft.extraFiles.push(path);
132
- }
133
- function materialize(draft, files, problems, orphans) {
134
- const parsedName = parseDirName(draft.dirName);
135
- if (!parsedName)
136
- return null;
137
- const expectedFile = draft.kind === "issue" ? "issue.md" : "pr.md";
138
- if (!draft.entityFile) {
139
- problems.push({
140
- path: draft.dirPath,
141
- message: `entity directory is missing its ${expectedFile} (§2.1)`,
142
- });
143
- orphans.push({
144
- kind: draft.kind,
145
- id: parsedName.id,
146
- dirName: draft.dirName,
147
- dirPath: draft.dirPath,
148
- status: draft.status,
149
- archived: draft.archived,
150
- commentPaths: [...draft.comments.values()].sort(),
151
- });
152
- return null;
153
- }
154
- const text = files.get(draft.entityFile) ?? "";
155
- let parsed;
156
- try {
157
- parsed = parseFile(text);
158
- }
159
- catch (error) {
160
- problems.push({
161
- path: draft.entityFile,
162
- message: error instanceof Error ? error.message : String(error),
163
- });
164
- return null;
165
- }
166
- const comments = [];
167
- for (const name of [...draft.comments.keys()].sort()) {
168
- const path = draft.comments.get(name);
169
- const meta = parseCommentFileName(name);
170
- if (!meta)
171
- continue;
172
- let commentParsed;
173
- try {
174
- commentParsed = parseFile(files.get(path) ?? "");
175
- }
176
- catch (error) {
177
- problems.push({
178
- path,
179
- message: error instanceof Error ? error.message : String(error),
180
- });
181
- continue;
182
- }
183
- const replyTo = commentParsed.fm["reply-to"];
184
- const commentAuthor = commentParsed.fm.author;
185
- comments.push({
186
- id: meta.id,
187
- fileName: name,
188
- path,
189
- stamp: meta.stamp,
190
- date: meta.date,
191
- author: typeof commentAuthor === "string" ? commentAuthor : "",
192
- replyTo: typeof replyTo === "string" ? replyTo : undefined,
193
- body: commentParsed.body,
194
- parsed: commentParsed,
195
- });
196
- }
197
- return {
198
- kind: draft.kind,
199
- id: parsedName.id,
200
- slug: parsedName.slug,
201
- dirName: draft.dirName,
202
- status: draft.status,
203
- archived: draft.archived,
204
- archiveYear: draft.archiveYear,
205
- dirPath: draft.dirPath,
206
- filePath: draft.entityFile,
207
- parsed,
208
- fm: parsed.fm,
209
- body: parsed.body,
210
- title: typeof parsed.fm.title === "string" ? parsed.fm.title : "",
211
- comments,
212
- extraFiles: draft.extraFiles.sort(),
213
- };
214
- }
215
- /** Every entity in the repository, issues first. */
216
- export function allEntities(repo) {
217
- return [...repo.issues, ...repo.prs];
218
- }
219
- /** Every ID in the repository: entities and comments alike (doctor check D3). */
220
- export function allIds(repo) {
221
- const out = [];
222
- for (const entity of allEntities(repo)) {
223
- out.push({ id: entity.id, path: entity.dirPath });
224
- for (const comment of entity.comments)
225
- out.push({ id: comment.id, path: comment.path });
226
- }
227
- return out;
228
- }
229
- /** Directory path for an entity of the given kind, status and directory name. */
230
- export function statusDir(kind, status) {
231
- return `${kind === "issue" ? "issues" : "prs"}/${status}`;
232
- }
233
- /** Locate an entity by exact ID across both kinds. */
234
- export function findById(repo, id) {
235
- return repo.byId.get(id);
236
- }
237
- //# sourceMappingURL=tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/core/tree.ts"],"names":[],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- /**
2
- * Format validation — the `nav doctor` checks of spec 04 §4.3.
3
- *
4
- * Checks D1–D6 and D8 are decidable from the tree alone and live here. D7, D9
5
- * and D10 need git archaeology; their tree-side halves live here and the
6
- * history queries are supplied by the CLI.
7
- */
8
- import { type Revision } from "./files.ts";
9
- import type { FileOp } from "./ops.ts";
10
- import { type EntityRecord, type NavTree, type Repo } from "./tree.ts";
11
- export declare const CHECKS: readonly ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10"];
12
- export type Check = (typeof CHECKS)[number];
13
- export type Level = "error" | "warning";
14
- export interface Diagnostic {
15
- check: Check;
16
- level: Level;
17
- /** Path relative to `.navbook/`, or "" for repository-wide findings. */
18
- path: string;
19
- message: string;
20
- /** Mechanical repair offered by `doctor --fix`. */
21
- fix?: FileOp[];
22
- }
23
- export declare const CHECK_LEVEL: Record<Check, Level>;
24
- export interface ValidateOptions {
25
- /** Commit messages to scan for `Refs:`/`Closes:` trailers (check D8). */
26
- commitMessages?: readonly string[];
27
- }
28
- /** Run every tree-decidable check. */
29
- export declare function validateTree(files: NavTree, opts?: ValidateOptions): Diagnostic[];
30
- /** Run every tree-decidable check against an already-parsed repository. */
31
- export declare function validateRepo(repo: Repo, opts?: ValidateOptions): Diagnostic[];
32
- /** Stable ordering: by check, then path, then message. */
33
- export declare function sortDiagnostics(diagnostics: Diagnostic[]): Diagnostic[];
34
- /** True when any diagnostic is an error (drives exit code 2). */
35
- export declare function hasErrors(diagnostics: readonly Diagnostic[]): boolean;
36
- /**
37
- * D7: each historical `revisions` list must be a prefix of the next one.
38
- * `versionsOldestFirst` holds the list as it stood in each commit that touched
39
- * the file, oldest first.
40
- */
41
- export declare function checkRevisionsAppendOnly(versionsOldestFirst: readonly Revision[][]): {
42
- ok: true;
43
- } | {
44
- ok: false;
45
- index: number;
46
- message: string;
47
- };
48
- /** D10: is a frontmatter timestamp implausible next to the commit that added it? */
49
- export declare function checkTimestampSkew(frontmatterIso: Date, gitAuthoredIso: Date, thresholdHours: number): boolean;
50
- /** Where a merged-but-unarchived pull request should be moved (check D9). */
51
- export declare function planD9Fix(entity: EntityRecord): FileOp[];
52
- /** Validate a bare entity directory name, used by `doctor` on hand-made trees. */
53
- export declare function isValidEntityDirName(name: string): boolean;
54
- /** Validate a bare comment filename. */
55
- export declare function isValidCommentFileName(name: string): boolean;
@@ -1,312 +0,0 @@
1
- /**
2
- * Format validation — the `nav doctor` checks of spec 04 §4.3.
3
- *
4
- * Checks D1–D6 and D8 are decidable from the tree alone and live here. D7, D9
5
- * and D10 need git archaeology; their tree-side halves live here and the
6
- * history queries are supplied by the CLI.
7
- */
8
- import { parseCommentFileName } from "./comments.js";
9
- import { readRevisions, validateComment, validateIssue, validatePr, } from "./files.js";
10
- import { isId } from "./id.js";
11
- import { extractProseRefs, extractTrailerRefs } from "./refs.js";
12
- import { parseDirName } from "./slug.js";
13
- import { allEntities, parseTree, statusDir, } from "./tree.js";
14
- export const CHECKS = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10"];
15
- export const CHECK_LEVEL = {
16
- D1: "error",
17
- D2: "error",
18
- D3: "error",
19
- D4: "error",
20
- D5: "error",
21
- D6: "error",
22
- D7: "error",
23
- D8: "warning",
24
- D9: "warning",
25
- D10: "warning",
26
- };
27
- /** Run every tree-decidable check. */
28
- export function validateTree(files, opts = {}) {
29
- return validateRepo(parseTree(files), opts);
30
- }
31
- /** Run every tree-decidable check against an already-parsed repository. */
32
- export function validateRepo(repo, opts = {}) {
33
- const out = [];
34
- out.push(...checkNames(repo));
35
- out.push(...checkFrontmatter(repo));
36
- const { duplicates, uniqueIds } = collectIds(repo);
37
- out.push(...duplicates);
38
- out.push(...checkStatusUniqueness(repo));
39
- out.push(...checkReplyTargets(repo));
40
- out.push(...checkReviewRevisions(repo));
41
- out.push(...checkDanglingRefs(repo, uniqueIds, opts.commitMessages ?? []));
42
- return sortDiagnostics(out);
43
- }
44
- /** Stable ordering: by check, then path, then message. */
45
- export function sortDiagnostics(diagnostics) {
46
- return [...diagnostics].sort((a, b) => {
47
- if (a.check !== b.check)
48
- return CHECKS.indexOf(a.check) - CHECKS.indexOf(b.check);
49
- if (a.path !== b.path)
50
- return a.path < b.path ? -1 : 1;
51
- return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;
52
- });
53
- }
54
- /** True when any diagnostic is an error (drives exit code 2). */
55
- export function hasErrors(diagnostics) {
56
- return diagnostics.some((d) => d.level === "error");
57
- }
58
- /* --------------------------------------------------------------- D1 : names */
59
- function checkNames(repo) {
60
- const fixes = new Map();
61
- for (const orphan of repo.orphans) {
62
- const entity = repo.byId.get(orphan.id);
63
- if (!entity || entity.kind !== orphan.kind || orphan.commentPaths.length === 0)
64
- continue;
65
- // The entity lives elsewhere: the stray comments belong with it (03 §3.3.1).
66
- fixes.set(orphan.dirPath, orphan.commentPaths.map((path) => ({
67
- op: "move",
68
- from: path,
69
- to: `${entity.dirPath}/comments/${path.slice(path.lastIndexOf("/") + 1)}`,
70
- })));
71
- }
72
- return repo.problems.map((problem) => {
73
- const fix = fixes.get(problem.path);
74
- const orphan = repo.orphans.find((o) => o.dirPath === problem.path);
75
- const entity = orphan ? repo.byId.get(orphan.id) : undefined;
76
- return {
77
- check: "D1",
78
- level: "error",
79
- path: problem.path,
80
- message: fix && entity
81
- ? `${problem.message}; #${orphan?.id} lives at ${entity.dirPath}, so its ${fix.length} stray comment file(s) belong there`
82
- : problem.message,
83
- ...(fix ? { fix } : {}),
84
- };
85
- });
86
- }
87
- /* --------------------------------------------------------- D2 : frontmatter */
88
- function checkFrontmatter(repo) {
89
- const out = [];
90
- for (const entity of allEntities(repo)) {
91
- const problems = entity.kind === "issue" ? validateIssue(entity.parsed) : validatePr(entity.parsed);
92
- for (const problem of problems) {
93
- out.push({ check: "D2", level: "error", path: entity.filePath, message: problem.message });
94
- }
95
- for (const comment of entity.comments) {
96
- for (const problem of validateComment(comment.parsed, { onPr: entity.kind === "pr" })) {
97
- out.push({ check: "D2", level: "error", path: comment.path, message: problem.message });
98
- }
99
- }
100
- }
101
- return out;
102
- }
103
- /* -------------------------------------------------- D3 : ID uniqueness */
104
- function collectIds(repo) {
105
- const seen = new Map();
106
- const entityStatuses = new Map();
107
- for (const entity of allEntities(repo)) {
108
- push(seen, entity.id, entity.dirPath);
109
- const key = `${entity.kind}/${entity.status}`;
110
- const bucket = entityStatuses.get(entity.id);
111
- if (bucket)
112
- bucket.add(key);
113
- else
114
- entityStatuses.set(entity.id, new Set([key]));
115
- for (const comment of entity.comments)
116
- push(seen, comment.id, comment.path);
117
- }
118
- const duplicates = [];
119
- for (const [id, paths] of seen) {
120
- if (paths.length < 2)
121
- continue;
122
- // A single entity living in two status directories is reported by D4.
123
- if ((entityStatuses.get(id)?.size ?? 0) > 1 &&
124
- paths.length === (entityStatuses.get(id)?.size ?? 0)) {
125
- continue;
126
- }
127
- duplicates.push({
128
- check: "D3",
129
- level: "error",
130
- path: paths.slice().sort()[0],
131
- message: `id '${id}' is used ${paths.length} times: ${paths.slice().sort().join(", ")}`,
132
- });
133
- }
134
- return { duplicates, uniqueIds: new Set(seen.keys()) };
135
- }
136
- function push(map, key, value) {
137
- const bucket = map.get(key);
138
- if (bucket)
139
- bucket.push(value);
140
- else
141
- map.set(key, [value]);
142
- }
143
- /* ------------------------------------------------ D4 : one status directory */
144
- function checkStatusUniqueness(repo) {
145
- const byId = new Map();
146
- for (const entity of allEntities(repo)) {
147
- const bucket = byId.get(entity.id);
148
- if (bucket)
149
- bucket.push(entity);
150
- else
151
- byId.set(entity.id, [entity]);
152
- }
153
- const out = [];
154
- for (const [id, records] of byId) {
155
- const locations = new Set(records.map((r) => `${r.kind}/${r.status}`));
156
- if (locations.size < 2)
157
- continue;
158
- const paths = records.map((r) => r.dirPath).sort();
159
- out.push({
160
- check: "D4",
161
- level: "error",
162
- path: paths[0],
163
- message: `#${id} exists in more than one status directory: ${paths.join(", ")} (spec 03 §3.4)`,
164
- });
165
- }
166
- return out;
167
- }
168
- /* --------------------------------------------------------- D5 : reply-to */
169
- function checkReplyTargets(repo) {
170
- const out = [];
171
- for (const entity of allEntities(repo)) {
172
- const ids = new Set(entity.comments.map((c) => c.id));
173
- for (const comment of entity.comments) {
174
- if (!comment.replyTo)
175
- continue;
176
- if (comment.replyTo === comment.id) {
177
- out.push({
178
- check: "D5",
179
- level: "error",
180
- path: comment.path,
181
- message: `'reply-to' points at the comment itself (${comment.replyTo})`,
182
- });
183
- continue;
184
- }
185
- if (!ids.has(comment.replyTo)) {
186
- out.push({
187
- check: "D5",
188
- level: "error",
189
- path: comment.path,
190
- message: `'reply-to: ${comment.replyTo}' does not name a comment of #${entity.id}`,
191
- });
192
- }
193
- }
194
- }
195
- return out;
196
- }
197
- /* ------------------------------------------------- D6 : review revisions */
198
- function checkReviewRevisions(repo) {
199
- const out = [];
200
- for (const pr of repo.prs) {
201
- const heads = new Set(readRevisions(pr.fm).map((r) => r.head));
202
- for (const comment of pr.comments) {
203
- const revision = comment.parsed.fm.revision;
204
- if (typeof revision !== "string")
205
- continue;
206
- if (!heads.has(revision)) {
207
- out.push({
208
- check: "D6",
209
- level: "error",
210
- path: comment.path,
211
- message: `revision ${revision.slice(0, 12)} is not a recorded revision head of #${pr.id} (spec 03 §3.5)`,
212
- });
213
- }
214
- }
215
- }
216
- return out;
217
- }
218
- /* ---------------------------------------------------- D8 : dangling refs */
219
- function checkDanglingRefs(repo, knownIds, commitMessages) {
220
- const out = [];
221
- const report = (path, ids, kind) => {
222
- for (const id of ids) {
223
- if (knownIds.has(id))
224
- continue;
225
- out.push({
226
- check: "D8",
227
- level: "warning",
228
- path,
229
- message: `${kind} reference #${id} matches no entity or comment in this tree`,
230
- });
231
- }
232
- };
233
- for (const entity of allEntities(repo)) {
234
- report(entity.filePath, extractProseRefs(entity.body), "prose");
235
- for (const key of ["duplicate-of", "superseded-by"]) {
236
- const value = entity.fm[key];
237
- if (typeof value === "string" && isId(value) && !knownIds.has(value)) {
238
- out.push({
239
- check: "D8",
240
- level: "warning",
241
- path: entity.filePath,
242
- message: `'${key}: ${value}' matches no entity in this tree`,
243
- });
244
- }
245
- }
246
- for (const comment of entity.comments)
247
- report(comment.path, extractProseRefs(comment.body), "prose");
248
- }
249
- const seen = new Set();
250
- for (const message of commitMessages) {
251
- const { refs, closes } = extractTrailerRefs(message);
252
- for (const id of [...refs, ...closes]) {
253
- if (knownIds.has(id) || seen.has(id))
254
- continue;
255
- seen.add(id);
256
- out.push({
257
- check: "D8",
258
- level: "warning",
259
- path: "",
260
- message: `commit trailer references #${id}, which matches no entity in this tree`,
261
- });
262
- }
263
- }
264
- return out;
265
- }
266
- /* ------------------------------------- D7 / D9 helpers (git-fed, pure core) */
267
- /**
268
- * D7: each historical `revisions` list must be a prefix of the next one.
269
- * `versionsOldestFirst` holds the list as it stood in each commit that touched
270
- * the file, oldest first.
271
- */
272
- export function checkRevisionsAppendOnly(versionsOldestFirst) {
273
- for (let i = 1; i < versionsOldestFirst.length; i++) {
274
- const before = versionsOldestFirst[i - 1];
275
- const after = versionsOldestFirst[i];
276
- if (after.length < before.length) {
277
- return {
278
- ok: false,
279
- index: i,
280
- message: `revisions list shrank from ${before.length} to ${after.length} entries`,
281
- };
282
- }
283
- for (let j = 0; j < before.length; j++) {
284
- const a = before[j];
285
- const b = after[j];
286
- if (a.head !== b.head || a.base !== b.base || a.date !== b.date) {
287
- return { ok: false, index: i, message: `revisions[${j}] was edited after being recorded` };
288
- }
289
- }
290
- }
291
- return { ok: true };
292
- }
293
- /** D10: is a frontmatter timestamp implausible next to the commit that added it? */
294
- export function checkTimestampSkew(frontmatterIso, gitAuthoredIso, thresholdHours) {
295
- const deltaHours = Math.abs(frontmatterIso.getTime() - gitAuthoredIso.getTime()) / 3_600_000;
296
- return deltaHours <= thresholdHours;
297
- }
298
- /** Where a merged-but-unarchived pull request should be moved (check D9). */
299
- export function planD9Fix(entity) {
300
- const target = `${statusDir("pr", "merged")}/${entity.dirName}`;
301
- return [{ op: "move", from: entity.dirPath, to: target }];
302
- }
303
- /** Validate a bare entity directory name, used by `doctor` on hand-made trees. */
304
- export function isValidEntityDirName(name) {
305
- const parsed = parseDirName(name);
306
- return parsed !== null && isId(parsed.id);
307
- }
308
- /** Validate a bare comment filename. */
309
- export function isValidCommentFileName(name) {
310
- return parseCommentFileName(name) !== null;
311
- }
312
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * The git configuration Navbook manages on the user's behalf.
3
- */
4
- export declare const ALIAS_DEFAULT = "nav";
5
- export declare const DIRECTORY_RENAMES_KEY = "merge.directoryRenames";
6
- /** The `git nav` style alias: `git config --global alias.<name> '!nav'`. */
7
- export declare function aliasCommand(name: string): string[];
8
- export declare function readGlobal(key: string): string | null;
9
- export declare function unsetGlobal(key: string): void;
10
- export declare function readLocal(cwd: string, key: string): string | null;
11
- export declare function setLocal(cwd: string, key: string, value: string): void;
12
- export declare function unsetLocal(cwd: string, key: string): void;