@blogic-cz/agent-tools 1.6.18 → 1.6.19
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 +8 -0
- package/dist/gh-tool/pr/commands.d.ts +1 -0
- package/dist/gh-tool/pr/commands.d.ts.map +1 -1
- package/dist/gh-tool/pr/core.d.ts +1 -0
- package/dist/gh-tool/pr/core.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/gh-tool/pr/commands.ts +6 -1
- package/src/gh-tool/pr/core.ts +60 -8
package/README.md
CHANGED
|
@@ -314,6 +314,14 @@ race with the edit. Bare or current heads match the selected repository owner's
|
|
|
314
314
|
use `--head owner:branch` to opt into updating a fork's PR. `pr edit --body ""` clears
|
|
315
315
|
the body; `pr view` always includes `body`.
|
|
316
316
|
|
|
317
|
+
`pr merge --match-head-commit <full-40-character-SHA>` requires the PR head to match
|
|
318
|
+
the reviewed commit, including during a dry run. Missing or invalid head information,
|
|
319
|
+
lookup failures, and mismatches refuse the merge before any mutation. With `--confirm`,
|
|
320
|
+
the same SHA is passed to GitHub's merge condition so a concurrent head change also
|
|
321
|
+
refuses the merge. The asynchronous stack fallback cannot enforce this condition and
|
|
322
|
+
is refused when the flag is present. Keep the reviewed SHA requirement and use a merge
|
|
323
|
+
path that enforces it after reviewing the current head.
|
|
324
|
+
|
|
317
325
|
### Stacked pull requests
|
|
318
326
|
|
|
319
327
|
GitHub's native stacked PRs refuse the GraphQL merge and require the asynchronous REST
|
|
@@ -220,6 +220,7 @@ export declare const prMergeCommand: Command.Command<"merge", {
|
|
|
220
220
|
readonly confirm: boolean;
|
|
221
221
|
readonly deleteBranch: boolean;
|
|
222
222
|
readonly format: "json" | "toon";
|
|
223
|
+
readonly matchHeadCommit: Option.Option<string>;
|
|
223
224
|
readonly pr: number;
|
|
224
225
|
readonly repo: Option.Option<string>;
|
|
225
226
|
readonly strategy: "merge" | "rebase" | "squash";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/gh-tool/pr/commands.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/gh-tool/pr/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -122,6 +122,7 @@ export declare const mergePR: (opts: {
|
|
|
122
122
|
strategy: MergeStrategy;
|
|
123
123
|
deleteBranch: boolean;
|
|
124
124
|
confirm: boolean;
|
|
125
|
+
matchHeadCommit?: string;
|
|
125
126
|
}) => Effect.Effect<MergeResult, GitHubMergeError | import("#gh/service").GhError, GitHubService>;
|
|
126
127
|
export declare const closePR: (opts: {
|
|
127
128
|
pr: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/gh-tool/pr/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAE1E,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,iBAAiB,EAEjB,WAAW,EACX,aAAa,EACb,MAAM,EAGN,iBAAiB,EAIlB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/gh-tool/pr/core.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -747,6 +747,10 @@ export const prMergeCommand = Command.make(
|
|
|
747
747
|
Flag.withDefault(DEFAULT_DELETE_BRANCH),
|
|
748
748
|
),
|
|
749
749
|
format: formatOption,
|
|
750
|
+
matchHeadCommit: Flag.String("match-head-commit").pipe(
|
|
751
|
+
Flag.withDescription("Require the PR head to match this full reviewed commit SHA"),
|
|
752
|
+
Flag.optional,
|
|
753
|
+
),
|
|
750
754
|
pr: Flag.Int("pr").pipe(Flag.withDescription("PR number to merge")),
|
|
751
755
|
repo: repoOption,
|
|
752
756
|
strategy: Flag.Literals("strategy", MERGE_STRATEGIES).pipe(
|
|
@@ -754,13 +758,14 @@ export const prMergeCommand = Command.make(
|
|
|
754
758
|
Flag.withDefault(DEFAULT_MERGE_STRATEGY),
|
|
755
759
|
),
|
|
756
760
|
},
|
|
757
|
-
({ confirm, deleteBranch, format, pr, repo, strategy }) =>
|
|
761
|
+
({ confirm, deleteBranch, format, matchHeadCommit, pr, repo, strategy }) =>
|
|
758
762
|
withRepo(
|
|
759
763
|
repo,
|
|
760
764
|
Effect.gen(function* () {
|
|
761
765
|
const result = yield* mergePR({
|
|
762
766
|
confirm,
|
|
763
767
|
deleteBranch,
|
|
768
|
+
matchHeadCommit: Option.getOrUndefined(matchHeadCommit),
|
|
764
769
|
pr,
|
|
765
770
|
strategy,
|
|
766
771
|
});
|
package/src/gh-tool/pr/core.ts
CHANGED
|
@@ -43,6 +43,8 @@ const STABLE_SNAPSHOT_ATTEMPTS = 3;
|
|
|
43
43
|
const GITHUB_ACTIONS_RUN_ID_RE = /github\.com\/[^/]+\/[^/]+\/actions\/runs\/(\d+)/;
|
|
44
44
|
const MERGE_SHA_POLL_INTERVAL_MS = 1000;
|
|
45
45
|
const MERGE_SHA_WAIT_SECONDS = 5;
|
|
46
|
+
const isFullCommitSha = (value: unknown): value is string =>
|
|
47
|
+
typeof value === "string" && value.length === 40 && /^[0-9a-f]+$/i.test(value);
|
|
46
48
|
|
|
47
49
|
const validatePRTitle = Effect.fn("pr.validatePRTitle")(function* (title: string) {
|
|
48
50
|
const gh = yield* GitHubService;
|
|
@@ -930,16 +932,54 @@ export const mergePR = Effect.fn("pr.mergePR")(function* (opts: {
|
|
|
930
932
|
strategy: MergeStrategy;
|
|
931
933
|
deleteBranch: boolean;
|
|
932
934
|
confirm: boolean;
|
|
935
|
+
matchHeadCommit?: string;
|
|
933
936
|
}) {
|
|
934
937
|
const gh = yield* GitHubService;
|
|
938
|
+
const matchHeadCommit = opts.matchHeadCommit;
|
|
935
939
|
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
940
|
+
if (matchHeadCommit !== undefined && !isFullCommitSha(matchHeadCommit)) {
|
|
941
|
+
return yield* new GitHubMergeError({
|
|
942
|
+
message: "--match-head-commit must be a full 40-character hexadecimal commit SHA",
|
|
943
|
+
reason: "unknown",
|
|
944
|
+
hint: "Provide the complete reviewed head commit SHA before retrying.",
|
|
945
|
+
nextCommand: `agent-tools-gh pr view --pr ${opts.pr}`,
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
const info = yield* gh
|
|
950
|
+
.runGhJson<PRViewJsonResult & { headRefOid?: unknown }>([
|
|
951
|
+
"pr",
|
|
952
|
+
"view",
|
|
953
|
+
String(opts.pr),
|
|
954
|
+
"--json",
|
|
955
|
+
"number,url,title,headRefName,baseRefName,state,isDraft,mergeable" +
|
|
956
|
+
(matchHeadCommit !== undefined ? ",headRefOid" : ""),
|
|
957
|
+
])
|
|
958
|
+
.pipe(
|
|
959
|
+
Effect.mapError((error) =>
|
|
960
|
+
matchHeadCommit === undefined
|
|
961
|
+
? error
|
|
962
|
+
: new GitHubMergeError({
|
|
963
|
+
message: `Could not verify the head commit of PR #${opts.pr}: ${error.message}`,
|
|
964
|
+
reason: "unknown",
|
|
965
|
+
hint: "The merge is refused while the head is unknown. Re-read the PR and verify its reviewed head before retrying.",
|
|
966
|
+
nextCommand: `agent-tools-gh pr view --pr ${opts.pr}`,
|
|
967
|
+
}),
|
|
968
|
+
),
|
|
969
|
+
);
|
|
970
|
+
|
|
971
|
+
if (
|
|
972
|
+
matchHeadCommit !== undefined &&
|
|
973
|
+
(!isFullCommitSha(info?.headRefOid) ||
|
|
974
|
+
info.headRefOid.toLowerCase() !== matchHeadCommit.toLowerCase())
|
|
975
|
+
) {
|
|
976
|
+
return yield* new GitHubMergeError({
|
|
977
|
+
message: `PR #${opts.pr} head does not match the reviewed commit ${matchHeadCommit}`,
|
|
978
|
+
reason: "unknown",
|
|
979
|
+
hint: "The head is missing, invalid, or changed. Re-read the PR and review its current head before retrying with that SHA.",
|
|
980
|
+
nextCommand: `agent-tools-gh pr view --pr ${opts.pr}`,
|
|
981
|
+
});
|
|
982
|
+
}
|
|
943
983
|
|
|
944
984
|
const repo = opts.deleteBranch ? yield* gh.getRepoInfo() : null;
|
|
945
985
|
|
|
@@ -1120,6 +1160,9 @@ export const mergePR = Effect.fn("pr.mergePR")(function* (opts: {
|
|
|
1120
1160
|
});
|
|
1121
1161
|
|
|
1122
1162
|
const mergeArgs = ["pr", "merge", String(opts.pr), `--${opts.strategy}`];
|
|
1163
|
+
if (matchHeadCommit !== undefined) {
|
|
1164
|
+
mergeArgs.push("--match-head-commit", matchHeadCommit);
|
|
1165
|
+
}
|
|
1123
1166
|
|
|
1124
1167
|
const shaFromAsyncMerge = yield* gh
|
|
1125
1168
|
.runGh(mergeArgs)
|
|
@@ -1127,7 +1170,16 @@ export const mergePR = Effect.fn("pr.mergePR")(function* (opts: {
|
|
|
1127
1170
|
Effect.map(() => null),
|
|
1128
1171
|
Effect.catchTag("GitHubCommandError", (error) =>
|
|
1129
1172
|
ASYNC_MERGE_REQUIRED_RE.test(error.stderr)
|
|
1130
|
-
?
|
|
1173
|
+
? matchHeadCommit !== undefined
|
|
1174
|
+
? Effect.fail(
|
|
1175
|
+
new GitHubMergeError({
|
|
1176
|
+
message: `PR #${opts.pr} requires an asynchronous merge that cannot enforce --match-head-commit`,
|
|
1177
|
+
reason: "unknown",
|
|
1178
|
+
hint: "The asynchronous fallback was refused because its exact-head condition is unsupported. Keep the reviewed SHA requirement and use a merge path that enforces it after reviewing the current head.",
|
|
1179
|
+
nextCommand: `agent-tools-gh pr view --pr ${opts.pr}`,
|
|
1180
|
+
}),
|
|
1181
|
+
)
|
|
1182
|
+
: mergeViaAsyncApi({ pr: opts.pr, strategy: opts.strategy })
|
|
1131
1183
|
: Effect.fail(error),
|
|
1132
1184
|
),
|
|
1133
1185
|
)
|