@tienne/gestalt 0.68.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 (114) hide show
  1. package/CLAUDE.md +9 -2
  2. package/README.md +1 -0
  3. package/dist/package.json +2 -1
  4. package/dist/plugin/review-agents/quality-reviewer/AGENT.md +1 -1
  5. package/dist/plugin/review-agents/writing-reviewer/AGENT.md +2 -2
  6. package/dist/plugin/skills/local-pr/SKILL.md +201 -0
  7. package/dist/plugin/skills/pr/SKILL.md +73 -4
  8. package/dist/plugin/skills/review/SKILL.md +190 -18
  9. package/dist/plugin/skills/review-reply/SKILL.md +144 -7
  10. package/dist/src/cli/commands/pr.d.ts +133 -0
  11. package/dist/src/cli/commands/pr.d.ts.map +1 -0
  12. package/dist/src/cli/commands/pr.js +489 -0
  13. package/dist/src/cli/commands/pr.js.map +1 -0
  14. package/dist/src/cli/index.d.ts.map +1 -1
  15. package/dist/src/cli/index.js +85 -0
  16. package/dist/src/cli/index.js.map +1 -1
  17. package/dist/src/core/config.d.ts.map +1 -1
  18. package/dist/src/core/config.js +4 -3
  19. package/dist/src/core/config.js.map +1 -1
  20. package/dist/src/core/home.d.ts +20 -0
  21. package/dist/src/core/home.d.ts.map +1 -0
  22. package/dist/src/core/home.js +52 -0
  23. package/dist/src/core/home.js.map +1 -0
  24. package/dist/src/core/types.d.ts +38 -0
  25. package/dist/src/core/types.d.ts.map +1 -1
  26. package/dist/src/core/version.d.ts.map +1 -1
  27. package/dist/src/core/version.js +4 -7
  28. package/dist/src/core/version.js.map +1 -1
  29. package/dist/src/events/store.d.ts +32 -0
  30. package/dist/src/events/store.d.ts.map +1 -1
  31. package/dist/src/events/store.js +68 -3
  32. package/dist/src/events/store.js.map +1 -1
  33. package/dist/src/local-pr/engine.d.ts +176 -0
  34. package/dist/src/local-pr/engine.d.ts.map +1 -0
  35. package/dist/src/local-pr/engine.js +373 -0
  36. package/dist/src/local-pr/engine.js.map +1 -0
  37. package/dist/src/local-pr/git.d.ts +190 -0
  38. package/dist/src/local-pr/git.d.ts.map +1 -0
  39. package/dist/src/local-pr/git.js +580 -0
  40. package/dist/src/local-pr/git.js.map +1 -0
  41. package/dist/src/local-pr/index.d.ts +6 -0
  42. package/dist/src/local-pr/index.d.ts.map +1 -0
  43. package/dist/src/local-pr/index.js +8 -0
  44. package/dist/src/local-pr/index.js.map +1 -0
  45. package/dist/src/local-pr/policy.d.ts +77 -0
  46. package/dist/src/local-pr/policy.d.ts.map +1 -0
  47. package/dist/src/local-pr/policy.js +80 -0
  48. package/dist/src/local-pr/policy.js.map +1 -0
  49. package/dist/src/local-pr/registry.d.ts +79 -0
  50. package/dist/src/local-pr/registry.d.ts.map +1 -0
  51. package/dist/src/local-pr/registry.js +307 -0
  52. package/dist/src/local-pr/registry.js.map +1 -0
  53. package/dist/src/local-pr/repository.d.ts +67 -0
  54. package/dist/src/local-pr/repository.d.ts.map +1 -0
  55. package/dist/src/local-pr/repository.js +251 -0
  56. package/dist/src/local-pr/repository.js.map +1 -0
  57. package/dist/src/local-pr/types.d.ts +151 -0
  58. package/dist/src/local-pr/types.d.ts.map +1 -0
  59. package/dist/src/local-pr/types.js +9 -0
  60. package/dist/src/local-pr/types.js.map +1 -0
  61. package/dist/src/local-pr-web/engine.d.ts +24 -0
  62. package/dist/src/local-pr-web/engine.d.ts.map +1 -0
  63. package/dist/src/local-pr-web/engine.js +112 -0
  64. package/dist/src/local-pr-web/engine.js.map +1 -0
  65. package/dist/src/local-pr-web/html-generator.d.ts +24 -0
  66. package/dist/src/local-pr-web/html-generator.d.ts.map +1 -0
  67. package/dist/src/local-pr-web/html-generator.js +385 -0
  68. package/dist/src/local-pr-web/html-generator.js.map +1 -0
  69. package/dist/src/local-pr-web/index.d.ts +5 -0
  70. package/dist/src/local-pr-web/index.d.ts.map +1 -0
  71. package/dist/src/local-pr-web/index.js +5 -0
  72. package/dist/src/local-pr-web/index.js.map +1 -0
  73. package/dist/src/local-pr-web/server.d.ts +126 -0
  74. package/dist/src/local-pr-web/server.d.ts.map +1 -0
  75. package/dist/src/local-pr-web/server.js +394 -0
  76. package/dist/src/local-pr-web/server.js.map +1 -0
  77. package/dist/src/local-pr-web/types.d.ts +11 -0
  78. package/dist/src/local-pr-web/types.d.ts.map +1 -0
  79. package/dist/src/local-pr-web/types.js +2 -0
  80. package/dist/src/local-pr-web/types.js.map +1 -0
  81. package/dist/src/mcp/schemas.d.ts +79 -4
  82. package/dist/src/mcp/schemas.d.ts.map +1 -1
  83. package/dist/src/mcp/schemas.js +80 -2
  84. package/dist/src/mcp/schemas.js.map +1 -1
  85. package/dist/src/mcp/server.d.ts.map +1 -1
  86. package/dist/src/mcp/server.js +13 -2
  87. package/dist/src/mcp/server.js.map +1 -1
  88. package/dist/src/mcp/tools/pr.d.ts +5 -0
  89. package/dist/src/mcp/tools/pr.d.ts.map +1 -0
  90. package/dist/src/mcp/tools/pr.js +165 -0
  91. package/dist/src/mcp/tools/pr.js.map +1 -0
  92. package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -1
  93. package/dist/src/mcp/tools/review-passthrough.js +264 -15
  94. package/dist/src/mcp/tools/review-passthrough.js.map +1 -1
  95. package/dist/src/memory/user-profile-store.d.ts.map +1 -1
  96. package/dist/src/memory/user-profile-store.js +3 -4
  97. package/dist/src/memory/user-profile-store.js.map +1 -1
  98. package/dist/src/review/context-collector.d.ts +1 -1
  99. package/dist/src/review/context-collector.js +1 -1
  100. package/dist/src/review/passthrough-engine.d.ts +1 -0
  101. package/dist/src/review/passthrough-engine.d.ts.map +1 -1
  102. package/dist/src/review/passthrough-engine.js +7 -2
  103. package/dist/src/review/passthrough-engine.js.map +1 -1
  104. package/dist/src/spec/text-based-spec-generator.d.ts.map +1 -1
  105. package/dist/src/spec/text-based-spec-generator.js +5 -2
  106. package/dist/src/spec/text-based-spec-generator.js.map +1 -1
  107. package/package.json +2 -1
  108. package/plugin/.codex-plugin/plugin.json +1 -1
  109. package/plugin/review-agents/quality-reviewer/AGENT.md +1 -1
  110. package/plugin/review-agents/writing-reviewer/AGENT.md +2 -2
  111. package/plugin/skills/local-pr/SKILL.md +201 -0
  112. package/plugin/skills/pr/SKILL.md +73 -4
  113. package/plugin/skills/review/SKILL.md +190 -18
  114. package/plugin/skills/review-reply/SKILL.md +144 -7
