@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.
@@ -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;AAUzC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;GAA0H,CAAC;AAIlJ,eAAO,MAAM,WAAW;;;;;;;;;GAAsF,CAAC;AAsB/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,CAoCR"}
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.flatMap((page) => page.checkRuns.map((check) => ({ name: check.name, state: checkState(check), url: check.detailsUrl ?? check.htmlUrl }))),
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":"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"}
1
+ {"version":3,"file":"githubCheckState.js","sourceRoot":"","sources":["../../src/host/githubCheckState.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export declare const NAME = "work-fleet";
2
2
  export declare const TITLE = "Work Fleet";
3
- export declare const VERSION = "0.1.0";
3
+ export declare const VERSION = "0.1.1";
4
4
  //# sourceMappingURL=packageInfo.d.ts.map
@@ -1,4 +1,4 @@
1
1
  export const NAME = "work-fleet";
2
2
  export const TITLE = "Work Fleet";
3
- export const VERSION = "0.1.0";
3
+ export const VERSION = "0.1.1";
4
4
  //# sourceMappingURL=packageInfo.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/work-fleet",
3
- "version": "0.1.0",
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.8.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.20.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.filter((attempt) => attempt.role !== "reviewer").slice(-3);
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
  }
@@ -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(Schema.encodeKeys({ detailsUrl: "details_url", headSha: "head_sha", htmlUrl: "html_url" }));
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.flatMap((page) =>
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 => ({
@@ -1,3 +1,3 @@
1
1
  export const NAME = "work-fleet";
2
2
  export const TITLE = "Work Fleet";
3
- export const VERSION = "0.1.0";
3
+ export const VERSION = "0.1.1";