@tienne/gestalt 0.75.1 → 0.76.1

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.
Files changed (57) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.ko.md +3 -3
  3. package/README.md +3 -3
  4. package/dist/package.json +1 -1
  5. package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
  6. package/dist/plugin/skills/local-pr/SKILL.md +1 -0
  7. package/dist/plugin/skills/review/SKILL.md +44 -21
  8. package/dist/plugin/skills/review-loop/CONTRACT.md +90 -0
  9. package/dist/plugin/skills/review-loop/SKILL.md +813 -0
  10. package/dist/plugin/skills/review-reply/SKILL.md +2 -2
  11. package/dist/plugin/skills/ship/SKILL.md +2 -1
  12. package/dist/src/cli/commands/review-loop.d.ts +45 -0
  13. package/dist/src/cli/commands/review-loop.d.ts.map +1 -0
  14. package/dist/src/cli/commands/review-loop.js +85 -0
  15. package/dist/src/cli/commands/review-loop.js.map +1 -0
  16. package/dist/src/cli/index.d.ts.map +1 -1
  17. package/dist/src/cli/index.js +27 -0
  18. package/dist/src/cli/index.js.map +1 -1
  19. package/dist/src/review-loop/fetch.d.ts +37 -0
  20. package/dist/src/review-loop/fetch.d.ts.map +1 -0
  21. package/dist/src/review-loop/fetch.js +88 -0
  22. package/dist/src/review-loop/fetch.js.map +1 -0
  23. package/dist/src/review-loop/index.d.ts +7 -0
  24. package/dist/src/review-loop/index.d.ts.map +1 -0
  25. package/dist/src/review-loop/index.js +7 -0
  26. package/dist/src/review-loop/index.js.map +1 -0
  27. package/dist/src/review-loop/report.d.ts +42 -0
  28. package/dist/src/review-loop/report.d.ts.map +1 -0
  29. package/dist/src/review-loop/report.js +100 -0
  30. package/dist/src/review-loop/report.js.map +1 -0
  31. package/dist/src/review-loop/signal.d.ts +37 -0
  32. package/dist/src/review-loop/signal.d.ts.map +1 -0
  33. package/dist/src/review-loop/signal.js +37 -0
  34. package/dist/src/review-loop/signal.js.map +1 -0
  35. package/dist/src/review-loop/state.d.ts +20 -0
  36. package/dist/src/review-loop/state.d.ts.map +1 -0
  37. package/dist/src/review-loop/state.js +55 -0
  38. package/dist/src/review-loop/state.js.map +1 -0
  39. package/dist/src/review-loop/target.d.ts +23 -0
  40. package/dist/src/review-loop/target.d.ts.map +1 -0
  41. package/dist/src/review-loop/target.js +57 -0
  42. package/dist/src/review-loop/target.js.map +1 -0
  43. package/dist/src/review-loop/threads.d.ts +43 -0
  44. package/dist/src/review-loop/threads.d.ts.map +1 -0
  45. package/dist/src/review-loop/threads.js +40 -0
  46. package/dist/src/review-loop/threads.js.map +1 -0
  47. package/package.json +1 -1
  48. package/plugin/.codex-plugin/plugin.json +2 -2
  49. package/plugin/.mcp.json +1 -1
  50. package/plugin/mcp.json +1 -1
  51. package/plugin/skills/_shared/proactive-routing.md +1 -0
  52. package/plugin/skills/local-pr/SKILL.md +1 -0
  53. package/plugin/skills/review/SKILL.md +44 -21
  54. package/plugin/skills/review-loop/CONTRACT.md +90 -0
  55. package/plugin/skills/review-loop/SKILL.md +813 -0
  56. package/plugin/skills/review-reply/SKILL.md +2 -2
  57. package/plugin/skills/ship/SKILL.md +2 -1
@@ -60,7 +60,7 @@ outputs:
60
60
  /review-reply feature/auth # 해당 브랜치의 PR
61
61
  ```
62
62
 
63
- 받은 코멘트에 한 번 답하는 게 이 스킬의 범위다. 코멘트가 안 나올 때까지 리뷰와 대응을 반복하려면 `ship` 스킬을 쓴다그쪽이 라운드마다 스킬을 부른다.
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`가 맞아요"라고 안내하고 사용자 판단을 받는다. 남의 PR에 리뷰이 어투로 답하면 어색해진다. (github·local 공통 규칙)
180
+ - **작성자 확인**: 작성자가 현재 사용자와 다르면 이건 남의 PR이다. "이 PR은 제 것이 아닌데, 리뷰어 입장 코멘트를 다는 거라면 `/review`가 맞아요. 코멘트를 남기고 대응까지 지켜볼 거면 `/review-loop`이고요"라고 안내하고 사용자 판단을 받는다. 남의 PR에 리뷰이 어투로 답하면 어색해진다. (github·local 공통 규칙)
181
181
 
182
182
  ### 1단계: 미해결 리뷰 스레드 수집
