@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,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":"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"}