@clemrig/factory 0.18.3 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -23
- package/dist/app/board.js +1 -0
- package/dist/app/board.js.map +1 -1
- package/dist/app/factory.d.ts +2 -0
- package/dist/app/factory.js +5 -1
- package/dist/app/factory.js.map +1 -1
- package/dist/app/review.d.ts +16 -0
- package/dist/app/review.js +87 -0
- package/dist/app/review.js.map +1 -0
- package/dist/app/spec-page.d.ts +11 -0
- package/dist/app/spec-page.js +37 -0
- package/dist/app/spec-page.js.map +1 -0
- package/dist/app/workflows/implement.js +3 -7
- package/dist/app/workflows/implement.js.map +1 -1
- package/dist/app/workflows/issue-save.d.ts +4 -1
- package/dist/app/workflows/issue-save.js +35 -4
- package/dist/app/workflows/issue-save.js.map +1 -1
- package/dist/app/workflows/stages/deliver.d.ts +5 -4
- package/dist/app/workflows/stages/deliver.js +47 -53
- package/dist/app/workflows/stages/deliver.js.map +1 -1
- package/dist/app/workflows/stages/prepare.js +11 -7
- package/dist/app/workflows/stages/prepare.js.map +1 -1
- package/dist/app/workflows/stages/resume.js +0 -4
- package/dist/app/workflows/stages/resume.js.map +1 -1
- package/dist/app/workflows/stages/run.d.ts +1 -2
- package/dist/app/workflows/tidy.js +2 -3
- package/dist/app/workflows/tidy.js.map +1 -1
- package/dist/cli/ui.d.ts +5 -2
- package/dist/cli/ui.js +24 -5
- package/dist/cli/ui.js.map +1 -1
- package/dist/domain/board.d.ts +6 -0
- package/dist/domain/board.js +5 -1
- package/dist/domain/board.js.map +1 -1
- package/dist/domain/description.d.ts +57 -5
- package/dist/domain/description.js +133 -12
- package/dist/domain/description.js.map +1 -1
- package/dist/domain/diff.d.ts +8 -0
- package/dist/domain/diff.js +90 -0
- package/dist/domain/diff.js.map +1 -0
- package/dist/domain/pull-request.d.ts +9 -21
- package/dist/domain/pull-request.js +43 -228
- package/dist/domain/pull-request.js.map +1 -1
- package/dist/domain/review-page.d.ts +171 -0
- package/dist/domain/review-page.js +200 -0
- package/dist/domain/review-page.js.map +1 -0
- package/dist/domain/spec-page.d.ts +132 -0
- package/dist/domain/spec-page.js +155 -0
- package/dist/domain/spec-page.js.map +1 -0
- package/dist/system/environment.d.ts +6 -0
- package/dist/system/environment.js +19 -0
- package/dist/system/environment.js.map +1 -1
- package/dist/system/factory.d.ts +2 -0
- package/dist/system/factory.js +4 -0
- package/dist/system/factory.js.map +1 -1
- package/dist/system/git.d.ts +5 -1
- package/dist/system/git.js +19 -2
- package/dist/system/git.js.map +1 -1
- package/dist/system/github.d.ts +3 -12
- package/dist/system/github.js +7 -31
- package/dist/system/github.js.map +1 -1
- package/dist/system/issues.d.ts +10 -0
- package/dist/system/issues.js +57 -1
- package/dist/system/issues.js.map +1 -1
- package/dist/system/run-files.d.ts +14 -0
- package/dist/system/run-files.js +51 -8
- package/dist/system/run-files.js.map +1 -1
- package/package.json +2 -2
- package/prompts/describe.md +36 -15
- package/templates/init/gitignore +1 -0
- package/templates/skills/issue/SKILL.md +49 -7
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { agent, code, gate,
|
|
1
|
+
import { agent, code, gate, z, } from "@clemrig/flow";
|
|
2
2
|
import { descriptionOutput, descriptionProblems, maxScreenshotBytes, } from "../../../domain/description.js";
|
|
3
|
-
import {
|
|
3
|
+
import { mergeDangerLine, pullRequestBody, reviewPath, } from "../../../domain/pull-request.js";
|
|
4
|
+
import { uiUrl } from "../../../system/environment.js";
|
|
4
5
|
import * as git from "../../../system/git.js";
|
|
5
6
|
import * as github from "../../../system/github.js";
|
|
6
|
-
import { screenshotProblems } from "../../../system/run-files.js";
|
|
7
|
+
import { readKept, screenshotProblems } from "../../../system/run-files.js";
|
|
7
8
|
import { browserContext, readers, reading, runningApp } from "./agents.js";
|
|
8
|
-
import { facts,
|
|
9
|
+
import { facts, reviewRounds, short, specCommitOf } from "./run.js";
|
|
9
10
|
/** One conversation for the description, a new one once it changed the repository. */
|
|
10
11
|
function describeSession(state) {
|
|
11
12
|
const restarts = state.retries?.["describe.modified"] ?? 0;
|
|
@@ -23,30 +24,35 @@ export function describer(profile, app) {
|
|
|
23
24
|
session: describeSession,
|
|
24
25
|
context: ({ state }) => {
|
|
25
26
|
const f = facts(state);
|
|
27
|
+
// Numbered, so that a decision names the one it comes from.
|
|
28
|
+
const numbered = (prefix, texts) => texts.map((text, index) => ({ id: `${prefix}${index + 1}`, text }));
|
|
26
29
|
return {
|
|
27
30
|
issue: f.slug,
|
|
28
31
|
spec: f.spec,
|
|
29
32
|
plan: f.plan,
|
|
33
|
+
interpretations: numbered("I", f.plan.interpretations),
|
|
30
34
|
changes: f.changes,
|
|
31
35
|
checks: f.checks,
|
|
32
36
|
review: f.review,
|
|
33
|
-
deviations: f.implementation.deviations,
|
|
34
|
-
repository: { public: f.repository.public },
|
|
37
|
+
deviations: numbered("D", f.implementation.deviations),
|
|
35
38
|
screenshots: f.screenshotsDir,
|
|
36
39
|
...browserContext(state),
|
|
37
40
|
};
|
|
38
41
|
},
|
|
39
42
|
})));
|
|
40
43
|
}
|
|
41
|
-
/**
|
|
42
|
-
function
|
|
44
|
+
/** Where others open the run's review page, when `FACTORY_UI_URL` says where `factory ui` is. */
|
|
45
|
+
function reviewPage(runId) {
|
|
46
|
+
const base = uiUrl();
|
|
47
|
+
return base && new URL(reviewPath(runId).slice(1), base).href;
|
|
48
|
+
}
|
|
49
|
+
/** What the pull request shows, from the run's data. */
|
|
50
|
+
function pullRequestFacts(state) {
|
|
43
51
|
const f = facts(state);
|
|
52
|
+
const page = reviewPage(state.id);
|
|
44
53
|
return {
|
|
45
|
-
objective: f.objective,
|
|
46
54
|
criteria: f.criteria,
|
|
47
55
|
deviations: f.implementation.deviations,
|
|
48
|
-
interpretations: f.plan.interpretations,
|
|
49
|
-
assumptions: f.plan.risks,
|
|
50
56
|
review: f.review,
|
|
51
57
|
acceptedReview: f.acceptedReview === true,
|
|
52
58
|
reviewRounds: reviewRounds(state),
|
|
@@ -54,16 +60,22 @@ function pullRequestFacts(state, description, pending) {
|
|
|
54
60
|
checks: f.checks,
|
|
55
61
|
skippedChecks: f.skippedChecks,
|
|
56
62
|
files: f.changes.files,
|
|
57
|
-
description,
|
|
58
|
-
screenshotsPending: pending,
|
|
63
|
+
description: f.description,
|
|
59
64
|
links: {
|
|
60
65
|
spec: `${f.repository.url}/blob/${specCommitOf(f)}/${f.specPath}`,
|
|
61
66
|
plan: `${f.repository.url}/blob/${f.planCommit}/${f.planPath}`,
|
|
62
67
|
},
|
|
63
68
|
runId: state.id,
|
|
69
|
+
...(page ? { reviewPage: page } : {}),
|
|
64
70
|
};
|
|
65
71
|
}
|
|
66
|
-
/**
|
|
72
|
+
/** The change's whole diff: a large one, from the file the review read. */
|
|
73
|
+
export function diffOf({ changes }) {
|
|
74
|
+
return changes.large
|
|
75
|
+
? readKept(changes.diffFile)
|
|
76
|
+
: Promise.resolve(changes.diff);
|
|
77
|
+
}
|
|
78
|
+
/** Changed files only in the guide and the decisions, distinct screenshots of their folder. */
|
|
67
79
|
export const judgeDescription = gate(["ok", "invalid"], async ({ state }) => {
|
|
68
80
|
const parsed = descriptionOutput.safeParse(state.output);
|
|
69
81
|
if (!parsed.success)
|
|
@@ -72,14 +84,17 @@ export const judgeDescription = gate(["ok", "invalid"], async ({ state }) => {
|
|
|
72
84
|
reason: `Invalid structured output:\n${z.prettifyError(parsed.error)}`,
|
|
73
85
|
};
|
|
74
86
|
const description = parsed.data;
|
|
75
|
-
const
|
|
87
|
+
const f = facts(state);
|
|
76
88
|
const problems = [
|
|
77
|
-
...descriptionProblems(description,
|
|
78
|
-
|
|
89
|
+
...descriptionProblems(description, {
|
|
90
|
+
files: f.changes.files,
|
|
91
|
+
diff: await diffOf(f),
|
|
92
|
+
criteria: f.criteria,
|
|
93
|
+
interpretations: f.plan.interpretations.length,
|
|
94
|
+
deviations: f.implementation.deviations.length,
|
|
95
|
+
}),
|
|
96
|
+
...(await screenshotProblems(f.screenshotsDir, description.screenshots.map(({ file }) => file), maxScreenshotBytes)),
|
|
79
97
|
];
|
|
80
|
-
const length = pullRequestBody(pullRequestFacts(state, description, false)).length;
|
|
81
|
-
if (length > maxBodyLength)
|
|
82
|
-
problems.push(`The pull request's body would have ${length} characters, over ${maxBodyLength}: shorten the description`);
|
|
83
98
|
if (problems.length > 0)
|
|
84
99
|
return {
|
|
85
100
|
outcome: "invalid",
|
|
@@ -98,52 +113,30 @@ export const judgeDescription = gate(["ok", "invalid"], async ({ state }) => {
|
|
|
98
113
|
* Commits the changes with the plan's subject, force-pushes the branch, opens
|
|
99
114
|
* or updates its pull request, then returns to the main branch.
|
|
100
115
|
*/
|
|
101
|
-
export const deliver = code(["done"
|
|
102
|
-
const { slug, base, plan, specPath
|
|
116
|
+
export const deliver = code(["done"], async ({ dir, state, log }) => {
|
|
117
|
+
const { slug, base, plan, specPath } = facts(state);
|
|
103
118
|
const commit = await git.commit(dir, `${plan.commit}\n\nSpec: ${specPath}`);
|
|
104
119
|
log(`Committed "${plan.commit}" as ${short(commit)}`);
|
|
105
120
|
await git.forcePush(dir, slug);
|
|
106
121
|
log(`Pushed ${slug}, replacing any earlier version of the branch`);
|
|
107
|
-
// Its screenshots are attached once it is open: a failed upload leaves the
|
|
108
|
-
// pull request recorded, and resuming attaches them.
|
|
109
|
-
const attach = description.screenshots.length > 0;
|
|
110
122
|
const pullRequest = await github.openPullRequest(dir, {
|
|
111
123
|
base,
|
|
112
124
|
head: slug,
|
|
113
125
|
title: plan.commit,
|
|
114
|
-
body: pullRequestBody(pullRequestFacts(state
|
|
126
|
+
body: pullRequestBody(pullRequestFacts(state)),
|
|
115
127
|
});
|
|
116
128
|
log(`Pull request: ${pullRequest}`);
|
|
117
129
|
await git.switchTo(dir, base);
|
|
118
130
|
log(`Back on ${base}`);
|
|
119
131
|
return {
|
|
120
|
-
outcome:
|
|
121
|
-
reason:
|
|
122
|
-
? "Pull request open, its screenshots to attach"
|
|
123
|
-
: "Pull request open",
|
|
132
|
+
outcome: "done",
|
|
133
|
+
reason: "Pull request open",
|
|
124
134
|
data: { pullRequest },
|
|
125
135
|
};
|
|
126
136
|
});
|
|
127
|
-
/** Uploads the screenshots into the open pull request's body. */
|
|
128
|
-
export const attach = step(async ({ dir, state, log }) => {
|
|
129
|
-
const { pullRequest, description, screenshotsDir } = facts(state);
|
|
130
|
-
const files = description.screenshots.map(({ file }) => file);
|
|
131
|
-
try {
|
|
132
|
-
await github.attachImages(screenshotsDir, pullRequest, pullRequestBody(pullRequestFacts(state, description, false)), files);
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
// gh writes the body even when only some uploads succeeded: the pull
|
|
136
|
-
// request says again that its screenshots are coming.
|
|
137
|
-
await github
|
|
138
|
-
.editBody(dir, pullRequest, pullRequestBody(pullRequestFacts(state, description, true)))
|
|
139
|
-
.catch((restore) => log(`Could not put back the pull request's body: ${message(restore)}`));
|
|
140
|
-
throw error;
|
|
141
|
-
}
|
|
142
|
-
log(`Attached ${files.length} screenshot${files.length === 1 ? "" : "s"} to ${pullRequest}`);
|
|
143
|
-
});
|
|
144
137
|
/** The delivered pull request, its review, checks and merge danger; nothing before it is open. */
|
|
145
138
|
export function deliveryResult(state) {
|
|
146
|
-
const { pullRequest, checks, description, acceptedReview
|
|
139
|
+
const { pullRequest, checks, description, acceptedReview } = facts(state);
|
|
147
140
|
if (typeof pullRequest !== "string")
|
|
148
141
|
return [];
|
|
149
142
|
const rounds = reviewRounds(state);
|
|
@@ -152,16 +145,17 @@ export function deliveryResult(state) {
|
|
|
152
145
|
: `after ${rounds} round${rounds === 1 ? "" : "s"} of changes`;
|
|
153
146
|
return [
|
|
154
147
|
`Pull request: ${pullRequest}`,
|
|
148
|
+
// Runs delivered by an earlier factory have no description, nor its page.
|
|
149
|
+
...(description
|
|
150
|
+
? [
|
|
151
|
+
`Review page: ${reviewPage(state.id) ?? `${reviewPath(state.id)} in factory ui`}`,
|
|
152
|
+
]
|
|
153
|
+
: []),
|
|
155
154
|
acceptedReview
|
|
156
155
|
? `Review: delivered by the operator with open findings ${after}`
|
|
157
156
|
: `Review: approved ${after}`,
|
|
158
157
|
`Checks passed: ${checks.map(({ name }) => name).join(", ")}`,
|
|
159
|
-
// Runs delivered by an earlier factory have no description, and their
|
|
160
|
-
// plans no interpretations.
|
|
161
158
|
...(description ? [mergeDangerLine(description)] : []),
|
|
162
|
-
...(plan?.interpretations?.length
|
|
163
|
-
? [interpretationsLine(plan.interpretations.length)]
|
|
164
|
-
: []),
|
|
165
159
|
];
|
|
166
160
|
}
|
|
167
161
|
//# sourceMappingURL=deliver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.js","sourceRoot":"","sources":["../../../../src/app/workflows/stages/deliver.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,IAAI,EACJ,IAAI,EAGJ,
|
|
1
|
+
{"version":3,"file":"deliver.js","sourceRoot":"","sources":["../../../../src/app/workflows/stages/deliver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { code, step } from "@clemrig/flow";
|
|
2
|
-
import { ghVersionProblem } from "../../../domain/pull-request.js";
|
|
3
2
|
import { parseSpec } from "../../../domain/spec.js";
|
|
4
3
|
import { isTidyBranch, tidySlug } from "../../../domain/tidy.js";
|
|
5
4
|
import { failureFeedback, } from "../../../domain/verification.js";
|
|
6
5
|
import { runBrowser } from "../../../system/browser.js";
|
|
7
6
|
import { runChecks } from "../../../system/checks.js";
|
|
7
|
+
import { uiUrl } from "../../../system/environment.js";
|
|
8
8
|
import * as git from "../../../system/git.js";
|
|
9
9
|
import * as github from "../../../system/github.js";
|
|
10
10
|
import { artifactPath, hasArtifact, isIssue, readArtifact, } from "../../../system/issues.js";
|
|
@@ -25,14 +25,18 @@ async function baseProblems(dir, base) {
|
|
|
25
25
|
problems.push(`${base} must match origin/${base}: push or pull first`);
|
|
26
26
|
return problems;
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* The repository on GitHub, when gh is logged in to open its pull request and
|
|
30
|
+
* the review page it links to has a valid address; otherwise why not.
|
|
31
|
+
*/
|
|
29
32
|
async function gitHubProblems(dir) {
|
|
30
33
|
const problems = [];
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
problems.push(
|
|
34
|
+
try {
|
|
35
|
+
uiUrl();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
problems.push(message(error));
|
|
39
|
+
}
|
|
36
40
|
if (!(await github.isAuthenticated(dir))) {
|
|
37
41
|
problems.push("gh is not logged in: run gh auth login");
|
|
38
42
|
return { problems };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../../src/app/workflows/stages/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwB,IAAI,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../../src/app/workflows/stages/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwB,IAAI,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,eAAe,GAEhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,KAAK,GAAG,MAAM,wBAAwB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,YAAY,GACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAc,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,2GAA2G;AAC3G,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;QACzC,QAAQ,CAAC,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACnE,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjC,IACE,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9C,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,sBAAsB,IAAI,sBAAsB,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAW;IAEX,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,KAAK,EAAE,CAAC;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,4CAA4C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,kBAAkB,CAC/B,GAAW,EACX,IAAY,EACZ,IAAY,EACZ,YAAsB;IAEtB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC;YAAE,SAAS;QACzD,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;YAChC,QAAQ,CAAC,IAAI,CACX,SAAS,IAAI,eAAe,UAAU,mDAAmD,IAAI,8EAA8E,IAAI,GAAG,CACnL,CAAC;;YAEF,QAAQ,CAAC,IAAI,CACX,SAAS,IAAI,eAAe,UAAU,qFAAqF,IAAI,GAAG,CACnI,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB;IACrC,OAAO,IAAI,KAAK,CACd,CAAC,eAAe,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,KAAK,UAAU,SAAS,CACtB,GAAW,EACX,MAAuB,EACvB,IAAY,EACZ,GAAQ;IAER,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,GAAG,EACH,MAAM,EACN,EAAE,EACF,aAAa,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAClC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,mCAAmC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CACvG,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,EAAE,IAAI,EAAE,UAAU,EAAsC,EACxD,SAAiB,EACjB,IAAsB;IAEtB,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,UAAU;YACxC,MAAM,IAAI,KAAK,CACb,wBAAwB,SAAS,SAAS,MAAM,IAAI,UAAU,OAAO,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAC1I,CAAC;QACJ,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,iEAAiE;QACjE,IAAI,IAAI,KAAK,IAAI;YACf,QAAQ,CAAC,IAAI,CACX,SAAS,IAAI,oDAAoD,IAAI,oBAAoB,CAC1F,CAAC;QACJ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC;aACpD,IAAI,CAAC,IAAI,CAAC,EAAE;YACf,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,OAAO,EAAE,CAAC,EACxD,4CAA4C,IAAI,4BAA4B,CAC7E,CAAC;;YAEF,QAAQ,CAAC,IAAI,CACX,GAAG,CAAC,MAAM,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CACxE,CAAC;QACJ,IAAI,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;YACtC,QAAQ,CAAC,IAAI,CACX,SAAS,IAAI,4CAA4C,IAAI,sBAAsB,CACpF,CAAC;QACJ,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,UAAU;YACvE,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,GAAG,CACD,yBAAyB,IAAI,8BAA8B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,yBAAyB,CAC/G,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,YAAY,CAChB,GAAG,EACH,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,SAAS,IAAI,eAAe,EAC5B,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAC1C,CAAC;QACF,GAAG,CAAC,kBAAkB,IAAI,SAAS,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,UAAU;YACV,GAAG,SAAS;YACZ,IAAI;YACJ,UAAU;YACV,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;YACpC,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;SACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,MAAuB;IAEvB,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpE,GAAG,CAAC,yBAAyB,IAAI,+BAA+B,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CACtD,GAAG,EACH,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,SAAS,IAAI,eAAe,EAC5B,KAAK,IAAI,EAAE;YACT,qEAAqE;YACrE,sCAAsC;YACtC,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CACnD,YAAY,CAAC,MAAM,CAAC,CACrB,CAAC;YACF,IAAI,CAAC,OAAO;gBAAE,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACxD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC,CACF,CAAC;QACF,IAAI,OAAO;YACT,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,MAAM,EAAE,qCAAqC,OAAO,CAAC,GAAG,EAAE;gBAC1D,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;aAClC,CAAC;QACJ,GAAG,CAAC,kBAAkB,IAAI,SAAS,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,GAAG,IAAI,wCAAwC;YACvD,IAAI,EAAE;gBACJ,IAAI;gBACJ,UAAU;gBACV,GAAG,SAAS;gBACZ,IAAI;gBACJ,UAAU;gBACV,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;gBACpC,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;gBACpC,gBAAgB;aACjB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -9,10 +9,6 @@ import { facts, short, specCommitOf } from "./run.js";
|
|
|
9
9
|
export async function resumeProblem({ dir, state, }) {
|
|
10
10
|
if (state.stage === "prepare")
|
|
11
11
|
return undefined;
|
|
12
|
-
// Its pull request is open: only its screenshots remain to attach, from the
|
|
13
|
-
// run's folder, whatever the repository is on.
|
|
14
|
-
if (state.stage === "attach")
|
|
15
|
-
return undefined;
|
|
16
12
|
// Stopped once its last stage was done, such as by Ctrl-C.
|
|
17
13
|
const { pullRequest } = state.data;
|
|
18
14
|
if (typeof pullRequest === "string")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../../src/app/workflows/stages/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,GAAG,EACH,KAAK,GAC+B;IACpC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../../src/app/workflows/stages/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,10 +17,9 @@ export interface Facts {
|
|
|
17
17
|
/** The spec's Objective, which the pull request recalls. */
|
|
18
18
|
objective: string;
|
|
19
19
|
criteria: Criterion[];
|
|
20
|
-
/** The repository on GitHub: its page
|
|
20
|
+
/** The repository on GitHub: its page. */
|
|
21
21
|
repository: {
|
|
22
22
|
url: string;
|
|
23
|
-
public: boolean;
|
|
24
23
|
};
|
|
25
24
|
/** The agents' browser, when `.factory/` installs one. */
|
|
26
25
|
browser?: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineWorkflow, END, node, retry } from "@clemrig/flow";
|
|
2
2
|
import { TIDY } from "../../domain/tidy.js";
|
|
3
3
|
import { commitSpec, judgeChoice, release, scout, survey, tidyResult, } from "./stages/choose.js";
|
|
4
|
-
import {
|
|
4
|
+
import { deliver, describer, judgeDescription } from "./stages/deliver.js";
|
|
5
5
|
import { implementer, judgeImplementation } from "./stages/implement.js";
|
|
6
6
|
import { commitPlan, judgePlan, planner } from "./stages/plan.js";
|
|
7
7
|
import { prepareTidy } from "./stages/prepare.js";
|
|
@@ -67,8 +67,7 @@ export function tidy(definition) {
|
|
|
67
67
|
ok: "deliver",
|
|
68
68
|
invalid: retry("describe", 2),
|
|
69
69
|
}),
|
|
70
|
-
deliver: node(deliver, { done: END
|
|
71
|
-
attach: node(attach, { ok: END }),
|
|
70
|
+
deliver: node(deliver, { done: END }),
|
|
72
71
|
},
|
|
73
72
|
resumeProblem,
|
|
74
73
|
// Also called for a failed run, which opened no pull request.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tidy.js","sourceRoot":"","sources":["../../../src/app/workflows/tidy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EACL,UAAU,EACV,WAAW,EACX,OAAO,EACP,KAAK,EACL,MAAM,EACN,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"tidy.js","sourceRoot":"","sources":["../../../src/app/workflows/tidy.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/ui.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { Factory } from "../app/factory.js";
|
|
2
2
|
/**
|
|
3
|
-
* `factory ui`: serves the Kanban of the repository's issues,
|
|
4
|
-
* of its runs under `/runs/`,
|
|
3
|
+
* `factory ui`: serves the Kanban of the repository's issues, the dashboard
|
|
4
|
+
* of its runs under `/runs/`, each presented spec's page and each delivered
|
|
5
|
+
* run's review page, until Ctrl-C, on `port` or one the system chooses. It
|
|
6
|
+
* also answers the host of `FACTORY_UI_URL`, which a proxy such as
|
|
7
|
+
* `tailscale serve` keeps.
|
|
5
8
|
*/
|
|
6
9
|
export declare function ui(factory: Factory, port?: number, loadError?: string): Promise<number>;
|
package/dist/cli/ui.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { basename } from "node:path";
|
|
2
|
-
import { startFactoryUi } from "@clemrig/factory-ui";
|
|
2
|
+
import { startFactoryUi, } from "@clemrig/factory-ui";
|
|
3
3
|
import { dashboardHandler } from "@clemrig/flow-ui";
|
|
4
4
|
import { readBoard } from "../app/board.js";
|
|
5
|
+
import { uiAddress } from "../app/factory.js";
|
|
6
|
+
import { readReviewAnswers, readReviewPage, readReviewScreenshot, saveReviewAnswers, } from "../app/review.js";
|
|
5
7
|
import { presentResult } from "../app/runs.js";
|
|
8
|
+
import { readSpecAnswers, readSpecPage, saveSpecAnswers, } from "../app/spec-page.js";
|
|
6
9
|
/**
|
|
7
|
-
* `factory ui`: serves the Kanban of the repository's issues,
|
|
8
|
-
* of its runs under `/runs/`,
|
|
10
|
+
* `factory ui`: serves the Kanban of the repository's issues, the dashboard
|
|
11
|
+
* of its runs under `/runs/`, each presented spec's page and each delivered
|
|
12
|
+
* run's review page, until Ctrl-C, on `port` or one the system chooses. It
|
|
13
|
+
* also answers the host of `FACTORY_UI_URL`, which a proxy such as
|
|
14
|
+
* `tailscale serve` keeps.
|
|
9
15
|
*/
|
|
10
16
|
export async function ui(factory, port, loadError) {
|
|
11
17
|
const label = basename(factory.dir);
|
|
@@ -17,14 +23,27 @@ export async function ui(factory, port, loadError) {
|
|
|
17
23
|
// Mounted under `/runs/`: the Kanban is one level up.
|
|
18
24
|
home: { label: "Board", href: "../" },
|
|
19
25
|
});
|
|
26
|
+
const address = uiAddress();
|
|
20
27
|
const page = await startFactoryUi({
|
|
21
28
|
title: "factory",
|
|
22
29
|
label,
|
|
23
|
-
//
|
|
30
|
+
// What the factory computes is what the pages show: checked here, where both meet.
|
|
24
31
|
board: () => readBoard(factory, loadError),
|
|
25
32
|
runs,
|
|
33
|
+
review: {
|
|
34
|
+
page: (run) => readReviewPage(factory, run, (file) => `api/review/${encodeURIComponent(run)}/screenshots/${encodeURIComponent(file)}`),
|
|
35
|
+
answers: (run) => readReviewAnswers(factory, run),
|
|
36
|
+
saveAnswers: (run, answers) => saveReviewAnswers(factory, run, answers),
|
|
37
|
+
screenshot: (run, file) => readReviewScreenshot(factory, run, file),
|
|
38
|
+
},
|
|
39
|
+
spec: {
|
|
40
|
+
page: (issue) => readSpecPage(factory, issue),
|
|
41
|
+
answers: (issue) => readSpecAnswers(factory, issue),
|
|
42
|
+
saveAnswers: (issue, answers) => saveSpecAnswers(factory, issue, answers),
|
|
43
|
+
},
|
|
44
|
+
...(address ? { hosts: [address.host] } : {}),
|
|
26
45
|
}, port);
|
|
27
|
-
process.stdout.write(`factory ui: ${page.url} (runs: ${page.url}runs/;
|
|
46
|
+
process.stdout.write(`factory ui: ${page.url} (runs: ${page.url}runs/; spec pages: ${address?.href ?? page.url}spec?issue=<slug>; review pages: ${address?.href ?? page.url}review?run=<id>; Ctrl-C to stop)\n`);
|
|
28
47
|
await new Promise((resolve) => {
|
|
29
48
|
const stop = () => {
|
|
30
49
|
process.off("SIGINT", stop);
|
package/dist/cli/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/board.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface IssueFacts {
|
|
|
8
8
|
/** From `issue.md`; the slug when it has no readable title. */
|
|
9
9
|
title: string;
|
|
10
10
|
hasSpec: boolean;
|
|
11
|
+
/** Its spec is presented, for the operator to validate it on its page. */
|
|
12
|
+
hasSpecPage: boolean;
|
|
11
13
|
/** The issues its spec depends on, and whether each is delivered: its `plan.md` on the main branch, whatever the working tree holds. */
|
|
12
14
|
dependencies: {
|
|
13
15
|
slug: string;
|
|
@@ -47,6 +49,10 @@ export interface IssueCard {
|
|
|
47
49
|
waitsFor: string[];
|
|
48
50
|
/** The newest pull request its deliveries recorded. */
|
|
49
51
|
pullRequest?: string;
|
|
52
|
+
/** The run that recorded it, when it has a review page: one that described its change. */
|
|
53
|
+
review?: string;
|
|
54
|
+
/** Its spec has a page to validate it. */
|
|
55
|
+
spec?: boolean;
|
|
50
56
|
/** The last run of each shown workflow, newest first. */
|
|
51
57
|
runs: RunProgress[];
|
|
52
58
|
}
|
package/dist/domain/board.js
CHANGED
|
@@ -67,7 +67,8 @@ export function boardOf(issues, runs, shown, problems) {
|
|
|
67
67
|
// The last delivery sets the column. A new delivery updates the same pull
|
|
68
68
|
// request: the newest one recorded stays shown.
|
|
69
69
|
const delivery = last(DELIVERY);
|
|
70
|
-
const
|
|
70
|
+
const delivered = own.findLast((run) => pullRequestOf(run) !== undefined);
|
|
71
|
+
const pullRequest = delivered && pullRequestOf(delivered);
|
|
71
72
|
const cardRuns = shown
|
|
72
73
|
.flatMap((workflow) => {
|
|
73
74
|
const run = last(workflow.name);
|
|
@@ -91,6 +92,9 @@ export function boardOf(issues, runs, shown, problems) {
|
|
|
91
92
|
.filter(({ delivered }) => !delivered)
|
|
92
93
|
.map(({ slug }) => slug),
|
|
93
94
|
...(pullRequest ? { pullRequest } : {}),
|
|
95
|
+
// Runs delivered by an earlier factory have no description, nor its page.
|
|
96
|
+
...(delivered?.data.description ? { review: delivered.id } : {}),
|
|
97
|
+
...(issue.hasSpecPage ? { spec: true } : {}),
|
|
94
98
|
runs: cardRuns,
|
|
95
99
|
},
|
|
96
100
|
};
|
package/dist/domain/board.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/domain/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAqB,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAExD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,SAAS;IACT,YAAY;IACZ,WAAW;IACX,SAAS;IACT,YAAY;IACZ,MAAM;CACE,CAAC;
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/domain/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { z } from "@clemrig/flow";
|
|
2
2
|
import type { ChangedFile } from "./review.js";
|
|
3
|
-
|
|
3
|
+
import type { Criterion } from "./spec.js";
|
|
4
|
+
/** What the review page draws: a mermaid diagram; a diff or a text block shows a shape as it is. */
|
|
4
5
|
export declare const visualKinds: readonly ["mermaid", "diff", "text"];
|
|
5
|
-
/**
|
|
6
|
+
/** The largest screenshot: the review page loads it whole, on a phone too. */
|
|
6
7
|
export declare const maxScreenshotBytes: number;
|
|
8
|
+
/** What a decision departs from: the spec's scope, a test that existed, or the spec's letter. */
|
|
9
|
+
export declare const decisionKinds: readonly ["beyond_spec", "changed_test", "spec_reading"];
|
|
10
|
+
/** What a decision's card shows: one of these, with its own fields. */
|
|
11
|
+
export declare const decisionVisualKinds: readonly ["reading", "diff", "screenshots", "list"];
|
|
7
12
|
/**
|
|
8
13
|
* The describing agent's response: what a reader who forgot the issue needs
|
|
9
|
-
* to review its pull request. As many items as the
|
|
14
|
+
* to review its pull request, on the review page. As many items as the
|
|
15
|
+
* change calls for.
|
|
10
16
|
*/
|
|
11
17
|
export declare const descriptionOutput: z.ZodObject<{
|
|
12
18
|
changes: z.ZodArray<z.ZodString>;
|
|
@@ -45,7 +51,53 @@ export declare const descriptionOutput: z.ZodObject<{
|
|
|
45
51
|
caption: z.ZodString;
|
|
46
52
|
}, z.core.$strict>>;
|
|
47
53
|
noScreenshots: z.ZodOptional<z.ZodString>;
|
|
54
|
+
decisions: z.ZodArray<z.ZodObject<{
|
|
55
|
+
kind: z.ZodEnum<{
|
|
56
|
+
beyond_spec: "beyond_spec";
|
|
57
|
+
changed_test: "changed_test";
|
|
58
|
+
spec_reading: "spec_reading";
|
|
59
|
+
}>;
|
|
60
|
+
title: z.ZodString;
|
|
61
|
+
criterion: z.ZodOptional<z.ZodString>;
|
|
62
|
+
advice: z.ZodEnum<{
|
|
63
|
+
accept: "accept";
|
|
64
|
+
revise: "revise";
|
|
65
|
+
}>;
|
|
66
|
+
recommendation: z.ZodString;
|
|
67
|
+
why: z.ZodString;
|
|
68
|
+
source: z.ZodOptional<z.ZodString>;
|
|
69
|
+
file: z.ZodOptional<z.ZodString>;
|
|
70
|
+
visual: z.ZodOptional<z.ZodObject<{
|
|
71
|
+
kind: z.ZodEnum<{
|
|
72
|
+
diff: "diff";
|
|
73
|
+
list: "list";
|
|
74
|
+
reading: "reading";
|
|
75
|
+
screenshots: "screenshots";
|
|
76
|
+
}>;
|
|
77
|
+
spec: z.ZodOptional<z.ZodString>;
|
|
78
|
+
read: z.ZodOptional<z.ZodString>;
|
|
79
|
+
file: z.ZodOptional<z.ZodString>;
|
|
80
|
+
from: z.ZodOptional<z.ZodNumber>;
|
|
81
|
+
to: z.ZodOptional<z.ZodNumber>;
|
|
82
|
+
files: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
83
|
+
items: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
84
|
+
}, z.core.$strict>>;
|
|
85
|
+
}, z.core.$strict>>;
|
|
86
|
+
manualChecks: z.ZodArray<z.ZodObject<{
|
|
87
|
+
title: z.ZodString;
|
|
88
|
+
expect: z.ZodString;
|
|
89
|
+
why: z.ZodString;
|
|
90
|
+
}, z.core.$strict>>;
|
|
48
91
|
}, z.core.$strict>;
|
|
49
92
|
export type Description = z.output<typeof descriptionOutput>;
|
|
50
|
-
/** What
|
|
51
|
-
export
|
|
93
|
+
/** What a description is checked against: the run's change, criteria, interpretations and deviations. */
|
|
94
|
+
export interface Described {
|
|
95
|
+
files: ChangedFile[];
|
|
96
|
+
/** The change's whole diff. */
|
|
97
|
+
diff: string;
|
|
98
|
+
criteria: Pick<Criterion, "id">[];
|
|
99
|
+
interpretations: number;
|
|
100
|
+
deviations: number;
|
|
101
|
+
}
|
|
102
|
+
/** What is wrong with a description of this change, the screenshots' files aside. */
|
|
103
|
+
export declare function descriptionProblems(description: Description, described: Described): string[];
|