@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
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/system/github.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/system/github.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ export type KeptCheck = CheckResult & {
6
6
  };
7
7
  /** Keeps `text` in the run's directory, at `path` within it; returns where, absolute. */
8
8
  export declare function keepInRun(runDir: string, path: string, text: string): Promise<string>;
9
+ /** A file the run kept, as text. */
10
+ export declare function readKept(file: string): Promise<string>;
9
11
  /** Keeps what each check wrote in `checks/<n>-<name>.log` of the run's directory. */
10
12
  export declare function keepCheckOutputs(runDir: string, passed: PassedCheck[]): Promise<KeptCheck[]>;
11
13
  /**
@@ -15,6 +17,18 @@ export declare function keepCheckOutputs(runDir: string, passed: PassedCheck[]):
15
17
  export declare function keepFailedCheck(runDir: string, name: string, output: string): Promise<string>;
16
18
  /** The run's folder where the describing agent puts its screenshots, created empty. */
17
19
  export declare function screenshotsFolder(runDir: string): Promise<string>;
20
+ /**
21
+ * Screenshot `file` of `folder`, with its media type: `undefined` when it is
22
+ * no image file of its own there, a link included, or is over `maxBytes`.
23
+ */
24
+ export declare function readScreenshot(folder: string, file: string, maxBytes: number): Promise<{
25
+ body: Buffer;
26
+ type: string;
27
+ } | undefined>;
28
+ /** The answers of a run's review page, as kept: `undefined` before the first, or when they are no JSON. */
29
+ export declare function readAnswers(runDir: string): Promise<unknown>;
30
+ /** Keeps the answers of a run's review page, replacing the file whole. */
31
+ export declare function keepAnswers(runDir: string, answers: unknown): Promise<void>;
18
32
  /**
19
33
  * What is wrong with the screenshots `files` of `folder`: a folder or a file
20
34
  * that is a link (which could lead anywhere on the machine), a file missing,
@@ -1,4 +1,5 @@
1
- import { lstat, mkdir, open, readdir, realpath, writeFile, } from "node:fs/promises";
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, mkdir, open, readdir, readFile, realpath, rename, writeFile, } from "node:fs/promises";
2
3
  import { basename, dirname, join } from "node:path";
3
4
  /** Keeps `text` in the run's directory, at `path` within it; returns where, absolute. */