183
183
 
@@ -75,6 +75,7 @@ outputs:
75
75
  | 리뷰를 한 번 받아본다 | `review` |
76
76
  | PR만 만든다 | `pr` |
77
77
  | 받은 리뷰에 답한다 | `review-reply` |
78
+ | 남의 PR을 리뷰하고 대응을 지켜보다 재리뷰한다 | `review-loop` |
78
79
  | 브랜치를 리뷰 통과 상태까지 밀어 GitHub에 낸다 | **이 스킬** |
79
80
 
80
81
  한 번 부르면 끝까지 간다. 중간에 서서 보고 싶으면 이 스킬이 아니라 위의 개별 스킬을 순서대로 부른다.
@@ -250,7 +251,7 @@ gh auth status
250
251
 
251
252
  - 공용 `/tmp`의 고정 이름 — 남이 먼저 만들어둔 심볼릭 링크로 쓰기 대상이 바뀔 수 있다
252
253
  - `mktemp -d` — 그 경로가 셸 변수에만 남는다. 라운드 사이에 셸 상태가 안 남는 런타임이면 다음 단계에서 빈 문자열로 풀린다
253
- - **레포 워킹트리 안** — `.gestalt/`처럼 이 레포가 무시하는 자리라도 **다른 레포에서는 아니다.** 이 스킬은 플러그인으로 배포돼 밖에서도 돈다. 무시 안 되는 자리에 쓰면 `review-reply`의 커밋이 로그까지 담아 PR에 실어 보내거나, `review` 4.7단계의 신선도 가드가 매 라운드 새 `??` 항목을 보고 리뷰를 통째로 다시 돌린다
254
+ - **레포 워킹트리 안** — `.gestalt/`처럼 이 레포가 무시하는 자리라도 **다른 레포에서는 아니다.** 이 스킬은 플러그인으로 배포돼 밖에서도 돈다. 무시 안 되는 자리에 쓰면 `review-reply`의 커밋이 로그까지 담아 PR에 실어 보내거나, `review` 4.7단계가 `consensus 일치 검사`에서 매 라운드 새 `??` 항목을 보고 리뷰를 통째로 다시 돌린다
254
255
 
255
256
  **git 디렉토리 아래를 쓴다.** git이 절대 추적하지 않는 자리이고 절대 경로라 cwd가 어디든 같은 자리를 가리킨다.
256
257
 
