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