@tienne/gestalt 0.67.0 → 0.69.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.
Files changed (163) hide show
  1. package/CLAUDE.md +12 -5
  2. package/README.ko.md +9 -5
  3. package/README.md +10 -5
  4. package/dist/package.json +2 -1
  5. package/dist/plugin/review-agents/comment-reviewer/AGENT.md +2 -0
  6. package/dist/plugin/review-agents/quality-reviewer/AGENT.md +1 -1
  7. package/dist/plugin/review-agents/writing-reviewer/AGENT.md +123 -0
  8. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +1 -1
  9. package/dist/plugin/role-agents/_shared/references/comment-rules.md +14 -0
  10. package/dist/plugin/skills/_shared/agent-model.md +15 -0
  11. package/dist/plugin/skills/blast-radius/SKILL.md +31 -0
  12. package/dist/plugin/skills/diff-radius/SKILL.md +1 -1
  13. package/dist/plugin/skills/execute/SKILL.md +15 -0
  14. package/dist/plugin/skills/local-pr/SKILL.md +201 -0
  15. package/dist/plugin/skills/pr/SKILL.md +73 -4
  16. package/dist/plugin/skills/review/SKILL.md +236 -22
  17. package/dist/plugin/skills/review-reply/SKILL.md +160 -7
  18. package/dist/src/agent/role-match-engine.d.ts +8 -0
  19. package/dist/src/agent/role-match-engine.d.ts.map +1 -1
  20. package/dist/src/agent/role-match-engine.js +1 -1
  21. package/dist/src/agent/role-match-engine.js.map +1 -1
  22. package/dist/src/cli/commands/interview.js +2 -2
  23. package/dist/src/cli/commands/interview.js.map +1 -1
  24. package/dist/src/cli/commands/pr.d.ts +133 -0
  25. package/dist/src/cli/commands/pr.d.ts.map +1 -0
  26. package/dist/src/cli/commands/pr.js +489 -0
  27. package/dist/src/cli/commands/pr.js.map +1 -0
  28. package/dist/src/cli/commands/spec.js +2 -2
  29. package/dist/src/cli/commands/spec.js.map +1 -1
  30. package/dist/src/cli/index.d.ts.map +1 -1
  31. package/dist/src/cli/index.js +85 -0
  32. package/dist/src/cli/index.js.map +1 -1
  33. package/dist/src/core/config.d.ts.map +1 -1
  34. package/dist/src/core/config.js +4 -3
  35. package/dist/src/core/config.js.map +1 -1
  36. package/dist/src/core/home.d.ts +20 -0
  37. package/dist/src/core/home.d.ts.map +1 -0
  38. package/dist/src/core/home.js +52 -0
  39. package/dist/src/core/home.js.map +1 -0
  40. package/dist/src/core/types.d.ts +38 -0
  41. package/dist/src/core/types.d.ts.map +1 -1
  42. package/dist/src/core/version.d.ts.map +1 -1
  43. package/dist/src/core/version.js +4 -7
  44. package/dist/src/core/version.js.map +1 -1
  45. package/dist/src/events/store.d.ts +32 -0
  46. package/dist/src/events/store.d.ts.map +1 -1
  47. package/dist/src/events/store.js +68 -3
  48. package/dist/src/events/store.js.map +1 -1
  49. package/dist/src/humanize/detectors.d.ts.map +1 -1
  50. package/dist/src/humanize/detectors.js +3 -1
  51. package/dist/src/humanize/detectors.js.map +1 -1
  52. package/dist/src/interview/engine.d.ts +6 -1
  53. package/dist/src/interview/engine.d.ts.map +1 -1
  54. package/dist/src/interview/engine.js +7 -2
  55. package/dist/src/interview/engine.js.map +1 -1
  56. package/dist/src/knowledge-base/summarizer.d.ts +22 -0
  57. package/dist/src/knowledge-base/summarizer.d.ts.map +1 -0
  58. package/dist/src/knowledge-base/summarizer.js +179 -0
  59. package/dist/src/knowledge-base/summarizer.js.map +1 -0
  60. package/dist/src/llm/factory.d.ts +9 -0
  61. package/dist/src/llm/factory.d.ts.map +1 -1
  62. package/dist/src/llm/factory.js +13 -0
  63. package/dist/src/llm/factory.js.map +1 -1
  64. package/dist/src/local-pr/engine.d.ts +176 -0
  65. package/dist/src/local-pr/engine.d.ts.map +1 -0
  66. package/dist/src/local-pr/engine.js +373 -0
  67. package/dist/src/local-pr/engine.js.map +1 -0
  68. package/dist/src/local-pr/git.d.ts +190 -0
  69. package/dist/src/local-pr/git.d.ts.map +1 -0
  70. package/dist/src/local-pr/git.js +580 -0
  71. package/dist/src/local-pr/git.js.map +1 -0
  72. package/dist/src/local-pr/index.d.ts +6 -0
  73. package/dist/src/local-pr/index.d.ts.map +1 -0
  74. package/dist/src/local-pr/index.js +8 -0
  75. package/dist/src/local-pr/index.js.map +1 -0
  76. package/dist/src/local-pr/policy.d.ts +77 -0
  77. package/dist/src/local-pr/policy.d.ts.map +1 -0
  78. package/dist/src/local-pr/policy.js +80 -0
  79. package/dist/src/local-pr/policy.js.map +1 -0
  80. package/dist/src/local-pr/registry.d.ts +79 -0
  81. package/dist/src/local-pr/registry.d.ts.map +1 -0
  82. package/dist/src/local-pr/registry.js +307 -0
  83. package/dist/src/local-pr/registry.js.map +1 -0
  84. package/dist/src/local-pr/repository.d.ts +67 -0
  85. package/dist/src/local-pr/repository.d.ts.map +1 -0
  86. package/dist/src/local-pr/repository.js +251 -0
  87. package/dist/src/local-pr/repository.js.map +1 -0
  88. package/dist/src/local-pr/types.d.ts +151 -0
  89. package/dist/src/local-pr/types.d.ts.map +1 -0
  90. package/dist/src/local-pr/types.js +9 -0
  91. package/dist/src/local-pr/types.js.map +1 -0
  92. package/dist/src/local-pr-web/engine.d.ts +24 -0
  93. package/dist/src/local-pr-web/engine.d.ts.map +1 -0
  94. package/dist/src/local-pr-web/engine.js +112 -0
  95. package/dist/src/local-pr-web/engine.js.map +1 -0
  96. package/dist/src/local-pr-web/html-generator.d.ts +24 -0
  97. package/dist/src/local-pr-web/html-generator.d.ts.map +1 -0
  98. package/dist/src/local-pr-web/html-generator.js +385 -0
  99. package/dist/src/local-pr-web/html-generator.js.map +1 -0
  100. package/dist/src/local-pr-web/index.d.ts +5 -0
  101. package/dist/src/local-pr-web/index.d.ts.map +1 -0
  102. package/dist/src/local-pr-web/index.js +5 -0
  103. package/dist/src/local-pr-web/index.js.map +1 -0
  104. package/dist/src/local-pr-web/server.d.ts +126 -0
  105. package/dist/src/local-pr-web/server.d.ts.map +1 -0
  106. package/dist/src/local-pr-web/server.js +394 -0
  107. package/dist/src/local-pr-web/server.js.map +1 -0
  108. package/dist/src/local-pr-web/types.d.ts +11 -0
  109. package/dist/src/local-pr-web/types.d.ts.map +1 -0
  110. package/dist/src/local-pr-web/types.js +2 -0
  111. package/dist/src/local-pr-web/types.js.map +1 -0
  112. package/dist/src/mcp/schemas.d.ts +79 -4
  113. package/dist/src/mcp/schemas.d.ts.map +1 -1
  114. package/dist/src/mcp/schemas.js +80 -2
  115. package/dist/src/mcp/schemas.js.map +1 -1
  116. package/dist/src/mcp/server.d.ts.map +1 -1
  117. package/dist/src/mcp/server.js +23 -10
  118. package/dist/src/mcp/server.js.map +1 -1
  119. package/dist/src/mcp/tools/generate-kb.d.ts +10 -1
  120. package/dist/src/mcp/tools/generate-kb.d.ts.map +1 -1
  121. package/dist/src/mcp/tools/generate-kb.js +17 -1
  122. package/dist/src/mcp/tools/generate-kb.js.map +1 -1
  123. package/dist/src/mcp/tools/pr.d.ts +5 -0
  124. package/dist/src/mcp/tools/pr.d.ts.map +1 -0
  125. package/dist/src/mcp/tools/pr.js +165 -0
  126. package/dist/src/mcp/tools/pr.js.map +1 -0
  127. package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -1
  128. package/dist/src/mcp/tools/review-passthrough.js +264 -15
  129. package/dist/src/mcp/tools/review-passthrough.js.map +1 -1
  130. package/dist/src/mcp/tools/search-kb.d.ts.map +1 -1
  131. package/dist/src/mcp/tools/search-kb.js +5 -0
  132. package/dist/src/mcp/tools/search-kb.js.map +1 -1
  133. package/dist/src/mcp/tools/status.d.ts +16 -0
  134. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  135. package/dist/src/mcp/tools/status.js +19 -4
  136. package/dist/src/mcp/tools/status.js.map +1 -1
  137. package/dist/src/memory/user-profile-store.d.ts.map +1 -1
  138. package/dist/src/memory/user-profile-store.js +3 -4
  139. package/dist/src/memory/user-profile-store.js.map +1 -1
  140. package/dist/src/review/context-collector.d.ts +1 -1
  141. package/dist/src/review/context-collector.js +1 -1
  142. package/dist/src/review/passthrough-engine.d.ts +1 -0
  143. package/dist/src/review/passthrough-engine.d.ts.map +1 -1
  144. package/dist/src/review/passthrough-engine.js +7 -2
  145. package/dist/src/review/passthrough-engine.js.map +1 -1
  146. package/dist/src/spec/text-based-spec-generator.d.ts.map +1 -1
  147. package/dist/src/spec/text-based-spec-generator.js +5 -2
  148. package/dist/src/spec/text-based-spec-generator.js.map +1 -1
  149. package/package.json +2 -1
  150. package/plugin/.codex-plugin/plugin.json +1 -1
  151. package/plugin/review-agents/comment-reviewer/AGENT.md +2 -0
  152. package/plugin/review-agents/quality-reviewer/AGENT.md +1 -1
  153. package/plugin/review-agents/writing-reviewer/AGENT.md +123 -0
  154. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +1 -1
  155. package/plugin/role-agents/_shared/references/comment-rules.md +14 -0
  156. package/plugin/skills/_shared/agent-model.md +15 -0
  157. package/plugin/skills/blast-radius/SKILL.md +31 -0
  158. package/plugin/skills/diff-radius/SKILL.md +1 -1
  159. package/plugin/skills/execute/SKILL.md +15 -0
  160. package/plugin/skills/local-pr/SKILL.md +201 -0
  161. package/plugin/skills/pr/SKILL.md +73 -4
  162. package/plugin/skills/review/SKILL.md +236 -22
  163. package/plugin/skills/review-reply/SKILL.md +160 -7
