1 Commits

Author SHA1 Message Date
temeddix 78dcb3a2b3 Honor author replies
Check / deno (pull_request) Successful in 40s
2026-09-14 00:20:25 +09:00
3 changed files with 21 additions and 38 deletions
-6
View File
@@ -20,11 +20,6 @@ inputs:
bot-token:
description: API key or token for the selected bot
required: false
model:
description: >-
Model for the selected bot. Defaults to `claude-sonnet-5` or
`gpt-5.6-terra`, the mid tiers, which cover reviews and fixes.
required: false
runs:
using: composite
@@ -45,7 +40,6 @@ runs:
ACTION_PATH: ${{ gitea.action_path }}
BOT_TYPE: ${{ inputs.bot-type }}
BOT_TOKEN: ${{ inputs.bot-token }}
MODEL: ${{ inputs.model }}
GITEA_API_URL: ${{ gitea.api_url }}
GITEA_REPOSITORY: ${{ gitea.repository }}
GITEA_TOKEN: ${{ inputs.author-token }}
+14 -12
View File
@@ -20,18 +20,20 @@ they bear on the task, and push from there.
For a `pull_request` event, review the PR without changing code, using the
`requesting-code-review` skill from superpowers: run its code reviewer template
against the PR's base and head. Run the project's checks on the head and treat a
failure as at least Important. Check the whole repository against the code rules
at the end of this prompt, not only the diff; a violation is at least Important
even when the diff did not cause it. Write the complete review, and nothing
else, to the file `${REVIEW_PATH}`: it is posted verbatim as a pull request
review from the bot account, and your final response is not posted at all. The
file's first line must be exactly the template's verdict and nothing else:
`Yes`, `No`, or `With fixes`. `Yes` approves and the other two request changes;
any other first line is posted as a plain comment, which wastes the run. Minor
issues alone never block, and neither does a finding the author has answered in
the comment history below as intended or a false alarm, once the code or docs
make that clear. When the verdict is not `Yes`, the second line names what must
against the PR's base and head, and make its complete output your final response
instead of the short comment style above. Run the project's checks on the head
and treat a failure as at least Important. Check the whole repository against
the code rules at the end of this prompt, not only the diff; a violation is at
least Important even when the diff did not cause it. Your final response is
posted verbatim as a pull request review from the bot account, so it is the
review text and nothing else: no narration about what you did, verified, or are
about to post, whether you reviewed yourself or relayed a reviewer subagent. Its
first line must be exactly the template's verdict and nothing else: `Yes`, `No`,
or `With fixes`. `Yes` approves and the other two request changes; any other
first line is posted as a plain comment, which wastes the run. Minor issues
alone never block, and neither does a finding the author has answered in the
comment history below as intended or a false alarm, once the code or docs make
that clear. When the verdict is not `Yes`, the second line names what must
change in one line, addressed to the author; the author's own agent picks the
fixes up, so never ask `@bot` to make them. For UI changes, check that the
result is aligned, clean, and pixel-perfect, and that included screenshots prove
+7 -20
View File
@@ -20,13 +20,6 @@ const EVENT = env("EVENT_NAME");
const AUTHOR_TOKEN = env("GITEA_TOKEN");
const REVIEWER_TOKEN = env("REVIEWER_TOKEN");
const RULES_PATH = "repos/commons/code-rules/raw/README.md";
// The mid tiers: a run follows a fixed template and the project's checks.
const DEFAULT_MODELS: Record<string, string> = {
claude: "claude-sonnet-5",
codex: "gpt-5.6-terra",
};
const model = (bot: string): string =>
Deno.env.get("MODEL") || DEFAULT_MODELS[bot];
// The reviewer token is withheld so the agent cannot approve as the bot.
const { REVIEWER_TOKEN: _, ...agentEnv } = Deno.env.toObject();
@@ -59,11 +52,9 @@ async function postComment(body: string): Promise<void> {
});
}
// A pull request event is a review request, so the review is posted instead
// of the response. It comes through a file, because a final chat message picks
// up narration while a file's first line is written on purpose. That line is
// the verdict; anything unexpected only comments, never approves.
const REVIEW_PATH = `${await Deno.makeTempDir()}/review.md`;
// A pull request event is a review request, so the response becomes a review.
// Its first line is the verdict; anything unexpected only comments, never
// approves.
const VERDICTS: Record<string, string> = {
Yes: "APPROVED",
No: "REQUEST_CHANGES",
@@ -72,12 +63,9 @@ const VERDICTS: Record<string, string> = {
async function postResult(body: string): Promise<void> {
if (EVENT !== "pull_request") return postComment(body);
const review = await Deno.readTextFile(REVIEW_PATH).catch(() => {
throw new Error(`no review was written to ${REVIEW_PATH}`);
});
const [verdict] = review.split("\n", 1);
const [verdict] = body.split("\n", 1);
await gitea(REVIEWER_TOKEN, `repos/${REPO}/pulls/${INDEX}/reviews`, {
body: stripAnsi(review),
body: stripAnsi(body),
event: VERDICTS[verdict.trim()] ?? "COMMENT",
});
}
@@ -123,7 +111,6 @@ async function renderPrompt(): Promise<string> {
GITEA_API_URL: API,
GITEA_REPOSITORY: REPO,
ISSUE_INDEX: INDEX,
REVIEW_PATH,
};
const template = await Deno.readTextFile(
new URL("prompt.md", import.meta.url),
@@ -147,7 +134,7 @@ async function runClaude(prompt: string): Promise<string> {
"--print",
"--dangerously-skip-permissions",
"--model",
model("claude"),
"claude-fable-5",
"--output-format",
"stream-json",
"--verbose",
@@ -212,7 +199,7 @@ async function runCodex(prompt: string): Promise<string> {
args: [
"exec",
"--model",
model("codex"),
"gpt-5.5",
"--dangerously-bypass-approvals-and-sandbox",
"--output-last-message",
file,