4
5
  export async function keepInRun(runDir, path, text) {
@@ -7,6 +8,10 @@ export async function keepInRun(runDir, path, text) {
7
8
  await writeFile(file, text);
8
9
  return file;
9
10
  }
11
+ /** A file the run kept, as text. */
12
+ export function readKept(file) {
13
+ return readFile(file, "utf8");
14
+ }
10
15
  /** Keeps what each check wrote in `checks/<n>-<name>.log` of the run's directory. */
11
16
  export function keepCheckOutputs(runDir, passed) {
12
17
  return Promise.all(passed.map(async ({ output, ...check }, index) => ({
@@ -33,13 +38,51 @@ export async function screenshotsFolder(runDir) {
33
38
  await mkdir(folder, { recursive: true });
34
39
  return folder;
35
40
  }
36
- /** The first bytes of a PNG, JPEG, GIF or WebP image. */
37
- function isImage(start) {
41
+ /** The media type of a PNG, JPEG, GIF or WebP image, from its first bytes; `undefined` for anything else. */
42
+ function imageType(start) {
38
43
  const ascii = (from, to) => start.subarray(from, to).toString("latin1");
39
- return (ascii(0, 8) === "\x89PNG\r\n\x1a\n" ||
40
- ascii(0, 3) === "\xff\xd8\xff" ||
41
- ascii(0, 4) === "GIF8" ||
42
- (ascii(0, 4) === "RIFF" && ascii(8, 12) === "WEBP"));
44
+ if (ascii(0, 8) === "\x89PNG\r\n\x1a\n")
45
+ return "image/png";
46
+ if (ascii(0, 3) === "\xff\xd8\xff")
47
+ return "image/jpeg";
48
+ if (ascii(0, 4) === "GIF8")
49
+ return "image/gif";
50
+ if (ascii(0, 4) === "RIFF" && ascii(8, 12) === "WEBP")
51
+ return "image/webp";
52
+ return undefined;
53
+ }
54
+ /**
55
+ * Screenshot `file` of `folder`, with its media type: `undefined` when it is
56
+ * no image file of its own there, a link included, or is over `maxBytes`.
57
+ */
58
+ export async function readScreenshot(folder, file, maxBytes) {
59
+ if (basename(file) !== file)
60
+ return undefined;
61
+ const path = join(folder, file);
62
+ const found = await lstat(path).catch(() => undefined);
63
+ if (!found?.isFile() || found.size > maxBytes)
64
+ return undefined;
65
+ const body = await readFile(path);
66
+ const type = imageType(body);
67
+ return type ? { body, type } : undefined;
68
+ }
69
+ /** The answers of a run's review page, as kept: `undefined` before the first, or when they are no JSON. */
70
+ export async function readAnswers(runDir) {
71
+ try {
72
+ return JSON.parse(await readFile(join(runDir, "answers.json"), "utf8"));
73
+ }
74
+ catch (error) {
75
+ if (error instanceof SyntaxError ||
76
+ error.code === "ENOENT")
77
+ return undefined;
78
+ throw error;
79
+ }
80
+ }
81
+ /** Keeps the answers of a run's review page, replacing the file whole. */
82
+ export async function keepAnswers(runDir, answers) {
83
+ const temporary = join(runDir, `answers-${randomUUID()}.tmp`);
84
+ await writeFile(temporary, `${JSON.stringify(answers)}\n`, { mode: 0o600 });
85
+ await rename(temporary, join(runDir, "answers.json"));
43
86
  }
44
87
  /**
45
88
  * What is wrong with the screenshots `files` of `folder`: a folder or a file
@@ -80,7 +123,7 @@ export async function screenshotProblems(folder, files, maxBytes) {
80
123
  finally {
81
124
  await handle.close();
82
125
  }
83
- if (!isImage(start))
126
+ if (!imageType(start))
84
127
  problems.push(`screenshots: ${file} is not a PNG, JPEG, GIF or WebP image`);
85
128
  }
86
129
  return problems;
@@ -1 +1 @@
1
- {"version":3,"file":"run-files.js","sourceRoot":"","sources":["../../src/system/run-files.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOpD,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,IAAY,EACZ,IAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,MAAqB;IAErB,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACjD,GAAG,KAAK;QACR,UAAU,EAAE,MAAM,SAAS,CACzB,MAAM,EACN,UAAU,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EACjD,MAAM,CACP;KACF,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,IAAY,EACZ,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,OAAO,SAAS,CACd,MAAM,EACN,iBAAiB,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EACrD,MAAM,CACP,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yDAAyD;AACzD,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CACzC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,CACL,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,mBAAmB;QACnC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,cAAc;QAC9B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM;QACtB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,CACpD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,KAAe,EACf,QAAgB;IAEhB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClE,OAAO,CAAC,gBAAgB,MAAM,uCAAuC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,mDAAmD;IACnD,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,qBAAqB,MAAM,EAAE,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,QAAQ,KAAK,oBAAoB,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CACX,gBAAgB,IAAI,QAAQ,KAAK,CAAC,IAAI,gBAAgB,QAAQ,EAAE,CACjE,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjB,QAAQ,CAAC,IAAI,CACX,gBAAgB,IAAI,wCAAwC,CAC7D,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"run-files.js","sourceRoot":"","sources":["../../src/system/run-files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clemrig/factory",
3
- "version": "0.18.3",
3
+ "version": "0.19.0",
4
4
  "description": "Take a repository's issues from spec to pull request with agents, watch them on a local Kanban, and run the repository's own workflows",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,7 +39,7 @@
39
39
  "prepack": "npm run build"
40
40
  },
41
41
  "dependencies": {
42
- "@clemrig/factory-ui": "0.3.0",
42
+ "@clemrig/factory-ui": "0.4.0",
43
43
  "@clemrig/flow": "0.11.0",
44
44
  "@clemrig/flow-ui": "0.12.0"
45
45
  }
@@ -1,23 +1,24 @@
1
- You describe an approved change for its pull request. Its reader reviews it days later and remembers nothing of
2
- the issue: from the pull request alone, they must understand what the change does, how it works, how dangerous it
3
- is to merge, and see it when it shows. You never change the repository. Write every text of your answer in the
1
+ You describe an approved change for its review page, which its pull request links to. Its reader reviews it days
2
+ later and remembers nothing of the issue: from that page alone, they must understand what the change does, how it
3
+ works, how dangerous it is to merge, see it when it shows, and decide what only a person can. You never change the repository. Write every text of your answer in the
4
4
  language of the spec's content, even when the request, the code or these instructions use another; keep code,
5
5
  paths and identifiers as they are.
6
6
 
7
7
  Read the repository's agent instructions: `AGENTS.md` at the root and in the directories the change touches.
8
8
  Ignore `.factory/`, except the files this request names.
9
9
 
10
- The request gives the spec, the plan, the change, the checks that passed, the review that approved it and
11
- `deviations`, where the implementation departed from the plan:
10
+ The request gives the spec, the plan, `interpretations`, its readings of the spec, numbered `I1`…, the change, the
11
+ checks that passed, the review that approved it and `deviations`, where the implementation departed from the plan,
12
+ numbered `D1`…:
12
13
 
13
14
  - `changes` lists the changed files with their added and removed lines. A small change comes with its whole diff in
14
15
  `diff`; a large one (`large` is true) with `diffFile`, the path of its diff.
15
16
  - `checks` gives each check's command and `outputFile`, where the run kept what it wrote.
16
17
 
17
- Read the code: describe what the change does, not what anyone said it does. The pull request already shows, from
18
+ Read the code: describe what the change does, not what anyone said it does. The review page already shows, from
18
19
  the run, the spec's objective, each acceptance criterion with the review's evidence, the checks, the review's
19
- findings, the deviations, and the plan's interpretations of the spec and risks: do not repeat them. When the
20
- review still asks for changes, the operator delivers the change anyway and the pull request lists them as open:
20
+ findings, and, word for word, the interpretations, the deviations and the plan's risks: do not repeat them. When the
21
+ review still asks for changes, the operator delivers the change anyway and the page lists them as open:
21
22
  weigh them in `danger`, without listing them again.
22
23
 
23
24
  Write for that reader: name things by what they do, an identifier only beside its meaning, and say what each item
@@ -51,11 +52,34 @@ Answer with:
51
52
  a package to publish; empty if nothing.
52
53
  - `guide`: `start`, the changed file to read first and why; `groups`, the changed files in the order to read them,
53
54
  each group with a short `title` such as "Core logic", "Wiring", "Tests" or "Docs". Give each file once, with its
54
- path as `changes` gives it; the pull request lists the files you leave out under "Other files".
55
+ path as `changes` gives it; the page lists the files you leave out under "Other files".
55
56
  - `screenshots`, or, without any, `noScreenshots` with the reason; leave `noScreenshots` out when there are some.
57
+ - `decisions`: what the reader must decide before merging, one card each, by this rule, and nothing else:
58
+ - `beyond_spec`: each change the spec does not ask for, such as a dependency raised, a behavior changed beside
59
+ the one it changes, or a file outside its scope;
60
+ - `changed_test`: each test that existed before whose expectation changed: an assertion removed, a value or a
61
+ case changed; say whether it now proves less than before;
62
+ - `spec_reading`: each place where the change reads the spec beyond its letter, in `interpretations` or in the
63
+ code.
64
+
65
+ None when nothing applies: the page shows every other interpretation and deviation word for word. Each has a
66
+ `title`, the decision in a sentence; `criterion`, the id of the criterion it bears on, if one; `advice`, `accept`
67
+ or `revise`, and `recommendation`, why, in a sentence or two; `why`, why it needs a person; `source`, the id of
68
+ the interpretation or deviation it comes from, if one; `file`, the changed file to open, if one; and `visual`,
69
+ what its card shows, with the fields of its `kind` only:
70
+ - `reading`: `spec`, the spec's words, quoted exactly, and `read`, how the change reads them;
71
+ - `diff`: `file`, a changed file, and `from` and `to`, lines of its new version (of its old one, for a deleted
72
+ file), 60 at most, which the page shows as the diff has them, with the lines removed just before each: to show
73
+ a removal, include the line that follows it;
74
+ - `screenshots`: `files`, screenshots of yours that show it;
75
+ - `list`: `items`, a few short items.
76
+ - `manualChecks`: what only a person can check before merging, because the run could not, as the review's evidence
77
+ and the plan's risks tell it: a real phone or browser where the review emulated one, real data, a sound, a third
78
+ party. Each has a `title`, what to do, in a sentence; `expect`, what should happen; and `why`, why the run could
79
+ not check it. None when the run checked everything that matters.
56
80
 
57
81
  Only `visuals` hold code fences' content: write no code fence, of backticks or tildes, or HTML comment anywhere
58
- else. The pull request's body must stay under 60,000 characters.
82
+ else.
59
83
 
60
84
  ## Screenshots
61
85
 
@@ -67,11 +91,8 @@ Otherwise, start the application as the repository's instructions say, and do no
67
91
  show a state, use what the repository's instructions provide for tests, or create your own data. Use the request's
68
92
  `browser` when it gives one, a command line (run it with `--help` first), or else the browser tools you have. Save
69
93
  each image in the folder `screenshots` names, then give its file name, starting with a letter or a digit and made of
70
- letters, digits, `.`, `-` and `_`, and its caption, in a sentence: PNG, JPEG, GIF or WebP, 10 MB at most, 50 at
71
- most, each a file of its own. Stop everything you started, servers and browsers, before you answer.
72
-
73
- When `repository.public` is true, anyone can see these images: show only test or seed data, never a secret, a
74
- token or a person's data; when you cannot, take none and say why.
94
+ letters, digits, `.`, `-` and `_`, and its caption, in a sentence: PNG, JPEG, GIF or WebP, 10 MB at most, each a
95
+ file of its own. Stop everything you started, servers and browsers, before you answer.
75
96
 
76
97
  Take none when nothing visible changed, when the application does not start or when you have no browser, and give
77
98
  the reason in `noScreenshots`.