@clemrig/factory 0.18.3 → 0.19.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 (54) hide show
  1. package/README.md +14 -18
  2. package/dist/app/factory.d.ts +2 -0
  3. package/dist/app/factory.js +5 -1
  4. package/dist/app/factory.js.map +1 -1
  5. package/dist/app/review.d.ts +16 -0
  6. package/dist/app/review.js +87 -0
  7. package/dist/app/review.js.map +1 -0
  8. package/dist/app/workflows/implement.js +3 -7
  9. package/dist/app/workflows/implement.js.map +1 -1
  10. package/dist/app/workflows/stages/deliver.d.ts +5 -4
  11. package/dist/app/workflows/stages/deliver.js +47 -53
  12. package/dist/app/workflows/stages/deliver.js.map +1 -1
  13. package/dist/app/workflows/stages/prepare.js +11 -7
  14. package/dist/app/workflows/stages/prepare.js.map +1 -1
  15. package/dist/app/workflows/stages/resume.js +0 -4
  16. package/dist/app/workflows/stages/resume.js.map +1 -1
  17. package/dist/app/workflows/stages/run.d.ts +1 -2
  18. package/dist/app/workflows/tidy.js +2 -3
  19. package/dist/app/workflows/tidy.js.map +1 -1
  20. package/dist/cli/ui.d.ts +4 -2
  21. package/dist/cli/ui.js +17 -5
  22. package/dist/cli/ui.js.map +1 -1
  23. package/dist/domain/board.d.ts +2 -0
  24. package/dist/domain/board.js +4 -1
  25. package/dist/domain/board.js.map +1 -1
  26. package/dist/domain/description.d.ts +57 -5
  27. package/dist/domain/description.js +133 -12
  28. package/dist/domain/description.js.map +1 -1
  29. package/dist/domain/diff.d.ts +8 -0
  30. package/dist/domain/diff.js +90 -0
  31. package/dist/domain/diff.js.map +1 -0
  32. package/dist/domain/pull-request.d.ts +9 -21
  33. package/dist/domain/pull-request.js +43 -228
  34. package/dist/domain/pull-request.js.map +1 -1
  35. package/dist/domain/review-page.d.ts +171 -0
  36. package/dist/domain/review-page.js +200 -0
  37. package/dist/domain/review-page.js.map +1 -0
  38. package/dist/system/environment.d.ts +6 -0
  39. package/dist/system/environment.js +19 -0
  40. package/dist/system/environment.js.map +1 -1
  41. package/dist/system/factory.d.ts +2 -0
  42. package/dist/system/factory.js +4 -0
  43. package/dist/system/factory.js.map +1 -1
  44. package/dist/system/git.d.ts +5 -1
  45. package/dist/system/git.js +19 -2
  46. package/dist/system/git.js.map +1 -1
  47. package/dist/system/github.d.ts +3 -12
  48. package/dist/system/github.js +7 -31
  49. package/dist/system/github.js.map +1 -1
  50. package/dist/system/run-files.d.ts +14 -0
  51. package/dist/system/run-files.js +51 -8
  52. package/dist/system/run-files.js.map +1 -1
  53. package/package.json +2 -2
  54. package/prompts/describe.md +36 -15
