@shivaedev/work-fleet 0.1.0 → 0.1.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/CHANGELOG.md +7 -0
- package/dist/engine/exhaustedCheckRepairs.d.ts.map +1 -1
- package/dist/engine/exhaustedCheckRepairs.js +3 -1
- package/dist/engine/exhaustedCheckRepairs.js.map +1 -1
- package/dist/engine/makeAdopt.d.ts.map +1 -1
- package/dist/engine/makeAdopt.js +10 -0
- package/dist/engine/makeAdopt.js.map +1 -1
- package/dist/host/daemon.d.ts +681 -681
- package/dist/host/githubCheckState.d.ts +4 -0
- package/dist/host/githubCheckState.d.ts.map +1 -1
- package/dist/host/githubCheckState.js +17 -2
- package/dist/host/githubCheckState.js.map +1 -1
- package/dist/packageInfo.d.ts +1 -1
- package/dist/packageInfo.js +1 -1
- package/package.json +3 -3
- package/src/engine/exhaustedCheckRepairs.ts +3 -1
- package/src/engine/makeAdopt.ts +12 -0
- package/src/host/githubCheckState.ts +19 -4
- package/src/packageInfo.ts +1 -1
|
@@ -2,16 +2,20 @@ import { Schema } from "effect";
|
|
|
2
2
|
import type { Checks } from "#policy.ts";
|
|
3
3
|
export declare const CheckPages: Schema.$Array<Schema.encodeKeys<Schema.Struct<{
|
|
4
4
|
readonly checkRuns: Schema.$Array<Schema.encodeKeys<Schema.Struct<{
|
|
5
|
+
readonly completedAt: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
5
6
|
readonly conclusion: Schema.NullOr<Schema.String>;
|
|
6
7
|
readonly detailsUrl: Schema.NullOr<Schema.String>;
|
|
7
8
|
readonly headSha: Schema.String;
|
|
8
9
|
readonly htmlUrl: Schema.String;
|
|
9
10
|
readonly name: Schema.String;
|
|
11
|
+
readonly startedAt: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
10
12
|
readonly status: Schema.String;
|
|
11
13
|
}>, {
|
|
14
|
+
readonly completedAt: "completed_at";
|
|
12
15
|
readonly detailsUrl: "details_url";
|
|
13
16
|
readonly headSha: "head_sha";
|
|
14
17
|
readonly htmlUrl: "html_url";
|
|
18
|
+
readonly startedAt: "started_at";
|
|
15
19
|
}>>;
|
|
16
20
|
}>, {
|
|
17
21
|
readonly checkRuns: "check_runs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubCheckState.d.ts","sourceRoot":"","sources":["../../src/host/githubCheckState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"githubCheckState.d.ts","sourceRoot":"","sources":["../../src/host/githubCheckState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAczC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;GAA0H,CAAC;AAIlJ,eAAO,MAAM,WAAW;;;;;;;;;GAAsF,CAAC;AAmC/G,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,UAAU,CAAC,IAAI,EAC9B,QAAQ,EAAE,OAAO,WAAW,CAAC,IAAI,EACjC,QAAQ,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,CAkCR"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
const CheckRun = Schema.Struct({
|
|
3
|
+
completedAt: Schema.optional(Schema.NullOr(Schema.String)),
|
|
3
4
|
conclusion: Schema.NullOr(Schema.String),
|
|
4
5
|
detailsUrl: Schema.NullOr(Schema.String),
|
|
5
6
|
headSha: Schema.String,
|
|
6
7
|
htmlUrl: Schema.String,
|
|
7
8
|
name: Schema.String,
|
|
9
|
+
startedAt: Schema.optional(Schema.NullOr(Schema.String)),
|
|
8
10
|
status: Schema.String,
|
|
9
|
-
}).pipe(Schema.encodeKeys({ detailsUrl: "details_url", headSha: "head_sha", htmlUrl: "html_url" }));
|
|
11
|
+
}).pipe(Schema.encodeKeys({ completedAt: "completed_at", detailsUrl: "details_url", headSha: "head_sha", htmlUrl: "html_url", startedAt: "started_at" }));
|
|
10
12
|
export const CheckPages = Schema.Array(Schema.Struct({ checkRuns: Schema.Array(CheckRun) }).pipe(Schema.encodeKeys({ checkRuns: "check_runs" })));
|
|
11
13
|
const Status = Schema.Struct({ context: Schema.String, state: Schema.String, targetUrl: Schema.NullOr(Schema.String) }).pipe(Schema.encodeKeys({ targetUrl: "target_url" }));
|
|
12
14
|
export const StatusPages = Schema.Array(Schema.Struct({ sha: Schema.String, statuses: Schema.Array(Status) }));
|
|
@@ -25,9 +27,22 @@ function statusState(state) {
|
|
|
25
27
|
}
|
|
26
28
|
return ["error", "failure"].includes(state) ? "fail" : "pending";
|
|
27
29
|
}
|
|
30
|
+
function newestChecks(pages) {
|
|
31
|
+
const newest = new Map();
|
|
32
|
+
function time(check) {
|
|
33
|
+
return Date.parse(check.completedAt ?? check.startedAt ?? "") || 0;
|
|
34
|
+
}
|
|
35
|
+
for (const check of pages.flatMap((page) => page.checkRuns)) {
|
|
36
|
+
const previous = newest.get(check.name);
|
|
37
|
+
if (previous === undefined || time(check) > time(previous)) {
|
|
38
|
+
newest.set(check.name, check);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...newest.values()];
|
|
42
|
+
}
|
|
28
43
|
export function githubCheckState(head, pr, checks, statuses, required) {
|
|
29
44
|
const observations = [
|
|
30
|
-
...checks
|
|
45
|
+
...newestChecks(checks).map((check) => ({ name: check.name, state: checkState(check), url: check.detailsUrl ?? check.htmlUrl })),
|
|
31
46
|
...statuses.flatMap((page) => page.statuses.map((status) => ({
|
|
32
47
|
name: status.context,
|
|
33
48
|
state: statusState(status.state),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubCheckState.js","sourceRoot":"","sources":["../../src/host/githubCheckState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM;CACrB,CAAC,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"githubCheckState.js","sourceRoot":"","sources":["../../src/host/githubCheckState.ts"],"names":[],"mappings":"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"}
|
package/dist/packageInfo.d.ts
CHANGED
package/dist/packageInfo.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/work-fleet",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Optional Board-backed execution, review and authorized delivery",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/work-fleet#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"@shivaedev/effect-contract": "0.5.0",
|
|
49
49
|
"@shivaedev/effect-service": "0.3.0",
|
|
50
50
|
"@shivaedev/effect-sql": "0.3.0",
|
|
51
|
-
"@shivaedev/platform": "0.
|
|
51
|
+
"@shivaedev/platform": "0.10.0",
|
|
52
52
|
"@shivaedev/work-board": "0.14.0",
|
|
53
53
|
"yaml": "2.9.1"
|
|
54
54
|
},
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"@effect/vitest": "4.0.4",
|
|
59
59
|
"@shivaedev/effect-test": "0.4.0",
|
|
60
60
|
"@shivaedev/effect-test-sql": "0.3.0",
|
|
61
|
-
"@shivaedev/quality": "0.
|
|
61
|
+
"@shivaedev/quality": "0.21.0",
|
|
62
62
|
"@types/node": "24.19.1",
|
|
63
63
|
"@typescript/native": "npm:typescript@7.0.2",
|
|
64
64
|
"effect": "4.0.4",
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { FleetRecord } from "#model.ts";
|
|
2
2
|
|
|
3
3
|
export function exhaustedCheckRepairs(record: FleetRecord, failures: readonly string[]): readonly string[] {
|
|
4
|
-
const repairs = record.attempts
|
|
4
|
+
const repairs = record.attempts
|
|
5
|
+
.filter((attempt) => attempt.role !== "reviewer" && !(attempt.role === "repair" && attempt.status === "failed" && attempt.receipt === undefined))
|
|
6
|
+
.slice(-3);
|
|
5
7
|
if (repairs.length < 3 || repairs.some((attempt) => attempt.role !== "repair" || attempt.status !== "completed")) {
|
|
6
8
|
return [];
|
|
7
9
|
}
|
package/src/engine/makeAdopt.ts
CHANGED
|
@@ -40,6 +40,18 @@ export function makeAdopt(state: EngineState) {
|
|
|
40
40
|
}
|
|
41
41
|
const result = adopted.success;
|
|
42
42
|
yield* validateResult(stored.value, result);
|
|
43
|
+
if (
|
|
44
|
+
latest.role === "repair"
|
|
45
|
+
&& latest.checkFailures !== undefined
|
|
46
|
+
&& result.kind === "change"
|
|
47
|
+
&& stored.value.result?.kind === "change"
|
|
48
|
+
&& result.pr === stored.value.result.pr
|
|
49
|
+
&& result.head === stored.value.result.head
|
|
50
|
+
&& stored.value.review?.head === result.head
|
|
51
|
+
&& stored.value.review.verdict === "approved"
|
|
52
|
+
) {
|
|
53
|
+
return yield* save(stored, { ...stored.value, checks: undefined, result, stage: "validating" });
|
|
54
|
+
}
|
|
43
55
|
return yield* save(stored, { ...stored.value, checks: undefined, result, review: undefined, stage: "reviewing" });
|
|
44
56
|
});
|
|
45
57
|
}
|
|
@@ -2,13 +2,17 @@ import { Schema } from "effect";
|
|
|
2
2
|
import type { Checks } from "#policy.ts";
|
|
3
3
|
|
|
4
4
|
const CheckRun = Schema.Struct({
|
|
5
|
+
completedAt: Schema.optional(Schema.NullOr(Schema.String)),
|
|
5
6
|
conclusion: Schema.NullOr(Schema.String),
|
|
6
7
|
detailsUrl: Schema.NullOr(Schema.String),
|
|
7
8
|
headSha: Schema.String,
|
|
8
9
|
htmlUrl: Schema.String,
|
|
9
10
|
name: Schema.String,
|
|
11
|
+
startedAt: Schema.optional(Schema.NullOr(Schema.String)),
|
|
10
12
|
status: Schema.String,
|
|
11
|
-
}).pipe(
|
|
13
|
+
}).pipe(
|
|
14
|
+
Schema.encodeKeys({ completedAt: "completed_at", detailsUrl: "details_url", headSha: "head_sha", htmlUrl: "html_url", startedAt: "started_at" }),
|
|
15
|
+
);
|
|
12
16
|
export const CheckPages = Schema.Array(Schema.Struct({ checkRuns: Schema.Array(CheckRun) }).pipe(Schema.encodeKeys({ checkRuns: "check_runs" })));
|
|
13
17
|
const Status = Schema.Struct({ context: Schema.String, state: Schema.String, targetUrl: Schema.NullOr(Schema.String) }).pipe(
|
|
14
18
|
Schema.encodeKeys({ targetUrl: "target_url" }),
|
|
@@ -35,6 +39,19 @@ function statusState(state: string): Observation["state"] {
|
|
|
35
39
|
}
|
|
36
40
|
return ["error", "failure"].includes(state) ? "fail" : "pending";
|
|
37
41
|
}
|
|
42
|
+
function newestChecks(pages: typeof CheckPages.Type) {
|
|
43
|
+
const newest = new Map<string, typeof CheckRun.Type>();
|
|
44
|
+
function time(check: typeof CheckRun.Type) {
|
|
45
|
+
return Date.parse(check.completedAt ?? check.startedAt ?? "") || 0;
|
|
46
|
+
}
|
|
47
|
+
for (const check of pages.flatMap((page) => page.checkRuns)) {
|
|
48
|
+
const previous = newest.get(check.name);
|
|
49
|
+
if (previous === undefined || time(check) > time(previous)) {
|
|
50
|
+
newest.set(check.name, check);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return [...newest.values()];
|
|
54
|
+
}
|
|
38
55
|
export function githubCheckState(
|
|
39
56
|
head: string,
|
|
40
57
|
pr: string,
|
|
@@ -43,9 +60,7 @@ export function githubCheckState(
|
|
|
43
60
|
required: readonly string[],
|
|
44
61
|
): Checks {
|
|
45
62
|
const observations: Observation[] = [
|
|
46
|
-
...checks.
|
|
47
|
-
page.checkRuns.map((check) => ({ name: check.name, state: checkState(check), url: check.detailsUrl ?? check.htmlUrl })),
|
|
48
|
-
),
|
|
63
|
+
...newestChecks(checks).map((check) => ({ name: check.name, state: checkState(check), url: check.detailsUrl ?? check.htmlUrl })),
|
|
49
64
|
...statuses.flatMap((page) =>
|
|
50
65
|
page.statuses.map(
|
|
51
66
|
(status): Observation => ({
|
package/src/packageInfo.ts
CHANGED