@navbook/cli 0.1.1 → 0.2.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 (168) 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 +235 -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 +262 -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/program.js +356 -0
  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 +0 -204
  86. package/dist/cli/program.js.map +0 -1
  87. package/dist/cli/prompt.d.ts +0 -22
  88. package/dist/cli/prompt.js.map +0 -1
  89. package/dist/cli/render/colors.d.ts +0 -13
  90. package/dist/cli/render/colors.js.map +0 -1
  91. package/dist/cli/render/detail.d.ts +0 -10
  92. package/dist/cli/render/detail.js +0 -105
  93. package/dist/cli/render/detail.js.map +0 -1
  94. package/dist/cli/render/table.d.ts +0 -19
  95. package/dist/cli/render/table.js.map +0 -1
  96. package/dist/cli/resolve.d.ts +0 -17
  97. package/dist/cli/resolve.js +0 -68
  98. package/dist/cli/resolve.js.map +0 -1
  99. package/dist/cli/workspace.d.ts +0 -52
  100. package/dist/cli/workspace.js +0 -178
  101. package/dist/cli/workspace.js.map +0 -1
  102. package/dist/core/comments.d.ts +0 -31
  103. package/dist/core/comments.js +0 -80
  104. package/dist/core/comments.js.map +0 -1
  105. package/dist/core/files.d.ts +0 -88
  106. package/dist/core/files.js +0 -441
  107. package/dist/core/files.js.map +0 -1
  108. package/dist/core/frontmatter.d.ts +0 -63
  109. package/dist/core/frontmatter.js +0 -149
  110. package/dist/core/frontmatter.js.map +0 -1
  111. package/dist/core/id.d.ts +0 -46
  112. package/dist/core/id.js +0 -66
  113. package/dist/core/id.js.map +0 -1
  114. package/dist/core/index.d.ts +0 -19
  115. package/dist/core/index.js +0 -20
  116. package/dist/core/index.js.map +0 -1
  117. package/dist/core/json.d.ts +0 -18
  118. package/dist/core/json.js +0 -51
  119. package/dist/core/json.js.map +0 -1
  120. package/dist/core/ops.d.ts +0 -92
  121. package/dist/core/ops.js +0 -173
  122. package/dist/core/ops.js.map +0 -1
  123. package/dist/core/person.d.ts +0 -20
  124. package/dist/core/person.js +0 -50
  125. package/dist/core/person.js.map +0 -1
  126. package/dist/core/query.d.ts +0 -30
  127. package/dist/core/query.js +0 -106
  128. package/dist/core/query.js.map +0 -1
  129. package/dist/core/refs.d.ts +0 -12
  130. package/dist/core/refs.js +0 -36
  131. package/dist/core/refs.js.map +0 -1
  132. package/dist/core/slug.d.ts +0 -22
  133. package/dist/core/slug.js +0 -40
  134. package/dist/core/slug.js.map +0 -1
  135. package/dist/core/time.d.ts +0 -14
  136. package/dist/core/time.js +0 -37
  137. package/dist/core/time.js.map +0 -1
  138. package/dist/core/tree.d.ts +0 -94
  139. package/dist/core/tree.js +0 -237
  140. package/dist/core/tree.js.map +0 -1
  141. package/dist/core/validate.d.ts +0 -55
  142. package/dist/core/validate.js +0 -312
  143. package/dist/core/validate.js.map +0 -1
  144. package/dist/git/config.d.ts +0 -12
  145. package/dist/git/config.js +0 -27
  146. package/dist/git/config.js.map +0 -1
  147. package/dist/git/exec.d.ts +0 -35
  148. package/dist/git/exec.js +0 -58
  149. package/dist/git/exec.js.map +0 -1
  150. package/dist/git/history.d.ts +0 -35
  151. package/dist/git/history.js +0 -82
  152. package/dist/git/history.js.map +0 -1
  153. package/dist/git/index-ops.d.ts +0 -20
  154. package/dist/git/index-ops.js +0 -45
  155. package/dist/git/index-ops.js.map +0 -1
  156. package/dist/git/merge.d.ts +0 -27
  157. package/dist/git/merge.js +0 -57
  158. package/dist/git/merge.js.map +0 -1
  159. package/dist/git/refscan.d.ts +0 -32
  160. package/dist/git/refscan.js +0 -82
  161. package/dist/git/refscan.js.map +0 -1
  162. package/dist/git/repo.d.ts +0 -45
  163. package/dist/git/repo.js +0 -95
  164. package/dist/git/repo.js.map +0 -1
  165. /package/dist/{cli/errors.js → errors.js} +0 -0
  166. /package/dist/{cli/install → install}/completions.js +0 -0
  167. /package/dist/{cli/render → render}/colors.js +0 -0
  168. /package/dist/{cli/render → render}/table.js +0 -0
