@clemrig/factory 0.18.0 → 0.18.1
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 +1 -1
- package/dist/domain/app.d.ts +4 -1
- package/dist/system/app.d.ts +3 -2
- package/dist/system/app.js +40 -7
- package/dist/system/app.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -90,7 +90,7 @@ A malformed agent response goes back to that agent, 2 times at most. The text th
|
|
|
90
90
|
|
|
91
91
|
#### The application
|
|
92
92
|
|
|
93
|
-
When `factory.ts` declares the repository's `app`, the run owns it, as it owns the browser: for each execution of the `implement`, `review` and `describe` stages, it picks a free port for each name in `ports`, runs `setup`, which prepares data of the application's own (a database created, migrated and seeded, for instance) and writes the application's variables as `NAME=value` lines in the file `FACTORY_APP_ENV` names, then `start`, in the foreground, and waits until its `url`, a function of its variables, answers in HTTP, whatever the status (5 minutes at most; 10 for `setup`, 5 for `teardown`). Each command runs in the repository, without a shell, with the application's variables: `FACTORY_APP`, a short identifier of its own that can name a database, the ports, then what `setup` wrote. The agents receive `app` (its `url`, and `logs`, the file of its output, in the run's folder) and its variables in their environment, so that their own commands, such as a migration or a query, reach the same data; their prompts tell them it already runs, with data they may change, and to start or stop no server. Once the stage is over, failed or not, the run stops the application (5 seconds, then SIGKILL of its process group) and runs `teardown`, even after a failed `setup`; the stage's journal tells when the application stopped by itself during the call, or when its data could not be removed. An application that cannot start fails the stage, with the end of its output; `factory resume` starts the stage again. None of the three commands may change the repository's files, which the run would take for the agents' work: what they change as the application starts or stops is put back and named in the stage's journal, and a change as it starts fails the stage; what the application writes while the agents work cannot be told from theirs. Without `app`, the agents start the application as the repository's agent instructions say.
|
|
93
|
+
When `factory.ts` declares the repository's `app`, the run owns it, as it owns the browser: for each execution of the `implement`, `review` and `describe` stages, it picks a free port for each name in `ports`, runs `setup`, which prepares data of the application's own (a database created, migrated and seeded, for instance) and writes the application's variables as `NAME=value` lines in the file `FACTORY_APP_ENV` names, then `start`, in the foreground, and waits until its `url`, a function of its variables, answers in HTTP, whatever the status, and each of its ports accepts connections, so that a front end that proxies its API waits for it (5 minutes at most; 10 for `setup`, 5 for `teardown`). Each command runs in the repository, without a shell, with the application's variables: `FACTORY_APP`, a short identifier of its own that can name a database, the ports, then what `setup` wrote. The agents receive `app` (its `url`, and `logs`, the file of its output, in the run's folder) and its variables in their environment, so that their own commands, such as a migration or a query, reach the same data; their prompts tell them it already runs, with data they may change, and to start or stop no server. Once the stage is over, failed or not, the run stops the application (5 seconds, then SIGKILL of its process group) and runs `teardown`, even after a failed `setup`; the stage's journal tells when the application stopped by itself during the call, or when its data could not be removed. An application that cannot start fails the stage, with the end of its output; `factory resume` starts the stage again. None of the three commands may change the repository's files, which the run would take for the agents' work: what they change as the application starts or stops is put back and named in the stage's journal, and a change as it starts fails the stage; what the application writes while the agents work cannot be told from theirs. Without `app`, the agents start the application as the repository's agent instructions say.
|
|
94
94
|
|
|
95
95
|
```ts
|
|
96
96
|
app: {
|
package/dist/domain/app.d.ts
CHANGED
|
@@ -19,7 +19,10 @@ export interface AppDeclaration {
|
|
|
19
19
|
start: Command;
|
|
20
20
|
/** Removes what setup prepared, even when setup failed halfway. */
|
|
21
21
|
teardown?: Command;
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Variables the factory gives each a free port, such as `WEB_PORT`, which
|
|
24
|
+
* the application listens on: it is ready once each accepts connections.
|
|
25
|
+
*/
|
|
23
26
|
ports?: string[];
|
|
24
27
|
/** Where the application answers once it runs, from its variables, such as `({ WEB_PORT }) => "http://localhost:" + WEB_PORT`. */
|
|
25
28
|
url: (variables: Record<string, string>) => string;
|
package/dist/system/app.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ export interface RunningApp {
|
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Prepares and starts the application in `dir`, its files in `runDir/app/`,
|
|
14
|
-
* and resolves once its url answers
|
|
15
|
-
*
|
|
14
|
+
* and resolves once its url answers and each of its ports accepts
|
|
15
|
+
* connections. A failure stops what started, removes what setup prepared,
|
|
16
|
+
* and gives the end of the application's log.
|
|
16
17
|
*/
|
|
17
18
|
export declare function startApp(app: AppDeclaration, dir: string, runDir: string): Promise<RunningApp>;
|
package/dist/system/app.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import { appendFile, mkdir, readFile, rm } from "node:fs/promises";
|
|
3
|
-
import { createServer } from "node:net";
|
|
3
|
+
import { connect, createServer } from "node:net";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { parseEnv } from "node:util";
|
|
6
6
|
import { ProcessInterruptedError, runCommand, } from "@clemrig/flow";
|
|
@@ -34,10 +34,26 @@ async function tail(logs) {
|
|
|
34
34
|
const message = (error) => error instanceof Error ? error.message : String(error);
|
|
35
35
|
/** Whether the url answers in HTTP, whatever its status. */
|
|
36
36
|
const answers = (url) => fetch(url, { redirect: "manual", signal: AbortSignal.timeout(2_000) }).then(() => true, () => false);
|
|
37
|
+
/** Whether something on this machine accepts connections on the port. */
|
|
38
|
+
const listens = (port) => new Promise((resolve) => {
|
|
39
|
+
const socket = connect({
|
|
40
|
+
host: "localhost",
|
|
41
|
+
port: Number(port),
|
|
42
|
+
timeout: 2_000,
|
|
43
|
+
});
|
|
44
|
+
const end = (listening) => {
|
|
45
|
+
socket.destroy();
|
|
46
|
+
resolve(listening);
|
|
47
|
+
};
|
|
48
|
+
socket.once("connect", () => end(true));
|
|
49
|
+
socket.once("error", () => end(false));
|
|
50
|
+
socket.once("timeout", () => end(false));
|
|
51
|
+
});
|
|
37
52
|
/**
|
|
38
53
|
* Prepares and starts the application in `dir`, its files in `runDir/app/`,
|
|
39
|
-
* and resolves once its url answers
|
|
40
|
-
*
|
|
54
|
+
* and resolves once its url answers and each of its ports accepts
|
|
55
|
+
* connections. A failure stops what started, removes what setup prepared,
|
|
56
|
+
* and gives the end of the application's log.
|
|
41
57
|
*/
|
|
42
58
|
export async function startApp(app, dir, runDir) {
|
|
43
59
|
const id = randomBytes(4).toString("hex");
|
|
@@ -45,7 +61,8 @@ export async function startApp(app, dir, runDir) {
|
|
|
45
61
|
await mkdir(folder, { recursive: true });
|
|
46
62
|
const logs = join(folder, `${id}.log`);
|
|
47
63
|
const written = join(folder, `${id}.env`);
|
|
48
|
-
const
|
|
64
|
+
const ports = await freePorts(app.ports ?? []);
|
|
65
|
+
const own = { FACTORY_APP: id, ...ports };
|
|
49
66
|
let env = own;
|
|
50
67
|
/** Runs a command of the application with its variables, its output in the log. */
|
|
51
68
|
const step = async (name, command, bound, extra = {}) => {
|
|
@@ -116,12 +133,28 @@ export async function startApp(app, dir, runDir) {
|
|
|
116
133
|
controller.abort();
|
|
117
134
|
await running;
|
|
118
135
|
};
|
|
136
|
+
/**
|
|
137
|
+
* What the application does not do yet: answer at its url, then accept
|
|
138
|
+
* connections on each of its ports, such as those of an API its url only
|
|
139
|
+
* proxies.
|
|
140
|
+
*/
|
|
141
|
+
const missing = async () => {
|
|
142
|
+
if (!(await answers(url)))
|
|
143
|
+
return `answer at ${url}`;
|
|
144
|
+
const closed = [];
|
|
145
|
+
for (const [name, port] of Object.entries(ports))
|
|
146
|
+
if (!(await listens(port)))
|
|
147
|
+
closed.push(name);
|
|
148
|
+
return closed.length > 0
|
|
149
|
+
? `accept connections on ${closed.join(", ")}`
|
|
150
|
+
: undefined;
|
|
151
|
+
};
|
|
119
152
|
const deadline = Date.now() + READY_TIMEOUT_MS;
|
|
120
|
-
|
|
153
|
+
for (let wanted = await missing(); wanted; wanted = await missing()) {
|
|
121
154
|
if (ended !== undefined || Date.now() >= deadline) {
|
|
122
155
|
const why = ended
|
|
123
|
-
? `The application stopped before
|
|
124
|
-
: `The application did not
|
|
156
|
+
? `The application stopped before it was ready: ${ended}`
|
|
157
|
+
: `The application did not ${wanted} within ${READY_TIMEOUT_MS / 60_000} minutes`;
|
|
125
158
|
await stopped();
|
|
126
159
|
return fail(why);
|
|
127
160
|
}
|
package/dist/system/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/system/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAoB,YAAY,EAAe,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/system/app.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
|
+
"version": "0.18.1",
|
|
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": {
|