@@ -0,0 +1,90 @@
1
+ const escapes = {
2
+ a: "\x07",
3
+ b: "\b",
4
+ t: "\t",
5
+ n: "\n",
6
+ v: "\v",
7
+ f: "\f",
8
+ r: "\r",
9
+ };
10
+ /**
11
+ * A name of a `---` or `+++` line, as Git writes it: followed by a tab when
12
+ * it has a space, quoted C style when it has special characters, its bytes
13
+ * outside ASCII in octal.
14
+ */
15
+ function nameOf(written) {
16
+ const name = written.replace(/\t$/, "");
17
+ if (!name.startsWith('"'))
18
+ return name;
19
+ const bytes = [];
20
+ for (const [, octal, escaped, plain] of name
21
+ .slice(1, -1)
22
+ .matchAll(/\\([0-7]{3})|\\(.)|([^\\]+)/gs)) {
23
+ if (octal)
24
+ bytes.push(Number.parseInt(octal, 8));
25
+ else
26
+ bytes.push(...new TextEncoder().encode(escaped === undefined ? plain : (escapes[escaped] ?? escaped)));
27
+ }
28
+ return new TextDecoder().decode(new Uint8Array(bytes));
29
+ }
30
+ /**
31
+ * The lines of `path`'s hunks in a unified diff of several files, its names
32
+ * after `a/` and `b/`; `undefined` when the diff does not change it.
33
+ */
34
+ function linesOf(diff, path) {
35
+ for (const section of diff.split(/^(?=diff --git )/m)) {
36
+ const lines = section.split("\n");
37
+ const start = lines.findIndex((line) => line.startsWith("@@ "));
38
+ const head = start === -1 ? lines : lines.slice(0, start);
39
+ const named = (marker) => {
40
+ const line = head.find((each) => each.startsWith(marker));
41
+ return line === undefined ? undefined : nameOf(line.slice(4));
42
+ };
43
+ const deleted = named("+++ ") === "/dev/null";
44
+ if (deleted ? named("--- ") !== `a/${path}` : named("+++ ") !== `b/${path}`)
45
+ continue;
46
+ const numbered = [];
47
+ let hunk = -1;
48
+ let next = 0;
49
+ for (const line of start === -1 ? [] : lines.slice(start)) {
50
+ const range = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(line);
51
+ if (range) {
52
+ hunk += 1;
53
+ next = Number(deleted ? range[1] : range[2]);
54
+ continue;
55
+ }
56
+ const mark = line[0];
57
+ // `` is no line of the file.
58
+ if (mark !== "+" && mark !== "-" && mark !== " ")
59
+ continue;
60
+ numbered.push({ mark, text: line.slice(1), hunk, number: next });
61
+ if (deleted ? mark !== "+" : mark !== "-")
62
+ next += 1;
63
+ }
64
+ return numbered;
65
+ }
66
+ return undefined;
67
+ }
68
+ /**
69
+ * The excerpt of `path`'s diff that shows lines `from` to `to` of its new
70
+ * version (of its old one, for a deleted file), with the lines removed just
71
+ * before each of them; each line keeps its mark, the common indentation
72
+ * removed, and `…` separates two hunks. `undefined` when it changes none of
73
+ * these lines.
74
+ */
75
+ export function diffExcerpt(diff, path, from, to) {
76
+ const kept = (linesOf(diff, path) ?? []).filter(({ number }) => number >= from && number <= to);
77
+ if (!kept.some(({ mark }) => mark !== " "))
78
+ return undefined;
79
+ const indents = kept
80
+ .filter(({ text }) => text.trim() !== "")
81
+ .map(({ text }) => /^[ \t]*/.exec(text)?.[0].length ?? 0);
82
+ const indent = indents.length > 0 ? Math.min(...indents) : 0;
83
+ return kept
84
+ .flatMap(({ mark, text, hunk }, index) => [
85
+ ...(index > 0 && kept[index - 1]?.hunk !== hunk ? [" …"] : []),
86
+ `${mark}${text.slice(indent).replaceAll("\t", " ")}`,
87
+ ])
88
+ .join("\n");
89
+ }
90
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/domain/diff.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,GAA2B;IACtC,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;CACR,CAAC;AAEF;;;;GAIG;AACH,SAAS,MAAM,CAAC,OAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI;SACzC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;;YAE/C,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CACzB,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,CAC9D,CACF,CAAC;IACN,CAAC;IACD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY;IACzC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1D,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW,CAAC;QAC9C,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;YACzE,SAAS;QACX,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QACd,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,IAAI,CAAC,CAAC;gBACV,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,wDAAwD;YACxD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;gBAAE,SAAS;YAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG;gBAAE,IAAI,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,EAAU;IAEV,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAC7C,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,EAAE,CAC/C,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI;SACjB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SACxC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI;SACR,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;KACtD,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -1,23 +1,11 @@
1
1
  import type { Description } from "./description.js";