@@ -0,0 +1,394 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { createServer } from 'node:http';
3
+ import { generatePrDetailHtml, generatePrListHtml } from './html-generator.js';
4
+ const REPO_KEY = '([0-9a-f]{8})';
5
+ const PR_LIST_PATH = new RegExp(`^/r/${REPO_KEY}/?$`);
6
+ const PR_DETAIL_PATH = new RegExp(`^/r/${REPO_KEY}/prs/([^/]+)$`);
7
+ /** 자산을 끌어오는 유일한 바깥 출처. CSP가 이 하나만 허용한다 */
8
+ const CDN_ORIGIN = 'https://cdn.jsdelivr.net';
9
+ const API_PR_LIST_PATH = new RegExp(`^/api/r/${REPO_KEY}/prs$`);
10
+ const API_PR_DETAIL_PATH = new RegExp(`^/api/r/${REPO_KEY}/prs/([^/]+)$`);
11
+ /**
12
+ * 로컬 PR을 브라우저에서 읽는 HTTP 서버. 읽기 전용이다.
13
+ *
14
+ * graph-viz/server.ts와 같은 자리다. 다른 점은 데이터를 생성 시점에 한 번 굳히지
15
+ * 않고 매 요청마다 LocalPrEngine에서 다시 읽는다는 것 — PR 목록은 서버가 떠 있는
16
+ * 동안에도 다른 워커가 코멘트를 달거나 판정을 남기며 바뀐다.
17
+ *
18
+ * 레포 여럿을 한 서버가 보여준다. URL에 실리는 건 경로가 아니라 등록된 레포의
19
+ * 키다 — 요청이 경로를 지정할 수 있으면 인증 없는 이 서버가 이 머신의 아무 git
20
+ * 레포나 읽어주는 도구가 된다. 모르는 키는 404다.
21
+ *
22
+ * Routes:
23
+ * GET / → `pr serve`를 친 레포의 목록으로 302
24
+ * GET /r/:key → 그 레포의 PR 목록 HTML
25
+ * GET /r/:key/prs/:id → PR 상세 HTML (diff, 코멘트 스레드, 라운드별 판정)
26
+ * GET /api/repos → 등록된 레포 목록 JSON
27
+ * GET /api/r/:key/prs → PR 목록 JSON
28
+ * GET /api/r/:key/prs/:id → PR 상세 JSON
29
+ * * → 404
30
+ */
31
+ export class PrWebServer {
32
+ engines;
33
+ primaryKey;
34
+ server = null;
35
+ sigintHandler = null;
36
+ diffCache = new DiffCache();
37
+ /**
38
+ * 레포 탭에 붙는 열린 PR 수. 마지막으로 센 값과 그 시각이다.
39
+ *
40
+ * 목록 페이지 한 번에 탭마다 `engine.list('open')`이 돌면 그 레포의 이벤트를
41
+ * 통째로 다시 접는다. 배지 숫자 하나 때문에 PR 전체를 복원하는 셈이다. 그 비용이
42
+ * 등록된 레포 수만큼 곱해진다.
43
+ *
44
+ * 이벤트 저장소에 집계 경로를 내는 길도 있었다. 안 골랐다 — `EventStore`는 로컬 PR
45
+ * 바깥에서도 쓰는 공용 모듈이라 배지 하나 때문에 조회 API를 늘리게 된다. 여기서는
46
+ * 짧은 TTL로 충분하다. 지금 보는 레포는 이 캐시를 아예 안 탄다 — 같은 요청이 이미
47
+ * 만든 목록에서 센다. 그래서 뒤처질 수 있는 건 남의 레포 배지뿐이다.
48
+ */
49
+ navCounts = new Map();
50
+ /** 남의 레포 배지를 붙잡아 두는 시간 */
51
+ static NAV_COUNT_TTL_MS = 5_000;
52
+ /**
53
+ * @param engines 레포 키 → 엔진. 시작할 때 정해지고 요청이 못 늘린다
54
+ * @param primaryKey `pr serve`를 친 자리의 레포. `/`가 여기로 보낸다
55
+ */
56
+ constructor(engines, primaryKey) {
57
+ this.engines = engines;
58
+ this.primaryKey = primaryKey;
59
+ }
60
+ /** Start the server on the given port. Resolves when listening. */
61
+ start(port) {
62
+ return new Promise((resolve, reject) => {
63
+ this.server = createServer((req, res) => {
64
+ // 핸들러가 던지면 createServer 콜백을 빠져나가 uncaughtException으로 프로세스가
65
+ // 죽는다. `GET /%` 한 번이면 되고 그건 임의 웹페이지가 img 태그로 보낼 수 있다.
66
+ // 읽기 전용 뷰어가 원격 요청 하나에 내려가지 않게 여기서 접는다.
67
+ try {
68
+ this.handleRequest(req, res);
69
+ }
70
+ catch (err) {
71
+ const msg = err instanceof Error ? err.message : String(err);
72
+ process.stderr.write(`[local-pr-web] request failed: ${msg}\n`);
73
+ if (!res.headersSent) {
74
+ res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
75
+ }
76
+ res.end('Internal Server Error');
77
+ }
78
+ });
79
+ this.server.once('error', reject);
80
+ this.server.listen(port, '127.0.0.1', () => {
81
+ this.server.off('error', reject);
82
+ this.server.on('error', (err) => {
83
+ process.stderr.write(`[local-pr-web] server error: ${err.message}\n`);
84
+ });
85
+ this.registerSigintHandler();
86
+ resolve();
87
+ });
88
+ });
89
+ }
90
+ /** Stop the server gracefully. Safe to call even if server was never started. */
91
+ stop() {
92
+ this.removeSigintHandler();
93
+ return new Promise((resolve, reject) => {
94
+ if (!this.server) {
95
+ resolve();
96
+ return;
97
+ }
98
+ this.server.close((err) => {
99
+ if (err) {
100
+ reject(err);
101
+ }
102
+ else {
103
+ this.server = null;
104
+ resolve();
105
+ }
106
+ });
107
+ });
108
+ }
109
+ /** Port the server is listening on, or undefined if not started. */
110
+ get port() {
111
+ const addr = this.server?.address();
112
+ if (addr && typeof addr === 'object')
113
+ return addr.port;
114
+ return undefined;
115
+ }
116
+ // ─── Private ───────────────────────────────────────────────────
117
+ /** 퍼센트 인코딩이 깨져 있으면 null. 부르는 쪽이 400으로 접는다 */
118
+ static safeDecode(raw) {
119
+ try {
120
+ return decodeURIComponent(raw);
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ handleRequest(req, res) {
127
+ // 읽기 전용 서버라 GET과 HEAD만 받는다. 나머지는 404가 아니라 405로 답해야
128
+ // 부르는 쪽이 "없는 자리"와 "여기선 못 하는 일"을 가릴 수 있다
129
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
130
+ res.writeHead(405, {
131
+ Allow: 'GET, HEAD',
132
+ 'Content-Type': 'text/plain; charset=utf-8',
133
+ 'X-Content-Type-Options': 'nosniff',
134
+ });
135
+ res.end('Method Not Allowed');
136
+ return;
137
+ }
138
+ // 127.0.0.1에만 바인딩해도 DNS 리바인딩은 남의 이름으로 이 자리에 닿는다.
139
+ // Host를 함께 봐야 그 경로가 막힌다
140
+ const host = (req.headers.host ?? '').split(':')[0];
141
+ if (host !== '127.0.0.1' && host !== 'localhost') {
142
+ res.writeHead(403, {
143
+ 'Content-Type': 'text/plain; charset=utf-8',
144
+ 'X-Content-Type-Options': 'nosniff',
145
+ });
146
+ res.end('Forbidden');
147
+ return;
148
+ }
149
+ // 경로 전체를 먼저 디코딩하면 id 안의 %2F가 슬래시로 풀려 라우트가 갈라진다.
150
+ // 목록 페이지가 링크를 encodeURIComponent로 만드는 것과 짝이 맞으려면
151
+ // 정규식을 raw에 먼저 물리고 캡처된 세그먼트만 디코딩해야 한다
152
+ const rawPath = (req.url ?? '/').split('?')[0];
153
+ const path = PrWebServer.safeDecode(rawPath);
154
+ if (path === null) {
155
+ res.writeHead(400, {
156
+ 'Content-Type': 'text/plain; charset=utf-8',
157
+ 'X-Content-Type-Options': 'nosniff',
158
+ });
159
+ res.end('Bad Request');
160
+ return;
161
+ }
162
+ if (path === '/') {
163
+ res.writeHead(302, { Location: `/r/${this.primaryKey}` });
164
+ res.end();
165
+ return;
166
+ }
167
+ if (path === '/api/repos') {
168
+ // path는 안 내보낸다. URL에 경로가 아니라 키만 싣기로 한 설계(registry.ts)를
169
+ // 이 엔드포인트가 되돌리면 안 된다. 인증이 없는 서버라 응답도 같은 선을 지킨다
170
+ this.sendJson(res, [...this.engines.values()].map((e) => ({
171
+ key: e.repo.key,
172
+ name: e.repo.name,
173
+ addedAt: e.repo.addedAt,
174
+ })));
175
+ return;
176
+ }
177
+ const apiList = rawPath.match(API_PR_LIST_PATH);
178
+ if (apiList) {
179
+ const held = this.engines.get(apiList[1]);
180
+ if (!held)
181
+ return this.notFound(res);
182
+ this.sendJson(res, held.engine.list());
183
+ return;
184
+ }
185
+ const apiDetail = rawPath.match(API_PR_DETAIL_PATH);
186
+ if (apiDetail) {
187
+ const held = this.engines.get(apiDetail[1]);
188
+ const apiId = PrWebServer.safeDecode(apiDetail[2]);
189
+ const pr = held && apiId !== null ? held.engine.get(apiId) : null;
190
+ if (!pr)
191
+ return this.notFound(res);
192
+ this.sendJson(res, pr);
193
+ return;
194
+ }
195
+ const listMatch = rawPath.match(PR_LIST_PATH);
196
+ if (listMatch) {
197
+ const held = this.engines.get(listMatch[1]);
198
+ if (!held)
199
+ return this.notFound(res);
200
+ // 한 번만 접는다. 탭 숫자도 이 목록에서 센다
201
+ const prs = held.engine.list();
202
+ this.sendHtml(res, generatePrListHtml(prs, this.repoNav(listMatch[1], prs)));
203
+ return;
204
+ }
205
+ const detailMatch = rawPath.match(PR_DETAIL_PATH);
206
+ if (detailMatch) {
207
+ const key = detailMatch[1];
208
+ const held = this.engines.get(key);
209
+ const id = PrWebServer.safeDecode(detailMatch[2]);
210
+ const pr = held && id !== null ? held.engine.get(id) : null;
211
+ if (!pr || !held)
212
+ return this.notFound(res);
213
+ const nonce = randomBytes(16).toString('base64');
214
+ this.sendHtml(res, generatePrDetailHtml(pr, this.diffOf(key, held.engine, pr), key, held.repo.name, nonce), nonce);
215
+ return;
216
+ }
217
+ this.notFound(res);
218
+ }
219
+ /**
220
+ * 레포 탭 줄. 지금 보는 레포의 숫자는 `activePrs`에서 세고 나머지는 TTL 캐시를 탄다.
221
+ *
222
+ * @param activePrs 이 요청이 이미 만든 목록. 같은 레포를 두 번 접지 않으려고 받는다
223
+ */
224
+ repoNav(activeKey, activePrs) {
225
+ const now = Date.now();
226
+ return [...this.engines.values()].map((e) => {
227
+ const key = e.repo.key;
228
+ let openCount;
229
+ if (key === activeKey) {
230
+ openCount = activePrs.filter((pr) => pr.status === 'open').length;
231
+ this.navCounts.set(key, { count: openCount, at: now });
232
+ }
233
+ else {
234
+ openCount = this.cachedOpenCount(key, e.engine, now);
235
+ }
236
+ return { key, name: e.repo.name, active: key === activeKey, openCount };
237
+ });
238
+ }
239
+ cachedOpenCount(key, engine, now) {
240
+ const hit = this.navCounts.get(key);
241
+ if (hit && now - hit.at < PrWebServer.NAV_COUNT_TTL_MS)
242
+ return hit.count;
243
+ // list('open')은 PR을 코멘트 배열까지 통째로 접은 뒤 버린다. 배지에 쓸 숫자
244
+ // 하나에 그 비용을 치를 이유가 없다. countByStatus는 상태를 정하는 이벤트만 훑는다
245
+ const count = engine.countByStatus().open;
246
+ this.navCounts.set(key, { count, at: now });
247
+ return count;
248
+ }
249
+ /**
250
+ * PR의 diff. 같은 sha 쌍이면 캐시에서 준다.
251
+ *
252
+ * 캐시 키에 레포를 함께 넣는다. 등록된 자리 둘이 같은 레포의 클론이면 sha 쌍이
253
+ * 겹친다. 지금은 두 자리의 diff가 어차피 같다. 그래도 캐시가 레포 경계를 넘어
254
+ * 값을 옮기는 구조 자체를 안 두는 편이 낫다. 한쪽에만 객체가 없는 경우처럼
255
+ * 같은 sha가 다른 결과를 내는 자리가 있다.
256
+ */
257
+ diffOf(repoKey, engine, pr) {
258
+ // head가 옮겨가면 키가 갈린다. update가 headSha를 바꾸기 때문이다
259
+ const key = `${repoKey}:${pr.baseSha}..${pr.headSha}`;
260
+ const hit = this.diffCache.get(key);
261
+ if (hit !== undefined)
262
+ return hit;
263
+ const diff = engine.diff(pr.id);
264
+ this.diffCache.set(key, diff);
265
+ return diff;
266
+ }
267
+ /**
268
+ * HTML을 내보낸다.
269
+ *
270
+ * CSP를 붙이는 이유는 이 화면이 리뷰어가 쓴 텍스트를 담고 같은 오리진에 CDN
271
+ * 스크립트를 끌어오기 때문이다. SRI가 CDN 변조는 막지만 이스케이프가 한 군데라도
272
+ * 빠지면 남는 방어선이 없다. 인라인 스크립트는 nonce로만 허용한다.
273
+ *
274
+ * `frame-ancestors`는 아무 페이지나 이 뷰어를 iframe으로 띄우는 것을 막는다.
275
+ * 키를 아는 쪽이 화면을 읽어가는 경로다.
276
+ */
277
+ sendHtml(res, html, nonce = '') {
278
+ const scriptSrc = nonce ? `'nonce-${nonce}' ${CDN_ORIGIN}` : CDN_ORIGIN;
279
+ res.writeHead(200, {
280
+ 'Content-Type': 'text/html; charset=utf-8',
281
+ 'Cache-Control': 'no-store',
282
+ 'X-Content-Type-Options': 'nosniff',
283
+ 'Referrer-Policy': 'no-referrer',
284
+ 'Content-Security-Policy': [
285
+ "default-src 'none'",
286
+ `script-src ${scriptSrc}`,
287
+ `style-src 'unsafe-inline' ${CDN_ORIGIN}`,
288
+ `font-src ${CDN_ORIGIN}`,
289
+ "img-src 'self' data:",
290
+ "frame-ancestors 'none'",
291
+ "base-uri 'none'",
292
+ "form-action 'none'",
293
+ ].join('; '),
294
+ });
295
+ res.end(html);
296
+ }
297
+ /**
298
+ * JSON 응답.
299
+ *
300
+ * CORS 헤더를 안 붙인다. 이 API를 부르는 건 같은 오리진에서 뜬 자기 페이지뿐이라
301
+ * 필요가 없다. 와일드카드를 열면 127.0.0.1 바인딩으로 얻은 격리가 풀린다 —
302
+ * 사용자가 열어둔 아무 웹페이지나 리뷰 중인 비공개 소스를 읽어갈 수 있다.
303
+ */
304
+ sendJson(res, value) {
305
+ res.writeHead(200, {
306
+ 'Content-Type': 'application/json; charset=utf-8',
307
+ 'Cache-Control': 'no-store',
308
+ 'X-Content-Type-Options': 'nosniff',
309
+ });
310
+ res.end(JSON.stringify(value));
311
+ }
312
+ notFound(res) {
313
+ res.writeHead(404, {
314
+ 'Content-Type': 'text/plain; charset=utf-8',
315
+ 'X-Content-Type-Options': 'nosniff',
316
+ });
317
+ res.end('Not Found');
318
+ }
319
+ registerSigintHandler() {
320
+ this.sigintHandler = () => {
321
+ process.stderr.write('\n[local-pr-web] SIGINT received — shutting down server...\n');
322
+ // finally로 받는다. close가 실패해도 프로세스는 끝나야 Ctrl+C가 먹는다
323
+ void this.stop().finally(() => {
324
+ process.exit(0);
325
+ });
326
+ };
327
+ process.once('SIGINT', this.sigintHandler);
328
+ }
329
+ removeSigintHandler() {
330
+ if (this.sigintHandler) {
331
+ process.off('SIGINT', this.sigintHandler);
332
+ this.sigintHandler = null;
333
+ }
334
+ }
335
+ }
336
+ /**
337
+ * diff 캐시.
338
+ *
339
+ * diff는 base와 head 두 sha에 대해 불변이라 캐시 키가 공짜로 주어져 있다. 안 쓰면
340
+ * 새로고침마다 execFileSync로 git을 부르는데, 동기 spawn이라 그동안 이벤트 루프가
341
+ * 통째로 멈춰 다른 요청도 함께 기다린다.
342
+ *
343
+ * 개수와 바이트를 함께 묶는다. 개수만 묶으면 `git.diff`의 maxBuffer가 64MB라
344
+ * 32개가 이론상 2GB가 된다. 예산보다 큰 diff 하나는 아예 안 담는다 — 담아 봐야
345
+ * 남은 걸 전부 밀어내고도 예산을 넘긴다.
346
+ *
347
+ * 상한을 생성자로 받는 건 테스트가 작은 값으로 밀어내기를 확인하려고 그렇다.
348
+ */
349
+ export class DiffCache {
350
+ maxEntries;
351
+ maxBytes;
352
+ entries = new Map();
353
+ bytes = 0;
354
+ constructor(maxEntries = 32, maxBytes = 8 * 1024 * 1024) {
355
+ this.maxEntries = maxEntries;
356
+ this.maxBytes = maxBytes;
357
+ }
358
+ get(key) {
359
+ return this.entries.get(key)?.value;
360
+ }
361
+ set(key, value) {
362
+ const size = Buffer.byteLength(value);
363
+ if (size > this.maxBytes)
364
+ return;
365
+ // 있는 키를 덮어쓰면 Map이 자리를 안 옮긴다. 그대로 두면 방금 채운 항목이 가장
366
+ // 오래된 것으로 남아 다음 축출에서 먼저 나간다. 지우고 다시 넣어 자리를 갱신한다
367
+ const previous = this.entries.get(key);
368
+ if (previous !== undefined) {
369
+ this.bytes -= previous.size;
370
+ this.entries.delete(key);
371
+ }
372
+ this.entries.set(key, { value, size });
373
+ this.bytes += size;
374
+ // 방금 넣은 건 안 버린다. 위 크기 가드가 값 하나로 maxBytes를 넘는 경우를 이미
375
+ // 걸러내므로, 남을 다 걷어내면 예산 안에 든다 — maxEntries가 0일 때만 예외이고
376
+ // 그건 캐시를 끈 설정이다
377
+ while (this.entries.size > this.maxEntries || this.bytes > this.maxBytes) {
378
+ const oldest = this.entries.keys().next().value;
379
+ if (oldest === undefined || oldest === key)
380
+ break;
381
+ this.bytes -= this.entries.get(oldest).size;
382
+ this.entries.delete(oldest);
383
+ }
384
+ }
385
+ /** 담고 있는 항목 수 */
386
+ get size() {
387
+ return this.entries.size;
388
+ }
389
+ /** 담고 있는 바이트 합 */
390
+ get byteSize() {
391
+ return this.bytes;
392
+ }
393
+ }
394
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/local-pr-web/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface PrWebServerOptions {
2
+ repoRoot: string;
3
+ port?: number;
4
+ openBrowser?: boolean;
5
+ }
6
+ export interface PrWebServerResult {
7
+ url: string;
8
+ port: number;
9
+ message: string;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/local-pr-web/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/local-pr-web/types.ts"],"names":[],"mappings":""}
@@ -238,7 +238,7 @@ export declare const specInputSchema: z.ZodObject<{
238
238
  }>;
239
239
  export type SpecInput = z.infer<typeof specInputSchema>;
240
240
  export declare const executeInputSchema: z.ZodObject<{
241
- action: z.ZodEnum<["start", "plan_step", "plan_complete", "execute_start", "execute_task", "evaluate", "status", "resume", "audit", "spawn", "evolve_fix", "evolve", "evolve_patch", "evolve_re_execute", "evolve_lateral", "evolve_lateral_result", "role_match", "role_consensus", "review_start", "review_submit", "review_consensus", "review_fix", "evolution_viz"]>;
241
+ action: z.ZodEnum<["start", "plan_step", "plan_complete", "execute_start", "execute_task", "evaluate", "status", "resume", "audit", "spawn", "evolve_fix", "evolve", "evolve_patch", "evolve_re_execute", "evolve_lateral", "evolve_lateral_result", "role_match", "role_consensus", "review_start", "review_submit", "review_consensus", "review_fix", "review_publish", "evolution_viz"]>;
242
242
  spec: z.ZodOptional<z.ZodObject<{
243
243
  version: z.ZodString;
244
244
  goal: z.ZodString;
@@ -1135,8 +1135,10 @@ export declare const executeInputSchema: z.ZodObject<{
1135
1135
  escalate: boolean;
1136
1136
  }>>;
1137
1137
  reviewSessionId: z.ZodOptional<z.ZodString>;
1138
+ prId: z.ZodOptional<z.ZodString>;
1139
+ prReviewer: z.ZodOptional<z.ZodString>;
1138
1140
  }, "strip", z.ZodTypeAny, {
1139
- action: "plan_complete" | "evaluate" | "status" | "start" | "plan_step" | "execute_start" | "execute_task" | "resume" | "audit" | "spawn" | "evolve_fix" | "evolve" | "evolve_patch" | "evolve_re_execute" | "evolve_lateral" | "evolve_lateral_result" | "role_match" | "role_consensus" | "review_start" | "review_submit" | "review_consensus" | "review_fix" | "evolution_viz";
1141
+ action: "plan_complete" | "evaluate" | "status" | "start" | "plan_step" | "execute_start" | "execute_task" | "resume" | "audit" | "spawn" | "evolve_fix" | "evolve" | "evolve_patch" | "evolve_re_execute" | "evolve_lateral" | "evolve_lateral_result" | "role_match" | "role_consensus" | "review_start" | "review_submit" | "review_consensus" | "review_fix" | "review_publish" | "evolution_viz";
1140
1142
  verbose: boolean;
1141
1143
  spec?: {
1142
1144
  goal: string;
@@ -1359,8 +1361,10 @@ export declare const executeInputSchema: z.ZodObject<{
1359
1361
  escalate: boolean;
1360
1362
  } | undefined;
1361
1363
  reviewSessionId?: string | undefined;
1364
+ prId?: string | undefined;
1365
+ prReviewer?: string | undefined;
1362
1366
  }, {
1363
- action: "plan_complete" | "evaluate" | "status" | "start" | "plan_step" | "execute_start" | "execute_task" | "resume" | "audit" | "spawn" | "evolve_fix" | "evolve" | "evolve_patch" | "evolve_re_execute" | "evolve_lateral" | "evolve_lateral_result" | "role_match" | "role_consensus" | "review_start" | "review_submit" | "review_consensus" | "review_fix" | "evolution_viz";
1367
+ action: "plan_complete" | "evaluate" | "status" | "start" | "plan_step" | "execute_start" | "execute_task" | "resume" | "audit" | "spawn" | "evolve_fix" | "evolve" | "evolve_patch" | "evolve_re_execute" | "evolve_lateral" | "evolve_lateral_result" | "role_match" | "role_consensus" | "review_start" | "review_submit" | "review_consensus" | "review_fix" | "review_publish" | "evolution_viz";
1364
1368
  spec?: {
1365
1369
  goal: string;
1366
1370
  version: string;
@@ -1583,10 +1587,12 @@ export declare const executeInputSchema: z.ZodObject<{
1583
1587
  escalate: boolean;
1584
1588
  } | undefined;
1585
1589
  reviewSessionId?: string | undefined;
1590
+ prId?: string | undefined;
1591
+ prReviewer?: string | undefined;
1586
1592
  }>;
1587
1593
  export type ExecuteInput = z.infer<typeof executeInputSchema>;
1588
1594
  export declare const executeToolSchema: {
1589
- action: z.ZodEnum<["start", "plan_step", "plan_complete", "execute_start", "execute_task", "evaluate", "status", "resume", "audit", "spawn", "evolve_fix", "evolve", "evolve_patch", "evolve_re_execute", "evolve_lateral", "evolve_lateral_result", "role_match", "role_consensus", "review_start", "review_submit", "review_consensus", "review_fix", "evolution_viz"]>;
1595
+ action: z.ZodEnum<["start", "plan_step", "plan_complete", "execute_start", "execute_task", "evaluate", "status", "resume", "audit", "spawn", "evolve_fix", "evolve", "evolve_patch", "evolve_re_execute", "evolve_lateral", "evolve_lateral_result", "role_match", "role_consensus", "review_start", "review_submit", "review_consensus", "review_fix", "review_publish", "evolution_viz"]>;
1590
1596
  spec: z.ZodOptional<z.ZodObject<{
1591
1597
  version: z.ZodString;
1592
1598
  goal: z.ZodString;
@@ -2483,6 +2489,8 @@ export declare const executeToolSchema: {
2483
2489
  escalate: boolean;
2484
2490
  }>>;
2485
2491
  reviewSessionId: z.ZodOptional<z.ZodString>;
2492
+ prId: z.ZodOptional<z.ZodString>;
2493
+ prReviewer: z.ZodOptional<z.ZodString>;
2486
2494
  };
2487
2495
  export declare const agentCreateInputSchema: z.ZodObject<{
2488
2496
  action: z.ZodEnum<["start", "submit"]>;
@@ -2596,4 +2604,71 @@ export declare const graphVisualizeInputSchema: z.ZodObject<{
2596
2604
  port?: number | undefined;
2597
2605
  }>;
2598
2606
  export type GraphVisualizeInput = z.infer<typeof graphVisualizeInputSchema>;
2607
+ /**
2608
+ * `ges_pr`이 받는 액션.
2609
+ *
2610
+ * 서버 등록(`server.tool`)이 이 배열을 그대로 쓴다. 목록을 두 곳에 적으면 하나가
2611
+ * 뒤처진다 — 실제로 checkout을 붙일 때 등록 enum만 열 개로 남아 MCP로는 부를 수
2612
+ * 없는 액션이 생겼다.
2613
+ */
2614
+ export declare const PR_ACTIONS: readonly ["create", "list", "get", "diff", "comment", "resolve", "review", "update", "edit", "merge", "close", "checkout", "checkout_remove"];
2615
+ export declare const prInputSchema: z.ZodObject<{
2616
+ action: z.ZodEnum<["create", "list", "get", "diff", "comment", "resolve", "review", "update", "edit", "merge", "close", "checkout", "checkout_remove"]>;
2617
+ repoRoot: z.ZodOptional<z.ZodString>;
2618
+ id: z.ZodOptional<z.ZodString>;
2619
+ title: z.ZodOptional<z.ZodString>;
2620
+ base: z.ZodOptional<z.ZodString>;
2621
+ head: z.ZodOptional<z.ZodString>;
2622
+ author: z.ZodOptional<z.ZodString>;
2623
+ body: z.ZodOptional<z.ZodString>;
2624
+ status: z.ZodOptional<z.ZodEnum<["open", "changes_requested", "merged", "closed"]>>;
2625
+ path: z.ZodOptional<z.ZodString>;
2626
+ line: z.ZodOptional<z.ZodNumber>;
2627
+ replyTo: z.ZodOptional<z.ZodString>;
2628
+ commentId: z.ZodOptional<z.ZodString>;
2629
+ verdict: z.ZodOptional<z.ZodEnum<["approve", "request_changes", "comment"]>>;
2630
+ summary: z.ZodOptional<z.ZodString>;
2631
+ deleteBranch: z.ZodOptional<z.ZodBoolean>;
2632
+ reason: z.ZodOptional<z.ZodString>;
2633
+ force: z.ZodOptional<z.ZodBoolean>;
2634
+ }, "strip", z.ZodTypeAny, {
2635
+ action: "review" | "merge" | "create" | "list" | "get" | "diff" | "comment" | "resolve" | "update" | "edit" | "close" | "checkout" | "checkout_remove";
2636
+ status?: "open" | "changes_requested" | "merged" | "closed" | undefined;
2637
+ path?: string | undefined;
2638
+ id?: string | undefined;
2639
+ force?: boolean | undefined;
2640
+ repoRoot?: string | undefined;
2641
+ title?: string | undefined;
2642
+ line?: number | undefined;
2643
+ summary?: string | undefined;
2644
+ base?: string | undefined;
2645
+ head?: string | undefined;
2646
+ author?: string | undefined;
2647
+ body?: string | undefined;
2648
+ replyTo?: string | undefined;
2649
+ commentId?: string | undefined;
2650
+ verdict?: "approve" | "request_changes" | "comment" | undefined;
2651
+ deleteBranch?: boolean | undefined;
2652
+ reason?: string | undefined;
2653
+ }, {
2654
+ action: "review" | "merge" | "create" | "list" | "get" | "diff" | "comment" | "resolve" | "update" | "edit" | "close" | "checkout" | "checkout_remove";
2655
+ status?: "open" | "changes_requested" | "merged" | "closed" | undefined;
2656
+ path?: string | undefined;
2657
+ id?: string | undefined;
2658
+ force?: boolean | undefined;
2659
+ repoRoot?: string | undefined;
2660
+ title?: string | undefined;
2661
+ line?: number | undefined;
2662
+ summary?: string | undefined;
2663
+ base?: string | undefined;
2664
+ head?: string | undefined;
2665
+ author?: string | undefined;
2666
+ body?: string | undefined;
2667
+ replyTo?: string | undefined;
2668
+ commentId?: string | undefined;
2669
+ verdict?: "approve" | "request_changes" | "comment" | undefined;
2670
+ deleteBranch?: boolean | undefined;
2671
+ reason?: string | undefined;
2672
+ }>;
2673
+ export type PrInput = z.infer<typeof prInputSchema>;
2599
2674
  //# sourceMappingURL=schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/mcp/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/mcp/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4B/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAGlE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoC1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0Z7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA2B,CAAC;AAG1D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAajC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGtE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAGlE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAGlE,eAAO,MAAM,iBAAiB;;;;;;;;;EAQ5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG5D,eAAO,MAAM,yBAAyB;;;;;;;;;EAMpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAG5E;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,+IAcb,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CxB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}