review 抓到一處落差:試跑判「終止且工作樹乾淨」就預告 git worktree remove, 但實跑多判一件事——那條路徑上的東西是不是真的一棵工作樹。別的 clone 在同一條路徑上 留下目錄時(路徑由 owner/repo/分支名 推導,不含本機 clone 的位置),試跑會預告一行 實跑必然拒絕的指令,而回報裡完全看不出原因。 判斷收進 lib 的 inspectWorktree,由它直接給出 reason(missing/foreign/dirty/ removable):試跑與實跑、自動與手動四條路徑從此擋在同一個判斷上,worktree-remove 裡 那份重算的副本也跟著刪掉。回報多一個「是工作樹」欄位,手動出口的 NOT_A_WORKTREE 不再是使用者第一次聽到這件事。 順帶兩件同源的修正: - 「是不是工作樹」改認 .git 為**檔案**。獨立 clone 的 .git 是目錄,先前會被當成工作樹, 然後在 git worktree remove 那一步炸出一句原始錯誤。 - 兩支腳本的 --dry-run 請求預告收進 pr-threads 的 plannedRequests,並補上 pr-watch 先前漏掉的那句說明(逐則 reaction 與逐個 review 的行內留言事前列不完)。預告與實際 發出的請求分開寫,加一個端點就會有一邊忘了改。 - PR 讀不到 head 分支時給出 PULL_HEAD_MISSING,而不是拿空字串去推導一條路徑。 議題 #41 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
69 lines
1.7 KiB
JavaScript
69 lines
1.7 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* 讀 PR 上的三類留言:一般留言、review 總評、行內留言。
|
|
*
|
|
* 三類分散在三個端點,漏掉任何一類就會有 reviewer 的意見沒被處理——而那正是
|
|
* `/sdlc-fix` 存在的理由。這一支只讀不寫,分類(必改/建議)由讀到內容的人判斷。
|
|
*
|
|
* 讀取本身與「已處理」的判定在 `pr-threads.js`——`pr-watch` 要數同一件事,
|
|
* 規則寫兩份遲早會各自演化。
|
|
*
|
|
* 用法:
|
|
* node scripts/pr-comments.js --repo owner/name --index 45 [--host <網址>] [--dry-run]
|
|
*/
|
|
import {
|
|
expectOk,
|
|
giteaRequest,
|
|
main,
|
|
parseFlags,
|
|
parseIndex,
|
|
parseRepo,
|
|
preflight,
|
|
resolveLogin,
|
|
} from './lib.js';
|
|
import {
|
|
COMMENT_REQUEST_NOTE,
|
|
fetchPull,
|
|
plannedRequests,
|
|
readPullComments,
|
|
unhandledCount,
|
|
} from './pr-threads.js';
|
|
|
|
main(async () => {
|
|
const flags = parseFlags(process.argv.slice(2), {
|
|
required: ['repo', 'index'],
|
|
optional: ['host'],
|
|
booleans: ['dry-run'],
|
|
});
|
|
const repo = parseRepo(flags.repo);
|
|
const index = parseIndex(flags.index);
|
|
|
|
if (flags['dry-run']) {
|
|
return {
|
|
dryRun: true,
|
|
repo,
|
|
index,
|
|
requests: plannedRequests(repo, index),
|
|
note: COMMENT_REQUEST_NOTE,
|
|
};
|
|
}
|
|
|
|
const login = resolveLogin({ host: flags.host });
|
|
await preflight(login, repo);
|
|
|
|
const me = expectOk(await giteaRequest(login, 'GET', '/user'), 'GET /user').login;
|
|
const pull = await fetchPull(login, repo, index);
|
|
const 留言 = await readPullComments(login, repo, index, me);
|
|
|
|
return {
|
|
repo,
|
|
index: pull.number,
|
|
title: pull.title,
|
|
url: pull.html_url,
|
|
state: pull.state,
|
|
留言,
|
|
未處理數: unhandledCount(留言),
|
|
};
|
|
});
|
|
|