@@ -1,80 +0,0 @@
1
- /**
2
- * Comment files — spec 02 §2.6. One file per comment, named with a colon-free
3
- * UTC timestamp plus the comment's own ID, so listings sort chronologically and
4
- * concurrent comments can never collide.
5
- */
6
- import { isId } from "./id.js";
7
- import { fromCompactStamp, toCompactStamp } from "./time.js";
8
- export const COMMENT_NAME_PATTERN = /^(\d{4}-\d{2}-\d{2}T\d{6}Z)-([a-z][a-z0-9]{7})\.md$/;
9
- /** Build the filename for a comment created at `date` with identifier `id`. */
10
- export function commentFileName(date, id) {
11
- return `${toCompactStamp(date)}-${id}.md`;
12
- }
13
- /** Parse a comment filename, or return null when it violates the grammar. */
14
- export function parseCommentFileName(name) {
15
- const match = COMMENT_NAME_PATTERN.exec(name);
16
- if (!match)
17
- return null;
18
- const stamp = match[1];
19
- const id = match[2];
20
- if (!isId(id))
21
- return null;
22
- const date = fromCompactStamp(stamp);
23
- if (!date)
24
- return null;
25
- return { stamp, date, id };
26
- }
27
- /**
28
- * Order comments for display: chronologically by filename, with replies placed
29
- * directly under the comment they answer and indented by one level.
30
- *
31
- * Replies to unknown comments, and reply cycles, degrade to top level rather
32
- * than disappearing.
33
- */
34
- export function threadOrder(comments) {
35
- const sorted = [...comments].sort((a, b) => a.fileName < b.fileName ? -1 : a.fileName > b.fileName ? 1 : 0);
36
- const byId = new Map(sorted.map((c) => [c.id, c]));
37
- const children = new Map();
38
- const roots = [];
39
- for (const comment of sorted) {
40
- const parent = comment.replyTo ? byId.get(comment.replyTo) : undefined;
41
- if (!parent || parent.id === comment.id || createsCycle(comment, byId)) {
42
- roots.push(comment);
43
- continue;
44
- }
45
- const bucket = children.get(parent.id);
46
- if (bucket)
47
- bucket.push(comment);
48
- else
49
- children.set(parent.id, [comment]);
50
- }
51
- const out = [];
52
- // Guard on identity, not id: duplicate ids are a doctor error (D3), and
53
- // until they are fixed the thread must still show each file exactly once.
54
- const emitted = new Set();
55
- const walk = (comment, depth) => {
56
- if (emitted.has(comment))
57
- return;
58
- emitted.add(comment);
59
- out.push({ comment, depth });
60
- for (const child of children.get(comment.id) ?? [])
61
- walk(child, depth + 1);
62
- };
63
- for (const root of roots)
64
- walk(root, 0);
65
- for (const comment of sorted)
66
- walk(comment, 0);
67
- return out;
68
- }
69
- function createsCycle(start, byId) {
70
- const seen = new Set([start.id]);
71
- let current = start.replyTo ? byId.get(start.replyTo) : undefined;
72
- while (current) {
73
- if (seen.has(current.id))
74
- return true;
75
- seen.add(current.id);
76
- current = current.replyTo ? byId.get(current.replyTo) : undefined;
77
- }
78
- return false;
79
- }
80
- //# sourceMappingURL=comments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/core/comments.ts"],"names":[],"mappings":"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"}
@@ -1,88 +0,0 @@
1
- /**
2
- * The three Navbook file kinds — spec 02 §2.5 (`issue.md`), §2.6 (comments and
3
- * reviews) and §2.7 (`pr.md`): parsing, validation, and construction.
4
- *
5
- * Parsing never throws on schema problems; it collects them so `nav doctor` can
6
- * report every fault in a file at once.
7
- *
8
- * Frontmatter is normalized once, at parse time: keys whose spec type is a
9
- * string (or a list/map of strings) are read from the scalar's source text, so
10
- * a hand-written all-digit commit SHA — which YAML would resolve to a lossy
11
- * number — still round-trips as the forty characters the author typed.
12
- */
13
- import { type NavDoc } from "./frontmatter.ts";
14
- export declare const SHA_PATTERN: RegExp;
15
- export declare const VERDICTS: readonly ["approve", "request-changes"];
16
- export type Verdict = (typeof VERDICTS)[number];
17
- export interface Problem {
18
- key?: string;
19
- message: string;
20
- }
21
- export interface ParsedFile {
22
- nav: NavDoc;
23
- /** Frontmatter with spec-typed keys normalized; unknown keys passed through. */
24
- fm: Record<string, unknown>;
25
- /** Frontmatter exactly as the YAML parser resolved it. */
26
- raw: Record<string, unknown>;
27
- body: string;
28
- problems: Problem[];
29
- }
30
- export interface Revision {
31
- head: string;
32
- base: string;
33
- date: string;
34
- }
35
- /** Parse any Navbook file; frontmatter faults surface as problems, not throws. */
36
- export declare function parseFile(text: string): ParsedFile;
37
- /** Coerce spec-typed frontmatter keys; leave unknown keys exactly as parsed. */
38
- export declare function normalizeFrontmatter(nav: NavDoc, parsed?: Record<string, unknown>): Record<string, unknown>;
39
- /** Read `labels` defensively, ignoring malformed entries. */
40
- export declare function readLabels(fm: Record<string, unknown>): string[];
41
- /** Read `assignee` (scalar or list) defensively. */
42
- export declare function readAssignees(fm: Record<string, unknown>): string[];
43
- /** Read `revisions` defensively, keeping only well-formed entries. */
44
- export declare function readRevisions(fm: Record<string, unknown>): Revision[];
45
- /** Read the `merged:` block defensively. */
46
- export declare function readMerged(fm: Record<string, unknown>): Record<string, unknown> | null;
47
- /** Validate an `issue.md` (§2.5). */
48
- export declare function validateIssue(parsed: ParsedFile): Problem[];
49
- /** Validate a `pr.md` (§2.7). */
50
- export declare function validatePr(parsed: ParsedFile): Problem[];
51
- /** Validate a comment file (§2.6), including the optional review fields. */
52
- export declare function validateComment(parsed: ParsedFile, opts: {
53
- onPr: boolean;
54
- }): Problem[];
55
- export interface NewIssueInput {
56
- title: string;
57
- author: string;
58
- created: string;
59
- body: string;
60
- labels?: string[];
61
- assignee?: string[];
62
- milestone?: string;
63
- }
64
- /** Render a new `issue.md`. */
65
- export declare function newIssueFile(input: NewIssueInput): string;
66
- export interface NewPrInput extends NewIssueInput {
67
- target: string;
68
- source: string;
69
- revisions: Revision[];
70
- draft?: boolean;
71
- }
72
- /** Render a new `pr.md`. */
73
- export declare function newPrFile(input: NewPrInput): string;
74
- export interface NewCommentInput {
75
- author: string;
76
- body: string;
77
- replyTo?: string;
78
- verdict?: Verdict;
79
- revision?: string;
80
- file?: string;
81
- line?: string;
82
- }
83
- /** Render a new comment or review file. */
84
- export declare function newCommentFile(input: NewCommentInput): string;
85
- /** Trim trailing whitespace and guarantee exactly one closing newline. */
86
- export declare function normalizeBody(body: string): string;
87
- /** Format a person for frontmatter, falling back to the bare address. */
88
- export declare function formatAuthor(name: string | undefined, email: string): string;
@@ -1,441 +0,0 @@
1
- /**
2
- * The three Navbook file kinds — spec 02 §2.5 (`issue.md`), §2.6 (comments and
3
- * reviews) and §2.7 (`pr.md`): parsing, validation, and construction.
4
- *
5
- * Parsing never throws on schema problems; it collects them so `nav doctor` can
6
- * report every fault in a file at once.
7
- *
8
- * Frontmatter is normalized once, at parse time: keys whose spec type is a
9
- * string (or a list/map of strings) are read from the scalar's source text, so
10
- * a hand-written all-digit commit SHA — which YAML would resolve to a lossy
11
- * number — still round-trips as the forty characters the author typed.
12
- */
13
- import { emptyDoc, hasKey, keysInOrder, parseDoc, patchDoc, seqLength, serializeDoc, setFlowList, stringAt, toPlain, } from "./frontmatter.js";
14
- import { isId } from "./id.js";
15
- import { formatPerson, parsePerson } from "./person.js";
16
- import { parseIso } from "./time.js";
17
- export const SHA_PATTERN = /^[0-9a-f]{40}$/;
18
- export const VERDICTS = ["approve", "request-changes"];
19
- /** Keys whose spec type is a single string-ish scalar. */
20
- const STRING_KEYS = [
21
- "title",
22
- "author",
23
- "created",
24
- "target",
25
- "source",
26
- "milestone",
27
- "resolution",
28
- "duplicate-of",
29
- "superseded-by",
30
- "reply-to",
31
- "verdict",
32
- "revision",
33
- "file",
34
- "imported-from",
35
- "imported-at",
36
- "signature",
37
- ];
38
- /** Parse any Navbook file; frontmatter faults surface as problems, not throws. */
39
- export function parseFile(text) {
40
- const nav = parseDoc(text);
41
- const problems = nav.errors.map((message) => ({
42
- message: `invalid YAML: ${message}`,
43
- }));
44
- // One conversion out of the YAML document, shared by both views of it.
45
- const raw = toPlain(nav);
46
- return { nav, fm: normalizeFrontmatter(nav, raw), raw, body: nav.body, problems };
47
- }
48
- /** Coerce spec-typed frontmatter keys; leave unknown keys exactly as parsed. */
49
- export function normalizeFrontmatter(nav, parsed) {
50
- const raw = parsed ?? toPlain(nav);
51
- const out = {};
52
- for (const key of keysInOrder(nav)) {
53
- if (key === "")
54
- continue;
55
- out[key] = normalizeKey(nav, key, raw[key]);
56
- }
57
- return out;
58
- }
59
- function normalizeKey(nav, key, rawValue) {
60
- if (STRING_KEYS.includes(key)) {
61
- return stringAt(nav, [key]) ?? rawValue;
62
- }
63
- if (key === "labels")
64
- return normalizeStringList(nav, key, rawValue);
65
- if (key === "assignee") {
66
- return Array.isArray(rawValue)
67
- ? normalizeStringList(nav, key, rawValue)
68
- : (stringAt(nav, [key]) ?? rawValue);
69
- }
70
- if (key === "revisions")
71
- return normalizeRevisions(nav, rawValue);
72
- if (key === "merged")
73
- return normalizeMerged(nav, rawValue);
74
- return rawValue;
75
- }
76
- function normalizeStringList(nav, key, rawValue) {
77
- const length = seqLength(nav, [key]);
78
- if (length === null || !Array.isArray(rawValue))
79
- return rawValue;
80
- return rawValue.map((item, index) => stringAt(nav, [key, index]) ?? item);
81
- }
82
- function normalizeRevisions(nav, rawValue) {
83
- if (seqLength(nav, ["revisions"]) === null || !Array.isArray(rawValue))
84
- return rawValue;
85
- return rawValue.map((item, index) => {
86
- if (!isPlainObject(item))
87
- return item;
88
- const out = { ...item };
89
- for (const field of ["head", "base", "date"]) {
90
- if (out[field] === undefined)
91
- continue;
92
- out[field] = stringAt(nav, ["revisions", index, field]) ?? out[field];
93
- }
94
- return out;
95
- });
96
- }
97
- function normalizeMerged(nav, rawValue) {
98
- if (!isPlainObject(rawValue))
99
- return rawValue;
100
- const out = { ...rawValue };
101
- for (const field of ["date", "by", "commit"]) {
102
- if (out[field] === undefined)
103
- continue;
104
- out[field] = stringAt(nav, ["merged", field]) ?? out[field];
105
- }
106
- return out;
107
- }
108
- function isPlainObject(value) {
109
- return typeof value === "object" && value !== null && !Array.isArray(value);
110
- }
111
- /* ------------------------------------------------------------------ helpers */
112
- function requireString(parsed, key, problems) {
113
- const value = parsed.fm[key];
114
- if (value === undefined || value === null) {
115
- if (hasKey(parsed.nav, key)) {
116
- problems.push({ key, message: `'${key}' must be a non-empty string` });
117
- }
118
- else {
119
- problems.push({ key, message: `missing required key '${key}'` });
120
- }
121
- return null;
122
- }
123
- if (typeof value !== "string" || value.trim() === "") {
124
- problems.push({ key, message: `'${key}' must be a non-empty string` });
125
- return null;
126
- }
127
- return value;
128
- }
129
- function checkOptionalString(parsed, key, problems) {
130
- const value = parsed.fm[key];
131
- if (value === undefined || value === null)
132
- return;
133
- if (typeof value !== "string" || value.trim() === "") {
134
- problems.push({ key, message: `'${key}' must be a non-empty string` });
135
- }
136
- }
137
- function checkPerson(parsed, key, problems) {
138
- const value = requireString(parsed, key, problems);
139
- if (value === null)
140
- return;
141
- if (!parsePerson(value)) {
142
- problems.push({
143
- key,
144
- message: `'${key}' must be an RFC 5322 address, got ${JSON.stringify(value)}`,
145
- });
146
- }
147
- }
148
- function checkTimestamp(parsed, key, problems) {
149
- const value = requireString(parsed, key, problems);
150
- if (value === null)
151
- return;
152
- if (!parseIso(value)) {
153
- problems.push({
154
- key,
155
- message: `'${key}' must be an ISO 8601 timestamp, got ${JSON.stringify(value)}`,
156
- });
157
- }
158
- }
159
- function checkLabels(parsed, problems) {
160
- const value = parsed.fm.labels;
161
- if (value === undefined || value === null)
162
- return;
163
- if (!Array.isArray(value) || value.some((v) => typeof v !== "string" || v.trim() === "")) {
164
- problems.push({ key: "labels", message: "'labels' must be a list of non-empty strings" });
165
- }
166
- }
167
- function checkAssignee(parsed, problems) {
168
- const value = parsed.fm.assignee;
169
- if (value === undefined || value === null)
170
- return;
171
- const entries = Array.isArray(value) ? value : [value];
172
- if (entries.length === 0) {
173
- problems.push({ key: "assignee", message: "'assignee' must be a person or list of persons" });
174
- return;
175
- }
176
- for (const entry of entries) {
177
- if (typeof entry !== "string" || !parsePerson(entry)) {
178
- problems.push({ key: "assignee", message: "'assignee' must be a person or list of persons" });
179
- return;
180
- }
181
- }
182
- }
183
- function checkIdReference(parsed, key, problems) {
184
- const value = parsed.fm[key];
185
- if (value === undefined || value === null)
186
- return;
187
- if (typeof value !== "string" || !isId(value)) {
188
- problems.push({ key, message: `'${key}' must be a Navbook ID` });
189
- }
190
- }
191
- function checkNoStatusKey(parsed, problems) {
192
- if (hasKey(parsed.nav, "status")) {
193
- problems.push({
194
- key: "status",
195
- message: "entity files must not carry a 'status' key; status is the path (§2.1)",
196
- });
197
- }
198
- }
199
- /** Read `labels` defensively, ignoring malformed entries. */
200
- export function readLabels(fm) {
201
- const value = fm.labels;
202
- if (!Array.isArray(value))
203
- return [];
204
- return value.filter((v) => typeof v === "string");
205
- }
206
- /** Read `assignee` (scalar or list) defensively. */
207
- export function readAssignees(fm) {
208
- const value = fm.assignee;
209
- if (value === undefined || value === null)
210
- return [];
211
- const entries = Array.isArray(value) ? value : [value];
212
- return entries.filter((v) => typeof v === "string");
213
- }
214
- /** Read `revisions` defensively, keeping only well-formed entries. */
215
- export function readRevisions(fm) {
216
- const value = fm.revisions;
217
- if (!Array.isArray(value))
218
- return [];
219
- const out = [];
220
- for (const entry of value) {
221
- if (!isPlainObject(entry))
222
- continue;
223
- if (typeof entry.head === "string" &&
224
- typeof entry.base === "string" &&
225
- typeof entry.date === "string") {
226
- out.push({ head: entry.head, base: entry.base, date: entry.date });
227
- }
228
- }
229
- return out;
230
- }
231
- /** Read the `merged:` block defensively. */
232
- export function readMerged(fm) {
233
- return isPlainObject(fm.merged) ? fm.merged : null;
234
- }
235
- /* --------------------------------------------------------------- validation */
236
- /** Validate an `issue.md` (§2.5). */
237
- export function validateIssue(parsed) {
238
- const problems = [...parsed.problems];
239
- requireString(parsed, "title", problems);
240
- checkPerson(parsed, "author", problems);
241
- checkTimestamp(parsed, "created", problems);
242
- checkLabels(parsed, problems);
243
- checkAssignee(parsed, problems);
244
- checkOptionalString(parsed, "milestone", problems);
245
- checkOptionalString(parsed, "resolution", problems);
246
- checkIdReference(parsed, "duplicate-of", problems);
247
- checkNoStatusKey(parsed, problems);
248
- if (parsed.body.trim() === "") {
249
- problems.push({ message: "issue description must not be empty (§2.5)" });
250
- }
251
- return problems;
252
- }
253
- /** Validate a `pr.md` (§2.7). */
254
- export function validatePr(parsed) {
255
- const problems = [...parsed.problems];
256
- requireString(parsed, "title", problems);
257
- checkPerson(parsed, "author", problems);
258
- checkTimestamp(parsed, "created", problems);
259
- requireString(parsed, "target", problems);
260
- checkOptionalString(parsed, "source", problems);
261
- checkLabels(parsed, problems);
262
- checkAssignee(parsed, problems);
263
- checkOptionalString(parsed, "milestone", problems);
264
- checkOptionalString(parsed, "resolution", problems);
265
- checkIdReference(parsed, "superseded-by", problems);
266
- checkNoStatusKey(parsed, problems);
267
- if (parsed.fm.draft !== undefined && typeof parsed.fm.draft !== "boolean") {
268
- problems.push({ key: "draft", message: "'draft' must be a boolean" });
269
- }
270
- validateRevisions(parsed, problems);
271
- validateMergedBlock(parsed, problems);
272
- return problems;
273
- }
274
- function validateRevisions(parsed, problems) {
275
- const value = parsed.fm.revisions;
276
- if (!Array.isArray(value) || value.length === 0) {
277
- problems.push({
278
- key: "revisions",
279
- message: "'revisions' must be a list with at least one entry (§2.7)",
280
- });
281
- return;
282
- }
283
- value.forEach((entry, index) => {
284
- const where = `revisions[${index}]`;
285
- if (!isPlainObject(entry)) {
286
- problems.push({ key: "revisions", message: `${where} must be a map` });
287
- return;
288
- }
289
- for (const field of ["head", "base"]) {
290
- const sha = entry[field];
291
- if (typeof sha !== "string" || !SHA_PATTERN.test(sha)) {
292
- problems.push({
293
- key: "revisions",
294
- message: `${where}.${field} must be a 40-hex commit SHA`,
295
- });
296
- }
297
- }
298
- if (typeof entry.date !== "string" || !parseIso(entry.date)) {
299
- problems.push({ key: "revisions", message: `${where}.date must be an ISO 8601 timestamp` });
300
- }
301
- });
302
- }
303
- function validateMergedBlock(parsed, problems) {
304
- const value = parsed.fm.merged;
305
- if (value === undefined || value === null)
306
- return;
307
- if (!isPlainObject(value)) {
308
- problems.push({ key: "merged", message: "'merged' must be a map of date, by and commit" });
309
- return;
310
- }
311
- if (value.date !== undefined && (typeof value.date !== "string" || !parseIso(value.date))) {
312
- problems.push({ key: "merged", message: "'merged.date' must be an ISO 8601 timestamp" });
313
- }
314
- if (value.by !== undefined && (typeof value.by !== "string" || !parsePerson(value.by))) {
315
- problems.push({ key: "merged", message: "'merged.by' must be an RFC 5322 address" });
316
- }
317
- if (value.commit !== undefined &&
318
- (typeof value.commit !== "string" || !SHA_PATTERN.test(value.commit))) {
319
- problems.push({ key: "merged", message: "'merged.commit' must be a 40-hex commit SHA" });
320
- }
321
- }
322
- /** Validate a comment file (§2.6), including the optional review fields. */
323
- export function validateComment(parsed, opts) {
324
- const problems = [...parsed.problems];
325
- const { fm } = parsed;
326
- checkPerson(parsed, "author", problems);
327
- checkIdReference(parsed, "reply-to", problems);
328
- const hasVerdict = fm.verdict !== undefined && fm.verdict !== null;
329
- const hasFile = fm.file !== undefined && fm.file !== null;
330
- if (hasVerdict && !VERDICTS.includes(fm.verdict)) {
331
- problems.push({ key: "verdict", message: `'verdict' must be one of ${VERDICTS.join(" | ")}` });
332
- }
333
- if (hasFile && (typeof fm.file !== "string" || fm.file.trim() === "")) {
334
- problems.push({ key: "file", message: "'file' must be a repository-relative path" });
335
- }
336
- if (fm.line !== undefined && fm.line !== null && !isValidLine(fm.line)) {
337
- problems.push({ key: "line", message: "'line' must be an integer or a 'start-end' range" });
338
- }
339
- if (hasVerdict || hasFile) {
340
- if (typeof fm.revision !== "string" || !SHA_PATTERN.test(fm.revision)) {
341
- problems.push({
342
- key: "revision",
343
- message: "'revision' (40-hex SHA) is required when 'verdict' or 'file' is present (§2.6)",
344
- });
345
- }
346
- if (!opts.onPr) {
347
- problems.push({
348
- message: "review fields are only meaningful on pull-request comments (§2.6)",
349
- });
350
- }
351
- }
352
- else if (fm.revision !== undefined && fm.revision !== null) {
353
- if (typeof fm.revision !== "string" || !SHA_PATTERN.test(fm.revision)) {
354
- problems.push({ key: "revision", message: "'revision' must be a 40-hex commit SHA" });
355
- }
356
- }
357
- return problems;
358
- }
359
- function isValidLine(value) {
360
- if (typeof value === "number")
361
- return Number.isInteger(value) && value > 0;
362
- if (typeof value !== "string")
363
- return false;
364
- const match = /^(\d+)(?:-(\d+))?$/.exec(value.trim());
365
- if (!match)
366
- return false;
367
- const start = Number(match[1]);
368
- if (start <= 0)
369
- return false;
370
- if (match[2] === undefined)
371
- return true;
372
- return Number(match[2]) >= start;
373
- }
374
- /** Render a new `issue.md`. */
375
- export function newIssueFile(input) {
376
- const nav = emptyDoc();
377
- patchDoc(nav, { title: input.title, author: input.author, created: input.created });
378
- applyOptionalMeta(nav, input);
379
- nav.body = `\n${normalizeBody(input.body)}`;
380
- return serializeDoc(nav);
381
- }
382
- /** Render a new `pr.md`. */
383
- export function newPrFile(input) {
384
- const nav = emptyDoc();
385
- patchDoc(nav, {
386
- title: input.title,
387
- author: input.author,
388
- created: input.created,
389
- target: input.target,
390
- source: input.source,
391
- });
392
- if (input.draft)
393
- patchDoc(nav, { draft: true });
394
- applyOptionalMeta(nav, input);
395
- patchDoc(nav, { revisions: input.revisions });
396
- nav.body = `\n${normalizeBody(input.body)}`;
397
- return serializeDoc(nav);
398
- }
399
- function applyOptionalMeta(nav, input) {
400
- if (input.labels?.length)
401
- setFlowList(nav, "labels", input.labels);
402
- if (input.assignee?.length) {
403
- if (input.assignee.length === 1)
404
- patchDoc(nav, { assignee: input.assignee[0] });
405
- else
406
- setFlowList(nav, "assignee", input.assignee);
407
- }
408
- if (input.milestone)
409
- patchDoc(nav, { milestone: input.milestone });
410
- }
411
- /** Render a new comment or review file. */
412
- export function newCommentFile(input) {
413
- const nav = emptyDoc();
414
- patchDoc(nav, { author: input.author });
415
- if (input.replyTo)
416
- patchDoc(nav, { "reply-to": input.replyTo });
417
- if (input.verdict)
418
- patchDoc(nav, { verdict: input.verdict });
419
- if (input.revision)
420
- patchDoc(nav, { revision: input.revision });
421
- if (input.file)
422
- patchDoc(nav, { file: input.file });
423
- if (input.line)
424
- patchDoc(nav, { line: normalizeLine(input.line) });
425
- nav.body = `\n${normalizeBody(input.body)}`;
426
- return serializeDoc(nav);
427
- }
428
- function normalizeLine(line) {
429
- const trimmed = line.trim();
430
- return /^\d+$/.test(trimmed) ? Number(trimmed) : trimmed;
431
- }
432
- /** Trim trailing whitespace and guarantee exactly one closing newline. */
433
- export function normalizeBody(body) {
434
- const trimmed = body.replace(/\s+$/, "");
435
- return trimmed === "" ? "" : `${trimmed}\n`;
436
- }
437
- /** Format a person for frontmatter, falling back to the bare address. */
438
- export function formatAuthor(name, email) {
439
- return formatPerson(name ? { name, email } : { email });
440
- }
441
- //# sourceMappingURL=files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"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"}