2
2
  import { type ChangedFile, type Review } from "./review.js";
3
3
  import type { Criterion } from "./spec.js";
4
- import { type CheckResult } from "./verification.js";
5
- /** The first `gh` that attaches images to a pull request (`--attach`). */
6
- export declare const minimumGhVersion = "2.99.0";
7
- /** Why this `gh` cannot open the pull request, if it cannot. */
8
- export declare function ghVersionProblem(version: string): string | undefined;
9
- /** Below GitHub's limit for a pull request's body (65,536 characters), with room for the screenshots' links. */
10
- export declare const maxBodyLength = 60000;
4
+ import type { CheckResult } from "./verification.js";
11
5
  export interface PullRequestFacts {
12
- /** The spec's Objective: why the change exists. */
13
- objective: string;
14
6
  criteria: Criterion[];
15
7
  /** Where the implementation departs from the plan, and why. */
16
8
  deviations: string[];
17
- /** The plan's reading of the spec where it reads more than one way: to confirm before merging. */
18
- interpretations: string[];
19
- /** What the plan assumed: its risks. */
20
- assumptions: string[];
21
9
  review: Review;
22
10
  /**
23
11
  * Whether the operator delivered the change as the review left it: its
@@ -37,21 +25,21 @@ export interface PullRequestFacts {
37
25
  /** The change's files, since the plan's commit. */
38
26
  files: ChangedFile[];
39
27
  description: Description;
40
- /**
41
- * Whether the screenshots are still to attach. Once attached, the body names
42
- * each by its file, which gh replaces with its upload's link.
43
- */
44
- screenshotsPending: boolean;
45
28
  /** Where a reader opens the spec and the plan, at the commits the run read and wrote them. */
46
29
  links: {
47
30
  spec: string;
48
31
  plan: string;
49
32
  };
50
33
  runId: string;
34
+ /** The review page's address, when `factory ui` has one others can reach. */
35
+ reviewPage?: string;
51
36
  }
52
- /** Everything needed to review the change without remembering its issue or opening the run. */
37
+ /** The review page's address, relative to where `factory ui` serves. */
38
+ export declare function reviewPath(runId: string): string;
39
+ /**
40
+ * The pull request's body: what it risks and proves at a glance, and the
41
+ * link to its review page, which shows everything else from the run.
42
+ */
53
43
  export declare function pullRequestBody(facts: PullRequestFacts): string;
54
- /** How many readings of the spec the plan chose, as the terminal shows them once the pull request is open. */
55
- export declare function interpretationsLine(count: number): string;
56
44
  /** The danger of merging, as the terminal shows it once the pull request is open. */
57
45
  export declare function mergeDangerLine({ danger }: Description): string;
