Bind ticket completion to current review evidence

This commit is contained in:
2026-09-29 01:47:01 +09:00
parent 590abf3142
commit ad08110c96
16 changed files with 530 additions and 59 deletions
@@ -1,6 +1,6 @@
// @generated by yoi-companion-openapi-typescript@1. Do not edit.
// Input: openapi/server-api.json
// Input contract: 0.1.0 (sha256:fbaf40391d4ab81b9ffb558ff4c055efb8c58e26b6a88d3eefbbbeefc6ea0822)
// Input contract: 0.1.0 (sha256:7b14311c0ae7d40c3e1b423890c890b1b73de321ed199c223b771711effcd280)
// Options: companion-operation-schema-closure,openapi-3.1,strict-integer-ranges,sorted-output
// Output: web/workspace/src/lib/generated/companion-api.ts
// Regenerate/check: cargo run -q -p server-api --example generate_companion_api_types -- --check
@@ -1,6 +1,6 @@
// @generated by yoi-repository-openapi-typescript@1. Do not edit.
// Input: openapi/server-api.json
// Input contract: 0.1.0 (sha256:fbaf40391d4ab81b9ffb558ff4c055efb8c58e26b6a88d3eefbbbeefc6ea0822)
// Input contract: 0.1.0 (sha256:7b14311c0ae7d40c3e1b423890c890b1b73de321ed199c223b771711effcd280)
// Options: repository-operation-schema-closure,openapi-3.1,format:uint64=safe-number,strict-safe-integers,sorted-output
// Output: web/workspace/src/lib/generated/repository-api.ts
// Regenerate/check: cargo run -q -p server-api --example generate_repository_openapi_types -- --check
@@ -1,6 +1,6 @@
// @generated by yoi-runtime-openapi-typescript@1. Do not edit.
// Input: openapi/server-api.json
// Input contract: 0.1.0 (sha256:fbaf40391d4ab81b9ffb558ff4c055efb8c58e26b6a88d3eefbbbeefc6ea0822)
// Input contract: 0.1.0 (sha256:7b14311c0ae7d40c3e1b423890c890b1b73de321ed199c223b771711effcd280)
// Options: runtime-operation-schema-closure,openapi-3.1,strict-integer-ranges,sorted-output
// Output: web/workspace/src/lib/generated/runtime-api.ts
// Regenerate/check: cargo run -q -p server-api --example generate_runtime_api_types -- --check
@@ -1,6 +1,6 @@
// @generated by yoi-ticket-browser-openapi-typescript@1. Do not edit.
// Input: openapi/server-api.json
// Input contract: 0.1.0 (sha256:fbaf40391d4ab81b9ffb558ff4c055efb8c58e26b6a88d3eefbbbeefc6ea0822)
// Input contract: 0.1.0 (sha256:7b14311c0ae7d40c3e1b423890c890b1b73de321ed199c223b771711effcd280)
// Options: ticket-objective-merge-request-browser-operation-schema-closure,openapi-3.1,strict-integer-ranges,sorted-output
// Output: web/workspace/src/lib/generated/ticket-api.ts
// Regenerate/check: cargo run -q -p server-api --example generate_ticket_api_types -- --check
@@ -47,9 +47,11 @@ export type MergeRequestRefDiagnostic = { code: string; message: string; };
export type MergeRequestRefResponse = { diagnostic?: MergeRequestRefDiagnostic | null; observed_at: string; ref?: string | null; status: string; };
export type MergeRequestReviewSubject = { merge_request_id: string; subject_ref: string; };
export type MergeRequestState = "open" | "merged" | "closed";
export type MergeRequestThreadEvent = { created_at: string; event_id: string; kind: "review_requested"; requested_by: MergeRequestWorkerIdentity; reviewer: MergeRequestWorkerIdentity; sequence: number; subject_ref: string; ticket_item_revision: string; } | { body: string; created_at: string; decision: ReviewDecision; event_id: string; findings: Array<ReviewFinding>; kind: "review"; request_event_id: string; reviewer: MergeRequestWorkerIdentity; sequence: number; subject_ref: string; ticket_item_revision: string; } | { created_at: string; event_id: string; kind: "review_revoked"; reason: string; review_event_id: string; revoked_by: MergeRequestWorkerIdentity; sequence: number; subject_ref: string; } | { created_at: string; event_id: string; kind: "review_cancelled"; reason: string; request_event_id: string; sequence: number; subject_ref: string; } | { author: MergeRequestWorkerIdentity; body: string; created_at: string; event_id: string; kind: "comment"; sequence: number; } | { approval_event_id: string; approved_source_ref: string; created_at: string; event_id: string; kind: "merge"; merged_by: MergeRequestWorkerIdentity; operation_id: string; resolution: ConflictResolution; sequence: number; strategy: MergeStrategy; target_ref_after: string; target_ref_before: string; };
export type MergeRequestThreadEvent = { created_at: string; event_id: string; kind: "review_requested"; requested_by: MergeRequestWorkerIdentity; reviewer: MergeRequestWorkerIdentity; sequence: number; subject_ref: string; ticket_item_revision: string; ticket_merge_request_subjects: Array<MergeRequestReviewSubject>; } | { body: string; created_at: string; decision: ReviewDecision; event_id: string; findings: Array<ReviewFinding>; kind: "review"; request_event_id: string; reviewer: MergeRequestWorkerIdentity; sequence: number; subject_ref: string; ticket_item_revision: string; ticket_merge_request_subjects: Array<MergeRequestReviewSubject>; } | { created_at: string; event_id: string; kind: "review_revoked"; reason: string; review_event_id: string; revoked_by: MergeRequestWorkerIdentity; sequence: number; subject_ref: string; } | { created_at: string; event_id: string; kind: "review_cancelled"; reason: string; request_event_id: string; sequence: number; subject_ref: string; } | { author: MergeRequestWorkerIdentity; body: string; created_at: string; event_id: string; kind: "comment"; sequence: number; } | { approval_event_id: string; approved_source_ref: string; created_at: string; event_id: string; kind: "merge"; merged_by: MergeRequestWorkerIdentity; operation_id: string; resolution: ConflictResolution; sequence: number; strategy: MergeStrategy; target_ref_after: string; target_ref_before: string; };
export type MergeRequestWorkerIdentity = { runtime_id: string; worker_id: string; };
@@ -1,6 +1,6 @@
// @generated by yoi-worker-openapi-typescript@1. Do not edit.
// Input: openapi/server-api.json
// Input contract: 0.1.0 (sha256:fbaf40391d4ab81b9ffb558ff4c055efb8c58e26b6a88d3eefbbbeefc6ea0822)
// Input contract: 0.1.0 (sha256:7b14311c0ae7d40c3e1b423890c890b1b73de321ed199c223b771711effcd280)
// Options: worker-operation-schema-closure,openapi-3.1,strict-integer-ranges,sorted-output
// Output: web/workspace/src/lib/generated/worker-launch-api.ts
// Regenerate/check: cargo run -q -p server-api --example generate_worker_launch_api_types -- --check
@@ -6,6 +6,7 @@ import type {
MergeRequestListResponse,
MergeRequestRefDiagnostic,
MergeRequestRefResponse,
MergeRequestReviewSubject,
MergeRequestThreadEvent,
MergeRequestWorkerIdentity,
ObjectiveDetail,
@@ -1055,6 +1056,21 @@ function parseMergeRequestWorker(
};
}
function parseMergeRequestReviewSubject(
value: unknown,
label: string,
): MergeRequestReviewSubject {
const item = object(value, label);
exact(item, ["merge_request_id", "subject_ref"], label);
return {
merge_request_id: string(
item.merge_request_id,
`${label}.merge_request_id`,
),
subject_ref: string(item.subject_ref, `${label}.subject_ref`),
};
}
function parseReviewFinding(value: unknown, label: string): ReviewFinding {
const item = object(value, label);
exact(item, ["body", "code", "line", "path", "severity"], label);
@@ -1096,6 +1112,7 @@ function parseMergeRequestThreadEvent(
"reviewer",
"subject_ref",
"ticket_item_revision",
"ticket_merge_request_subjects",
],
label,
);
@@ -1112,6 +1129,11 @@ function parseMergeRequestThreadEvent(
item.ticket_item_revision,
`${label}.ticket_item_revision`,
),
ticket_merge_request_subjects: array(
item.ticket_merge_request_subjects,
`${label}.ticket_merge_request_subjects`,
parseMergeRequestReviewSubject,
),
};
}
if (kind === "review") {
@@ -1124,6 +1146,7 @@ function parseMergeRequestThreadEvent(
"reviewer",
"subject_ref",
"ticket_item_revision",
"ticket_merge_request_subjects",
], label);
const decision = string(item.decision, `${label}.decision`);
if (!["approve", "request_changes"].includes(decision)) {
@@ -1145,6 +1168,11 @@ function parseMergeRequestThreadEvent(
item.ticket_item_revision,
`${label}.ticket_item_revision`,
),
ticket_merge_request_subjects: array(
item.ticket_merge_request_subjects,
`${label}.ticket_merge_request_subjects`,
parseMergeRequestReviewSubject,
),
};
}
if (kind === "review_revoked") {