@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.
- package/CLAUDE.md +9 -2
- package/README.md +1 -0
- package/dist/package.json +2 -1
- package/dist/plugin/review-agents/quality-reviewer/AGENT.md +1 -1
- package/dist/plugin/review-agents/writing-reviewer/AGENT.md +2 -2
- package/dist/plugin/skills/local-pr/SKILL.md +201 -0
- package/dist/plugin/skills/pr/SKILL.md +73 -4
- package/dist/plugin/skills/review/SKILL.md +190 -18
- package/dist/plugin/skills/review-reply/SKILL.md +144 -7
- package/dist/src/cli/commands/pr.d.ts +133 -0
- package/dist/src/cli/commands/pr.d.ts.map +1 -0
- package/dist/src/cli/commands/pr.js +489 -0
- package/dist/src/cli/commands/pr.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +85 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +4 -3
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/home.d.ts +20 -0
- package/dist/src/core/home.d.ts.map +1 -0
- package/dist/src/core/home.js +52 -0
- package/dist/src/core/home.js.map +1 -0
- package/dist/src/core/types.d.ts +38 -0
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/version.d.ts.map +1 -1
- package/dist/src/core/version.js +4 -7
- package/dist/src/core/version.js.map +1 -1
- package/dist/src/events/store.d.ts +32 -0
- package/dist/src/events/store.d.ts.map +1 -1
- package/dist/src/events/store.js +68 -3
- package/dist/src/events/store.js.map +1 -1
- package/dist/src/local-pr/engine.d.ts +176 -0
- package/dist/src/local-pr/engine.d.ts.map +1 -0
- package/dist/src/local-pr/engine.js +373 -0
- package/dist/src/local-pr/engine.js.map +1 -0
- package/dist/src/local-pr/git.d.ts +190 -0
- package/dist/src/local-pr/git.d.ts.map +1 -0
- package/dist/src/local-pr/git.js +580 -0
- package/dist/src/local-pr/git.js.map +1 -0
- package/dist/src/local-pr/index.d.ts +6 -0
- package/dist/src/local-pr/index.d.ts.map +1 -0
- package/dist/src/local-pr/index.js +8 -0
- package/dist/src/local-pr/index.js.map +1 -0
- package/dist/src/local-pr/policy.d.ts +77 -0
- package/dist/src/local-pr/policy.d.ts.map +1 -0
- package/dist/src/local-pr/policy.js +80 -0
- package/dist/src/local-pr/policy.js.map +1 -0
- package/dist/src/local-pr/registry.d.ts +79 -0
- package/dist/src/local-pr/registry.d.ts.map +1 -0
- package/dist/src/local-pr/registry.js +307 -0
- package/dist/src/local-pr/registry.js.map +1 -0
- package/dist/src/local-pr/repository.d.ts +67 -0
- package/dist/src/local-pr/repository.d.ts.map +1 -0
- package/dist/src/local-pr/repository.js +251 -0
- package/dist/src/local-pr/repository.js.map +1 -0
- package/dist/src/local-pr/types.d.ts +151 -0
- package/dist/src/local-pr/types.d.ts.map +1 -0
- package/dist/src/local-pr/types.js +9 -0
- package/dist/src/local-pr/types.js.map +1 -0
- package/dist/src/local-pr-web/engine.d.ts +24 -0
- package/dist/src/local-pr-web/engine.d.ts.map +1 -0
- package/dist/src/local-pr-web/engine.js +112 -0
- package/dist/src/local-pr-web/engine.js.map +1 -0
- package/dist/src/local-pr-web/html-generator.d.ts +24 -0
- package/dist/src/local-pr-web/html-generator.d.ts.map +1 -0
- package/dist/src/local-pr-web/html-generator.js +385 -0
- package/dist/src/local-pr-web/html-generator.js.map +1 -0
- package/dist/src/local-pr-web/index.d.ts +5 -0
- package/dist/src/local-pr-web/index.d.ts.map +1 -0
- package/dist/src/local-pr-web/index.js +5 -0
- package/dist/src/local-pr-web/index.js.map +1 -0
- package/dist/src/local-pr-web/server.d.ts +126 -0
- package/dist/src/local-pr-web/server.d.ts.map +1 -0
- package/dist/src/local-pr-web/server.js +394 -0
- package/dist/src/local-pr-web/server.js.map +1 -0
- package/dist/src/local-pr-web/types.d.ts +11 -0
- package/dist/src/local-pr-web/types.d.ts.map +1 -0
- package/dist/src/local-pr-web/types.js +2 -0
- package/dist/src/local-pr-web/types.js.map +1 -0
- package/dist/src/mcp/schemas.d.ts +79 -4
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +80 -2
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +13 -2
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/pr.d.ts +5 -0
- package/dist/src/mcp/tools/pr.d.ts.map +1 -0
- package/dist/src/mcp/tools/pr.js +165 -0
- package/dist/src/mcp/tools/pr.js.map +1 -0
- package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/review-passthrough.js +264 -15
- package/dist/src/mcp/tools/review-passthrough.js.map +1 -1
- package/dist/src/memory/user-profile-store.d.ts.map +1 -1
- package/dist/src/memory/user-profile-store.js +3 -4
- package/dist/src/memory/user-profile-store.js.map +1 -1
- package/dist/src/review/context-collector.d.ts +1 -1
- package/dist/src/review/context-collector.js +1 -1
- package/dist/src/review/passthrough-engine.d.ts +1 -0
- package/dist/src/review/passthrough-engine.d.ts.map +1 -1
- package/dist/src/review/passthrough-engine.js +7 -2
- package/dist/src/review/passthrough-engine.js.map +1 -1
- package/dist/src/spec/text-based-spec-generator.d.ts.map +1 -1
- package/dist/src/spec/text-based-spec-generator.js +5 -2
- package/dist/src/spec/text-based-spec-generator.js.map +1 -1
- package/package.json +2 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/review-agents/quality-reviewer/AGENT.md +1 -1
- package/plugin/review-agents/writing-reviewer/AGENT.md +2 -2
- package/plugin/skills/local-pr/SKILL.md +201 -0
- package/plugin/skills/pr/SKILL.md +73 -4
- package/plugin/skills/review/SKILL.md +190 -18
- package/plugin/skills/review-reply/SKILL.md +144 -7
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { PR_AGGREGATE } from './types.js';
|
|
2
|
+
/** ์ด ๋๋ฉ์ธ์ด ์ฐ๋ ์ด๋ฒคํธ ์ด๋ฆ */
|
|
3
|
+
export const PrEvent = {
|
|
4
|
+
CREATED: 'pr.created',
|
|
5
|
+
UPDATED: 'pr.updated',
|
|
6
|
+
EDITED: 'pr.edited',
|
|
7
|
+
COMMENT_ADDED: 'pr.comment.added',
|
|
8
|
+
COMMENT_RESOLVED: 'pr.comment.resolved',
|
|
9
|
+
REVIEW_SUBMITTED: 'pr.review.submitted',
|
|
10
|
+
MERGED: 'pr.merged',
|
|
11
|
+
CLOSED: 'pr.closed',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* ์ด๋ฒคํธ๋ฅผ ์ ์ด PR ์ํ๋ฅผ ๋ง๋ ๋ค.
|
|
15
|
+
*
|
|
16
|
+
* ์ํ๋ฅผ ๋ฐ๋ก ์ ์ฅํ์ง ์์์ DB๋ฅผ ์ง์ฐ๊ณ ์ด๋ฒคํธ๋ง ๋จ์๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
|
|
17
|
+
* ExecuteSessionRepository๊ฐ ์ฐ๋ ๋ฐฉ์๊ณผ ๊ฐ๋ค.
|
|
18
|
+
*/
|
|
19
|
+
export class PullRequestRepository {
|
|
20
|
+
eventStore;
|
|
21
|
+
constructor(eventStore) {
|
|
22
|
+
this.eventStore = eventStore;
|
|
23
|
+
}
|
|
24
|
+
reconstruct(prId) {
|
|
25
|
+
const events = this.eventStore.replay(PR_AGGREGATE, prId);
|
|
26
|
+
if (events.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
return this.fold(prId, events);
|
|
29
|
+
}
|
|
30
|
+
list() {
|
|
31
|
+
return this.eventStore.listAggregates(PR_AGGREGATE);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* ๋ชจ๋ PR์ ํ ๋ฒ์ ์กฐํ๋ก ๋ง๋ ๋ค.
|
|
35
|
+
*
|
|
36
|
+
* id๋ฅผ ํ์ด ํ๋์ฉ replayํ๋ฉด PR ์๋งํผ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ค. ๋ชฉ๋ก ํ๋ฉด๊ณผ CLI list๊ฐ
|
|
37
|
+
* ๋ถ๋ฅด๋ ์๋ฆฌ๋ผ PR์ด ๋์๋ก ๊ทธ๋๋ก ๋๋ ค์ง๋ค.
|
|
38
|
+
*/
|
|
39
|
+
reconstructAll() {
|
|
40
|
+
const grouped = this.eventStore.getAllByAggregateType(PR_AGGREGATE);
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const [id, events] of grouped) {
|
|
43
|
+
const pr = this.fold(id, events);
|
|
44
|
+
if (pr)
|
|
45
|
+
out.push(pr);
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* ์ํ๋ณ ๊ฐ์๋ง ์ผ๋ค.
|
|
51
|
+
*
|
|
52
|
+
* ๋ฐฐ์ง ํ๋ ์ฐ์๊ณ PR์ ๋ค ์ ๋ ์๋ฆฌ๊ฐ ์๋ค. ์ฝ๋ฉํธ์ ๋ฆฌ๋ทฐ์ ๋ผ์ด๋ ๋ฐฐ์ด์ ๋ง๋ค๊ณ
|
|
53
|
+
* ๊ฐ์๋ง ์ฝ๊ณ ๋ฒ๋ฆฐ๋ค. ์ฌ๊ธฐ์๋ `foldStatus`๋ก ์ํ๋ง ์ ํ๊ณ ์ ๊ธฐ๋ฅผ ์ ํ๋ค.
|
|
54
|
+
*/
|
|
55
|
+
countByStatus() {
|
|
56
|
+
const counts = {
|
|
57
|
+
open: 0,
|
|
58
|
+
changes_requested: 0,
|
|
59
|
+
merged: 0,
|
|
60
|
+
closed: 0,
|
|
61
|
+
};
|
|
62
|
+
for (const events of this.eventStore.getAllByAggregateType(PR_AGGREGATE).values()) {
|
|
63
|
+
const status = this.foldStatus(events);
|
|
64
|
+
if (status)
|
|
65
|
+
counts[status]++;
|
|
66
|
+
}
|
|
67
|
+
return counts;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* ์ด ์ํ์ธ PR๋ง ๋ง๋ ๋ค.
|
|
71
|
+
*
|
|
72
|
+
* ๋จผ์ ์ํ๋ง ์ ์ด ํ๋ณด๋ฅผ ์ขํ๊ณ ๋จ์ ๊ฒ๋ง ํต์งธ๋ก ์ ๋๋ค. ์ํ ํํฐ๊ฐ ๋ถ์ ํธ์ถ์
|
|
73
|
+
* ๋๋ถ๋ถ์ ๋ฒ๋ฆฌ๋๋ฐ ๋ฒ๋ฆด ๊ฒ๊น์ง ๋ค ๋ง๋ค์ด ๋์ ์ด์ ๊ฐ ์๋ค.
|
|
74
|
+
*/
|
|
75
|
+
reconstructByStatus(status) {
|
|
76
|
+
const out = [];
|
|
77
|
+
for (const [id, events] of this.eventStore.getAllByAggregateType(PR_AGGREGATE)) {
|
|
78
|
+
if (this.foldStatus(events) !== status)
|
|
79
|
+
continue;
|
|
80
|
+
const pr = this.fold(id, events);
|
|
81
|
+
if (pr)
|
|
82
|
+
out.push(pr);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ์ํ๋ง ์ ๋๋ค. `fold`๊ฐ ๋ง๋๋ ๊ฒ ์ค `status` ํ๋๋ง ๋์ค๋ ๊ฐ๋ฒผ์ด ๊ฐ๋๋ค.
|
|
88
|
+
*
|
|
89
|
+
* ์ํ๋ฅผ ์ ํ๋ ์ด๋ฒคํธ๋ ๋ค์ฏ๋ฟ์ด๋ค โ created(open), updated(๊ณ ์ณ ์ฌ๋ ธ์ผ๋ ๋ค์
|
|
90
|
+
* open), review.submitted(request_changes์ผ ๋๋ง), merged, closed. ์ฝ๋ฉํธ๋ฅผ ๋ถ์ด๊ณ
|
|
91
|
+
* ๋ซ๋ ์ด๋ฒคํธ๋ `comments`์ ๋ผ์ด๋์ ์ฝ๋ฉํธ ์๋ง ๊ฑด๋๋ฆฌ๊ณ ์ํ์๋ ์๋์ง ์๋๋ค.
|
|
92
|
+
* approve์ comment ํ์ ๋ ๋ผ์ด๋์ ํ์ ๋ง ์ ๊ณ ์ํ๋ฅผ ์ ์ฎ๊ธด๋ค.
|
|
93
|
+
*
|
|
94
|
+
* `pr.edited`๋ ์ฌ๊ธฐ ์๋ค. ์ผ๋ถ๋ฌ ์๋ค โ ๋ณธ๋ฌธ ์คํ๋ฅผ ๊ณ ์ณค๋ค๊ณ ๋ฆฌ๋ทฐ์ด๊ฐ ๋ด๋ฆฐ
|
|
95
|
+
* `changes_requested`๊ฐ ํ๋ฆฌ๋ฉด ํ์ ์ด ๊ธ์ ์์ ์ผ๋ก ๋ฆฌ์
๋๋ค. `fold`๋ง ๊ทธ ์ด๋ฒคํธ๋ฅผ
|
|
96
|
+
* ์ฝ๊ณ ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ ๊ฐ์ ๋ผ์ด๋ค.
|
|
97
|
+
*
|
|
98
|
+
* ๋ ๊ฐ๋๊ฐ ๊ฐ๋ฆฌ๋ฉด ๋ชฉ๋ก๊ณผ ํํฐ๊ฐ ์ด๊ธ๋๋ค. `list(status)`๊ฐ `list()`๋ฅผ ๊ฑฐ๋ฅธ ๊ฒ๊ณผ
|
|
99
|
+
* ๊ฐ์์ง ๋ณด๋ ํ
์คํธ๊ฐ ๊ทธ ์๋ฆฌ๋ฅผ ์ก๋๋ฐ, ๊ทธ ํ
์คํธ๋ approve์ comment ํ์ ์ ๋ ๋ค
|
|
100
|
+
* ์ง๋๋ค โ ์ ๋ฌธ์ฅ์ด ๋์ ๋๋ํ ์ ์ด ๋๋ ๋ฐ๋ ๊ฒ๋ ๋์ด์ด์ผ ํ๋ค.
|
|
101
|
+
*/
|
|
102
|
+
foldStatus(events) {
|
|
103
|
+
let status = null;
|
|
104
|
+
for (const event of events) {
|
|
105
|
+
switch (event.eventType) {
|
|
106
|
+
case PrEvent.CREATED:
|
|
107
|
+
status ??= 'open';
|
|
108
|
+
break;
|
|
109
|
+
case PrEvent.UPDATED:
|
|
110
|
+
if (status === 'changes_requested')
|
|
111
|
+
status = 'open';
|
|
112
|
+
break;
|
|
113
|
+
case PrEvent.REVIEW_SUBMITTED:
|
|
114
|
+
if (event.payload.verdict === 'request_changes') {
|
|
115
|
+
status = 'changes_requested';
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case PrEvent.MERGED:
|
|
119
|
+
status = 'merged';
|
|
120
|
+
break;
|
|
121
|
+
case PrEvent.CLOSED:
|
|
122
|
+
status = 'closed';
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return status;
|
|
129
|
+
}
|
|
130
|
+
fold(prId, events) {
|
|
131
|
+
const created = events.find((e) => e.eventType === PrEvent.CREATED);
|
|
132
|
+
if (!created)
|
|
133
|
+
return null;
|
|
134
|
+
const head = created.payload;
|
|
135
|
+
const pr = {
|
|
136
|
+
id: prId,
|
|
137
|
+
title: head.title,
|
|
138
|
+
body: head.body,
|
|
139
|
+
author: head.author,
|
|
140
|
+
baseSha: head.baseSha,
|
|
141
|
+
headSha: head.headSha,
|
|
142
|
+
headRef: head.headRef,
|
|
143
|
+
baseRef: head.baseRef,
|
|
144
|
+
status: 'open',
|
|
145
|
+
createdAt: created.timestamp,
|
|
146
|
+
updatedAt: created.timestamp,
|
|
147
|
+
comments: [],
|
|
148
|
+
reviews: [],
|
|
149
|
+
rounds: [{ number: 1, openedAt: created.timestamp, verdict: null, commentCount: 0 }],
|
|
150
|
+
};
|
|
151
|
+
for (const event of events) {
|
|
152
|
+
this.apply(pr, event);
|
|
153
|
+
pr.updatedAt = event.timestamp;
|
|
154
|
+
}
|
|
155
|
+
return pr;
|
|
156
|
+
}
|
|
157
|
+
apply(pr, event) {
|
|
158
|
+
switch (event.eventType) {
|
|
159
|
+
case PrEvent.UPDATED: {
|
|
160
|
+
const p = event.payload;
|
|
161
|
+
pr.headSha = p.headSha;
|
|
162
|
+
pr.headRef = p.headRef;
|
|
163
|
+
// ๊ณ ์น๊ณ ๋ค์ ์ฌ๋ ธ์ผ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์๋ฆฌ๋ก ๋๋๋ฆฐ๋ค
|
|
164
|
+
if (pr.status === 'changes_requested')
|
|
165
|
+
pr.status = 'open';
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case PrEvent.EDITED: {
|
|
169
|
+
const p = event.payload;
|
|
170
|
+
// ์ ์ค๋ฆฐ ํญ๋ชฉ์ ๊ทธ๋๋ก ๋๋ค. ๋น ๋ฌธ์์ด์ "๋น์๋ผ"๋ผ์ ์ฌ๊ธฐ์ ๊ฑธ๋ฌ์ง๋ฉด ์ ๋๋ค
|
|
171
|
+
if (p.title !== undefined)
|
|
172
|
+
pr.title = p.title;
|
|
173
|
+
if (p.body !== undefined)
|
|
174
|
+
pr.body = p.body;
|
|
175
|
+
// ์ํ๋ ๋ผ์ด๋๋ ์ ๊ฑด๋๋ฆฐ๋ค. ๊ธ์๋ฅผ ๊ณ ์น ๊ฒ์ด์ง ๋ฆฌ๋ทฐ ๋์์ ์ฎ๊ธด ๊ฒ ์๋๋ค
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case PrEvent.COMMENT_ADDED: {
|
|
179
|
+
const p = event.payload;
|
|
180
|
+
const comment = {
|
|
181
|
+
id: p.commentId,
|
|
182
|
+
author: p.author,
|
|
183
|
+
path: p.path,
|
|
184
|
+
line: p.line,
|
|
185
|
+
body: p.body,
|
|
186
|
+
threadId: p.threadId,
|
|
187
|
+
resolved: false,
|
|
188
|
+
headSha: p.headSha,
|
|
189
|
+
createdAt: event.timestamp,
|
|
190
|
+
...(p.marker ? { marker: p.marker } : {}),
|
|
191
|
+
};
|
|
192
|
+
pr.comments.push(comment);
|
|
193
|
+
currentRound(pr).commentCount++;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case PrEvent.COMMENT_RESOLVED: {
|
|
197
|
+
const p = event.payload;
|
|
198
|
+
// ์ค๋ ๋๋ฅผ ํต์งธ๋ก ๋ซ๋๋ค. ๋ฟ๋ฆฌ๋ง ๋ซ๊ณ ๋ต๊ธ์ด ์ด๋ฆฐ ์ฑ ๋จ์ผ๋ฉด ๋ฏธํด๊ฒฐ ์๊ฐ ์ด๊ธ๋๋ค
|
|
199
|
+
const target = pr.comments.find((c) => c.id === p.commentId);
|
|
200
|
+
if (target) {
|
|
201
|
+
for (const c of pr.comments) {
|
|
202
|
+
if (c.threadId === target.threadId)
|
|
203
|
+
c.resolved = true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
case PrEvent.REVIEW_SUBMITTED: {
|
|
209
|
+
const p = event.payload;
|
|
210
|
+
const round = currentRound(pr);
|
|
211
|
+
const review = {
|
|
212
|
+
id: p.reviewId,
|
|
213
|
+
reviewer: p.reviewer,
|
|
214
|
+
verdict: p.verdict,
|
|
215
|
+
summary: p.summary,
|
|
216
|
+
round: round.number,
|
|
217
|
+
headSha: p.headSha,
|
|
218
|
+
createdAt: event.timestamp,
|
|
219
|
+
};
|
|
220
|
+
pr.reviews.push(review);
|
|
221
|
+
// comment ํ์ ์ ๋ผ์ด๋๋ฅผ ๋ซ์ง ์๋๋ค. ์๊ฒฌ๋ง ๋จ๊ธฐ๋ ์๋ฆฌ๋ค
|
|
222
|
+
if (p.verdict === 'request_changes') {
|
|
223
|
+
pr.status = 'changes_requested';
|
|
224
|
+
round.verdict = p.verdict;
|
|
225
|
+
pr.rounds.push({
|
|
226
|
+
number: round.number + 1,
|
|
227
|
+
openedAt: event.timestamp,
|
|
228
|
+
verdict: null,
|
|
229
|
+
commentCount: 0,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else if (p.verdict === 'approve') {
|
|
233
|
+
round.verdict = p.verdict;
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case PrEvent.MERGED:
|
|
238
|
+
pr.status = 'merged';
|
|
239
|
+
break;
|
|
240
|
+
case PrEvent.CLOSED:
|
|
241
|
+
pr.status = 'closed';
|
|
242
|
+
break;
|
|
243
|
+
default:
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function currentRound(pr) {
|
|
249
|
+
return pr.rounds[pr.rounds.length - 1];
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/local-pr/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๋ก์ปฌ PR ๋ฆฌ๋ทฐ์ ๋๋ฉ์ธ ํ์
.
|
|
3
|
+
*
|
|
4
|
+
* ์๊ฒฉ GitHub PR์ ์ฌ๋์๊ฒ ๋๊ธฐ๋ ์๋ฆฌ๋ค. ์ฌ๊ธฐ๋ ์์ด์ ํธ๊ฐ ์ชผ๊ฐ ์์
์ ๋ค๋ฅธ
|
|
5
|
+
* ์์ด์ ํธ์๊ฒ ๋ฆฌ๋ทฐ๋ฐ๊ณ ์ฃผ๊ณ ๋ฐ๋ ์๋ฆฌ๋ค. ํ ์์
๋จ์๊ฐ PR ํ๋๋ค.
|
|
6
|
+
*/
|
|
7
|
+
/** ์ด๋ฒคํธ ์ ์ฅ์์์ ์ด ๋๋ฉ์ธ์ ๊ฐ๋ฆฌํค๋ ์ด๋ฆ */
|
|
8
|
+
export declare const PR_AGGREGATE = "local-pr";
|
|
9
|
+
export type PrStatus = 'open' | 'changes_requested' | 'merged' | 'closed';
|
|
10
|
+
export type ReviewVerdict = 'approve' | 'request_changes' | 'comment';
|
|
11
|
+
/**
|
|
12
|
+
* ๋๊ฐ ํ๋์ง.
|
|
13
|
+
*
|
|
14
|
+
* `claude-code:main`, `codex:worker-2`, `human:tienne` ๊ฐ์ ํํ๋ค. ์์ด์ ํธ๋ผ๋ฆฌ
|
|
15
|
+
* ์ฃผ๊ณ ๋ฐ๋ ์๋ฆฌ๋ผ ์์ฑ์์ ๋ฆฌ๋ทฐ์ด๊ฐ ๊ฐ๋ ค์ผ "๋๊ฐ ์ง์๊ณ ๋๊ฐ ๋ตํ๋"๊ฐ ๋จ๋๋ค.
|
|
16
|
+
*/
|
|
17
|
+
export type Actor = string;
|
|
18
|
+
export interface PullRequest {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
body: string;
|
|
22
|
+
author: Actor;
|
|
23
|
+
/** ๊ฐ๋ผ์ ธ ๋์จ ์ง์ . merge-base๋ก ์ก๋๋ค */
|
|
24
|
+
baseSha: string;
|
|
25
|
+
/** ์ง๊ธ ๋ฆฌ๋ทฐ ๋์์ธ ์ปค๋ฐ. update๋ก ์ฎ๊ฒจ๊ฐ๋ค */
|
|
26
|
+
headSha: string;
|
|
27
|
+
/** head๋ฅผ ๋ง๋ค์ด๋ธ ๋ธ๋์น ์ด๋ฆ. ์ง์์ง ์ ์์ด ์ฐธ๊ณ ์ฉ์ด๋ค */
|
|
28
|
+
headRef: string | null;
|
|
29
|
+
baseRef: string | null;
|
|
30
|
+
status: PrStatus;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
comments: Comment[];
|
|
34
|
+
reviews: Review[];
|
|
35
|
+
rounds: Round[];
|
|
36
|
+
}
|
|
37
|
+
export interface Comment {
|
|
38
|
+
id: string;
|
|
39
|
+
author: Actor;
|
|
40
|
+
path: string;
|
|
41
|
+
/** head ๊ธฐ์ค ๋ผ์ธ. ํ์ผ ์ ๋ฐ์ด๋ฉด null */
|
|
42
|
+
line: number | null;
|
|
43
|
+
body: string;
|
|
44
|
+
/** ์ค๋ ๋์ ์ฒซ ์ฝ๋ฉํธ id. ์๊ธฐ ์์ ์ด๋ฉด ์ค๋ ๋์ ๋ฟ๋ฆฌ๋ค */
|
|
45
|
+
threadId: string;
|
|
46
|
+
resolved: boolean;
|
|
47
|
+
/** ์ด ์ฝ๋ฉํธ๊ฐ ๋ฌ๋ฆฐ ์์ ์ head. ์ดํ update๋ก ๋ผ์ธ์ด ๋ฐ๋ ธ๋์ง ๊ฐ๋ฆฐ๋ค */
|
|
48
|
+
headSha: string;
|
|
49
|
+
createdAt: string;
|
|
50
|
+
/**
|
|
51
|
+
* ์ด ์ฝ๋ฉํธ๋ฅผ ๋ถ์ธ ์๋ํ๊ฐ ๋จ๊ธด ์๊ตญ.
|
|
52
|
+
*
|
|
53
|
+
* ์ฌ๋์ด ์ฝ์ ๋ด์ฉ์ด ์๋๋ผ ๋ณธ๋ฌธ ๋ฐ์ ๋๋ค. ๋ณธ๋ฌธ์ ์ค์ผ๋ฉด CLI๊ฐ ํ๋ฌธ์ผ๋ก ์ฐ๊ณ
|
|
54
|
+
* ์น์ ์ด์ค์ผ์ดํํด์ ํ๋ฉด์ ๊ทธ๋๋ก ๋ด๋ณด๋ธ๋ค โ ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ๋ง๋ค ์ฝ์ ์ด์ ๊ฐ ์๋
|
|
55
|
+
* ํด์ ์ค์ด ๋ถ๋๋ค. ์์ผ๋ก ๋จ ์ฝ๋ฉํธ์๋ ์๋ค.
|
|
56
|
+
*/
|
|
57
|
+
marker?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface Review {
|
|
60
|
+
id: string;
|
|
61
|
+
reviewer: Actor;
|
|
62
|
+
verdict: ReviewVerdict;
|
|
63
|
+
summary: string;
|
|
64
|
+
/** ์ด ํ์ ์ด ์ํ ๋ผ์ด๋ ๋ฒํธ */
|
|
65
|
+
round: number;
|
|
66
|
+
headSha: string;
|
|
67
|
+
createdAt: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* ๋ฆฌ๋ทฐ ํ ๋ฐํด.
|
|
71
|
+
*
|
|
72
|
+
* ๋ฆฌ์ ์ด ์ PR์ ๋ง๋ค์ง ์๊ณ ๊ฐ์ PR์์ ๋ผ์ด๋๋ฅผ ๋๋ฆฐ๋ค. 3์ฐจ์์ ๋ค์ ์ด๋ฆฐ ์ฝ๋ฉํธ๊ฐ
|
|
73
|
+
* ์ด๋ ๋ผ์ด๋์์ ๋ฌ๊ณ ์ด๋์ ๋ซํ๋์ง๊ฐ ์ด ๋จ์๋ก ๋ณด์ธ๋ค.
|
|
74
|
+
*/
|
|
75
|
+
export interface Round {
|
|
76
|
+
number: number;
|
|
77
|
+
openedAt: string;
|
|
78
|
+
/** ์ด ๋ผ์ด๋๋ฅผ ๋ซ์ ํ์ . ์์ง ์ ๋ซํ์ผ๋ฉด null */
|
|
79
|
+
verdict: ReviewVerdict | null;
|
|
80
|
+
/** ์ด ๋ผ์ด๋์์ ์๋ก ๋ฌ๋ฆฐ ์ฝ๋ฉํธ ์ */
|
|
81
|
+
commentCount: number;
|
|
82
|
+
}
|
|
83
|
+
export interface PrCreatedPayload {
|
|
84
|
+
title: string;
|
|
85
|
+
body: string;
|
|
86
|
+
author: Actor;
|
|
87
|
+
baseSha: string;
|
|
88
|
+
headSha: string;
|
|
89
|
+
headRef: string | null;
|
|
90
|
+
baseRef: string | null;
|
|
91
|
+
}
|
|
92
|
+
export interface PrUpdatedPayload {
|
|
93
|
+
headSha: string;
|
|
94
|
+
headRef: string | null;
|
|
95
|
+
}
|
|
96
|
+
export interface CommentAddedPayload {
|
|
97
|
+
commentId: string;
|
|
98
|
+
author: Actor;
|
|
99
|
+
path: string;
|
|
100
|
+
line: number | null;
|
|
101
|
+
body: string;
|
|
102
|
+
threadId: string;
|
|
103
|
+
headSha: string;
|
|
104
|
+
/** ์๋ํ๊ฐ ๋จ๊ธด ์๊ตญ. ์ฌ๋์ด ๋จ ์ฝ๋ฉํธ์๋ ์๋ค */
|
|
105
|
+
marker?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface CommentResolvedPayload {
|
|
108
|
+
commentId: string;
|
|
109
|
+
by: Actor;
|
|
110
|
+
}
|
|
111
|
+
export interface ReviewSubmittedPayload {
|
|
112
|
+
reviewId: string;
|
|
113
|
+
reviewer: Actor;
|
|
114
|
+
verdict: ReviewVerdict;
|
|
115
|
+
summary: string;
|
|
116
|
+
headSha: string;
|
|
117
|
+
}
|
|
118
|
+
export interface PrMergedPayload {
|
|
119
|
+
by: Actor;
|
|
120
|
+
mergeSha: string;
|
|
121
|
+
/**
|
|
122
|
+
* ๋จธ์งํ ์์ ์ ๋ฏธํด๊ฒฐ ์ค๋ ๋ ์.
|
|
123
|
+
*
|
|
124
|
+
* ์ฝ๋ฉํธ๊ฐ ์๋๋ผ ์ค๋ ๋๋ฅผ ์ผ๋ค โ ๋ต๊ธ์ด ๋ฌ๋ฆด์๋ก ์๊ฐ ๋๋ฉด ์ฃผ๊ณ ๋ฐ์์๋ก ๋๋น
|
|
125
|
+
* ๋ณด์ด๋ ์ ํธ๊ฐ ๋๋ค. ๊ณ์ฐ์ `policy.unresolvedCount` ํ๋์์ ๋์จ๋ค.
|
|
126
|
+
*
|
|
127
|
+
* ์น์ธ ๊ฒ์ดํธ๊ฐ ์์ด์ ๋ง์ง๋ ์๋๋ค. ๋์ "์ค๋ ๋ ์ธ ๊ฐ ๋จ์ ์ฑ ๋จธ์ง๋จ"์ด
|
|
128
|
+
* ์ด๋ ฅ์ ๋จ์์ผ ๋์ค์ ๊ทธ ํ๋จ์ ๋์ง์ ์ ์๋ค.
|
|
129
|
+
*/
|
|
130
|
+
unresolvedCount: number;
|
|
131
|
+
}
|
|
132
|
+
export interface PrClosedPayload {
|
|
133
|
+
by: Actor;
|
|
134
|
+
reason: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* ๋ณธ๋ฌธ(๊ณผ ์ ๋ชฉ)์ ๊ณ ์น ๊ธฐ๋ก.
|
|
138
|
+
*
|
|
139
|
+
* `PrUpdatedPayload`์ ๊ฐ๋ผ ๋๋ค. head๋ฅผ ์ฎ๊ธฐ๋ ๊ฑด "๊ณ ์ณ์ ๋ค์ ์ฌ๋ ธ๋ค"๋ ๋ป์ด๋ผ
|
|
140
|
+
* ๋ฆฌ๋ทฐ ํ์ ์ ๋๋๋ฆฌ์ง๋ง ๋ณธ๋ฌธ ์คํ๋ฅผ ๊ณ ์น ๊ฑด ๋ฆฌ๋ทฐ ๋์ ์ฝ๋์ ์์ ์ ๋ ๊ฒ์ด๋ค.
|
|
141
|
+
* ํ ์ด๋ฒคํธ๋ก ํฉ์น๋ฉด ์คํ ์์ ์ด `changes_requested`๋ฅผ `open`์ผ๋ก ํ์ด ๋ฒ๋ฆฐ๋ค.
|
|
142
|
+
*
|
|
143
|
+
* ์ ๊ณ ์น ํญ๋ชฉ์ ์์ ์ ์ฃ๋๋ค. `undefined`๊ฐ "๊ทธ๋๋ก ๋ฌ๋ผ"๊ณ , ๋น ๋ฌธ์์ด์ด
|
|
144
|
+
* "๋ณธ๋ฌธ์ ๋น์๋ผ"๋ค โ ๋์ ๊ฐ์ ๊ฐ์ผ๋ก ๋๋ฉด ๋ณธ๋ฌธ์ ๋ชป ์ง์ด๋ค.
|
|
145
|
+
*/
|
|
146
|
+
export interface PrEditedPayload {
|
|
147
|
+
by: Actor;
|
|
148
|
+
title?: string;
|
|
149
|
+
body?: string;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/local-pr/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๋ก์ปฌ PR ๋ฆฌ๋ทฐ์ ๋๋ฉ์ธ ํ์
.
|
|
3
|
+
*
|
|
4
|
+
* ์๊ฒฉ GitHub PR์ ์ฌ๋์๊ฒ ๋๊ธฐ๋ ์๋ฆฌ๋ค. ์ฌ๊ธฐ๋ ์์ด์ ํธ๊ฐ ์ชผ๊ฐ ์์
์ ๋ค๋ฅธ
|
|
5
|
+
* ์์ด์ ํธ์๊ฒ ๋ฆฌ๋ทฐ๋ฐ๊ณ ์ฃผ๊ณ ๋ฐ๋ ์๋ฆฌ๋ค. ํ ์์
๋จ์๊ฐ PR ํ๋๋ค.
|
|
6
|
+
*/
|
|
7
|
+
/** ์ด๋ฒคํธ ์ ์ฅ์์์ ์ด ๋๋ฉ์ธ์ ๊ฐ๋ฆฌํค๋ ์ด๋ฆ */
|
|
8
|
+
export const PR_AGGREGATE = 'local-pr';
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/local-pr/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+BAA+B;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PrWebServerOptions, PrWebServerResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ๋ก์ปฌ PR ์น UI ํ์ดํ๋ผ์ธ์ ์กฐ๋ฆฝํ๋ค: LocalPrEngine ์์ฑ โ ๋น ํฌํธ ํ์ โ
|
|
4
|
+
* PrWebServer ๊ธฐ๋ โ (์ ํ) ๋ธ๋ผ์ฐ์ ์ด๊ธฐ.
|
|
5
|
+
*
|
|
6
|
+
* graph-viz/engine.ts์ ๊ฐ์ ์๋ฆฌ๋ค. graph-viz๋ ์ ์ ๊ทธ๋ํ ์ค๋
์ท์ ํ ๋ฒ ๊ตณํ
|
|
7
|
+
* ๋๊ธฐ์ง๋ง ์ฌ๊ธฐ๋ PrWebServer๊ฐ ๋งค ์์ฒญ๋ง๋ค LocalPrEngine์ ๋ค์ ์ฝ์ผ๋ฏ๋ก
|
|
8
|
+
* ์๋ฒ๊ฐ ๋ ์๋ ๋์ ๋ฌ๋ฆฐ ์ฝ๋ฉํธ๋ ํ์ ๋ ์๋ก๊ณ ์นจํ๋ฉด ๋ฐ๋ก ๋ณด์ธ๋ค.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PrWebEngine {
|
|
11
|
+
private server;
|
|
12
|
+
private engines;
|
|
13
|
+
start(opts: PrWebServerOptions): Promise<PrWebServerResult>;
|
|
14
|
+
/** Stop the server and release resources. Safe to call even if never started. */
|
|
15
|
+
stop(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ํ๋ก์ธ์ค ํ๋๊ฐ ์๋ฒ๋ฅผ ํ๋๋ง ๋์ฐ๋๋ก ๊ณต์ ํ๋ ์ธ์คํด์ค.
|
|
19
|
+
*
|
|
20
|
+
* ์์ง ๋ถ๋ฅด๋ ์๋ฆฌ๊ฐ ์๋ค. `pr serve`๋ `new PrWebEngine()`์ผ๋ก ์ง์ ๋ง๋ค๊ณ MCP๋
|
|
21
|
+
* ์ด ๋ชจ๋์ ์ ๊ฐ์ ธ๊ฐ๋ค. ์ฌ๋ฌ ํ๋ฉด์ด ์๋ฒ๋ฅผ ๊ณต์ ํด์ผ ํ ๋๋ฅผ ์ํด ๋จ๊ฒจ ๋ ์ง์
์ ์ด๋ค.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getPrWebEngine(): PrWebEngine;
|
|
24
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/local-pr-web/engine.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAsE;IAE/E,KAAK,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsEjE,iFAAiF;IAC3E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAG5C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { findAvailablePort } from '../graph-viz/port-finder.js';
|
|
2
|
+
import { LocalPrEngine } from '../local-pr/engine.js';
|
|
3
|
+
import { listRepos, registerRepo } from '../local-pr/registry.js';
|
|
4
|
+
import { PrWebServer } from './server.js';
|
|
5
|
+
/**
|
|
6
|
+
* ๋ก์ปฌ PR ์น UI ํ์ดํ๋ผ์ธ์ ์กฐ๋ฆฝํ๋ค: LocalPrEngine ์์ฑ โ ๋น ํฌํธ ํ์ โ
|
|
7
|
+
* PrWebServer ๊ธฐ๋ โ (์ ํ) ๋ธ๋ผ์ฐ์ ์ด๊ธฐ.
|
|
8
|
+
*
|
|
9
|
+
* graph-viz/engine.ts์ ๊ฐ์ ์๋ฆฌ๋ค. graph-viz๋ ์ ์ ๊ทธ๋ํ ์ค๋
์ท์ ํ ๋ฒ ๊ตณํ
|
|
10
|
+
* ๋๊ธฐ์ง๋ง ์ฌ๊ธฐ๋ PrWebServer๊ฐ ๋งค ์์ฒญ๋ง๋ค LocalPrEngine์ ๋ค์ ์ฝ์ผ๋ฏ๋ก
|
|
11
|
+
* ์๋ฒ๊ฐ ๋ ์๋ ๋์ ๋ฌ๋ฆฐ ์ฝ๋ฉํธ๋ ํ์ ๋ ์๋ก๊ณ ์นจํ๋ฉด ๋ฐ๋ก ๋ณด์ธ๋ค.
|
|
12
|
+
*/
|
|
13
|
+
export class PrWebEngine {
|
|
14
|
+
server = null;
|
|
15
|
+
engines = new Map();
|
|
16
|
+
async start(opts) {
|
|
17
|
+
const { repoRoot, port: preferredPort, openBrowser = true } = opts;
|
|
18
|
+
// ๊ฐ์ ์ธ์คํด์ค๋ก start๋ฅผ ๋ค์ ๋ถ๋ฅผ ์ ์๋ค. ๋จผ์ ๊ฑท์ด๋ด์ง ์์ผ๋ฉด ์์ ๋ฌ ์๋ฒ๊ฐ
|
|
19
|
+
// ์ฐธ์กฐ์์๋ง ๋ฐ๋ ค๋๊ณ ์์ผ๊ณผ ํฌํธ, SIGINT ๋ฆฌ์ค๋๋ ๊ทธ๋๋ก ๋จ๋๋ค
|
|
20
|
+
await this.stop();
|
|
21
|
+
// ์ง๊ธ ์๋ฆฌ๋ฅผ ๋จผ์ ๋ชฉ๋ก์ ๋ฃ๋๋ค. PR์ ํ ๋ฒ๋ ์ ๋ง๋ ๋ ํฌ์์ serve๋ฅผ ์ณ๋
|
|
22
|
+
// ์๊ธฐ ๋ ํฌ๋ ๋ณด์ฌ์ผ ํ๋ค.
|
|
23
|
+
//
|
|
24
|
+
// ์ฌ๊ธฐ์ ๋์ง๋ ๊ฑด ๋๊ฐ git์ด๋ค โ .git์ด ๊นจ์ก๊ฑฐ๋ ๋ ํฌ๊ฐ ์๋๋ค. ๊ทธ ์๋ฌธ์ ๊ทธ๋๋ก
|
|
25
|
+
// ์ฌ๋ฆฌ๋ฉด ์ฌ์ฉ์๋ rev-parse ์คํจ๋ง ๋ณธ๋ค. ์ด๋ ์๋ฆฌ๋ฅผ ๋ชป ์ด์๋์ง๋ก ๋ฐ๊ฟ ๋์ง๋ค
|
|
26
|
+
let primary;
|
|
27
|
+
try {
|
|
28
|
+
primary = registerRepo(repoRoot);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
throw new Error(`์ด ๋ ํฌ๋ฅผ ๋ชป ์ด์์ด์: ${repoRoot}`, { cause: e });
|
|
32
|
+
}
|
|
33
|
+
// ๋ ํฌ ํ๋๊ฐ ๋ชป ์ด๋ ค๋ ์๋ฒ๋ ๋ ์ผ ํ๋ค. ๋ชฉ๋ก์๋ ๋จ์ ๋ ํฌ๊ฐ ์์ฌ ์๊ณ ๊ทธ์ค
|
|
34
|
+
// ํ๋๊ฐ ์ฎ๊ฒจ์ง๊ฑฐ๋ .git์ด ๊นจ์ก๋ค๊ณ ๋๋จธ์ง๋ฅผ ๋ชป ๋ณด๋ ๊ฑด ๋ง์ด ์ ๋๋ค.
|
|
35
|
+
// ์กฐ์ฉํ ๋นผ์ง๋ ์๋๋ค โ ์ ๋ณด์ด๋ ์ด์ ๋ฅผ ์๋ ค์ผ ์ฌ์ฉ์๊ฐ ๊ณ ์น ์ ์๋ค
|
|
36
|
+
const broken = [];
|
|
37
|
+
for (const repo of listRepos()) {
|
|
38
|
+
try {
|
|
39
|
+
this.engines.set(repo.key, { repo, engine: new LocalPrEngine(repo.path) });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
broken.push(repo.name);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (broken.length > 0) {
|
|
46
|
+
process.stderr.write(`[local-pr-web] ๋ชป ์ฐ ๋ ํฌ ${broken.length}๊ฐ: ${broken.join(', ')}\n`);
|
|
47
|
+
}
|
|
48
|
+
const held = this.engines.get(primary.key);
|
|
49
|
+
if (!held)
|
|
50
|
+
throw new Error(`์ด ๋ ํฌ๋ฅผ ๋ชป ์ด์์ด์: ${repoRoot}`);
|
|
51
|
+
const count = held.engine.list().length;
|
|
52
|
+
// 0์ "์๋ฌด ๋น ํฌํธ๋"๋ผ๋ ๋ป์ด๋ผ ํ์ํ ๊ฒ ์๋ค. ํ์์ ํ์ฐ๋ฉด isPortAvailable(0)์ด
|
|
53
|
+
// ๋ ํต๊ณผํด 0์ ๊ทธ๋๋ก ๋๋ ค์ค๋ค. ๊ทธ 0์ด URL์ ๋ฐํ ์ฃฝ์ ์ฃผ์๊ฐ ๋๊ฐ๋ค
|
|
54
|
+
const requested = preferredPort ?? 7892;
|
|
55
|
+
// ์ฌ๊ธฐ์๋ถํฐ๋ ์ด๋ฏธ sqlite ํธ๋ค์ด ๋ ํฌ ์๋งํผ ์ด๋ ค ์๋ค. ํฌํธ๋ฅผ ๋ชป ์ก๊ฑฐ๋ listen์ด
|
|
56
|
+
// ๊ฑฐ๋ถํ๋ฉด ๊ทธ๊ฒ๋ค์ด ์ฐธ์กฐ๋ง ๋จ๊ณ ์ ๋ซํ๋ค โ ๊ฐ์ ์ธ์คํด์ค๋ก ์ฌ์๋ํ๋ฉด ๋์ ๋๋ค
|
|
57
|
+
let port;
|
|
58
|
+
try {
|
|
59
|
+
port = requested === 0 ? 0 : await findAvailablePort(requested);
|
|
60
|
+
this.server = new PrWebServer(this.engines, primary.key);
|
|
61
|
+
await this.server.start(port);
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
await this.stop();
|
|
65
|
+
throw e;
|
|
66
|
+
}
|
|
67
|
+
// listen(0)์ด๋ฉด ์ค์ ํฌํธ๋ OS๊ฐ ์ ํ๋ค. ์์ฒญ๊ฐ์ด ์๋๋ผ ๋ฌ ์๋ฆฌ๋ฅผ ์๋ ค์ค๋ค
|
|
68
|
+
const actualPort = this.server.port ?? port;
|
|
69
|
+
const url = `http://127.0.0.1:${actualPort}`;
|
|
70
|
+
process.stderr.write(`[local-pr-web] server running at ${url}\n`);
|
|
71
|
+
if (openBrowser) {
|
|
72
|
+
await openUrl(url);
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
url,
|
|
76
|
+
port: actualPort,
|
|
77
|
+
message: `๋ก์ปฌ PR ์น UI๊ฐ ${url}์์ ๋๋ค (PR ${count}๊ฐ)`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Stop the server and release resources. Safe to call even if never started. */
|
|
81
|
+
async stop() {
|
|
82
|
+
if (this.server) {
|
|
83
|
+
await this.server.stop();
|
|
84
|
+
this.server = null;
|
|
85
|
+
}
|
|
86
|
+
for (const { engine } of this.engines.values())
|
|
87
|
+
engine.dispose();
|
|
88
|
+
this.engines.clear();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
let _instance = null;
|
|
92
|
+
/**
|
|
93
|
+
* ํ๋ก์ธ์ค ํ๋๊ฐ ์๋ฒ๋ฅผ ํ๋๋ง ๋์ฐ๋๋ก ๊ณต์ ํ๋ ์ธ์คํด์ค.
|
|
94
|
+
*
|
|
95
|
+
* ์์ง ๋ถ๋ฅด๋ ์๋ฆฌ๊ฐ ์๋ค. `pr serve`๋ `new PrWebEngine()`์ผ๋ก ์ง์ ๋ง๋ค๊ณ MCP๋
|
|
96
|
+
* ์ด ๋ชจ๋์ ์ ๊ฐ์ ธ๊ฐ๋ค. ์ฌ๋ฌ ํ๋ฉด์ด ์๋ฒ๋ฅผ ๊ณต์ ํด์ผ ํ ๋๋ฅผ ์ํด ๋จ๊ฒจ ๋ ์ง์
์ ์ด๋ค.
|
|
97
|
+
*/
|
|
98
|
+
export function getPrWebEngine() {
|
|
99
|
+
if (!_instance)
|
|
100
|
+
_instance = new PrWebEngine();
|
|
101
|
+
return _instance;
|
|
102
|
+
}
|
|
103
|
+
async function openUrl(url) {
|
|
104
|
+
try {
|
|
105
|
+
const { default: open } = await import('open');
|
|
106
|
+
await open(url);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
process.stderr.write(`[local-pr-web] could not open browser automatically: ${err.message}\n`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/local-pr-web/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PullRequest } from '../local-pr/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ๋ก์ปฌ PR ์น UI์ HTML์ ๋ง๋๋ ์์ ํจ์ ๋ชจ์.
|
|
4
|
+
*
|
|
5
|
+
* graph-viz/html-generator.ts์ ๊ฐ์ ์๋ฆฌ๋ค โ ํ๋ ์์ํฌ ์์ด ๋ฌธ์์ด์ ์ด์ด ๋ถ์ฌ
|
|
6
|
+
* ์๊ธฐ์๊ฒฐ์ ์ธ HTML์ ๋ง๋ ๋ค. ๋ค๋ฅธ ์ ์ ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ ํ
์คํธ(์ ๋ชฉ, ์ฝ๋ฉํธ ๋ณธ๋ฌธ)๋
|
|
7
|
+
* ์ ๋ถ ๋ฆฌ๋ทฐ์ด๊ฐ ์
๋ ฅํ ์ ๋ขฐํ ์ ์๋ ๊ฐ์ด๋ผ๋ ๊ฒ์ด๋ค. escapeHtml์ ๊ฑฐ์น์ง ์์
|
|
8
|
+
* ํ
์คํธ๋ฅผ ๊ทธ๋๋ก ๊ฝ์ผ๋ฉด ์ฝ๋ฉํธ์ ์ฌ์ `<script>`๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๊ทธ๋๋ก ์คํ๋๋ค.
|
|
9
|
+
*/
|
|
10
|
+
/** HTML ํ
์คํธ ๋
ธ๋/์์ฑ์ ์์ ํ๊ฒ ๊ฝ๋๋ก ์ด์ค์ผ์ดํํ๋ค */
|
|
11
|
+
export declare function escapeHtml(input: string): string;
|
|
12
|
+
export declare function toEmbeddableJson(value: unknown): string;
|
|
13
|
+
export interface RepoTab {
|
|
14
|
+
key: string;
|
|
15
|
+
name: string;
|
|
16
|
+
active: boolean;
|
|
17
|
+
/** ์์ง ์ ๋ซํ PR ์. ์ด๋์ ์ผ์ด ์์๋์ง ํ๋์ ๋ณด์ด๋ผ๊ณ ํจ๊ป ๊ทธ๋ฆฐ๋ค */
|
|
18
|
+
openCount: number;
|
|
19
|
+
}
|
|
20
|
+
/** `GET /r/:key` โ PR ๋ชฉ๋ก ํ์ด์ง */
|
|
21
|
+
export declare function generatePrListHtml(prs: PullRequest[], repos?: RepoTab[]): string;
|
|
22
|
+
/** `GET /prs/:id` โ diff์ ์ฝ๋ฉํธ ์ค๋ ๋, ๋ผ์ด๋๋ณ ํ์ ์ด๋ ฅ */
|
|
23
|
+
export declare function generatePrDetailHtml(pr: PullRequest, diff: string, repoKey?: string, repoName?: string, nonce?: string): string;
|
|
24
|
+
//# sourceMappingURL=html-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-generator.d.ts","sourceRoot":"","sources":["../../../src/local-pr-web/html-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAU,MAAM,sBAAsB,CAAC;AAEhE;;;;;;;GAOG;AAEH,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAgBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIvD;AAwKD,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAuBD,gCAAgC;AAChC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,KAAK,GAAE,OAAO,EAAO,GAAG,MAAM,CAmCpF;AA6DD,iDAAiD;AACjD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,SAAK,EACZ,QAAQ,SAAK,EACb,KAAK,SAAK,GACT,MAAM,CA+FR"}
|