@@ -1,89 +1,20 @@
1
- import { isBlocking, natureLabel, } from "./review.js";
2
- import { seconds } from "./verification.js";
3
- /** The first `gh` that attaches images to a pull request (`--attach`). */
4
- export const minimumGhVersion = "2.99.0";
5
- /** Why this `gh` cannot open the pull request, if it cannot. */
6
- export function ghVersionProblem(version) {
7
- const parts = (text) => text.split(".").map(Number);
8
- const [major = 0, minor = 0, patch = 0] = parts(version);
9
- const [needMajor = 0, needMinor = 0, needPatch = 0] = parts(minimumGhVersion);
10
- const recent = major !== needMajor
11
- ? major > needMajor
12
- : minor !== needMinor
13
- ? minor > needMinor
14
- : patch >= needPatch;
15
- return recent
16
- ? undefined
17
- : `gh ${minimumGhVersion} or later is required to attach screenshots (found ${version}): upgrade gh`;
18
- }
19
- /** Below GitHub's limit for a pull request's body (65,536 characters), with room for the screenshots' links. */
20
- export const maxBodyLength = 60_000;
21
- /** Agent text on one line. */
22
- function line(text) {
23
- return text.replace(/\s*\n\s*/g, " ");
24
- }
25
- /**
26
- * Text shown as prose, from the spec or an agent: nothing in it opens a code
27
- * block or a comment, which would swallow the rest of the body.
28
- */
29
- function inert(text) {
1
+ import { isBlocking } from "./review.js";
2
+ /** Agent text on one line, in a table cell: no column separator. */
3
+ function cell(text) {
30
4
  return text
31
- .replaceAll("```", "\\`\\`\\`")
32
- .replaceAll("~~~", "\\~\\~\\~")
5
+ .replace(/\s*\n\s*/g, " ")
6
+ .replaceAll("|", "\\|")
33
7
  .replaceAll("<!--", "&lt;!--");
34
8
  }
35
- /** Agent text inside a table cell: one line, no column separator. */
36
- function cell(text) {
37
- return inert(line(text)).replaceAll("|", "\\|");
38
- }
39
- /** A list item whose text may hold several lines. */
40
- function item(text) {
41
- return `- ${inert(text.trim()).replace(/\n/g, "\n ")}`;
42
- }
43
- /** Agent text as HTML, in a folded section's title. */
44
- function html(text) {
45
- return line(text)
46
- .replaceAll("&", "&amp;")
47
- .replaceAll("<", "&lt;")
48
- .replaceAll(">", "&gt;");
49
- }
50
- /** Agent text as an image's alternative text: one line, no bracket to end it. */
51
- function alt(text) {
52
- return line(text).replace(/[\\[\]]/g, "\\$&");
53
- }
54
9
  function plural(count, noun) {
55
10
  return `${count} ${noun}${count === 1 ? "" : "s"}`;
56
11
  }
57
- /** Content folded under its title until the reader opens it. */
58
- function folded(title, content) {
59
- return `<details><summary>${title}</summary>\n\n${content}\n\n</details>`;
60
- }
61
- /** Above this many files, the review guide folds each group's list. */
62
- const foldedFiles = 10;
63
- /** A changed file with its added and removed lines, as the review guide lists it. */
64
- function changedFile(file) {
65
- const name = file.from
66
- ? `\`${file.from}\` → \`${file.path}\``
67
- : `\`${file.path}\``;
68
- return file.added === undefined || file.removed === undefined
69
- ? `${name} (binary)`
70
- : `${name} (+${file.added} -${file.removed})`;
71
- }
72
- /** A review's finding, as the pull request lists it: where, what, and its nature. */
73
- function finding({ nature, file, summary, }) {
74
- const label = natureLabel(nature);
75
- return item(`${file ? `\`${file}\` — ` : ""}${summary.trim()} _${label[0]?.toUpperCase()}${label.slice(1)}_`);
76
- }
77
12
  /** What the review still asks for, which the operator accepted to deliver. */
78
- function openItems({ review, acceptedReview }) {
13
+ function openCount({ review, acceptedReview }) {
79
14
  if (!acceptedReview)
80
- return [];
81
- return [
82
- ...review.criteria
83
- .filter(({ status }) => status === "not_met")
84
- .map(({ id, evidence }) => item(`${id} is not met — ${evidence.trim()}`)),
85
- ...review.findings.filter(({ nature }) => isBlocking(nature)).map(finding),
86
- ];
15
+ return 0;
16
+ return (review.criteria.filter(({ status }) => status === "not_met").length +
17
+ review.findings.filter(({ nature }) => isBlocking(nature)).length);
87
18
  }
88
19
  /** The criteria the last review found met. */
89
20
  function metCriteria({ criteria, review }) {
@@ -95,7 +26,7 @@ function rounds(facts) {
95
26
  const after = facts.reviewRounds === 0
96
27
  ? "at the first review"
97
28
  : `after ${plural(facts.reviewRounds, "round")} of changes`;
98
- return openItems(facts).length > 0
29
+ return openCount(facts) > 0
99
30
  ? `Delivered by the operator ${after}`
100
31
  : `Approved ${after}`;
101
32
  }
@@ -104,7 +35,7 @@ function glance(facts) {
104
35
  const { files, links, runId, description, checks, skippedChecks } = facts;
105
36
  const sum = (key) => files.reduce((total, file) => total + (file[key] ?? 0), 0);
106
37
  const { danger, screenshots } = description;
107
- const open = openItems(facts).length;
38
+ const open = openCount(facts);
108
39
  const nonBlocking = facts.review.findings.filter(({ nature }) => !isBlocking(nature)).length;
109
40
  const proof = [
110
41
  `${metCriteria(facts)} / ${facts.criteria.length} criteria`,
@@ -137,171 +68,55 @@ function glance(facts) {
137
68
  `| **Review** | ${review.join(" · ")} |`,
138
69
  ].join("\n");
139
70
  }
140
- /** A code block around `content`, its fence longer than any it holds. */
141
- function codeBlock(kind, content) {
142
- const longest = Math.max(0, ...[...content.matchAll(/`+/g)].map(([run]) => run.length));
143
- const fence = "`".repeat(Math.max(3, longest + 1));
144
- return `${fence}${kind}\n${content.trimEnd()}\n${fence}`;
145
- }
146
- function howItWorks({ visuals }) {
147
- if (visuals.length === 0)
148
- return "The change needs no diagram.";
149
- return visuals
150
- .map(({ caption, kind, content }) => `${inert(caption.trim())}\n\n${codeBlock(kind, content)}`)
151
- .join("\n\n");
152
- }
153
- function mergeDanger({ danger }) {
154
- const afterMerge = danger.afterMerge.length > 0
155
- ? danger.afterMerge
156
- .map((action, index) => `${index + 1}. ${cell(action)}`)
157
- .join("<br>")
158
- : "Nothing.";
159
- return [
160
- `| **Door** | **${danger.door === "one_way" ? "One-way" : "Two-way"}.** ${cell(danger.reason)} |`,
161
- "|:--|:--|",
162
- `| **Blast radius** | **${cell(danger.blastRadius)}.** ${cell(danger.ramifications)} |`,
163
- `| **Rollback** | ${cell(danger.rollback)} |`,
164
- `| **After merge** | ${afterMerge} |`,
165
- ].join("\n");
166
- }
167
- function reviewGuide({ description, files }) {
168
- const { start, groups } = description.guide;
169
- const byPath = new Map(files.map((file) => [file.path, file]));
170
- const listed = (paths) => paths.flatMap((path) => {
171
- const file = byPath.get(path);
172
- return file ? [`- ${changedFile(file)}`] : [];
173
- });
174
- const grouped = new Set(groups.flatMap((group) => group.files));
175
- const others = files.filter(({ path }) => !grouped.has(path));
176
- const sections = [
177
- ...groups.map(({ title, files: paths }, index) => ({
178
- title: `${index + 1}. ${title.trim()}`,
179
- lines: listed(paths),
180
- })),
181
- ...(others.length > 0
182
- ? [
183
- {
184
- title: groups.length > 0 ? "Other files" : "Files",
185
- lines: others.map((file) => `- ${changedFile(file)}`),
186
- },
187
- ]
71
+ /**
72
+ * What the reader answers on the review page: the describer's decisions, one
73
+ * on what the review left, one on what the operator delivered open, and the
74
+ * checks to do by hand.
75
+ */
76
+ function toAnswer(facts) {
77
+ const { decisions, manualChecks } = facts.description;
78
+ const count = decisions.length +
79
+ (facts.review.findings.some(({ nature }) => !isBlocking(nature)) ? 1 : 0) +
80
+ (openCount(facts) > 0 ? 1 : 0);
81
+ const items = [
82
+ ...(count > 0 ? [plural(count, "decision")] : []),
83
+ ...(manualChecks.length > 0
84
+ ? [`${plural(manualChecks.length, "check")} to do yourself`]
188
85
  : []),
189
86
  ];
190
- // A large change shows its groups, each list folded.
191
- const fold = files.length > foldedFiles;
192
- return [
193
- `Start with \`${start.file}\`: ${inert(start.why.trim())}`,
194
- ...sections.map(({ title, lines }) => fold
195
- ? folded(`<b>${html(title)}</b> · ${plural(lines.length, "file")}`, lines.join("\n"))
196
- : `**${inert(line(title))}**\n${lines.join("\n")}`),
197
- ].join("\n\n");
87
+ return items.length > 0 ? items.join(" and ") : "nothing to decide";
198
88
  }
199
- function judgment(facts) {
200
- const open = openItems(facts);
201
- const findings = facts.review.findings
202
- .filter(({ nature }) => !isBlocking(nature))
203
- .map(finding);
204
- const lists = [
205
- ["Spec interpretations to confirm", facts.interpretations.map(item)],
206
- ["Open, accepted by the operator", open],
207
- ["Non-blocking findings", findings],
208
- ["Deviations from the plan", facts.deviations.map(item)],
209
- ];
210
- const shown = lists
211
- .filter(([, items]) => items.length > 0)
212
- .map(([title, items]) => `**${title}**\n${items.join("\n")}`);
213
- const fixed = facts.resolved.length > 0
214
- ? [
215
- folded(`Resolved during the review rounds · ${facts.resolved.length}`, facts.resolved
216
- .map(({ summary, evidence }) => item(`${summary.trim()} Proof: ${evidence.trim()}`))
217
- .join("\n")),
218
- ]
219
- : [];
220
- const assumptions = facts.assumptions.length > 0
221
- ? [
222
- folded(`The plan's ${plural(facts.assumptions.length, "assumption")}`, facts.assumptions.map(item).join("\n")),
223
- ]
224
- : [];
225
- const sections = [...shown, ...fixed, ...assumptions];
226
- if (sections.length === 0)
227
- return `${rounds(facts)}. No spec interpretation, non-blocking finding, deviation from the plan or assumption.`;
228
- const left = open.length > 0 ? ", with what it still asked for left open" : "";
229
- return [`${rounds(facts)}${left}.`, ...sections].join("\n\n");
89
+ /** Where to review the change: its page, from the run's data. */
90
+ function reviewLink(facts) {
91
+ const path = reviewPath(facts.runId);
92
+ return facts.reviewPage
93
+ ? `**[Review this change](${facts.reviewPage})**: ${toAnswer(facts)}.`
94
+ : `**Review this change** on its page, ${toAnswer(facts)}: run \`factory ui\` where the run ran, and open \`${path}\`.`;
230
95
  }
231
- function screenshots({ description, screenshotsPending, }) {
232
- const shots = description.screenshots;
233
- if (shots.length === 0)
234
- return `No screenshots: ${inert(description.noScreenshots?.trim() ?? "")}`;
235
- if (screenshotsPending)
236
- return `_Attaching ${plural(shots.length, "screenshot")}…_`;
237
- return shots
238
- .map(({ file, caption }) =>
239
- // A backslash would escape the closing underscore. Each image is a
240
- // paragraph of its own, as gh attached them in a real run; a line
241
- // that starts with `![` or `_` opens no code block or comment.
242
- `![${alt(caption)}](${file})\n\n_${line(caption).replaceAll("\\", "\\\\")}_`)
243
- .join("\n\n");
96
+ /** The review page's address, relative to where `factory ui` serves. */
97
+ export function reviewPath(runId) {
98
+ return `/review?run=${encodeURIComponent(runId)}`;
244
99
  }
245
- function evidence(facts) {
246
- const met = metCriteria(facts);
247
- const total = facts.criteria.length;
248
- const checks = [
249
- ...(facts.checks.length > 0
250
- ? [
251
- `passed: ${facts.checks.map(({ name, command, durationMs }) => `${name} (\`${command.join(" ")}\`, ${seconds(durationMs)})`).join(", ")}`,
252
- ]
253
- : []),
254
- ...(facts.skippedChecks.length > 0
255
- ? [
256
- `skipped, no change matching their files: ${facts.skippedChecks.join(", ")}`,
257
- ]
258
- : []),
259
- ];
260
- const criteria = facts.criteria.map(({ id, text }) => {
261
- const judged = facts.review.criteria.find((criterion) => criterion.id === id);
262
- const unmet = judged?.status === "not_met" ? "Not met: " : "";
263
- return `| ${cell(`${id}: ${text}`)} | ${cell(`${unmet}${judged?.evidence ?? ""}`)} |`;
264
- });
265
- return [
266
- screenshots(facts),
267
- `**${met} / ${total} ${total === 1 ? "criterion" : "criteria"} met**, checked by an independent review${met < total ? "; the others are open, accepted by the operator" : ""}.`,
268
- `Checks ${checks.join("; ")}.`,
269
- folded("Each criterion and the review's evidence", `| Criterion | Evidence |\n|---|---|\n${criteria.join("\n")}`),
270
- ].join("\n\n");
271
- }
272
- /** Everything needed to review the change without remembering its issue or opening the run. */
100
+ /**
101
+ * The pull request's body: what it risks and proves at a glance, and the
102
+ * link to its review page, which shows everything else from the run.
103
+ */
273
104
  export function pullRequestBody(facts) {
274
- const { description } = facts;
275
- const { danger } = description;
276
- const open = openItems(facts).length;
105
+ const { danger } = facts.description;
106
+ const open = openCount(facts);
277
107
  return `${[
278
108
  ...(open > 0
279
109
  ? [
280
- `> [!WARNING]\n> **Delivered with ${plural(open, "open review finding")}**, accepted by the operator: see Needs your judgment.`,
110
+ `> [!WARNING]\n> **Delivered with ${plural(open, "open review finding")}**, accepted by the operator.`,
281
111
  ]
282
112
  : []),
283
113
  ...(danger.door === "one_way"
284
114
  ? [`> [!CAUTION]\n> **One-way door:** ${cell(danger.reason)}`]
285
115
  : []),
286
- ...(facts.interpretations.length > 0
287
- ? [
288
- `> [!IMPORTANT]\n> **${plural(facts.interpretations.length, "spec interpretation")} to confirm**, chosen by the plan: see Needs your judgment.`,
289
- ]
290
- : []),
116
+ reviewLink(facts),
291
117
  glance(facts),
292
- `## Why\n\n${inert(facts.objective.trim())}`,
293
- `## What changes\n\n${description.changes.map(item).join("\n")}`,
294
- `## How it works\n\n${howItWorks(description)}`,
295
- `## Merge danger\n\n${mergeDanger(description)}`,
296
- `## Review guide\n\n${reviewGuide(facts)}`,
297
- `### Needs your judgment\n\n${judgment(facts)}`,
298
- `## Evidence\n\n${evidence(facts)}`,
299
118
  ].join("\n\n")}\n`;
300
119
  }
301
- /** How many readings of the spec the plan chose, as the terminal shows them once the pull request is open. */
302
- export function interpretationsLine(count) {
303
- return `Spec interpretations to confirm: ${count}, in Needs your judgment`;
304
- }
305
120
  /** The danger of merging, as the terminal shows it once the pull request is open. */
306
121
  export function mergeDangerLine({ danger }) {
307
122
  return `Merge danger: ${danger.door === "one_way" ? "one-way" : "two-way"} door, blast radius ${danger.blastRadius}`;
@@ -1 +1 @@
1
- {"version":3,"file":"pull-request.js","sourceRoot":"","sources":["../../src/domain/pull-request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pull-request.js","sourceRoot":"","sources":["../../src/domain/pull-request.ts"],"names":[],"mappings":"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"}