@slowcook-ai/review-overlay 0.1.0 → 0.4.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.
@@ -45,6 +45,41 @@ export interface ReviewCommentPayload {
45
45
  user_agent: string;
46
46
  }
47
47
  export declare const PAYLOAD_MARKER = "slowcook:review-overlay";
48
+ /**
49
+ * 0.3.0 — Plate-reply breadcrumb. Plate emits this JSON block at the
50
+ * end of its amendment summary so the overlay can correlate each
51
+ * reply to the original review-overlay comment by ID without any
52
+ * timestamp heuristics. One reply entry per overlay comment plate
53
+ * processed in the run.
54
+ */
55
+ export declare const PLATE_REPLY_MARKER = "slowcook:plate-reply";
56
+ export type PlateReplyStatus = "applied" | "declined" | "spec-altering" | "noop";
57
+ export interface PlateReplyEntry {
58
+ /** GitHub comment id of the overlay comment this reply addresses. */
59
+ to_comment_id: number;
60
+ status: PlateReplyStatus;
61
+ /** One-line summary of plate's action (what changed, or why declined). */
62
+ summary: string;
63
+ /** Files plate touched as part of resolving this comment (mock/ paths). */
64
+ files_touched?: string[];
65
+ }
66
+ export interface PlateReplyPayload {
67
+ version: string;
68
+ /** Commit SHA plate force-pushed (when status applies); null on no-op / escalate. */
69
+ amendment_commit?: string | null;
70
+ replies: PlateReplyEntry[];
71
+ }
72
+ /**
73
+ * Build the HTML-comment block plate appends to its summary so the
74
+ * overlay can correlate replies to overlay comments.
75
+ */
76
+ export declare function formatPlateReplyBlock(p: PlateReplyPayload): string;
77
+ /**
78
+ * Reverse — extract the plate-reply payload from a comment body.
79
+ * Returns null when the comment isn't a plate reply or the payload is
80
+ * malformed.
81
+ */
82
+ export declare function parsePlateReply(body: string): PlateReplyPayload | null;
48
83
  export interface FormatArgs {
49
84
  payload: ReviewCommentPayload;
50
85
  /** Optional inline screenshot data URL (image/png). */
@@ -1 +1 @@
1
- {"version":3,"file":"comment-format.d.ts","sourceRoot":"","sources":["../src/comment-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;IAChD,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,wBAAwB,EAAE,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,iDAAiD;QACjD,IAAI,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACtD,CAAC;IACF,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA8B5D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAgB5E;AAeD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,oBAAoB,CAkBvB"}
1
+ {"version":3,"file":"comment-format.d.ts","sourceRoot":"","sources":["../src/comment-format.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,72 @@
13
13
  * Pure function; no DOM access.
14
14
  */
15
15
  export const PAYLOAD_MARKER = "slowcook:review-overlay";
16
+ /**
17
+ * 0.3.0 — Plate-reply breadcrumb. Plate emits this JSON block at the
18
+ * end of its amendment summary so the overlay can correlate each
19
+ * reply to the original review-overlay comment by ID without any
20
+ * timestamp heuristics. One reply entry per overlay comment plate
21
+ * processed in the run.
22
+ */
23
+ export const PLATE_REPLY_MARKER = "slowcook:plate-reply";
24
+ /**
25
+ * Build the HTML-comment block plate appends to its summary so the
26
+ * overlay can correlate replies to overlay comments.
27
+ */
28
+ export function formatPlateReplyBlock(p) {
29
+ return [
30
+ "<!--",
31
+ PLATE_REPLY_MARKER,
32
+ JSON.stringify(p),
33
+ "-->",
34
+ ].join("\n");
35
+ }
36
+ /**
37
+ * Reverse — extract the plate-reply payload from a comment body.
38
+ * Returns null when the comment isn't a plate reply or the payload is
39
+ * malformed.
40
+ */
41
+ export function parsePlateReply(body) {
42
+ const idx = body.indexOf(PLATE_REPLY_MARKER);
43
+ if (idx < 0)
44
+ return null;
45
+ const tail = body.slice(idx + PLATE_REPLY_MARKER.length);
46
+ const closeIdx = tail.indexOf("-->");
47
+ const region = closeIdx < 0 ? tail : tail.slice(0, closeIdx);
48
+ const m = region.match(/\{[\s\S]*\}/);
49
+ if (!m)
50
+ return null;
51
+ try {
52
+ const parsed = JSON.parse(m[0]);
53
+ if (!isPlateReplyPayload(parsed))
54
+ return null;
55
+ return parsed;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function isPlateReplyPayload(v) {
62
+ if (!v || typeof v !== "object")
63
+ return false;
64
+ const o = v;
65
+ if (typeof o["version"] !== "string")
66
+ return false;
67
+ if (!Array.isArray(o["replies"]))
68
+ return false;
69
+ for (const r of o["replies"]) {
70
+ if (!r || typeof r !== "object")
71
+ return false;
72
+ const e = r;
73
+ if (typeof e["to_comment_id"] !== "number")
74
+ return false;
75
+ if (typeof e["status"] !== "string")
76
+ return false;
77
+ if (typeof e["summary"] !== "string")
78
+ return false;
79
+ }
80
+ return true;
81
+ }
16
82
  /**
17
83
  * Render the full comment body (markdown + hidden JSON). The hidden
18
84
  * JSON is wrapped in an HTML comment with a stable marker so plate's
@@ -1 +1 @@
1
- {"version":3,"file":"comment-format.js","sourceRoot":"","sources":["../src/comment-format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comment-format.js","sourceRoot":"","sources":["../src/comment-format.ts"],"names":[],"mappings":"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"}
package/dist/github.d.ts CHANGED
@@ -7,7 +7,12 @@
7
7
  *
8
8
  * Storage key is keyed by the {owner}/{repo} pair so the same browser
9
9
  * can hold multiple consumers' tokens without collision.
10
+ *
11
+ * 0.3.0 — also reads PR comments to render Figma-style anchored pins
12
+ * for previously-left feedback. Cached in localStorage so the pin
13
+ * layer renders instantly on refresh.
10
14
  */
15
+ import { type ReviewCommentPayload, type PlateReplyEntry } from "./comment-format.js";
11
16
  export interface RepoCoord {
12
17
  owner: string;
13
18
  repo: string;
@@ -36,9 +41,89 @@ export interface SubmitErr {
36
41
  message: string;
37
42
  }
38
43
  export type SubmitResult = SubmitOk | SubmitErr;
44
+ /**
45
+ * 0.3.0 — A single overlay comment paired with plate's reply (when one
46
+ * exists). The overlay's pin layer renders one of these per comment.
47
+ */
48
+ export interface OverlayCommentRecord {
49
+ /** GitHub comment id (numeric). */
50
+ commentId: number;
51
+ /** PR-comment author + ISO timestamp + comment body URL on GitHub. */
52
+ author: string;
53
+ createdAt: string;
54
+ htmlUrl: string;
55
+ /** Parsed structured payload from the review-overlay marker block. */
56
+ payload: ReviewCommentPayload;
57
+ /**
58
+ * Plate's reply for this comment (parsed from a `slowcook:plate-reply`
59
+ * block on a comment posted after the overlay one). Null when plate
60
+ * hasn't acted yet OR when the run pre-dates the breadcrumb (0.3.0+).
61
+ */
62
+ plateReply: PlateReplyEntry | null;
63
+ /** GitHub comment URL of the plate reply (when plateReply is set). */
64
+ plateCommentUrl?: string;
65
+ }
66
+ interface FetchArgs extends RepoCoord {
67
+ pr: number;
68
+ pat: string;
69
+ apiBase?: string;
70
+ fetchImpl?: typeof fetch;
71
+ }
72
+ /**
73
+ * Fetch all overlay comments + correlated plate replies for a PR.
74
+ * Returns one record per overlay comment in oldest-first order.
75
+ */
76
+ export declare function fetchOverlayComments(args: FetchArgs): Promise<OverlayCommentRecord[]>;
77
+ export declare function commentsCacheKey(repo: RepoCoord, pr: number): string;
78
+ export declare function loadCachedComments(storage: Storage, repo: RepoCoord, pr: number): OverlayCommentRecord[] | null;
79
+ export declare function saveCachedComments(storage: Storage, repo: RepoCoord, pr: number, records: OverlayCommentRecord[]): void;
80
+ /**
81
+ * 0.4.0 — per-scenario comment stats. The scenarios picker renders one
82
+ * badge cluster per card: total / applied / unresolved / spec-altering
83
+ * / declined / noop. Aggregated across every open + closed mockup PR
84
+ * in the repo, grouped by story_id from each overlay comment's payload.
85
+ */
86
+ export interface ScenarioCommentStats {
87
+ total: number;
88
+ unresolved: number;
89
+ applied: number;
90
+ declined: number;
91
+ specAltering: number;
92
+ noop: number;
93
+ }
94
+ export declare function emptyStats(): ScenarioCommentStats;
95
+ interface FetchPrsArgs extends RepoCoord {
96
+ pat: string;
97
+ apiBase?: string;
98
+ fetchImpl?: typeof fetch;
99
+ }
100
+ /**
101
+ * List every PR (open + closed) on the repo that carries the
102
+ * `slowcook-mockup` label. Each result includes the PR number, the
103
+ * derived storyId from the branch name (`slowcook/mockup/story-N`),
104
+ * and the comments-list URL for paginated comment fetch.
105
+ */
106
+ export declare function fetchAllMockupPrs(args: FetchPrsArgs): Promise<Array<{
107
+ pr: number;
108
+ storyId: string;
109
+ }>>;
110
+ /**
111
+ * Aggregate per-scenario comment stats by walking every mockup PR's
112
+ * comments + grouping by overlay-payload.story_id. Plate's breadcrumb
113
+ * provides the status (applied / declined / spec-altering / noop);
114
+ * absent breadcrumb counts as unresolved.
115
+ *
116
+ * One round-trip per PR + 1 for the listing. For most consumers the
117
+ * total is <20 PRs; in-flight Promise.all keeps the wall-clock fast.
118
+ */
119
+ export declare function fetchScenarioStats(args: FetchPrsArgs): Promise<Record<string, ScenarioCommentStats>>;
120
+ export declare function scenarioStatsCacheKey(repo: RepoCoord): string;
121
+ export declare function loadCachedScenarioStats(storage: Storage, repo: RepoCoord): Record<string, ScenarioCommentStats> | null;
122
+ export declare function saveCachedScenarioStats(storage: Storage, repo: RepoCoord, stats: Record<string, ScenarioCommentStats>): void;
39
123
  /**
40
124
  * POST a comment to the given PR. Returns a tagged result rather than
41
125
  * throwing so the React layer can render specific UI per failure mode.
42
126
  */
43
127
  export declare function submitComment(args: SubmitArgs): Promise<SubmitResult>;
128
+ export {};
44
129
  //# sourceMappingURL=github.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAExE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAEhE;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAuC3E"}
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
package/dist/github.js CHANGED
@@ -7,7 +7,12 @@
7
7
  *
8
8
  * Storage key is keyed by the {owner}/{repo} pair so the same browser
9
9
  * can hold multiple consumers' tokens without collision.
10
+ *
11
+ * 0.3.0 — also reads PR comments to render Figma-style anchored pins
12
+ * for previously-left feedback. Cached in localStorage so the pin
13
+ * layer renders instantly on refresh.
10
14
  */
15
+ import { parseReviewComment, parsePlateReply, } from "./comment-format.js";
11
16
  const PAT_STORAGE_KEY_PREFIX = "slowcook.review-overlay.pat.";
12
17
  export function patStorageKey(repo) {
13
18
  return `${PAT_STORAGE_KEY_PREFIX}${repo.owner}/${repo.repo}`;
@@ -21,6 +26,214 @@ export function savePat(storage, repo, pat) {
21
26
  export function clearPat(storage, repo) {
22
27
  storage.removeItem(patStorageKey(repo));
23
28
  }
29
+ /**
30
+ * Fetch all overlay comments + correlated plate replies for a PR.
31
+ * Returns one record per overlay comment in oldest-first order.
32
+ */
33
+ export async function fetchOverlayComments(args) {
34
+ const fetchImpl = args.fetchImpl ?? globalThis.fetch;
35
+ const apiBase = args.apiBase ?? "https://api.github.com";
36
+ const url = `${apiBase}/repos/${encodeURIComponent(args.owner)}/${encodeURIComponent(args.repo)}/issues/${args.pr}/comments?per_page=100`;
37
+ let res;
38
+ try {
39
+ res = await fetchImpl(url, {
40
+ headers: {
41
+ Authorization: `Bearer ${args.pat}`,
42
+ Accept: "application/vnd.github+json",
43
+ "X-GitHub-Api-Version": "2022-11-28",
44
+ },
45
+ });
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ if (!res.ok)
51
+ return [];
52
+ const all = (await res.json());
53
+ const overlayRecords = [];
54
+ // Plate-reply entries indexed by `to_comment_id` for O(1) lookup later.
55
+ const plateRepliesByCommentId = new Map();
56
+ for (const c of all) {
57
+ const overlayPayload = parseReviewComment(c.body);
58
+ if (overlayPayload) {
59
+ overlayRecords.push({
60
+ commentId: c.id,
61
+ author: c.user.login,
62
+ createdAt: c.created_at,
63
+ htmlUrl: c.html_url,
64
+ payload: overlayPayload,
65
+ plateReply: null,
66
+ });
67
+ }
68
+ const plateReply = parsePlateReply(c.body);
69
+ if (plateReply) {
70
+ for (const r of plateReply.replies) {
71
+ plateRepliesByCommentId.set(r.to_comment_id, { entry: r, htmlUrl: c.html_url });
72
+ }
73
+ }
74
+ }
75
+ // Correlate by comment id (no heuristic; plate's breadcrumb names it).
76
+ for (const rec of overlayRecords) {
77
+ const reply = plateRepliesByCommentId.get(rec.commentId);
78
+ if (reply) {
79
+ rec.plateReply = reply.entry;
80
+ rec.plateCommentUrl = reply.htmlUrl;
81
+ }
82
+ }
83
+ return overlayRecords;
84
+ }
85
+ /**
86
+ * localStorage cache for the comment list — lets the pin layer render
87
+ * instantly on refresh without waiting for the network round-trip.
88
+ * Background-refresh fires after, updating with any newer state.
89
+ */
90
+ const COMMENTS_CACHE_KEY_PREFIX = "slowcook.review-overlay.comments.";
91
+ export function commentsCacheKey(repo, pr) {
92
+ return `${COMMENTS_CACHE_KEY_PREFIX}${repo.owner}/${repo.repo}/${pr}`;
93
+ }
94
+ export function loadCachedComments(storage, repo, pr) {
95
+ const raw = storage.getItem(commentsCacheKey(repo, pr));
96
+ if (!raw)
97
+ return null;
98
+ try {
99
+ const parsed = JSON.parse(raw);
100
+ if (!Array.isArray(parsed))
101
+ return null;
102
+ return parsed;
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ export function saveCachedComments(storage, repo, pr, records) {
109
+ try {
110
+ storage.setItem(commentsCacheKey(repo, pr), JSON.stringify(records));
111
+ }
112
+ catch {
113
+ /* ignore quota / private-mode errors */
114
+ }
115
+ }
116
+ export function emptyStats() {
117
+ return { total: 0, unresolved: 0, applied: 0, declined: 0, specAltering: 0, noop: 0 };
118
+ }
119
+ /**
120
+ * List every PR (open + closed) on the repo that carries the
121
+ * `slowcook-mockup` label. Each result includes the PR number, the
122
+ * derived storyId from the branch name (`slowcook/mockup/story-N`),
123
+ * and the comments-list URL for paginated comment fetch.
124
+ */
125
+ export async function fetchAllMockupPrs(args) {
126
+ const fetchImpl = args.fetchImpl ?? globalThis.fetch;
127
+ const apiBase = args.apiBase ?? "https://api.github.com";
128
+ const url = `${apiBase}/repos/${encodeURIComponent(args.owner)}/${encodeURIComponent(args.repo)}/issues?labels=slowcook-mockup&state=all&per_page=100`;
129
+ let res;
130
+ try {
131
+ res = await fetchImpl(url, {
132
+ headers: {
133
+ Authorization: `Bearer ${args.pat}`,
134
+ Accept: "application/vnd.github+json",
135
+ "X-GitHub-Api-Version": "2022-11-28",
136
+ },
137
+ });
138
+ }
139
+ catch {
140
+ return [];
141
+ }
142
+ if (!res.ok)
143
+ return [];
144
+ const issues = (await res.json());
145
+ const out = [];
146
+ for (const issue of issues) {
147
+ if (!issue.pull_request)
148
+ continue;
149
+ // The branch name carries the unambiguous story id; fall back to
150
+ // title regex if branch fetch isn't available in this issues
151
+ // response (it usually isn't — would need a second PR fetch).
152
+ // Title pattern from vibe: "mockup: story-N".
153
+ const titleMatch = (issue.title ?? "").match(/story-([\w-]+)/);
154
+ if (!titleMatch || !titleMatch[1])
155
+ continue;
156
+ out.push({ pr: issue.number, storyId: titleMatch[1] });
157
+ }
158
+ return out;
159
+ }
160
+ /**
161
+ * Aggregate per-scenario comment stats by walking every mockup PR's
162
+ * comments + grouping by overlay-payload.story_id. Plate's breadcrumb
163
+ * provides the status (applied / declined / spec-altering / noop);
164
+ * absent breadcrumb counts as unresolved.
165
+ *
166
+ * One round-trip per PR + 1 for the listing. For most consumers the
167
+ * total is <20 PRs; in-flight Promise.all keeps the wall-clock fast.
168
+ */
169
+ export async function fetchScenarioStats(args) {
170
+ const prs = await fetchAllMockupPrs(args);
171
+ if (prs.length === 0)
172
+ return {};
173
+ const allRecords = await Promise.all(prs.map((p) => fetchOverlayComments({ ...args, pr: p.pr }).catch(() => [])));
174
+ const stats = {};
175
+ for (let i = 0; i < prs.length; i++) {
176
+ const { storyId } = prs[i];
177
+ const records = allRecords[i];
178
+ if (!stats[storyId])
179
+ stats[storyId] = emptyStats();
180
+ const s = stats[storyId];
181
+ for (const rec of records) {
182
+ // Prefer the payload's story_id when present (more reliable than
183
+ // PR-title parsing); fall back to the PR's storyId otherwise.
184
+ const targetId = rec.payload.story_id ?? storyId;
185
+ if (!stats[targetId])
186
+ stats[targetId] = emptyStats();
187
+ const target = stats[targetId];
188
+ target.total += 1;
189
+ const status = rec.plateReply?.status;
190
+ switch (status) {
191
+ case "applied":
192
+ target.applied += 1;
193
+ break;
194
+ case "declined":
195
+ target.declined += 1;
196
+ break;
197
+ case "spec-altering":
198
+ target.specAltering += 1;
199
+ break;
200
+ case "noop":
201
+ target.noop += 1;
202
+ break;
203
+ default:
204
+ target.unresolved += 1;
205
+ break;
206
+ }
207
+ }
208
+ // Suppress unused — `s` was only kept as a clarity anchor; if there
209
+ // were no records, `stats[storyId]` was initialised but stays zero.
210
+ void s;
211
+ }
212
+ return stats;
213
+ }
214
+ const SCENARIO_STATS_CACHE_KEY_PREFIX = "slowcook.review-overlay.scenario-stats.";
215
+ export function scenarioStatsCacheKey(repo) {
216
+ return `${SCENARIO_STATS_CACHE_KEY_PREFIX}${repo.owner}/${repo.repo}`;
217
+ }
218
+ export function loadCachedScenarioStats(storage, repo) {
219
+ const raw = storage.getItem(scenarioStatsCacheKey(repo));
220
+ if (!raw)
221
+ return null;
222
+ try {
223
+ return JSON.parse(raw);
224
+ }
225
+ catch {
226
+ return null;
227
+ }
228
+ }
229
+ export function saveCachedScenarioStats(storage, repo, stats) {
230
+ try {
231
+ storage.setItem(scenarioStatsCacheKey(repo), JSON.stringify(stats));
232
+ }
233
+ catch {
234
+ /* ignore quota errors */
235
+ }
236
+ }
24
237
  /**
25
238
  * POST a comment to the given PR. Returns a tagged result rather than
26
239
  * throwing so the React layer can render specific UI per failure mode.
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAO9D,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAgB,EAAE,IAAe;IACvD,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAgB,EAAE,IAAe,EAAE,GAAW;IACpE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB,EAAE,IAAe;IACxD,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC;AA0BD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,wBAAwB,CAAC;IACzD,MAAM,GAAG,GAAG,GAAG,OAAO,UAAU,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,WAAW,CAAC;IAC7H,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE;gBACnC,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,6BAA6B;gBACrC,sBAAsB,EAAE,YAAY;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,kBAAmB,CAAW,CAAC,OAAO,EAAE;SAClD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;YACrD,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,UAAU;SAClC,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqC,CAAC;IACjE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  * cli package, server-side) imports `parseReviewComment` from here to
11
11
  * decode review comments off the PR thread.
12
12
  */
13
- export { PAYLOAD_MARKER, formatReviewComment, parseReviewComment, buildPayload, type ReviewCommentPayload, type ViewportInfo, type FormatArgs, } from "./comment-format.js";
14
- export { extractSelector, type ExtractedSelector, } from "./selector.js";
15
- export { loadPat, savePat, clearPat, patStorageKey, submitComment, type RepoCoord, type SubmitArgs, type SubmitResult, type SubmitOk, type SubmitErr, } from "./github.js";
13
+ export { PAYLOAD_MARKER, PLATE_REPLY_MARKER, formatReviewComment, parseReviewComment, formatPlateReplyBlock, parsePlateReply, buildPayload, type ReviewCommentPayload, type ViewportInfo, type FormatArgs, type PlateReplyEntry, type PlateReplyPayload, type PlateReplyStatus, } from "./comment-format.js";
14
+ export { extractSelector, resolveStoredSelector, type ExtractedSelector, } from "./selector.js";
15
+ export { loadPat, savePat, clearPat, patStorageKey, submitComment, fetchOverlayComments, loadCachedComments, saveCachedComments, commentsCacheKey, fetchAllMockupPrs, fetchScenarioStats, loadCachedScenarioStats, saveCachedScenarioStats, scenarioStatsCacheKey, emptyStats, type RepoCoord, type SubmitArgs, type SubmitResult, type SubmitOk, type SubmitErr, type OverlayCommentRecord, type ScenarioCommentStats, } from "./github.js";
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,EACb,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,SAAS,GACf,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,EACV,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * cli package, server-side) imports `parseReviewComment` from here to
11
11
  * decode review comments off the PR thread.
12
12
  */
13
- export { PAYLOAD_MARKER, formatReviewComment, parseReviewComment, buildPayload, } from "./comment-format.js";
14
- export { extractSelector, } from "./selector.js";
15
- export { loadPat, savePat, clearPat, patStorageKey, submitComment, } from "./github.js";
13
+ export { PAYLOAD_MARKER, PLATE_REPLY_MARKER, formatReviewComment, parseReviewComment, formatPlateReplyBlock, parsePlateReply, buildPayload, } from "./comment-format.js";
14
+ export { extractSelector, resolveStoredSelector, } from "./selector.js";
15
+ export { loadPat, savePat, clearPat, patStorageKey, submitComment, fetchOverlayComments, loadCachedComments, saveCachedComments, commentsCacheKey, fetchAllMockupPrs, fetchScenarioStats, loadCachedScenarioStats, saveCachedScenarioStats, scenarioStatsCacheKey, emptyStats, } from "./github.js";
16
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GAIb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,GAEhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,GAMd,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,YAAY,GAOb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,GAQX,MAAM,aAAa,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { SlowcookReviewOverlay, type SlowcookReviewOverlayProps } from "./overlay.js";
2
+ export { useScenarioCommentStats, type UseScenarioCommentStatsArgs } from "./use-scenario-comment-stats.js";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,KAAK,2BAA2B,EAAE,MAAM,iCAAiC,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { SlowcookReviewOverlay } from "./overlay.js";
2
+ export { useScenarioCommentStats } from "./use-scenario-comment-stats.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAmC,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAmC,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAoC,MAAM,iCAAiC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/react/overlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAc3E,MAAM,WAAW,0BAA0B;IACzC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oGAAoG;IACpG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAgL3F"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/react/overlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAkB3E,MAAM,WAAW,0BAA0B;IACzC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oGAAoG;IACpG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CA6Q3F"}