@@ -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;AAmCpC,wBAAgB,SAAS,IAAI,OAAO,CAuQnC"}
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"}
@@ -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,37 @@
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
+ export declare const REVIEWER_PAGE = 50;
17
+ /**
18
+ * PR 상태와 내가 볼 스레드를 한 번에 받는다.
19
+ *
20
+ * 판정에 쓸 원자료를 이 함수 하나가 모은다. 페이지를 도는 건 스레드뿐이라 합치는 건
21
+ * 여기서 끝난다. 부르는 쪽은 스레드를 온전히 받거나 아무것도 못 받는다.
22
+ *
23
+ * `reviewRequests` 도 connection 이지만 커서를 안 돈다. GitHub 가 PR 당 요청 리뷰어를
24
+ * `REVIEWER_PAGE` 보다 훨씬 아래로 제한해 한 페이지에 다 들어온다. 그 전제가 깨지면 아래에서 던진다 —
25
+ * 목록이 잘리면 `rerequested` 가 거짓으로 읽혀, 작성자가 다시 봐달라고 눌러도 재리뷰를
26
+ * 안 돈다.
27
+ *
28
+ * 부분 성공을 걸러낸다. GitHub 는 HTTP 200에 `data` 를 채우고도 `errors` 를 함께
29
+ * 실어 `reviewThreads` 만 `null` 로 주는 응답을 낸다. 그걸 통과시키면 스레드 0 개가
30
+ * 조회 성공으로 읽혀 승인이 나간다.
31
+ */
32
+ export declare function fetchPrSnapshot(opts: {
33
+ owner: string;
34
+ repo: string;
35
+ prNumber: number;
36
+ }, gh?: GhRunner): PrSnapshot;
37
+ //# 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;AAE9B,2DAA2D;AAC3D,eAAO,MAAM,aAAa,KAAK,CAAC;AAwBhC;;;;;;;;;;;;;;GAcG;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,CAqDZ"}
@@ -0,0 +1,88 @@
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
+ /** 요청 리뷰어를 한 번에 받는 수. 쿼리와 '한 페이지를 채웠는지' 검사가 같은 값을 봐야 한다 */
6
+ export const REVIEWER_PAGE = 50;
7
+ const QUERY = `
8
+ query($owner:String!, $repo:String!, $pr:Int!, $cursor:String) {
9
+ repository(owner:$owner, name:$repo) {
10
+ pullRequest(number:$pr) {
11
+ state
12
+ headRefOid
13
+ reviewRequests(first:${REVIEWER_PAGE}) {
14
+ nodes { requestedReviewer { ... on User { login } } }
15
+ }
16
+ reviewThreads(first:50, after:$cursor) {
17
+ pageInfo { hasNextPage endCursor }
18
+ nodes {
19
+ isResolved
20
+ isOutdated
21
+ opener: comments(first:1) { nodes { author { login } } }
22
+ latest: comments(last:1) { nodes { author { login } } }
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }`;
28
+ /**
29
+ * PR 상태와 내가 볼 스레드를 한 번에 받는다.
30
+ *
31
+ * 판정에 쓸 원자료를 이 함수 하나가 모은다. 페이지를 도는 건 스레드뿐이라 합치는 건
32
+ * 여기서 끝난다. 부르는 쪽은 스레드를 온전히 받거나 아무것도 못 받는다.
33
+ *
34
+ * `reviewRequests` 도 connection 이지만 커서를 안 돈다. GitHub 가 PR 당 요청 리뷰어를
35
+ * `REVIEWER_PAGE` 보다 훨씬 아래로 제한해 한 페이지에 다 들어온다. 그 전제가 깨지면 아래에서 던진다 —
36
+ * 목록이 잘리면 `rerequested` 가 거짓으로 읽혀, 작성자가 다시 봐달라고 눌러도 재리뷰를
37
+ * 안 돈다.
38
+ *
39
+ * 부분 성공을 걸러낸다. GitHub 는 HTTP 200에 `data` 를 채우고도 `errors` 를 함께
40
+ * 실어 `reviewThreads` 만 `null` 로 주는 응답을 낸다. 그걸 통과시키면 스레드 0 개가
41
+ * 조회 성공으로 읽혀 승인이 나간다.
42
+ */
43
+ export function fetchPrSnapshot(opts, gh = runGh) {
44
+ const threads = [];
45
+ let cursor = null;
46
+ let prState;
47
+ let headRefOid;
48
+ let requestedReviewers;
49
+ for (let page = 0; page < PAGE_LIMIT; page++) {
50
+ // 문자열은 `-f` 로 넘긴다. `-F` 는 값이 특수 문자로 시작하면 파일을 읽거나 현재
51
+ // 레포 값으로 치환하는 매직이 있다. 거기 문자열을 태우면 값 모양에 기대는 안전이 된다
52
+ const args = [
53
+ 'api',
54
+ 'graphql',
55
+ '-f',
56
+ `query=${QUERY}`,
57
+ '-f',
58
+ `owner=${opts.owner}`,
59
+ '-f',
60
+ `repo=${opts.repo}`,
61
+ '-F',
62
+ `pr=${opts.prNumber}`,
63
+ ];
64
+ if (cursor)
65
+ args.push('-f', `cursor=${cursor}`);
66
+ const parsed = JSON.parse(gh(args));
67
+ const pr = parsed.data?.repository?.pullRequest;
68
+ if (parsed.errors?.length || !pr || !pr.reviewThreads) {
69
+ const first = parsed.errors?.[0]?.message ?? 'reviewThreads 가 null';
70
+ throw new Error(`조회 응답에 오류: ${first}`);
71
+ }
72
+ prState = pr.state;
73
+ headRefOid = pr.headRefOid;
74
+ if (pr.reviewRequests.nodes.length >= REVIEWER_PAGE) {
75
+ throw new Error('요청 리뷰어가 한 페이지를 채웠다 — 목록이 잘렸을 수 있어 판정하지 않는다');
76
+ }
77
+ requestedReviewers = pr.reviewRequests.nodes
78
+ .map((n) => n.requestedReviewer?.login)
79
+ .filter((l) => typeof l === 'string');
80
+ threads.push(...pr.reviewThreads.nodes);
81
+ if (!pr.reviewThreads.pageInfo.hasNextPage) {
82
+ return { prState, headRefOid, threads, requestedReviewers };
83
+ }
84
+ cursor = pr.reviewThreads.pageInfo.endCursor;
85
+ }
86
+ throw new Error('스레드 페이지가 상한을 넘었다 — 판정하지 않는다');
87
+ }
88
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/review-loop/fetch.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwBtE;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAoF,EACpF,KAAe,KAAK;IAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,oDAAoD;IACpD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrF,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3C,CAAC,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI;QACpD,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,KAAK,MAAM,CAAC;IACzC,uDAAuD;IACvD,+BAA+B;IAC/B,MAAM,OAAO,GAAG,YAAY,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,YAAY,CAAC;IAC9E,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IAEvF,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK;QACL,IAAI;QACJ,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI;QACJ,IAAI,EAAE,QAAQ,CAAC,UAAU;QACzB,YAAY;QACZ,OAAO;QACP,WAAW;QACX,EAAE;QACF,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;QAClC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QACjE,OAAO;QACP,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;KAC/F,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,GAAW,EAAE,EAAY;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC1D,kDAAkD;IAClD,eAAe;IACf,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAY;IACtC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkD,CAAC;IAChF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -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