2 Commits

Author SHA1 Message Date
temeddix e65ac772f6 Rewrite the runner in TypeScript
Check / deno (pull_request) Successful in 45s
2026-09-13 23:09:53 +09:00
temeddix 7182a6f8f4 Split author and reviewer tokens 2026-09-13 22:58:24 +09:00
2 changed files with 12 additions and 32 deletions
+9 -11
View File
@@ -13,17 +13,15 @@ response ends, so background monitors, scheduled wake-ups, and queued tasks
never resume. Never promise future action and never claim to be waiting on a
notification.
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, and make its complete output your final response
instead of the short comment style above. 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 as
a pull request review from the bot account: it requests changes when it mentions
`@bot` and approves otherwise, so the assessment instructs `@bot` to make the
fixes exactly when it is not `Yes`, and Minor issues alone never block. For UI
changes, check that the result is aligned, clean, and pixel-perfect, and that
included screenshots prove the intended result was achieved.
For a `pull_request` event, review the PR without changing code. Your final
response is posted as a pull request review from the bot account: it requests
changes when it mentions `@bot` and approves otherwise. So include `@bot` with
instructions to fix the findings exactly when changes are needed, and never
mention `@bot` when the PR is ready. For UI changes, check that the result is
aligned, clean, and pixel-perfect, and that included screenshots prove the
intended result was achieved. Also check the whole repository, not only the
diff, against the code rules at the end of this prompt, and request changes for
every violation you find even when the diff did not cause it.
For an `issue_comment` or `pull_request_review_comment` event, treat the `body`
in the triggering comment payload below as the user's exact instruction.
+3 -21
View File
@@ -68,32 +68,16 @@ async function postResult(body: string): Promise<void> {
});
}
async function run(command: string, args: string[]): Promise<void> {
const { success, code } = await new Deno.Command(command, { args }).output();
if (!success) throw new Error(`${command} ${args[0]} exited with ${code}`);
}
// Commits belong to the same account as the pull request they end up in.
async function configureGitAuthor(): Promise<void> {
const user: GiteaUser = await (await gitea(AUTHOR_TOKEN, "user")).json();
for (const [key, value] of [["name", user.login], ["email", user.email]]) {
await run("git", ["config", "--global", `user.${key}`, value]);
await new Deno.Command("git", {
args: ["config", "--global", `user.${key}`, value],
}).output();
}
}
// The superpowers plugin gives the agent its skills, including the code review
// one that the prompt asks for. Both installs are idempotent on the persisted
// home.
async function installSuperpowers(bot: string): Promise<void> {
const commands = bot === "claude"
? [
["plugin", "marketplace", "add", "obra/superpowers-marketplace"],
["plugin", "install", "-y", "superpowers@superpowers-marketplace"],
]
: [["plugin", "add", "superpowers@openai-curated-remote"]];
for (const args of commands) await run(bot, args);
}
async function renderPrompt(): Promise<string> {
const comments: GiteaComment[] = await (await gitea(
REVIEWER_TOKEN,
@@ -127,7 +111,6 @@ async function runClaude(prompt: string): Promise<string> {
);
Deno.exit(1);
}
await installSuperpowers("claude");
const claude = new Deno.Command("claude", {
args: [
"--print",
@@ -191,7 +174,6 @@ async function runCodex(prompt: string): Promise<string> {
})
.output();
if (!loggedIn.success) await codexDeviceLogin();
await installSuperpowers("codex");
const file = await Deno.makeTempFile();
const status = await new Deno.Command("codex", {
args: [