@tienne/gestalt 0.75.0 → 0.76.0
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/CLAUDE.md +1 -1
- package/README.ko.md +3 -3
- package/README.md +3 -3
- package/dist/package.json +1 -1
- package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +5 -1
- package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
- package/dist/plugin/skills/local-pr/SKILL.md +1 -0
- package/dist/plugin/skills/review/SKILL.md +14 -1
- package/dist/plugin/skills/review-loop/CONTRACT.md +90 -0
- package/dist/plugin/skills/review-loop/SKILL.md +813 -0
- package/dist/plugin/skills/review-reply/SKILL.md +2 -2
- package/dist/plugin/skills/ship/SKILL.md +1 -0
- package/dist/src/cli/commands/review-loop.d.ts +45 -0
- package/dist/src/cli/commands/review-loop.d.ts.map +1 -0
- package/dist/src/cli/commands/review-loop.js +85 -0
- package/dist/src/cli/commands/review-loop.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +27 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/review-loop/fetch.d.ts +32 -0
- package/dist/src/review-loop/fetch.d.ts.map +1 -0
- package/dist/src/review-loop/fetch.js +80 -0
- package/dist/src/review-loop/fetch.js.map +1 -0
- package/dist/src/review-loop/index.d.ts +7 -0
- package/dist/src/review-loop/index.d.ts.map +1 -0
- package/dist/src/review-loop/index.js +7 -0
- package/dist/src/review-loop/index.js.map +1 -0
- package/dist/src/review-loop/report.d.ts +42 -0
- package/dist/src/review-loop/report.d.ts.map +1 -0
- package/dist/src/review-loop/report.js +100 -0
- package/dist/src/review-loop/report.js.map +1 -0
- package/dist/src/review-loop/signal.d.ts +37 -0
- package/dist/src/review-loop/signal.d.ts.map +1 -0
- package/dist/src/review-loop/signal.js +37 -0
- package/dist/src/review-loop/signal.js.map +1 -0
- package/dist/src/review-loop/state.d.ts +20 -0
- package/dist/src/review-loop/state.d.ts.map +1 -0
- package/dist/src/review-loop/state.js +55 -0
- package/dist/src/review-loop/state.js.map +1 -0
- package/dist/src/review-loop/target.d.ts +23 -0
- package/dist/src/review-loop/target.d.ts.map +1 -0
- package/dist/src/review-loop/target.js +57 -0
- package/dist/src/review-loop/target.js.map +1 -0
- package/dist/src/review-loop/threads.d.ts +43 -0
- package/dist/src/review-loop/threads.d.ts.map +1 -0
- package/dist/src/review-loop/threads.js +40 -0
- package/dist/src/review-loop/threads.js.map +1 -0
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +5 -1
- package/plugin/skills/_shared/proactive-routing.md +1 -0
- package/plugin/skills/local-pr/SKILL.md +1 -0
- package/plugin/skills/review/SKILL.md +14 -1
- package/plugin/skills/review-loop/CONTRACT.md +90 -0
- package/plugin/skills/review-loop/SKILL.md +813 -0
- package/plugin/skills/review-reply/SKILL.md +2 -2
- package/plugin/skills/ship/SKILL.md +1 -0
|
@@ -60,7 +60,7 @@ outputs:
|
|
|
60
60
|
/review-reply feature/auth # 해당 브랜치의 PR
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
받은 코멘트에 한 번 답하는 게 이 스킬의 범위다. 코멘트가 안 나올 때까지
|
|
63
|
+
받은 코멘트에 한 번 답하는 게 이 스킬의 범위다. 반복은 어느 쪽에 서 있느냐로 갈린다. **내 PR**을 코멘트가 안 나올 때까지 밀어 올리려면 `ship`이다. **남의 PR**을 리뷰하고 대응을 지켜보다 재리뷰하려면 `review-loop`이고. 둘 다 라운드마다 스킬을 부른다 — `ship`은 이 스킬을, `review-loop`은 `review`를.
|
|
64
64
|
|
|
65
65
|
## 불변 규칙 두 가지
|
|
66
66
|
|
|
@@ -177,7 +177,7 @@ pnpm tsx bin/gestalt.ts pr --json show <판별에서 잡은 id>
|
|
|
177
177
|
|
|
178
178
|
- `target`이 생략되면 현재 브랜치의 PR을 찾는다. PR이 없으면 여기서 멈추고 알린다 — 답할 코멘트가 있을 곳이 없다.
|
|
179
179
|
- `state`가 `MERGED`/`CLOSED`(local은 `merged`/`closed`)면 사용자에게 한 줄 확인한다 ("이미 종료된 PR인데 답글만 남길까요?").
|
|
180
|
-
- **작성자 확인**: 작성자가 현재 사용자와 다르면 이건 남의 PR이다. "이 PR은 제 것이 아닌데, 리뷰어 입장 코멘트를 다는 거라면 `/review`가
|
|
180
|
+
- **작성자 확인**: 작성자가 현재 사용자와 다르면 이건 남의 PR이다. "이 PR은 제 것이 아닌데, 리뷰어 입장 코멘트를 다는 거라면 `/review`가 맞아요. 코멘트를 남기고 대응까지 지켜볼 거면 `/review-loop`이고요"라고 안내하고 사용자 판단을 받는다. 남의 PR에 리뷰이 어투로 답하면 어색해진다. (github·local 공통 규칙)
|
|
181
181
|
|
|
182
182
|
### 1단계: 미해결 리뷰 스레드 수집
|
|
183
183
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `gestalt review-loop` — 남의 PR을 반복해 리뷰하는 루프가 쓰는 조회 도구.
|
|
3
|
+
*
|
|
4
|
+
* 판정에 쓰는 수를 스킬 문서가 셸로 적는 대신 여기서 낸다. 문서의 코드블록은 각각 다른
|
|
5
|
+
* Bash 호출이라 앞 블록의 변수가 뒤에서 빈 문자열로 풀리는데, 그 값이 미대응 스레드
|
|
6
|
+
* 수이면 승인이 조용히 열린다. 한 명령이 조회부터 신호 도출까지 끝내면 그 중간이 없다.
|
|
7
|
+
*/
|
|
8
|
+
export interface ReviewLoopStateOptions {
|
|
9
|
+
pr: string;
|
|
10
|
+
me?: string;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function reviewLoopStateCommand(opts: ReviewLoopStateOptions): void;
|
|
14
|
+
/**
|
|
15
|
+
* 상태 자리 경로를 낸다. 대상을 주면 그 PR 의 자리, 안 주면 뿌리다.
|
|
16
|
+
*
|
|
17
|
+
* 뿌리가 따로 있는 이유는 순서 때문이다 — 대상 문자열을 셸에 안 넘기려면 파일로
|
|
18
|
+
* 떨궈야 하는데, 그 파일을 PR 별 자리에 두면 자리 이름을 정하는 데 필요한 번호를
|
|
19
|
+
* 아직 모르는 단계다.
|
|
20
|
+
*
|
|
21
|
+
* **PR 별 자리는 네트워크를 안 탄다.** 경로는 대상과 git 디렉토리만으로 정해지는
|
|
22
|
+
* 순수 함수라, 그걸 얻으려고 조회를 부르면 좌표가 필요한 자리마다 GraphQL 왕복이
|
|
23
|
+
* 붙는다. 번호로만 준 경우에만 레포를 한 번 묻는다.
|
|
24
|
+
*/
|
|
25
|
+
export declare function reviewLoopDirCommand(opts: {
|
|
26
|
+
create?: boolean;
|
|
27
|
+
}): void;
|
|
28
|
+
/**
|
|
29
|
+
* 대상에서 좌표를 한 번에 푼다 — PR 번호와 레포와 상태 자리 경로.
|
|
30
|
+
*
|
|
31
|
+
* 라운드 내내 이 넷이 필요한데 전부 조회에서 뽑으면 좌표를 얻으려고 GraphQL 을
|
|
32
|
+
* 왕복하게 된다. 경로는 대상과 git 디렉토리만으로 정해지는 순수 함수이고 레포도
|
|
33
|
+
* URL 이면 거기 적혀 있다 — 번호로만 준 경우에만 한 번 묻는다.
|
|
34
|
+
*
|
|
35
|
+
* 부르는 쪽은 이 결과를 파일로 굳혀 두고 라운드 내내 읽는다.
|
|
36
|
+
*/
|
|
37
|
+
export declare function reviewLoopResolveCommand(opts: {
|
|
38
|
+
pr: string;
|
|
39
|
+
create?: boolean;
|
|
40
|
+
}): void;
|
|
41
|
+
export declare function reviewLoopParseCommand(opts: {
|
|
42
|
+
target: string;
|
|
43
|
+
json?: boolean;
|
|
44
|
+
}): void;
|
|
45
|
+
//# sourceMappingURL=review-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-loop.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/review-loop.ts"],"names":[],"mappings":"AAYA;;;;;;GAMG;AAEH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,CAUzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAMrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CASrF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CASrF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
import { parseTarget, readLoopState, resolveRepo, runGh, SIGNAL_ACTION, stateDir, stateRoot, } from '../../review-loop/index.js';
|
|
3
|
+
export function reviewLoopStateCommand(opts) {
|
|
4
|
+
run(() => {
|
|
5
|
+
const { prNumber, owner, repo } = parseTarget(opts.pr);
|
|
6
|
+
const report = readLoopState({ prNumber, owner, repo, me: opts.me });
|
|
7
|
+
if (opts.json) {
|
|
8
|
+
console.log(JSON.stringify(report, null, 2));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
printReport(report);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 상태 자리 경로를 낸다. 대상을 주면 그 PR 의 자리, 안 주면 뿌리다.
|
|
16
|
+
*
|
|
17
|
+
* 뿌리가 따로 있는 이유는 순서 때문이다 — 대상 문자열을 셸에 안 넘기려면 파일로
|
|
18
|
+
* 떨궈야 하는데, 그 파일을 PR 별 자리에 두면 자리 이름을 정하는 데 필요한 번호를
|
|
19
|
+
* 아직 모르는 단계다.
|
|
20
|
+
*
|
|
21
|
+
* **PR 별 자리는 네트워크를 안 탄다.** 경로는 대상과 git 디렉토리만으로 정해지는
|
|
22
|
+
* 순수 함수라, 그걸 얻으려고 조회를 부르면 좌표가 필요한 자리마다 GraphQL 왕복이
|
|
23
|
+
* 붙는다. 번호로만 준 경우에만 레포를 한 번 묻는다.
|
|
24
|
+
*/
|
|
25
|
+
export function reviewLoopDirCommand(opts) {
|
|
26
|
+
run(() => {
|
|
27
|
+
const dir = stateRoot();
|
|
28
|
+
if (opts.create)
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
console.log(dir);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 대상에서 좌표를 한 번에 푼다 — PR 번호와 레포와 상태 자리 경로.
|
|
35
|
+
*
|
|
36
|
+
* 라운드 내내 이 넷이 필요한데 전부 조회에서 뽑으면 좌표를 얻으려고 GraphQL 을
|
|
37
|
+
* 왕복하게 된다. 경로는 대상과 git 디렉토리만으로 정해지는 순수 함수이고 레포도
|
|
38
|
+
* URL 이면 거기 적혀 있다 — 번호로만 준 경우에만 한 번 묻는다.
|
|
39
|
+
*
|
|
40
|
+
* 부르는 쪽은 이 결과를 파일로 굳혀 두고 라운드 내내 읽는다.
|
|
41
|
+
*/
|
|
42
|
+
export function reviewLoopResolveCommand(opts) {
|
|
43
|
+
run(() => {
|
|
44
|
+
const parsed = parseTarget(opts.pr);
|
|
45
|
+
const { owner, repo } = parsed.owner && parsed.repo ? { owner: parsed.owner, repo: parsed.repo } : resolveRepo(runGh);
|
|
46
|
+
const dir = stateDir({ owner, repo, prNumber: parsed.prNumber });
|
|
47
|
+
if (opts.create)
|
|
48
|
+
mkdirSync(dir, { recursive: true });
|
|
49
|
+
console.log(JSON.stringify({ prNumber: parsed.prNumber, owner, repo, stateDir: dir }));
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export function reviewLoopParseCommand(opts) {
|
|
53
|
+
run(() => {
|
|
54
|
+
const parsed = parseTarget(opts.target);
|
|
55
|
+
if (opts.json) {
|
|
56
|
+
console.log(JSON.stringify(parsed));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
console.log(parsed.prNumber);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function printReport(r) {
|
|
63
|
+
console.log(`${r.owner}/${r.repo}#${r.prNumber} ${r.prState} — ${r.signal}`);
|
|
64
|
+
console.log(` ${SIGNAL_ACTION[r.signal]}`);
|
|
65
|
+
console.log(` 내가 연 스레드 ${r.myThreads}개 중 미대응 ${r.pending}개 (PR 전체 ${r.prThreads}개)`);
|
|
66
|
+
console.log(` head ${r.head.slice(0, 8)}${r.changed ? ' (리뷰 이후 바뀜)' : ''}`);
|
|
67
|
+
if (r.rerequested)
|
|
68
|
+
console.log(' 작성자가 재리뷰를 요청했어요');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 실패를 종료 코드로 답한다.
|
|
72
|
+
*
|
|
73
|
+
* 부르는 쪽이 명령 치환으로 값만 가져가므로 stdout 에 아무것도 안 내는 게 중요하다.
|
|
74
|
+
* 실패한 조회가 빈 문자열로 넘어가 0 으로 읽히면 승인 게이트가 그대로 열린다.
|
|
75
|
+
*/
|
|
76
|
+
function run(body) {
|
|
77
|
+
try {
|
|
78
|
+
body();
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=review-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-loop.js","sourceRoot":"","sources":["../../../../src/cli/commands/review-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,wBAAgB,SAAS,IAAI,OAAO,CAsSnC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { humanizeCheckCommand } from './commands/humanize-check.js';
|
|
|
12
12
|
import { humanizeScanCommand } from './commands/humanize-scan.js';
|
|
13
13
|
import { explainCheckCommand } from './commands/explain-check.js';
|
|
14
14
|
import { DEFAULT_CASES_PATH, explainEvalCommand } from './commands/explain-eval.js';
|
|
15
|
+
import { reviewLoopDirCommand, reviewLoopParseCommand, reviewLoopResolveCommand, reviewLoopStateCommand, } from './commands/review-loop.js';
|
|
15
16
|
import { getVersion } from '../core/version.js';
|
|
16
17
|
import { prCheckoutCommand, prCloseCommand, prCommentCommand, prCommentsCommand, prCreateCommand, prDiffCommand, prEditCommand, prListCommand, prMergeCommand, prReposCommand, prResolveCommand, prReviewCommand, prPruneCommand, prServeCommand, prShowCommand, prUnregisterCommand, prUpdateCommand, } from './commands/pr.js';
|
|
17
18
|
export function createCli() {
|
|
@@ -162,6 +163,32 @@ export function createCli() {
|
|
|
162
163
|
pr.command('unregister <key>')
|
|
163
164
|
.description('그 레포를 웹 UI 목록에서 뺀다. 레포 자체는 안 건드린다')
|
|
164
165
|
.action((key, o, cmd) => prUnregisterCommand({ ...inherited(cmd), ...o, key }));
|
|
166
|
+
const reviewLoop = program
|
|
167
|
+
.command('review-loop')
|
|
168
|
+
.description('남의 PR 리뷰 루프가 쓰는 조회 — 판정에 쓰는 수를 여기서 낸다');
|
|
169
|
+
reviewLoop
|
|
170
|
+
.command('state')
|
|
171
|
+
.description('PR 상태와 미대응 스레드 수, 다음에 할 일을 한 번에')
|
|
172
|
+
.requiredOption('--pr <target>', 'PR 번호나 URL')
|
|
173
|
+
.option('--me <login>', '내 로그인. 없으면 상태 자리 캐시나 gh api user')
|
|
174
|
+
.option('--json', '에이전트가 파싱할 JSON으로')
|
|
175
|
+
.action((o) => reviewLoopStateCommand(o));
|
|
176
|
+
reviewLoop
|
|
177
|
+
.command('dir')
|
|
178
|
+
.description('상태 자리의 뿌리. 대상을 아직 못 가린 단계가 쓴다')
|
|
179
|
+
.option('--create', '없으면 만든다')
|
|
180
|
+
.action((o) => reviewLoopDirCommand(o));
|
|
181
|
+
reviewLoop
|
|
182
|
+
.command('resolve')
|
|
183
|
+
.description('대상에서 PR 번호와 레포와 상태 자리를 한 번에 — 라운드 내내 이걸 읽는다')
|
|
184
|
+
.requiredOption('--pr <target>', 'PR 번호나 URL')
|
|
185
|
+
.option('--create', '상태 자리를 만든다')
|
|
186
|
+
.action((o) => reviewLoopResolveCommand(o));
|
|
187
|
+
reviewLoop
|
|
188
|
+
.command('parse <target>')
|
|
189
|
+
.description('번호나 #번호나 PR URL에서 번호와 레포를 읽는다')
|
|
190
|
+
.option('--json', 'prNumber와 owner와 repo를 JSON으로')
|
|
191
|
+
.action((target, o) => reviewLoopParseCommand({ target, ...o }));
|
|
165
192
|
program
|
|
166
193
|
.command('humanize-scan')
|
|
167
194
|
.description('원문에서 실제로 걸린 S1 룰만 처방과 함께 추린다 (exit 0 걸림 / 10 없음)')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ReviewThread } from './threads.js';
|
|
2
|
+
/** `gh` 호출을 밖에서 갈아끼우려고 둔 자리. 테스트가 실제 네트워크를 안 탄다 */
|
|
3
|
+
export interface GhRunner {
|
|
4
|
+
(args: readonly string[]): string;
|
|
5
|
+
}
|
|
6
|
+
export declare const runGh: GhRunner;
|
|
7
|
+
export interface PrSnapshot {
|
|
8
|
+
prState: string;
|
|
9
|
+
headRefOid: string;
|
|
10
|
+
threads: ReviewThread[];
|
|
11
|
+
requestedReviewers: string[];
|
|
12
|
+
}
|
|
13
|
+
/** 페이지가 늘어도 끝나도록 두는 상한. 스레드 50개씩이라 5000개까지 본다 */
|
|
14
|
+
export declare const PAGE_LIMIT = 100;
|
|
15
|
+
/**
|
|
16
|
+
* PR 상태와 내가 볼 스레드를 한 번에 받는다.
|
|
17
|
+
*
|
|
18
|
+
* 판정에 쓰는 수가 전부 이 한 호출에서 나온다. 문서가 이걸 셸로 적던 때는 조회와
|
|
19
|
+
* 집계가 다른 Bash 호출로 갈려 그 사이를 파일로 이어야 했다. 스냅샷이 이번 조회의
|
|
20
|
+
* 것인지 가리는 표식과 신선도 검사가 따라붙었다. 한 프로세스 안에서 조회하고 세면
|
|
21
|
+
* 그 중간 상태가 아예 없다.
|
|
22
|
+
*
|
|
23
|
+
* 부분 성공을 걸러낸다. GitHub 는 HTTP 200에 `data` 를 채우고도 `errors` 를 함께
|
|
24
|
+
* 실어 `reviewThreads` 만 `null` 로 주는 응답을 낸다. 그걸 통과시키면 스레드 0 개가
|
|
25
|
+
* 조회 성공으로 읽혀 승인이 나간다.
|
|
26
|
+
*/
|
|
27
|
+
export declare function fetchPrSnapshot(opts: {
|
|
28
|
+
owner: string;
|
|
29
|
+
repo: string;
|
|
30
|
+
prNumber: number;
|
|
31
|
+
}, gh?: GhRunner): PrSnapshot;
|
|
32
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/review-loop/fetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,mDAAmD;AACnD,MAAM,WAAW,QAAQ;IACvB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,KAAK,EAAE,QAC+D,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,iDAAiD;AACjD,eAAO,MAAM,UAAU,MAAM,CAAC;AAwB9B;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EACvD,EAAE,GAAE,QAAgB,GACnB,UAAU,CAkDZ"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
export const runGh = (args) => execFileSync('gh', [...args], { encoding: 'utf-8', maxBuffer: 32 * 1024 * 1024 });
|
|
3
|
+
/** 페이지가 늘어도 끝나도록 두는 상한. 스레드 50개씩이라 5000개까지 본다 */
|
|
4
|
+
export const PAGE_LIMIT = 100;
|
|
5
|
+
const QUERY = `
|
|
6
|
+
query($owner:String!, $repo:String!, $pr:Int!, $cursor:String) {
|
|
7
|
+
repository(owner:$owner, name:$repo) {
|
|
8
|
+
pullRequest(number:$pr) {
|
|
9
|
+
state
|
|
10
|
+
headRefOid
|
|
11
|
+
reviewRequests(first:50) {
|
|
12
|
+
nodes { requestedReviewer { ... on User { login } } }
|
|
13
|
+
}
|
|
14
|
+
reviewThreads(first:50, after:$cursor) {
|
|
15
|
+
pageInfo { hasNextPage endCursor }
|
|
16
|
+
nodes {
|
|
17
|
+
isResolved
|
|
18
|
+
isOutdated
|
|
19
|
+
opener: comments(first:1) { nodes { author { login } } }
|
|
20
|
+
latest: comments(last:1) { nodes { author { login } } }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}`;
|
|
26
|
+
/**
|
|
27
|
+
* PR 상태와 내가 볼 스레드를 한 번에 받는다.
|
|
28
|
+
*
|
|
29
|
+
* 판정에 쓰는 수가 전부 이 한 호출에서 나온다. 문서가 이걸 셸로 적던 때는 조회와
|
|
30
|
+
* 집계가 다른 Bash 호출로 갈려 그 사이를 파일로 이어야 했다. 스냅샷이 이번 조회의
|
|
31
|
+
* 것인지 가리는 표식과 신선도 검사가 따라붙었다. 한 프로세스 안에서 조회하고 세면
|
|
32
|
+
* 그 중간 상태가 아예 없다.
|
|
33
|
+
*
|
|
34
|
+
* 부분 성공을 걸러낸다. GitHub 는 HTTP 200에 `data` 를 채우고도 `errors` 를 함께
|
|
35
|
+
* 실어 `reviewThreads` 만 `null` 로 주는 응답을 낸다. 그걸 통과시키면 스레드 0 개가
|
|
36
|
+
* 조회 성공으로 읽혀 승인이 나간다.
|
|
37
|
+
*/
|
|
38
|
+
export function fetchPrSnapshot(opts, gh = runGh) {
|
|
39
|
+
const threads = [];
|
|
40
|
+
let cursor = null;
|
|
41
|
+
let prState;
|
|
42
|
+
let headRefOid;
|
|
43
|
+
let requestedReviewers;
|
|
44
|
+
for (let page = 0; page < PAGE_LIMIT; page++) {
|
|
45
|
+
// 문자열은 `-f` 로 넘긴다. `-F` 는 값이 특수 문자로 시작하면 파일을 읽거나 현재
|
|
46
|
+
// 레포 값으로 치환하는 매직이 있다. 거기 문자열을 태우면 값 모양에 기대는 안전이 된다
|
|
47
|
+
const args = [
|
|
48
|
+
'api',
|
|
49
|
+
'graphql',
|
|
50
|
+
'-f',
|
|
51
|
+
`query=${QUERY}`,
|
|
52
|
+
'-f',
|
|
53
|
+
`owner=${opts.owner}`,
|
|
54
|
+
'-f',
|
|
55
|
+
`repo=${opts.repo}`,
|
|
56
|
+
'-F',
|
|
57
|
+
`pr=${opts.prNumber}`,
|
|
58
|
+
];
|
|
59
|
+
if (cursor)
|
|
60
|
+
args.push('-f', `cursor=${cursor}`);
|
|
61
|
+
const parsed = JSON.parse(gh(args));
|
|
62
|
+
const pr = parsed.data?.repository?.pullRequest;
|
|
63
|
+
if (parsed.errors?.length || !pr || !pr.reviewThreads) {
|
|
64
|
+
const first = parsed.errors?.[0]?.message ?? 'reviewThreads 가 null';
|
|
65
|
+
throw new Error(`조회 응답에 오류: ${first}`);
|
|
66
|
+
}
|
|
67
|
+
prState = pr.state;
|
|
68
|
+
headRefOid = pr.headRefOid;
|
|
69
|
+
requestedReviewers = pr.reviewRequests.nodes
|
|
70
|
+
.map((n) => n.requestedReviewer?.login)
|
|
71
|
+
.filter((l) => typeof l === 'string');
|
|
72
|
+
threads.push(...pr.reviewThreads.nodes);
|
|
73
|
+
if (!pr.reviewThreads.pageInfo.hasNextPage) {
|
|
74
|
+
return { prState, headRefOid, threads, requestedReviewers };
|
|
75
|
+
}
|
|
76
|
+
cursor = pr.reviewThreads.pageInfo.endCursor;
|
|
77
|
+
}
|
|
78
|
+
throw new Error('스레드 페이지가 상한을 넘었다 — 판정하지 않는다');
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/review-loop/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,CAAC,MAAM,KAAK,GAAa,CAAC,IAAI,EAAE,EAAE,CACtC,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;AASpF,iDAAiD;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;EAoBZ,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAuD,EACvD,KAAe,KAAK;IAEpB,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAe,CAAC;IACpB,IAAI,UAAkB,CAAC;IACvB,IAAI,kBAA4B,CAAC;IAEjC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7C,oDAAoD;QACpD,mDAAmD;QACnD,MAAM,IAAI,GAAG;YACX,KAAK;YACL,SAAS;YACT,IAAI;YACJ,SAAS,KAAK,EAAE;YAChB,IAAI;YACJ,SAAS,IAAI,CAAC,KAAK,EAAE;YACrB,IAAI;YACJ,QAAQ,IAAI,CAAC,IAAI,EAAE;YACnB,IAAI;YACJ,MAAM,IAAI,CAAC,QAAQ,EAAE;SACtB,CAAC;QACF,IAAI,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAGjC,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC;QAChD,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,sBAAsB,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;QACnB,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QAC3B,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,KAAK,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QAErD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAExC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9D,CAAC;QACD,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { countPending, isMine, type ReviewThread } from './threads.js';
|
|
2
|
+
export { deriveSignal, SIGNAL_ACTION, type LoopSignal, type LoopState } from './signal.js';
|
|
3
|
+
export { parsePrNumber, parseTarget, type PrTarget } from './target.js';
|
|
4
|
+
export { fetchPrSnapshot, runGh, type GhRunner, type PrSnapshot } from './fetch.js';
|
|
5
|
+
export { readLoopState, resolveRepo, type LoopStateReport } from './report.js';
|
|
6
|
+
export { stateDir, stateRoot, LOGIN_FILE, REVIEWED_HEAD_FILE } from './state.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/review-loop/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { countPending, isMine } from './threads.js';
|
|
2
|
+
export { deriveSignal, SIGNAL_ACTION } from './signal.js';
|
|
3
|
+
export { parsePrNumber, parseTarget } from './target.js';
|
|
4
|
+
export { fetchPrSnapshot, runGh } from './fetch.js';
|
|
5
|
+
export { readLoopState, resolveRepo } from './report.js';
|
|
6
|
+
export { stateDir, stateRoot, LOGIN_FILE, REVIEWED_HEAD_FILE } from './state.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/review-loop/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAqB,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAmC,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAkC,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type GhRunner } from './fetch.js';
|
|
2
|
+
import { type LoopSignal } from './signal.js';
|
|
3
|
+
export interface LoopStateReport {
|
|
4
|
+
prNumber: number;
|
|
5
|
+
/** 실제로 조회한 레포. 부르는 쪽이 게시할 때 같은 곳을 가리키려면 이 값을 쓴다 */
|
|
6
|
+
owner: string;
|
|
7
|
+
repo: string;
|
|
8
|
+
/** 상태 자리의 절대 경로. 부르는 쪽이 다시 계산하지 않게 함께 낸다 */
|
|
9
|
+
stateDir: string;
|
|
10
|
+
prState: string;
|
|
11
|
+
open: boolean;
|
|
12
|
+
head: string;
|
|
13
|
+
reviewedHead: string | null;
|
|
14
|
+
changed: boolean;
|
|
15
|
+
rerequested: boolean;
|
|
16
|
+
me: string;
|
|
17
|
+
/** PR 에 달린 전체 스레드. 남이 연 것도 들어간다 */
|
|
18
|
+
prThreads: number;
|
|
19
|
+
/** 그중 내가 연 것. 사람에게 보이는 수는 이쪽이다 */
|
|
20
|
+
myThreads: number;
|
|
21
|
+
pending: number;
|
|
22
|
+
signal: LoopSignal;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 판정에 쓰는 수를 전부 만든다.
|
|
26
|
+
*
|
|
27
|
+
* 부르는 쪽이 이 함수 하나만 보면 되도록 조회와 집계와 신호 도출을 여기서 잇는다.
|
|
28
|
+
* 문서가 이 셋을 따로 적던 때는 각 코드블록이 다른 Bash 호출이라 앞 블록의 값이 뒤에서
|
|
29
|
+
* 빈 문자열로 풀렸다. 그 빈 값이 미대응 0 으로 읽혀 승인이 나갔다.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readLoopState(opts: {
|
|
32
|
+
prNumber: number;
|
|
33
|
+
owner?: string;
|
|
34
|
+
repo?: string;
|
|
35
|
+
me?: string;
|
|
36
|
+
cwd?: string;
|
|
37
|
+
}, gh?: GhRunner): LoopStateReport;
|
|
38
|
+
export declare function resolveRepo(gh: GhRunner): {
|
|
39
|
+
owner: string;
|
|
40
|
+
repo: string;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/review-loop/report.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EACpF,EAAE,GAAE,QAAgB,GACnB,eAAe,CAwCjB;AA0CD,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAOzE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { fetchPrSnapshot, runGh } from './fetch.js';
|
|
4
|
+
import { deriveSignal } from './signal.js';
|
|
5
|
+
import { countPending, isMine } from './threads.js';
|
|
6
|
+
import { LOGIN_FILE, REVIEWED_HEAD_FILE, stateDir } from './state.js';
|
|
7
|
+
/**
|
|
8
|
+
* 판정에 쓰는 수를 전부 만든다.
|
|
9
|
+
*
|
|
10
|
+
* 부르는 쪽이 이 함수 하나만 보면 되도록 조회와 집계와 신호 도출을 여기서 잇는다.
|
|
11
|
+
* 문서가 이 셋을 따로 적던 때는 각 코드블록이 다른 Bash 호출이라 앞 블록의 값이 뒤에서
|
|
12
|
+
* 빈 문자열로 풀렸다. 그 빈 값이 미대응 0 으로 읽혀 승인이 나갔다.
|
|
13
|
+
*/
|
|
14
|
+
export function readLoopState(opts, gh = runGh) {
|
|
15
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
16
|
+
// 대상이 URL 로 왔으면 거기 적힌 레포를 본다. 번호만 왔을 때만 현재 레포로 떨어진다
|
|
17
|
+
const { owner, repo } = opts.owner && opts.repo ? { owner: opts.owner, repo: opts.repo } : resolveRepo(gh);
|
|
18
|
+
const dir = stateDir({ owner, repo, prNumber: opts.prNumber }, cwd);
|
|
19
|
+
const me = validateLogin(opts.me?.trim() || resolveLogin(dir, gh));
|
|
20
|
+
const snapshot = fetchPrSnapshot({ owner, repo, prNumber: opts.prNumber }, gh);
|
|
21
|
+
const reviewedPath = join(dir, REVIEWED_HEAD_FILE);
|
|
22
|
+
const reviewedHead = existsSync(reviewedPath)
|
|
23
|
+
? readFileSync(reviewedPath, 'utf-8').trim() || null
|
|
24
|
+
: null;
|
|
25
|
+
const pending = countPending(snapshot.threads, me);
|
|
26
|
+
const open = snapshot.prState === 'OPEN';
|
|
27
|
+
// 첫 라운드는 비교할 이전 head 가 없다. 그때 changed 를 참으로 두면 리뷰도 안 한
|
|
28
|
+
// 커밋을 "새 커밋이 왔다"로 읽으므로 거짓으로 둔다
|
|
29
|
+
const changed = reviewedHead !== null && snapshot.headRefOid !== reviewedHead;
|
|
30
|
+
const lower = me.toLowerCase();
|
|
31
|
+
const rerequested = snapshot.requestedReviewers.some((r) => r.toLowerCase() === lower);
|
|
32
|
+
return {
|
|
33
|
+
prNumber: opts.prNumber,
|
|
34
|
+
owner,
|
|
35
|
+
repo,
|
|
36
|
+
stateDir: dir,
|
|
37
|
+
prState: snapshot.prState,
|
|
38
|
+
open,
|
|
39
|
+
head: snapshot.headRefOid,
|
|
40
|
+
reviewedHead,
|
|
41
|
+
changed,
|
|
42
|
+
rerequested,
|
|
43
|
+
me,
|
|
44
|
+
prThreads: snapshot.threads.length,
|
|
45
|
+
myThreads: snapshot.threads.filter((th) => isMine(th, me)).length,
|
|
46
|
+
pending,
|
|
47
|
+
signal: deriveSignal({ open, reviewed: reviewedHead !== null, pending, changed, rerequested }),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 로그인이 GitHub 이 실제로 낼 수 있는 꼴인지 본다.
|
|
52
|
+
*
|
|
53
|
+
* 공백만 걷어내고 그대로 쓰면 보이지 않는 문자가 섞인 값이 검사를 통과한 뒤 어떤
|
|
54
|
+
* 스레드와도 안 맞아 미대응이 0이 되고 승인이 열린다. 대소문자는 비교하는 쪽에서
|
|
55
|
+
* 맞추므로 여기서는 문법만 본다.
|
|
56
|
+
*/
|
|
57
|
+
function validateLogin(login) {
|
|
58
|
+
if (!/^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/.test(login)) {
|
|
59
|
+
throw new Error(`내 로그인을 못 읽었다: ${JSON.stringify(login)}`);
|
|
60
|
+
}
|
|
61
|
+
return login;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 내 로그인. 캐시가 있으면 그걸 쓰고 없으면 조회한다.
|
|
65
|
+
*
|
|
66
|
+
* 캐시 파일이 비어 있으면 조회로 떨어진다. 셸로 적던 때는 `gh api user > my-login` 이
|
|
67
|
+
* 종료 코드를 안 봐서 인증이 끊긴 순간 0 바이트 파일이 남았다. 그 뒤 모든 라운드가
|
|
68
|
+
* 빈 로그인으로 집계해 미대응이 영구히 0이 됐다.
|
|
69
|
+
*/
|
|
70
|
+
function resolveLogin(dir, gh) {
|
|
71
|
+
const cached = join(dir, LOGIN_FILE);
|
|
72
|
+
if (existsSync(cached)) {
|
|
73
|
+
const value = readFileSync(cached, 'utf-8').trim();
|
|
74
|
+
if (value)
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
const login = gh(['api', 'user', '--jq', '.login']).trim();
|
|
78
|
+
if (!login)
|
|
79
|
+
throw new Error('내 로그인을 못 읽었다 — gh 인증을 확인한다');
|
|
80
|
+
// 굳혀둔다. 안 그러면 조회할 때마다 왕복이 하나씩 더 붙는다. 상태 자리 표가 선언한
|
|
81
|
+
// 파일도 영영 안 생긴다
|
|
82
|
+
try {
|
|
83
|
+
mkdirSync(dir, { recursive: true });
|
|
84
|
+
writeFileSync(cached, `${login}\n`);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// 캐시를 못 써도 조회는 성립한다. 다음 라운드가 다시 묻는다
|
|
88
|
+
}
|
|
89
|
+
return login;
|
|
90
|
+
}
|
|
91
|
+
export function resolveRepo(gh) {
|
|
92
|
+
const raw = gh(['repo', 'view', '--json', 'owner,name']).trim();
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
const owner = parsed.owner?.login;
|
|
95
|
+
const repo = parsed.name;
|
|
96
|
+
if (!owner || !repo)
|
|
97
|
+
throw new Error('레포를 못 읽었다 — origin 원격을 확인한다');
|
|
98
|
+
return { owner, repo };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/review-loop/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 대응 모니터링이 읽어낸 PR 상태. 조회 결과와 라운드 상태를 합쳐 만든 판정 입력이다 —
|
|
3
|
+
* `changed` 는 조회한 head 를 지난 라운드에 리뷰한 sha 와 비교한 값이고 나머지 셋도
|
|
4
|
+
* 원시 응답이 아니라 거기서 뽑아낸 것이다.
|
|
5
|
+
*/
|
|
6
|
+
export interface LoopState {
|
|
7
|
+
/** PR 이 아직 열려 있는지. GraphQL `state` 가 OPEN 일 때만 참 */
|
|
8
|
+
open: boolean;
|
|
9
|
+
/** 이 루프가 한 번이라도 리뷰했는지. `reviewed-head` 가 있으면 참 */
|
|
10
|
+
reviewed: boolean;
|
|
11
|
+
/** 내가 연 열린 스레드 중 미대응 수 */
|
|
12
|
+
pending: number;
|
|
13
|
+
/** head 가 지난 라운드에 리뷰한 커밋과 다른지 */
|
|
14
|
+
changed: boolean;
|
|
15
|
+
/** 리뷰 요청 목록에 내 로그인이 다시 들어왔는지 */
|
|
16
|
+
rerequested: boolean;
|
|
17
|
+
}
|
|
18
|
+
export type LoopSignal = 'CLOSED' | 'REREVIEW_REQUESTED' | 'READY' | 'REPLIES_ONLY' | 'WAITING';
|
|
19
|
+
/**
|
|
20
|
+
* 네 값에서 다음에 할 일을 정한다.
|
|
21
|
+
*
|
|
22
|
+
* 이 도출이 문서에 없던 자리다. 감시 모드를 미루며 폴링 스크립트를 지울 때 규칙이
|
|
23
|
+
* 그 안에 있다가 함께 사라졌다. 재리뷰 판정 표는 만들어지지 않는 이름으로 분기하고
|
|
24
|
+
* 있었다. 여기 두면 네 값의 곱집합이 전부 어느 한 쪽으로 간다.
|
|
25
|
+
*
|
|
26
|
+
* 순서가 규칙의 일부다. 닫힌 PR 은 나머지를 볼 것도 없다. 작성자가 명시적으로 다시
|
|
27
|
+
* 봐달라고 눌렀으면 미대응이 남아 있어도 그 뜻을 따른다.
|
|
28
|
+
*/
|
|
29
|
+
export declare function deriveSignal(state: LoopState): LoopSignal;
|
|
30
|
+
/**
|
|
31
|
+
* 신호마다 루프가 다음에 하는 일.
|
|
32
|
+
*
|
|
33
|
+
* 문서의 재리뷰 판정 표가 이 문자열을 그대로 싣는다. 테스트가 표 행과 이 값을 대조하므로
|
|
34
|
+
* 한쪽만 고치면 게이트에서 걸린다.
|
|
35
|
+
*/
|
|
36
|
+
export declare const SIGNAL_ACTION: Record<LoopSignal, string>;
|
|
37
|
+
//# sourceMappingURL=signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../../src/review-loop/signal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,oBAAoB,GAAG,OAAO,GAAG,cAAc,GAAG,SAAS,CAAC;AAEhG;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAQzD;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAMpD,CAAC"}
|