@@ -0,0 +1,580 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, mkdtempSync, realpathSync, rmdirSync, rmSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ /**
6
+ * 로컬 PR이 쓰는 git 연산.
7
+ *
8
+ * 명령은 전부 execFileSync로 인자를 배열로 넘긴다. 셸을 안 거치므로 제목이나
9
+ * 브랜치 이름에 따옴표와 공백이 섞여도 그대로 간다.
10
+ */
11
+ /**
12
+ * 대상 레포의 config가 시키는 외부 명령을 끈다.
13
+ *
14
+ * `core.fsmonitor`에 적힌 값은 git이 그대로 실행한다. 그런데 이 모듈이 도는 자리
15
+ * 중에는 `pr serve`가 띄운 인증 없는 웹 서버의 요청 경로가 있다. 그 서버가 여는
16
+ * 레포 목록에는 사용자가 한 번이라도 serve를 돌린 남의 클론이 함께 들어 있다.
17
+ * `.git/config`는 에이전트가 쓸 수 있는 파일이라, 막지 않으면 HTTP GET 한 번이
18
+ * 그 config에 적힌 명령을 실행시킨다.
19
+ *
20
+ * 상태를 바꾸는 명령에도 함께 건다. fsmonitor는 파일 변경을 캐시로 앞당기는
21
+ * 성능 장치일 뿐이라 꺼도 결과가 안 달라진다 — 큰 레포에서 `status`가 느려질 뿐이다.
22
+ * 대신 훅이나 머지 드라이버는 안 건드린다. 그쪽은 사람이 직접 부른 머지에서
23
+ * 돌라고 있는 것이다. 웹 요청 경로에는 안 실린다.
24
+ *
25
+ * diff 쪽 벡터(`diff.external`, `diff.<드라이버>.textconv`)는 여기가 아니라
26
+ * diff 명령의 `--no-ext-diff --no-textconv`로 막는다. `-c diff.external=`은 빈
27
+ * 문자열을 실행 파일로 알아들어서 `cannot run : No such file or directory`로
28
+ * 죽는다 — 막기는 하지만 diff 자체가 안 나온다.
29
+ */
30
+ const NO_CONFIG_EXEC = ['-c', 'core.fsmonitor='];
31
+ /** diff 계열이 config에 적힌 외부 필터를 안 타게 하는 스위치 */
32
+ const NO_DIFF_FILTERS = ['--no-ext-diff', '--no-textconv'];
33
+ function git(repoRoot, args) {
34
+ return execFileSync('git', [...NO_CONFIG_EXEC, ...args], {
35
+ cwd: repoRoot,
36
+ encoding: 'utf-8',
37
+ maxBuffer: 64 * 1024 * 1024,
38
+ }).trim();
39
+ }
40
+ /**
41
+ * rev와 ref 이름에 `-`로 시작하는 값을 막는다.
42
+ *
43
+ * execFileSync라 셸 주입은 없지만 git은 `-`로 시작하는 인자를 옵션으로 읽는다.
44
+ * 이 값들의 출처는 MCP `ges_pr`의 `base`와 `head`이고 거기 스키마는 아직
45
+ * `z.string()`뿐이다. 서브커맨드마다 `--`를 받는지가 갈려서 — `rev-parse --verify`는
46
+ * `--` 뒤를 경로로 읽어 `Needed a single revision`으로 죽는다 — 옵션 종결자만으로는
47
+ * 다 못 막는다. 값 자체를 여기서 거른다.
48
+ */
49
+ function assertRev(value, what) {
50
+ if (value === '')
51
+ throw new Error(`${what}가 비었다`);
52
+ if (value.startsWith('-'))
53
+ throw new Error(`${what}는 -로 시작할 수 없다: ${value}`);
54
+ }
55
+ /**
56
+ * `<base>..<head>` 범위를 만들기 전에 양쪽을 거른다.
57
+ *
58
+ * 이 자리에는 `--`가 이미 붙어 있는데 그게 안 막는다. git은 첫 비옵션 인자를 만나기
59
+ * 전까지 옵션을 읽으므로, 범위 문자열이 `-`로 시작하면 그 뒤의 `--`가 손을 못 쓴다.
60
+ * `git diff "--output=/tmp/X..HEAD" --`로 임의 파일 쓰기가 실제로 된다.
61
+ *
62
+ * 지금 부르는 쪽이 넘기는 값은 전부 `resolveSha`가 뱉은 40자 sha라 실전 경로에서는
63
+ * 안 걸린다. 그래도 여기서 다시 막는 이유는 `assertPrId`가 든 것과 같다 — `index.ts`가
64
+ * 이 모듈을 통째로 내보내므로 엔진을 안 거치고 직접 부르는 경로가 열려 있다. 값의
65
+ * 출처인 `reviews.db`는 워크트리 여럿이 함께 쓰는 로컬 파일이다. diff 세 함수는 그중
66
+ * 인증 없는 웹 서버가 매 요청마다 지나는 자리다.
67
+ */
68
+ function assertShaPair(baseSha, headSha) {
69
+ assertRev(baseSha, 'base sha');
70
+ assertRev(headSha, 'head sha');
71
+ }
72
+ /**
73
+ * 이 레포의 공용 git 디렉토리.
74
+ *
75
+ * 워크트리에서 `--git-dir`는 그 워크트리 전용 경로를 준다. PR 목록은 워크트리
76
+ * 여럿이 함께 봐야 하므로 본체를 가리키는 `--git-common-dir`로 잡는다.
77
+ */
78
+ const commonDirCache = new Map();
79
+ /**
80
+ * 캐시 상한. MCP 서버는 한 번 떠서 오래 사는데 `repoRoot`는 요청마다 다를 수 있어,
81
+ * 상한이 없으면 항목이 단조 증가한다. 실제로 오가는 레포는 한 자릿수라 넉넉하다.
82
+ */
83
+ const COMMON_DIR_CACHE_MAX = 64;
84
+ export function gitCommonDir(repoRoot) {
85
+ // 키를 실경로로 맞춘다. 같은 자리를 심볼릭 링크로도 부르고 실경로로도 부르면
86
+ // 문자열이 갈려 같은 레포가 캐시에 두 줄로 앉는다
87
+ let key;
88
+ try {
89
+ key = realpathSync(repoRoot);
90
+ }
91
+ catch {
92
+ key = resolve(repoRoot);
93
+ }
94
+ // 프로세스 수명 동안 repoRoot당 불변이다. 캐시가 없으면 checkout 한 번에 이 값을
95
+ // 구하는 git 프로세스가 예닐곱 번 뜬다 — spawn당 수십 ms라 그대로 쌓인다
96
+ const hit = commonDirCache.get(key);
97
+ if (hit !== undefined)
98
+ return hit;
99
+ const raw = resolve(repoRoot, git(repoRoot, ['rev-parse', '--git-common-dir']));
100
+ // 심볼릭 링크를 푼다. 본체에서는 상대 경로(.git)로, 워크트리에서는 절대 경로로
101
+ // 나오는데 macOS의 /tmp처럼 링크를 타는 자리에서는 그 둘이 다른 문자열이 된다.
102
+ // 이 값이 저장소 경로와 레포 키의 기준이라 갈리면 같은 레포가 둘로 보인다
103
+ const common = realpathSync(raw);
104
+ // 가장 오래된 항목부터 버린다. Map은 넣은 순서를 지키므로 첫 키가 그 자리다.
105
+ // 레포가 옮겨졌거나 `.git`이 갈린 경우에 낡은 값을 영영 붙들지 않는 효과도 있다
106
+ while (commonDirCache.size >= COMMON_DIR_CACHE_MAX) {
107
+ const oldest = commonDirCache.keys().next();
108
+ if (oldest.done === true)
109
+ break;
110
+ commonDirCache.delete(oldest.value);
111
+ }
112
+ commonDirCache.set(key, common);
113
+ return common;
114
+ }
115
+ /**
116
+ * PR 저장소 경로. 본체 git 디렉토리 옆에 둔다.
117
+ *
118
+ * 워크트리 어디서 불러도 같은 파일을 가리켜야 목록이 갈라지지 않는다.
119
+ */
120
+ export function reviewsDbPath(repoRoot) {
121
+ return join(gitCommonDir(repoRoot), '..', '.gestalt', 'reviews.db');
122
+ }
123
+ /**
124
+ * PR 커밋을 붙잡아 두는 ref의 뿌리.
125
+ *
126
+ * 이름을 리터럴로 여러 자리에 적으면 하나를 고칠 때 나머지가 남는다. 붙이는 자리와
127
+ * 놓는 자리와 훑는 자리가 이미 셋이라 상수로 둔다.
128
+ */
129
+ export const PR_REF_ROOT = 'refs/gestalt/pr';
130
+ /** `--force`로 지울 때 워크트리 전용 커밋을 붙잡아 둘 ref의 뿌리 */
131
+ export const CHECKOUT_REF_ROOT = 'refs/gestalt/pr-checkout';
132
+ export function resolveSha(repoRoot, rev) {
133
+ assertRev(rev, 'rev');
134
+ return git(repoRoot, ['rev-parse', '--verify', `${rev}^{commit}`]);
135
+ }
136
+ /** 두 갈래가 갈라진 지점. PR의 base가 된다 */
137
+ export function mergeBase(repoRoot, base, head) {
138
+ assertRev(base, 'base');
139
+ assertRev(head, 'head');
140
+ return git(repoRoot, ['merge-base', '--', base, head]);
141
+ }
142
+ /** 지금 올라타 있는 브랜치 이름. detached HEAD면 null */
143
+ export function currentBranch(repoRoot) {
144
+ const name = git(repoRoot, ['rev-parse', '--abbrev-ref', 'HEAD']);
145
+ return name === 'HEAD' ? null : name;
146
+ }
147
+ /**
148
+ * PR의 커밋을 ref로 붙잡는다.
149
+ *
150
+ * 워커가 브랜치를 지우거나 리베이스해도 이 ref가 커밋을 잡고 있어 diff가 산다.
151
+ * GitHub이 `refs/pull/N/head`를 두는 것과 같은 이유다. 붙잡지 않으면 gc가
152
+ * 수거해 간 뒤 PR이 빈 껍데기가 된다.
153
+ */
154
+ export function pinRefs(repoRoot, prId, baseSha, headSha) {
155
+ git(repoRoot, ['update-ref', '--', `${PR_REF_ROOT}/${prId}/base`, baseSha]);
156
+ git(repoRoot, ['update-ref', '--', `${PR_REF_ROOT}/${prId}/head`, headSha]);
157
+ }
158
+ /**
159
+ * 붙잡아 둔 ref를 놓는다.
160
+ *
161
+ * **head는 안 놓는다.** PR을 닫아도 그 커밋은 되짚을 수 있어야 한다 — `checkout`이
162
+ * 닫힌 PR도 떼어낸다고 약속한다. 그게 "그때 그 코드가 맞았나"를 나중에 보는 자리다.
163
+ * head까지 놓으면 브랜치도 지워진 PR은 gc가 한 번 돌고 나서 빈 껍데기가 된다.
164
+ *
165
+ * base만 놓는 이유는 그 커밋이 base 브랜치 이력에 이미 들어 있어서다. 놓아도 안 사라진다.
166
+ */
167
+ export function unpinRefs(repoRoot, prId) {
168
+ try {
169
+ git(repoRoot, ['update-ref', '-d', '--', `${PR_REF_ROOT}/${prId}/base`]);
170
+ }
171
+ catch {
172
+ // 이미 없으면 지울 것도 없다
173
+ }
174
+ }
175
+ /**
176
+ * diff 계열은 셋 다 config에 적힌 외부 필터를 끄고 부른다.
177
+ *
178
+ * `diff.external`과 `diff.<드라이버>.textconv`는 git이 실행하는 외부 명령이다.
179
+ * 이 셋은 인증 없는 웹 서버의 요청 경로에서 돈다. 켜져 있으면 출력이 통합 diff가
180
+ * 아니게 되는데, 이 값을 읽는 쪽(웹 UI, 리뷰 에이전트)은 전부 통합 diff를 기대한다. 끄는 게 보안이자 정확성이다.
181
+ */
182
+ export function diff(repoRoot, baseSha, headSha) {
183
+ assertShaPair(baseSha, headSha);
184
+ return git(repoRoot, ['diff', ...NO_DIFF_FILTERS, `${baseSha}..${headSha}`, '--']);
185
+ }
186
+ export function changedFiles(repoRoot, baseSha, headSha) {
187
+ assertShaPair(baseSha, headSha);
188
+ const out = git(repoRoot, [
189
+ 'diff',
190
+ ...NO_DIFF_FILTERS,
191
+ '--name-only',
192
+ `${baseSha}..${headSha}`,
193
+ '--',
194
+ ]);
195
+ return out ? out.split('\n') : [];
196
+ }
197
+ export function diffStat(repoRoot, baseSha, headSha) {
198
+ assertShaPair(baseSha, headSha);
199
+ return git(repoRoot, ['diff', ...NO_DIFF_FILTERS, '--stat', `${baseSha}..${headSha}`, '--']);
200
+ }
201
+ /** 이 레포에 딸린 워크트리 목록 */
202
+ export function worktrees(repoRoot) {
203
+ const out = git(repoRoot, ['worktree', 'list', '--porcelain']);
204
+ const entries = [];
205
+ let current = {};
206
+ for (const line of out.split('\n')) {
207
+ if (line.startsWith('worktree ')) {
208
+ current = { path: line.slice('worktree '.length), branch: null };
209
+ entries.push(current);
210
+ }
211
+ else if (line.startsWith('branch ')) {
212
+ current.branch = line.slice('branch refs/heads/'.length);
213
+ }
214
+ }
215
+ return entries;
216
+ }
217
+ /**
218
+ * 이 브랜치를 올라타고 있는 워크트리. 없으면 null.
219
+ *
220
+ * `known`을 주면 목록을 다시 안 구한다. `worktree list`는 프로세스를 하나 띄우는데
221
+ * 체크아웃 한 번에 이 목록을 보는 자리가 여럿이라 진입점에서 한 번 구해 돌린다.
222
+ */
223
+ export function worktreeOn(repoRoot, branch, known) {
224
+ return (known ?? worktrees(repoRoot)).find((w) => w.branch === branch) ?? null;
225
+ }
226
+ /** 심볼릭 링크를 풀어 같은 자리인지 본다 */
227
+ function samePath(a, b) {
228
+ const real = (p) => {
229
+ try {
230
+ return realpathSync(resolve(p));
231
+ }
232
+ catch {
233
+ return resolve(p);
234
+ }
235
+ };
236
+ return real(a) === real(b);
237
+ }
238
+ export function isClean(repoRoot) {
239
+ return git(repoRoot, ['status', '--porcelain']) === '';
240
+ }
241
+ /**
242
+ * PR의 head를 base 브랜치에 병합한다.
243
+ *
244
+ * 부르는 쪽이 base로 옮겨 타지 않아도 되게 임시 워크트리에서 합치고 브랜치 ref만
245
+ * 옮긴다. 워커가 자기 워크트리에 그대로 있는 채로 머지할 수 있다.
246
+ *
247
+ * **base가 다른 워크트리에 체크아웃돼 있으면 ref를 밀지 않는다.** 그쪽은 파일이 옛
248
+ * 상태인데 HEAD만 움직인다. 그러면 그 워크트리의 `git status`가 머지로 들어온 변경을
249
+ * 전부 미커밋 삭제로 잡는다.
250
+ * 그 자리에서 직접 머지하도록 돌려보낸다.
251
+ *
252
+ * ref는 옛 값을 함께 넘겨 옮긴다. 여기서 base를 읽은 뒤 update-ref를 부르기 전에
253
+ * 다른 손이 base를 옮겼으면 git이 거부한다 — 그 사이에 낀 남의 커밋을 덮지 않는다.
254
+ */
255
+ export function mergeIntoBase(repoRoot, input) {
256
+ const { prId, baseRef, headSha, title } = input;
257
+ assertRev(baseRef, 'base 브랜치');
258
+ assertRev(headSha, 'head sha');
259
+ const message = `Merge local PR ${prId}: ${title}`;
260
+ const holder = worktreeOn(repoRoot, baseRef);
261
+ // 지금 이 자리가 base를 올라타고 있으면 그냥 여기서 합치는 게 제일 안전하다.
262
+ // macOS의 /tmp처럼 심볼릭 링크를 타는 경로가 있어 실경로로 맞춰야 같은 자리인지 안다
263
+ if (holder && samePath(holder.path, repoRoot)) {
264
+ try {
265
+ git(repoRoot, ['merge', '--no-ff', headSha, '-m', message]);
266
+ }
267
+ catch (e) {
268
+ // 충돌하면 부르는 사람의 워킹 트리에 MERGE_HEAD가 선 채 남는다. 임시 워크트리
269
+ // 갈래는 finally로 통째로 걷어내니 이쪽도 되돌려야 대칭이 맞는다. 안 그러면
270
+ // 실패를 받은 에이전트가 자기 자리가 머지 중간 상태인 걸 모른다
271
+ try {
272
+ git(repoRoot, ['merge', '--abort']);
273
+ }
274
+ catch {
275
+ // 머지가 서지도 못했다. 되돌릴 게 없다
276
+ }
277
+ const detail = e instanceof Error ? e.message : String(e);
278
+ throw new Error(`base ${baseRef}에 머지하다 실패했다. 워킹 트리는 되돌렸다\n${detail}`, {
279
+ cause: e,
280
+ });
281
+ }
282
+ return { mergeSha: resolveSha(repoRoot, 'HEAD'), viaWorktree: false };
283
+ }
284
+ if (holder) {
285
+ throw new Error(`base 브랜치 ${baseRef}를 다른 워크트리가 올라타고 있다: ${holder.path}\n` +
286
+ '거기서 머지하거나 그 워크트리를 정리한 뒤 다시 부른다');
287
+ }
288
+ const before = resolveSha(repoRoot, baseRef);
289
+ const scratch = mkdtempSync(join(tmpdir(), `gestalt-merge-${prId}-`));
290
+ try {
291
+ // 브랜치를 체크아웃하지 않고 그 지점만 떼어 온다. 어느 워크트리와도 안 겹친다
292
+ git(repoRoot, ['worktree', 'add', '--detach', '-q', scratch, before]);
293
+ git(scratch, ['merge', '--no-ff', headSha, '-m', message]);
294
+ const mergeSha = resolveSha(scratch, 'HEAD');
295
+ // 옛 값을 같이 넘긴다. 그 사이 base가 움직였으면 여기서 거부된다
296
+ git(repoRoot, ['update-ref', '--', `refs/heads/${baseRef}`, mergeSha, before]);
297
+ return { mergeSha, viaWorktree: true };
298
+ }
299
+ finally {
300
+ try {
301
+ git(repoRoot, ['worktree', 'remove', '--force', scratch]);
302
+ }
303
+ catch {
304
+ rmSync(scratch, { recursive: true, force: true });
305
+ git(repoRoot, ['worktree', 'prune']);
306
+ }
307
+ }
308
+ }
309
+ export function deleteBranch(repoRoot, branch) {
310
+ assertRev(branch, '브랜치 이름');
311
+ git(repoRoot, ['branch', '-D', '--', branch]);
312
+ }
313
+ /** 이 커밋이 아직 살아 있는가. ref가 안 붙었으면 gc가 가져갈 수 있다 */
314
+ export function commitExists(repoRoot, sha) {
315
+ try {
316
+ git(repoRoot, ['cat-file', '-e', '--', `${sha}^{commit}`]);
317
+ return true;
318
+ }
319
+ catch {
320
+ return false;
321
+ }
322
+ }
323
+ /** 떼어낸 워크트리를 모아 두는 칸. 공용 git 디렉토리 아래 이 이름으로 들어간다 */
324
+ const CHECKOUT_ROOT = 'gestalt/pr-checkout';
325
+ /**
326
+ * PR 리뷰용 워크트리가 놓일 자리.
327
+ *
328
+ * 공용 git 디렉토리 아래에 둔다. `.git/`은 워킹 트리가 아니라서 추적 안 되는
329
+ * 디렉토리가 리뷰 중인 diff에 섞이지 않는다 — 레포 안을 피해 tmp로 갔던 원래 이유가
330
+ * 여기서는 안 생긴다.
331
+ *
332
+ * tmp를 안 쓰는 이유는 둘이다. 공유 /tmp를 쓰는 호스트에서는 이 경로가 예측 가능해서
333
+ * 남이 먼저 그 자리를 만들어 두면 리뷰 중인 소스가 남의 소유 디렉토리에 풀린다.
334
+ * 그리고 tmp 경로는 TMPDIR를 타므로 뗄 때와 지울 때 환경이 다르면 값이 갈린다.
335
+ *
336
+ * repoRoot와 prId만으로 정해져서 리뷰어가 경로를 안 적어놨어도 지울 때 같은 값이
337
+ * 다시 나온다. 공용 git 디렉토리가 이미 레포마다 갈리므로 해시 칸도 필요 없다.
338
+ */
339
+ export function prCheckoutPath(repoRoot, prId) {
340
+ assertPrId(prId);
341
+ return join(gitCommonDir(repoRoot), CHECKOUT_ROOT, prId);
342
+ }
343
+ /**
344
+ * PR id 형식.
345
+ *
346
+ * 이 값이 파일 경로와 git ref 이름으로 그대로 이어 붙는다. `removePrCheckout`은
347
+ * 그 경로에 재귀 삭제를 건다. `pinRefs`는 ref를 만든다. 엔진을 거치지 않고 이
348
+ * 모듈을 직접 부르는 경로가 열려 있어서(`index.ts`가 통째로 export한다) 방어를
349
+ * 호출자에게 맡기지 않는다.
350
+ */
351
+ const PR_ID = /^[0-9a-f]{8}$/;
352
+ function assertPrId(prId) {
353
+ if (!PR_ID.test(prId))
354
+ throw new Error(`PR id 형식이 아니다: ${prId}`);
355
+ }
356
+ /**
357
+ * 이 PR이 떼어져 등록돼 있는 자리. 없으면 null.
358
+ *
359
+ * `known`을 주면 `worktree list` 스폰을 아낀다 — `worktreeOn`과 같은 이유다.
360
+ */
361
+ function registeredCheckout(repoRoot, prId, known) {
362
+ const canonical = prCheckoutPath(repoRoot, prId);
363
+ return (known ?? worktrees(repoRoot)).some((w) => samePath(w.path, canonical)) ? canonical : null;
364
+ }
365
+ /**
366
+ * 워크트리를 지운 뒤에도 git을 부를 수 있는 자리.
367
+ *
368
+ * `scrub`은 자기 cwd를 지울 수 있다 — `checkout`이 알려준 경로로 `cd` 한 채
369
+ * `--remove`를 부르는 게 이 명령의 정상 흐름이다. 사라진 cwd에서 git을 부르면
370
+ * spawn이 ENOENT로 죽어, 정리는 됐는데 실패로 보고한다. 그래서 지우는 자리 밖인
371
+ * 본체 워킹 트리를 잡는다. 본체가 없는 bare 레포면 공용 git 디렉토리 자신을 쓴다.
372
+ */
373
+ function gitAnchor(repoRoot) {
374
+ const common = gitCommonDir(repoRoot);
375
+ const main = dirname(common);
376
+ return existsSync(join(main, '.git')) ? main : common;
377
+ }
378
+ /**
379
+ * 그 자리가 아직 워크트리 노릇을 하면 거기 HEAD를, 아니면 null을 준다.
380
+ *
381
+ * `.git` 링크 파일이 있는지를 먼저 본다. 이 경로는 공용 git 디렉토리 아래라 링크가
382
+ * 깨져도 git이 상위를 훑어 레포를 찾아낸다 — `rev-parse`만으로는 성한 워크트리와
383
+ * 껍데기만 남은 자리를 못 가른다.
384
+ *
385
+ * 성했는지만 답하고 sha를 버리면 부르는 쪽이 `rev-parse`를 한 번 더 돌린다. 같은
386
+ * 값을 구하는 프로세스를 두 번 띄우게 되므로 여기서 함께 돌려준다.
387
+ */
388
+ function headOf(path) {
389
+ if (!existsSync(join(path, '.git')))
390
+ return null;
391
+ try {
392
+ return resolveSha(path, 'HEAD');
393
+ }
394
+ catch {
395
+ return null;
396
+ }
397
+ }
398
+ /** 이 커밋을 품은 ref가 하나라도 있는가. 없으면 워크트리와 함께 사라진다 */
399
+ function anchoredByRef(repoRoot, sha) {
400
+ return (git(repoRoot, ['for-each-ref', '--contains', sha, '--count=1', '--format=%(refname)']) !== '');
401
+ }
402
+ /** 반쯤 남은 흔적을 치운다. 등록과 디렉토리 둘 다 없앤다 */
403
+ function scrub(repoRoot, path) {
404
+ const anchor = gitAnchor(repoRoot);
405
+ let removed = true;
406
+ try {
407
+ git(anchor, ['worktree', 'remove', '--force', path]);
408
+ }
409
+ catch {
410
+ // 등록이 없거나 이미 깨졌다. 아래에서 손으로 치운다
411
+ removed = false;
412
+ }
413
+ rmSync(path, { recursive: true, force: true });
414
+ // `worktree remove`가 통했으면 등록은 이미 그 명령이 걷어갔다. prune은 손으로
415
+ // 치운 갈래에서만 필요하다 — 늘 부르면 프로세스가 한 번 더 뜬다
416
+ if (!removed)
417
+ git(anchor, ['worktree', 'prune']);
418
+ // 해시 칸에는 이 레포의 PR 자리만 들어간다. 비었으면 같이 치운다 — 안 그러면
419
+ // 레포마다 빈 디렉토리가 tmp에 쌓인다. 다른 PR이 남아 있으면 rmdir이 거부한다
420
+ try {
421
+ rmdirSync(dirname(path));
422
+ }
423
+ catch {
424
+ // 비어 있지 않거나 이미 없다. 어느 쪽이든 더 할 일이 없다
425
+ }
426
+ }
427
+ /**
428
+ * PR head를 임시 워크트리로 떼어 놓는다.
429
+ *
430
+ * 리뷰어가 코드를 일부러 깨서 테스트가 잡는지 보려면 PR head가 실물 파일로 있어야
431
+ * 한다. 리뷰어 자신의 워크트리는 자기 브랜치를 올라타고 있어 그 코드가 없다.
432
+ *
433
+ * `--detach`로 뗀다. 브랜치를 체크아웃하면 그 브랜치를 이미 올라탄 워크트리와
434
+ * 부딪힌다. mergeIntoBase가 임시 워크트리에서 같은 선택을 한 이유와 같다.
435
+ *
436
+ * 같은 PR을 두 번 부르면 있는 워크트리를 그대로 돌려준다. 리뷰어가 거기서 하던
437
+ * 작업을 날리지 않는다. 그 자리가 이미 워크트리로 등록돼 있는지를 먼저 본다. 등록만
438
+ * 남고 속이 깨졌으면 치운 뒤 다시 뗀다. 어느 갈래로 가든 한 PR에 워크트리는 하나다.
439
+ */
440
+ export function checkoutPrHead(repoRoot, prId, headSha) {
441
+ assertRev(headSha, 'head sha');
442
+ // 목록을 한 번만 구한다. `worktree list`는 프로세스를 띄우는 호출이다
443
+ const existing = registeredCheckout(repoRoot, prId, worktrees(repoRoot));
444
+ // 리뷰어가 거기서 커밋을 얹었으면 HEAD가 PR head에서 옮겨가 있다. 인자로 받은
445
+ // 값이 아니라 그 자리의 실제 HEAD를 돌려준다
446
+ const liveHead = existing === null ? null : headOf(existing);
447
+ if (existing && liveHead !== null) {
448
+ return { path: existing, created: false, headSha: liveHead };
449
+ }
450
+ const path = prCheckoutPath(repoRoot, prId);
451
+ // 등록이나 디렉토리 한쪽만 남은 자리. 지난번 정리가 중간에 끊긴 흔적이다.
452
+ // 그대로 두면 `worktree add`가 거부하므로 치우고 다시 뗀다
453
+ if (existing)
454
+ scrub(repoRoot, existing);
455
+ if (existsSync(path))
456
+ scrub(repoRoot, path);
457
+ mkdirSync(dirname(path), { recursive: true });
458
+ git(repoRoot, ['worktree', 'add', '--detach', '-q', path, headSha]);
459
+ return { path, created: true, headSha };
460
+ }
461
+ /**
462
+ * `--force`로 지울 때 워크트리 전용 커밋을 붙잡아 둘 ref.
463
+ *
464
+ * 이름에 sha를 실어 바퀴마다 한 칸씩 남긴다. PR당 한 칸이면 두 번째 `--force`가
465
+ * 첫 번째로 구한 커밋을 덮어써서, 그 커밋이 어느 ref도 안 품은 상태가 된다.
466
+ * 뮤테이션 검증은 깨고 커밋하고 치우기를 여러 바퀴 도는 흐름이라 그 자리를 실제로 밟는다.
467
+ */
468
+ function strandedRef(prId, sha) {
469
+ return `${CHECKOUT_REF_ROOT}/${prId}/${sha.slice(0, 8)}`;
470
+ }
471
+ /**
472
+ * 떼어 놓은 워크트리를 지운다.
473
+ *
474
+ * **지울 만하지 않으면 지우지 않는다.** 리뷰어가 뮤테이션 검증 중이면 그 워크트리는
475
+ * 일부러 깨놓은 코드다. 여기서 날리면 무엇을 어떻게 깼는지가 사라진다. 두 갈래를 막는다.
476
+ *
477
+ * - 커밋 안 된 변경 (`dirty`)
478
+ * - 여기서 커밋했는데 어느 ref도 안 품은 커밋 (`diverged`) — 떼어낸 자리는 detached
479
+ * HEAD라 브랜치 ref가 없고 워크트리 전용 reflog도 함께 죽는다. `git status`는
480
+ * 깨끗하다고 답하므로 미커밋 검사만으로는 이 손실이 안 걸린다.
481
+ *
482
+ * 어느 쪽이든 왜 안 지웠는지 돌려준다. 정말 버릴 참이면 `force`로 다시 부른다. 그때도
483
+ * ref가 안 품은 커밋은 `refs/gestalt/pr-checkout/<prId>/<sha 앞 8자>`로 붙잡아 두고 지운다 —
484
+ * 막는 것과 지우게 두는 것 사이에서, 되돌릴 실마리를 남기는 쪽을 골랐다. 리뷰어가 검증
485
+ * 중간을 커밋해 두는 건 있을 법한 흐름이라 `--force` 한 번에 영영 잃게 둘 수 없다.
486
+ *
487
+ * git이 추적하지 않기로 한 파일(.gitignore에 걸린 node_modules 등)은 변경으로
488
+ * 세지 않는다. `git status --porcelain`이 이미 그것들을 뺀 목록을 준다.
489
+ */
490
+ export function removePrCheckout(repoRoot, prId, options = {}) {
491
+ const path = registeredCheckout(repoRoot, prId, worktrees(repoRoot));
492
+ if (!path) {
493
+ const guess = prCheckoutPath(repoRoot, prId);
494
+ git(gitAnchor(repoRoot), ['worktree', 'prune']);
495
+ // 등록이 끊기고 디렉토리만 남은 자리는 지난 정리가 중간에 끊긴 흔적이다. 그 안에
496
+ // 리뷰어가 일부러 깨놓은 코드가 있을 수 있는데 여기서는 읽을 방법이 없다.
497
+ // 지킬 게 있는지 모르면 안 지운다 — force로 뜻을 밝혀야 버린다
498
+ if (existsSync(guess) && !options.force) {
499
+ return {
500
+ path: guess,
501
+ removed: false,
502
+ status: 'stale',
503
+ reason: '등록이 끊긴 디렉토리가 남아 있다. 안을 확인한 뒤 --force로 다시 부른다',
504
+ savedRef: null,
505
+ };
506
+ }
507
+ const had = existsSync(guess);
508
+ rmSync(guess, { recursive: true, force: true });
509
+ return {
510
+ path: guess,
511
+ removed: had,
512
+ status: had ? 'removed' : 'absent',
513
+ reason: had ? null : '떼어 놓은 워크트리가 없다',
514
+ savedRef: null,
515
+ };
516
+ }
517
+ // 속이 깨진 자리는 지킬 변경도 읽을 수 없다. 흔적만 치운다
518
+ const head = headOf(path);
519
+ if (head === null) {
520
+ scrub(repoRoot, path);
521
+ return { path, removed: true, status: 'removed', reason: null, savedRef: null };
522
+ }
523
+ if (!options.force && !isClean(path)) {
524
+ return {
525
+ path,
526
+ removed: false,
527
+ status: 'dirty',
528
+ reason: '커밋 안 된 변경이 있다. 확인한 뒤 --force로 다시 부른다',
529
+ savedRef: null,
530
+ };
531
+ }
532
+ // PR head에서 옮겨갔고 어느 ref도 안 품은 HEAD. 지우면 되짚을 sha를 아는 데가 없다
533
+ const stranded = options.headSha !== undefined && head !== options.headSha && !anchoredByRef(repoRoot, head);
534
+ if (stranded && !options.force) {
535
+ return {
536
+ path,
537
+ removed: false,
538
+ status: 'diverged',
539
+ reason: `여기서 커밋한 변경이 있다 (HEAD ${head.slice(0, 8)}). 확인한 뒤 --force로 다시 부른다`,
540
+ savedRef: null,
541
+ };
542
+ }
543
+ const savedRef = stranded ? strandedRef(prId, head) : null;
544
+ if (savedRef)
545
+ git(repoRoot, ['update-ref', '--', savedRef, head]);
546
+ scrub(repoRoot, path);
547
+ return { path, removed: true, status: 'removed', reason: null, savedRef };
548
+ }
549
+ /**
550
+ * 이 뿌리 아래 붙어 있는 ref 이름.
551
+ *
552
+ * 패턴에 슬래시를 붙여 넘긴다. `refs/gestalt/pr`은 `refs/gestalt/pr-checkout`의
553
+ * 접두사이기도 해서, 슬래시 없이 훑으면 체크아웃 자국까지 딸려 온다.
554
+ */
555
+ export function refsUnder(repoRoot, root) {
556
+ const out = git(repoRoot, ['for-each-ref', '--format=%(refname)', `${root}/`]);
557
+ return out ? out.split('\n') : [];
558
+ }
559
+ /** 이 커밋이 저 갈래의 이력에 들어 있는가. 들어 있으면 ref를 놓아도 안 사라진다 */
560
+ export function isAncestor(repoRoot, sha, rev) {
561
+ try {
562
+ assertRev(sha, 'sha');
563
+ assertRev(rev, 'rev');
564
+ git(repoRoot, ['merge-base', '--is-ancestor', '--', sha, rev]);
565
+ return true;
566
+ }
567
+ catch {
568
+ return false;
569
+ }
570
+ }
571
+ /** ref를 놓는다. 이미 없으면 놓을 것도 없다 */
572
+ export function deleteRef(repoRoot, ref) {
573
+ try {
574
+ git(repoRoot, ['update-ref', '-d', '--', ref]);
575
+ }
576
+ catch {
577
+ // 이미 없다
578
+ }
579
+ }
580
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/local-pr/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './git.js';
3
+ export * from './policy.js';
4
+ export { PullRequestRepository, PrEvent } from './repository.js';
5
+ export { LocalPrEngine, PrError } from './engine.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local-pr/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AAGzB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './types.js';
2
+ export * from './git.js';
3
+ // 판단 규칙은 policy가 원본이다. 중간 모듈이 되내보내면 같은 함수를 어디서
4
+ // 가져왔느냐로 진입점이 갈린다. 원본을 고쳐도 옛 경로가 남는다
5
+ export * from './policy.js';
6
+ export { PullRequestRepository, PrEvent } from './repository.js';
7
+ export { LocalPrEngine, PrError } from './engine.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/local-pr/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,+CAA+C;AAC/C,qCAAqC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}