pr-digest 0.1.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/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # pr-digest
2
+
3
+ A CLI tool for generating comprehensive digests of GitHub pull requests, optimized for AI agent handoffs with full timeline context.
4
+
5
+ ## Features
6
+
7
+ - Fetches all PR information (title, description, branches)
8
+ - Retrieves complete timeline including reviews, comments, and status changes
9
+ - Formats output using markdown-factory for clean, readable output
10
+ - Includes AI agent instructions based on timeline analysis
11
+ - Flexible authentication (args, env vars, or gh CLI)
12
+ - Auto-detects PR from current git repository using Octokit
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install -g pr-digest
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ### Auto-detect PR from current git repository
23
+
24
+ ```bash
25
+ pr-digest digest
26
+ ```
27
+
28
+ When run from a GitHub repository, `pr-digest` will:
29
+
30
+ 1. Detect the GitHub repository from `git remote get-url origin`
31
+ 2. Get the current branch name from `git branch --show-current`
32
+ 3. Search GitHub for an open PR with a matching head branch
33
+ 4. Generate a digest for that PR
34
+
35
+ You can still explicitly provide owner/repo/pr if needed:
36
+
37
+ - `--owner` and `--repo` override the detected GitHub repository
38
+ - `--pr` overrides the auto-detected PR number
39
+
40
+ ### Using a GitHub PR URL
41
+
42
+ ```bash
43
+ pr-digest digest https://github.com/owner/repo/pull/123
44
+ ```
45
+
46
+ ### With output file
47
+
48
+ ```bash
49
+ pr-digest digest --url https://github.com/owner/repo/pull/123 --output digest.md
50
+ ```
51
+
52
+ ### Authentication
53
+
54
+ The tool tries token sources in this order:
55
+
56
+ 1. `--token` CLI argument
57
+ 2. `GH_TOKEN` environment variable
58
+ 3. `GITHUB_TOKEN` environment variable
59
+ 4. `gh auth token` command (requires GitHub CLI)
60
+
61
+ ## Digest Format
62
+
63
+ The generated digest includes:
64
+
65
+ - **PR Header**: Title, number, and link
66
+ - **Branch Information**: Base branch (for `git diff` commands) and head branch
67
+ - **Timeline Section**: Full conversation history including:
68
+ - Review summary with approval statistics
69
+ - Individual review comments with review states
70
+ - Nx Cloud CI links (detected and highlighted)
71
+ - General Comments: Issue-level comments with threaded replies
72
+ - File-Specific Comments\*\*: Review comments grouped by file with line numbers and ranges
73
+ - **AI Agent Instructions**: Context-aware guidelines based on timeline data
74
+
75
+ > **Timeline Features:**
76
+
77
+ - Shows review state (approved, changes requested, commented, dismissed, etc.)
78
+ - Groups comments into threads with replies
79
+ - Detects Nx Cloud CI links in review comments and highlights them
80
+ - Provides review summary statistics for quick overview
81
+ - Helps AI agents understand the full review conversation context
82
+
83
+ ## Development
84
+
85
+ ```bash
86
+ # Build
87
+ npm run build
88
+
89
+ # Run tests
90
+ npm run test
91
+
92
+ # Type check
93
+ npm run typecheck
94
+
95
+ # Lint
96
+ npm run lint
97
+ ```
package/dist/cli.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ declare const prCLI: import("cli-forge").CLI<{
3
+ unmatched: string[];
4
+ '--'?: string[];
5
+ } & {
6
+ url?: string;
7
+ } & {} & {
8
+ owner?: string;
9
+ } & {} & {
10
+ repo?: string;
11
+ } & {} & {
12
+ pr?: number;
13
+ } & {} & {
14
+ token?: string;
15
+ } & {} & {
16
+ output?: string;
17
+ } & {} & {
18
+ "ai-provider"?: string;
19
+ } & {}, Promise<void>, {}, undefined>;
20
+ export default prCLI;
21
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAaA,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;qCAkHT,CAAC;AAEH,eAAe,KAAK,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ import { __awaiter } from "tslib";
3
+ import { cli } from 'cli-forge';
4
+ import { mkdir, writeFile } from 'fs/promises';
5
+ import { dirname } from 'path';
6
+ import { fetchPrData, formatDigest } from './digest.js';
7
+ import { getGitHubToken, getGitRepoInfo, getPRFromBranch, parseGitHubUrl, } from './utils.js';
8
+ const prCLI = cli('pr-digest', {
9
+ description: 'Generate a digest of a GitHub pull request',
10
+ builder: (args) => args
11
+ .option('url', {
12
+ type: 'string',
13
+ description: 'GitHub PR URL (e.g., https://github.com/owner/repo/pull/123)',
14
+ })
15
+ .option('owner', {
16
+ type: 'string',
17
+ description: 'Repository owner',
18
+ })
19
+ .option('repo', {
20
+ type: 'string',
21
+ description: 'Repository name',
22
+ })
23
+ .option('pr', {
24
+ type: 'number',
25
+ description: 'PR number',
26
+ })
27
+ .option('token', {
28
+ type: 'string',
29
+ description: 'GitHub token (defaults to GH_TOKEN, GITHUB_TOKEN, or gh auth token)',
30
+ })
31
+ .option('output', {
32
+ type: 'string',
33
+ description: 'Output file path (defaults to stdout)',
34
+ })
35
+ .option('ai-provider', {
36
+ type: 'string',
37
+ description: 'AI provider for log summarization (opencode or claude)',
38
+ default: 'opencode',
39
+ })
40
+ .group('PR Source', ['url', 'owner', 'repo', 'pr'])
41
+ .examples('pr-digest --url https://github.com/owner/repo/pull/123', 'pr-digest (auto-detects from current repo)', 'pr-digest --owner owner --repo repo --pr 123', 'pr-digest --ai-provider claude --url https://github.com/owner/repo/pull/123'),
42
+ handler: (args) => __awaiter(void 0, void 0, void 0, function* () {
43
+ let owner;
44
+ let repo;
45
+ let prNumber;
46
+ if (args.url) {
47
+ const parsed = parseGitHubUrl(args.url);
48
+ if (!parsed) {
49
+ console.error(`Invalid GitHub URL: ${args.url}`);
50
+ process.exit(1);
51
+ }
52
+ owner = parsed.owner;
53
+ repo = parsed.repo;
54
+ prNumber = parsed.prNumber;
55
+ }
56
+ else {
57
+ const gitInfo = getGitRepoInfo();
58
+ if (!gitInfo) {
59
+ console.error('Error: Could not detect GitHub repository from current git repo. Provide --url, --owner, --repo, and --pr explicitly.');
60
+ process.exit(1);
61
+ }
62
+ owner = args.owner || gitInfo.owner;
63
+ repo = args.repo || gitInfo.repo;
64
+ prNumber =
65
+ args.pr ||
66
+ (yield (() => __awaiter(void 0, void 0, void 0, function* () {
67
+ if (gitInfo.currentBranch) {
68
+ const prFromBranch = yield getPRFromBranch(owner, repo, gitInfo.currentBranch);
69
+ if (prFromBranch) {
70
+ return prFromBranch;
71
+ }
72
+ else {
73
+ console.error('Error: Could not find a PR for the current branch. Provide --pr explicitly.');
74
+ process.exit(1);
75
+ }
76
+ }
77
+ else {
78
+ console.error('Error: Either --url or --owner, --repo, and --pr must be provided');
79
+ process.exit(1);
80
+ }
81
+ }))());
82
+ }
83
+ const token = yield getGitHubToken(args.token);
84
+ const { pr, timeline, checkRuns } = yield fetchPrData(owner, repo, prNumber, token, args['ai-provider']);
85
+ const digest = formatDigest(pr, timeline, checkRuns);
86
+ if (args.output) {
87
+ yield mkdir(dirname(args.output), { recursive: true }).catch(() => undefined);
88
+ yield writeFile(args.output, digest, 'utf-8');
89
+ console.log(`Digest written to ${args.output}`);
90
+ }
91
+ else {
92
+ console.log(digest);
93
+ }
94
+ }),
95
+ });
96
+ export default prCLI;
97
+ prCLI.forge();
98
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { PrInfo, TimelineEvent } from './types';
2
+ interface CheckRun {
3
+ name: string;
4
+ status: 'queued' | 'in_progress' | 'completed' | 'waiting' | 'requested' | 'pending';
5
+ conclusion: 'success' | 'failure' | 'neutral' | 'cancelled' | 'timed_out' | 'action_required' | 'skipped' | null;
6
+ startedAt: string;
7
+ completedAt: string | null;
8
+ htmlUrl: string;
9
+ detailsUrl: string;
10
+ logs: string[];
11
+ aiSummary?: string;
12
+ }
13
+ export declare function fetchPrData(owner: string, repo: string, prNumber: number, token?: string, aiProvider?: 'opencode' | 'claude'): Promise<{
14
+ pr: PrInfo;
15
+ timeline: TimelineEvent[];
16
+ checkRuns: CheckRun[];
17
+ }>;
18
+ export declare function formatDigest(pr: PrInfo, timeline: TimelineEvent[], checkRuns?: CheckRun[]): string;
19
+ export {};
20
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EACF,QAAQ,GACR,aAAa,GACb,WAAW,GACX,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IACd,UAAU,EACN,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,WAAW,GACX,iBAAiB,GACjB,SAAS,GACT,IAAI,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqOD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,GAAE,UAAU,GAAG,QAAqB,GAC7C,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CAuK3E;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,aAAa,EAAE,EACzB,SAAS,GAAE,QAAQ,EAAO,GACzB,MAAM,CA2DR"}
package/dist/digest.js ADDED
@@ -0,0 +1,424 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Octokit } from '@octokit/rest';
3
+ import { spawn } from 'child_process';
4
+ import { blockQuote, bold, codeBlock, h1, h2, h3, h4, link, unorderedList, } from 'markdown-factory';
5
+ function parseDiff(patchText) {
6
+ const diffMap = new Map();
7
+ const lines = patchText.split('\n');
8
+ let currentFile = null;
9
+ let currentHunk = null;
10
+ for (let i = 0; i < lines.length; i++) {
11
+ const line = lines[i];
12
+ const fileMatch = line.match(/^\+\+\+ b\/(.+)$/);
13
+ if (fileMatch) {
14
+ currentFile = fileMatch[1];
15
+ if (!diffMap.has(currentFile)) {
16
+ diffMap.set(currentFile, []);
17
+ }
18
+ currentHunk = null;
19
+ continue;
20
+ }
21
+ const hunkMatch = line.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
22
+ if (hunkMatch && currentFile) {
23
+ currentHunk = {
24
+ oldStart: parseInt(hunkMatch[1], 10),
25
+ oldCount: hunkMatch[2] ? parseInt(hunkMatch[2], 10) : 1,
26
+ newStart: parseInt(hunkMatch[3], 10),
27
+ newCount: hunkMatch[4] ? parseInt(hunkMatch[4], 10) : 1,
28
+ lines: [],
29
+ filePath: currentFile,
30
+ };
31
+ const hunks = diffMap.get(currentFile);
32
+ if (hunks) {
33
+ hunks.push(currentHunk);
34
+ }
35
+ continue;
36
+ }
37
+ if (currentHunk &&
38
+ (line.startsWith(' ') || line.startsWith('+') || line.startsWith('-'))) {
39
+ currentHunk.lines.push(line);
40
+ }
41
+ }
42
+ return diffMap;
43
+ }
44
+ function findDiffForComment(diffMap, comment) {
45
+ if (!comment.path || comment.line === null || comment.line === undefined) {
46
+ return null;
47
+ }
48
+ const hunks = diffMap.get(comment.path);
49
+ if (!hunks) {
50
+ return null;
51
+ }
52
+ for (const hunk of hunks) {
53
+ if (comment.line >= hunk.newStart &&
54
+ comment.line < hunk.newStart + hunk.newCount) {
55
+ const contextSize = 3;
56
+ const lineIndex = comment.line - hunk.newStart;
57
+ const startLine = Math.max(0, lineIndex - contextSize);
58
+ const endLine = Math.min(hunk.lines.length, lineIndex + contextSize + 1);
59
+ return `@@ -${hunk.oldStart},${hunk.oldCount} +${hunk.newStart},${hunk.newCount} @@\n${hunk.lines.slice(startLine, endLine).join('\n')}`;
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ function summarizeLogsWithAI(logs_1, checkName_1) {
65
+ return __awaiter(this, arguments, void 0, function* (logs, checkName, aiProvider = 'opencode') {
66
+ if (logs.length === 0) {
67
+ return null;
68
+ }
69
+ const logContent = logs.join('\n');
70
+ const prompt = `Summarize the following CI/CD check logs for "${checkName}".
71
+
72
+ IMPORTANT STRUCTURE GUIDELINES:
73
+ - Keep the summary concise (max 3-5 bullet points)
74
+ - Focus on the main issues or errors found
75
+ - Highlight what the check was testing
76
+ - If successful, briefly confirm what passed
77
+
78
+ CRITICAL - Nx Cloud Links:
79
+ - If you see ANY URLs containing "nx.app", "nx.app/cipes", or "nx.app/runs", these are Nx Cloud links
80
+ - These links can be fetched using Nx Cloud MCP/skills
81
+ - List them prominently if found
82
+
83
+ Logs to summarize:
84
+ \`\`\`
85
+ ${logContent.slice(0, 10000)}
86
+ \`\`\``;
87
+ return new Promise((resolve) => {
88
+ const child = spawn('npx', [aiProvider, 'summarize'], {
89
+ shell: true,
90
+ });
91
+ let stdout = '';
92
+ let stderr = '';
93
+ child.stdout.on('data', (data) => {
94
+ stdout += data.toString();
95
+ });
96
+ child.stderr.on('data', (data) => {
97
+ stderr += data.toString();
98
+ });
99
+ child.on('close', (code) => {
100
+ if (code === 0 && stdout.trim()) {
101
+ resolve(stdout.trim());
102
+ }
103
+ else {
104
+ console.error(`Failed to summarize logs (code ${code}): ${stderr}`);
105
+ resolve(null);
106
+ }
107
+ });
108
+ child.stdin.write(prompt);
109
+ child.stdin.end();
110
+ setTimeout(() => {
111
+ child.kill();
112
+ resolve(null);
113
+ }, 30000);
114
+ });
115
+ });
116
+ }
117
+ function fetchCheckRuns(owner_1, repo_1, headSha_1, octokit_1) {
118
+ return __awaiter(this, arguments, void 0, function* (owner, repo, headSha, octokit, aiProvider = 'opencode') {
119
+ try {
120
+ const { data: checkRunsData } = yield octokit.rest.checks.listForRef({
121
+ owner,
122
+ repo,
123
+ ref: headSha,
124
+ per_page: 50,
125
+ });
126
+ const checkRunsWithLogs = yield Promise.all(checkRunsData.check_runs.map((run) => __awaiter(this, void 0, void 0, function* () {
127
+ let logs = [];
128
+ if (run.logs_url) {
129
+ try {
130
+ const logsResponse = yield octokit.request('GET ' + run.logs_url);
131
+ if (typeof logsResponse.data === 'string') {
132
+ logs = logsResponse.data
133
+ .split('\n')
134
+ .filter((line) => line.trim());
135
+ }
136
+ }
137
+ catch (_a) {
138
+ // Ignore log fetch errors
139
+ }
140
+ }
141
+ return {
142
+ name: run.name,
143
+ status: run.status,
144
+ conclusion: run.conclusion,
145
+ startedAt: run.started_at,
146
+ completedAt: run.completed_at,
147
+ htmlUrl: run.html_url,
148
+ detailsUrl: run.details_url,
149
+ logs,
150
+ };
151
+ })));
152
+ const checkRunsWithSummaries = yield Promise.all(checkRunsWithLogs.map((checkRun) => __awaiter(this, void 0, void 0, function* () {
153
+ const hasNxCloudLinks = checkRun.logs.some((log) => log.includes('nx.app'));
154
+ if (!hasNxCloudLinks && checkRun.logs.length > 0) {
155
+ const summary = yield summarizeLogsWithAI(checkRun.logs, checkRun.name, aiProvider);
156
+ return Object.assign(Object.assign({}, checkRun), { aiSummary: summary || undefined });
157
+ }
158
+ return checkRun;
159
+ })));
160
+ return checkRunsWithSummaries;
161
+ }
162
+ catch (error) {
163
+ console.error('Failed to fetch check runs:', error);
164
+ return [];
165
+ }
166
+ });
167
+ }
168
+ export function fetchPrData(owner_1, repo_1, prNumber_1, token_1) {
169
+ return __awaiter(this, arguments, void 0, function* (owner, repo, prNumber, token, aiProvider = 'opencode') {
170
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
171
+ const octokit = new Octokit(token ? { auth: token } : undefined);
172
+ const { data: pr } = yield octokit.rest.pulls.get({
173
+ owner,
174
+ repo,
175
+ pull_number: prNumber,
176
+ });
177
+ const patchResponse = yield octokit.request('GET ' + pr.patch_url, {
178
+ headers: { Accept: 'application/vnd.github.patch' },
179
+ });
180
+ const patchText = patchResponse.data;
181
+ const diffMap = parseDiff(patchText);
182
+ const [{ data: commits }, { data: issueComments }, { data: reviews }, { data: reviewComments }, checkRuns,] = yield Promise.all([
183
+ octokit.rest.pulls.listCommits({
184
+ owner,
185
+ repo,
186
+ pull_number: prNumber,
187
+ per_page: 100,
188
+ }),
189
+ octokit.rest.issues.listComments({ owner, repo, issue_number: prNumber }),
190
+ octokit.rest.pulls.listReviews({ owner, repo, pull_number: prNumber }),
191
+ octokit.rest.pulls.listReviewComments({
192
+ owner,
193
+ repo,
194
+ pull_number: prNumber,
195
+ }),
196
+ fetchCheckRuns(owner, repo, pr.head.sha, octokit, aiProvider),
197
+ ]);
198
+ const timeline = [];
199
+ for (const commit of commits) {
200
+ timeline.push({
201
+ type: 'push',
202
+ sha: commit.sha.substring(0, 7),
203
+ message: commit.commit.message.split('\n')[0],
204
+ url: commit.html_url,
205
+ createdAt: ((_a = commit.commit.committer) === null || _a === void 0 ? void 0 : _a.date) ||
206
+ ((_b = commit.commit.author) === null || _b === void 0 ? void 0 : _b.date) ||
207
+ new Date().toISOString(),
208
+ author: commit.author ? { login: commit.author.login } : undefined,
209
+ });
210
+ }
211
+ for (const comment of issueComments) {
212
+ timeline.push({
213
+ type: 'comment',
214
+ id: comment.id.toString(),
215
+ body: (_c = comment.body) !== null && _c !== void 0 ? _c : '',
216
+ author: (_e = (_d = comment.user) === null || _d === void 0 ? void 0 : _d.login) !== null && _e !== void 0 ? _e : 'unknown',
217
+ createdAt: comment.created_at,
218
+ });
219
+ }
220
+ const reviewCommentsByReviewId = new Map();
221
+ for (const rc of reviewComments) {
222
+ const reviewId = ((_f = rc.pull_request_review_id) === null || _f === void 0 ? void 0 : _f.toString()) || 'general';
223
+ const comments = reviewCommentsByReviewId.get(reviewId) || [];
224
+ comments.push(rc);
225
+ reviewCommentsByReviewId.set(reviewId, comments);
226
+ }
227
+ for (const review of reviews) {
228
+ const reviewId = review.id.toString();
229
+ const reviewRcs = reviewCommentsByReviewId.get(reviewId) || [];
230
+ const topLevelReviewComments = reviewRcs.filter((rc) => !rc.in_reply_to_id);
231
+ const reviewEvent = {
232
+ type: 'review',
233
+ id: reviewId,
234
+ author: (_h = (_g = review.user) === null || _g === void 0 ? void 0 : _g.login) !== null && _h !== void 0 ? _h : 'unknown',
235
+ createdAt: review.submitted_at ||
236
+ review.created_at ||
237
+ new Date().toISOString(),
238
+ state: review.state === 'APPROVED' ||
239
+ review.state === 'CHANGES_REQUESTED' ||
240
+ review.state === 'DISMISSED'
241
+ ? review.state
242
+ : 'COMMENTED',
243
+ body: (_j = review.body) !== null && _j !== void 0 ? _j : undefined,
244
+ comments: topLevelReviewComments.map((rc) => {
245
+ var _a, _b, _c;
246
+ return ({
247
+ id: rc.id.toString(),
248
+ body: (_a = rc.body) !== null && _a !== void 0 ? _a : '',
249
+ author: (_c = (_b = rc.user) === null || _b === void 0 ? void 0 : _b.login) !== null && _c !== void 0 ? _c : 'unknown',
250
+ createdAt: rc.created_at || new Date().toISOString(),
251
+ path: rc.path,
252
+ line: rc.line,
253
+ startLine: rc.start_line,
254
+ endLine: rc.line,
255
+ diff: findDiffForComment(diffMap, { path: rc.path, line: rc.line }),
256
+ });
257
+ }),
258
+ replies: reviewRcs
259
+ .filter((rc) => rc.in_reply_to_id)
260
+ .map((rc) => {
261
+ var _a, _b, _c;
262
+ return ({
263
+ id: rc.id.toString(),
264
+ body: (_a = rc.body) !== null && _a !== void 0 ? _a : '',
265
+ author: (_c = (_b = rc.user) === null || _b === void 0 ? void 0 : _b.login) !== null && _c !== void 0 ? _c : 'unknown',
266
+ createdAt: rc.created_at || new Date().toISOString(),
267
+ });
268
+ }),
269
+ };
270
+ timeline.push(reviewEvent);
271
+ }
272
+ const generalReviewComments = reviewCommentsByReviewId.get('general') || [];
273
+ for (const rc of generalReviewComments) {
274
+ if (!rc.in_reply_to_id) {
275
+ const repliesForThisComment = generalReviewComments.filter((r) => r.in_reply_to_id === rc.id);
276
+ const reviewEvent = {
277
+ type: 'review',
278
+ id: rc.id.toString(),
279
+ author: (_l = (_k = rc.user) === null || _k === void 0 ? void 0 : _k.login) !== null && _l !== void 0 ? _l : 'unknown',
280
+ createdAt: new Date().toISOString(),
281
+ state: 'COMMENTED',
282
+ comments: [
283
+ {
284
+ id: rc.id.toString(),
285
+ body: (_m = rc.body) !== null && _m !== void 0 ? _m : '',
286
+ author: (_p = (_o = rc.user) === null || _o === void 0 ? void 0 : _o.login) !== null && _p !== void 0 ? _p : 'unknown',
287
+ createdAt: new Date().toISOString(),
288
+ path: rc.path,
289
+ line: rc.line,
290
+ startLine: rc.start_line,
291
+ endLine: rc.line,
292
+ diff: findDiffForComment(diffMap, { path: rc.path, line: rc.line }),
293
+ },
294
+ ],
295
+ replies: repliesForThisComment.map((r) => {
296
+ var _a, _b, _c;
297
+ return ({
298
+ id: r.id.toString(),
299
+ body: (_a = r.body) !== null && _a !== void 0 ? _a : '',
300
+ author: (_c = (_b = r.user) === null || _b === void 0 ? void 0 : _b.login) !== null && _c !== void 0 ? _c : 'unknown',
301
+ createdAt: new Date().toISOString(),
302
+ });
303
+ }),
304
+ };
305
+ timeline.push(reviewEvent);
306
+ }
307
+ }
308
+ timeline.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
309
+ const prInfo = {
310
+ title: pr.title,
311
+ number: pr.number,
312
+ baseBranch: pr.base.ref,
313
+ headBranch: pr.head.ref,
314
+ description: (_q = pr.body) !== null && _q !== void 0 ? _q : undefined,
315
+ url: pr.html_url,
316
+ };
317
+ return { pr: prInfo, timeline, checkRuns };
318
+ });
319
+ }
320
+ export function formatDigest(pr, timeline, checkRuns = []) {
321
+ const reviewEvents = timeline.filter((e) => e.type === 'review');
322
+ const approvedCount = reviewEvents.filter((r) => r.state === 'APPROVED').length;
323
+ const changesRequestedCount = reviewEvents.filter((r) => r.state === 'CHANGES_REQUESTED').length;
324
+ const commentedCount = reviewEvents.filter((r) => r.state === 'COMMENTED').length;
325
+ const dismissedCount = reviewEvents.filter((r) => r.state === 'DISMISSED').length;
326
+ return h1(link(pr.url, `${pr.title} #${pr.number}`), h2('PR Information'), blockQuote('This digest contains all information needed to address review comments and make requested changes.'), unorderedList(`Base branch: \`${pr.baseBranch}\` (use for \`git diff ${pr.baseBranch}\`)`, `Head branch: \`${pr.headBranch}\``), pr.description ? h2('Description', blockQuote(pr.description)) : '', h2('Timeline'), ...timeline.map((event) => formatTimelineEvent(event)), h2('Status Checks'), formatStatusChecks(checkRuns), h2('Summary'), h3('Review Statistics'), unorderedList(`Total reviews: ${reviewEvents.length}`, `Approved: ${approvedCount} ✓`, `Changes requested: ${changesRequestedCount}`, `Commented: ${commentedCount}`, `Dismissed: ${dismissedCount}`), h3('Action Items'), formatActionItems(timeline), h3('Git Commands'), codeBlock(`# View changes in files with comments
327
+ git diff ${pr.baseBranch}
328
+
329
+ # View changes for a specific file
330
+ git diff ${pr.baseBranch} -- path/to/file.ts`, 'bash'), h2('DEVELOPER COMMENTS'), blockQuote('The below comments were written by developer of this PR, and provide extra notes / relevant context to addressing PR review.'), blockQuote('[...fill me in]'));
331
+ }
332
+ function formatTimelineEvent(event) {
333
+ if (event.type === 'push') {
334
+ return h3(`PUSH ${event.sha}`, bold(event.message), link(event.url, 'View commit'));
335
+ }
336
+ if (event.type === 'comment') {
337
+ return h3(`COMMENT ${event.author}`, blockQuote(event.body));
338
+ }
339
+ if (event.type === 'review') {
340
+ const stateBadge = event.state === 'APPROVED'
341
+ ? '✓ APPROVED'
342
+ : event.state === 'CHANGES_REQUESTED'
343
+ ? '❌ CHANGES REQUESTED'
344
+ : event.state === 'DISMISSED'
345
+ ? '⊗ DISMISSED'
346
+ : '💬 COMMENTED';
347
+ const commentsSection = event.comments.length > 0
348
+ ? event.comments.map((c) => formatReviewComment(c)).join('\n\n')
349
+ : '';
350
+ const repliesSection = event.replies.length > 0
351
+ ? '\n\n**Replies:**\n\n' +
352
+ event.replies
353
+ .map((r) => `> @${r.author}: ${blockQuote(r.body)}`)
354
+ .join('\n\n')
355
+ : '';
356
+ return h3(`REVIEW ${stateBadge} by @${event.author}`, event.body ? blockQuote(event.body) : '', commentsSection, repliesSection);
357
+ }
358
+ return '';
359
+ }
360
+ function formatStatusChecks(checkRuns) {
361
+ if (checkRuns.length === 0) {
362
+ return '*No status checks found.*';
363
+ }
364
+ const successful = checkRuns.filter((c) => c.conclusion === 'success');
365
+ const failed = checkRuns.filter((c) => c.conclusion === 'failure');
366
+ const pending = checkRuns.filter((c) => c.status === 'in_progress' || c.status === 'queued');
367
+ const cancelled = checkRuns.filter((c) => c.conclusion === 'cancelled');
368
+ if (successful.length === checkRuns.length) {
369
+ return `✅ All ${checkRuns.length} status checks passed.`;
370
+ }
371
+ const sections = [];
372
+ if (failed.length > 0) {
373
+ sections.push(h3('Failed Checks', ...failed.map((c) => formatCheckRun(c, '❌'))));
374
+ }
375
+ if (pending.length > 0) {
376
+ sections.push(h3('Pending Checks', ...pending.map((c) => formatCheckRun(c, '⏳'))));
377
+ }
378
+ if (cancelled.length > 0) {
379
+ sections.push(h3('Cancelled Checks', ...cancelled.map((c) => formatCheckRun(c, '⊗'))));
380
+ }
381
+ if (successful.length > 0) {
382
+ sections.push(h3('Passed Checks', ...successful.map((c) => formatCheckRun(c, '✅'))));
383
+ }
384
+ return sections.join('\n\n');
385
+ }
386
+ function formatCheckRun(checkRun, emoji) {
387
+ const nxCloudLinks = checkRun.logs.some((log) => log.includes('nx.app'));
388
+ const statusIcon = emoji;
389
+ const hasAiSummary = checkRun.aiSummary && checkRun.aiSummary.trim().length > 0;
390
+ const aiSummaryText = hasAiSummary ? checkRun.aiSummary : '';
391
+ return (`${statusIcon} **${checkRun.name}**\n\n` +
392
+ (nxCloudLinks
393
+ ? `> ⚠️ **Nx Cloud link detected** - This check can be fetched using Nx Cloud MCP/skills.\n\n`
394
+ : '') +
395
+ (hasAiSummary
396
+ ? `> **AI Summary**:\n\n${blockQuote(aiSummaryText)}\n\n`
397
+ : '') +
398
+ (checkRun.htmlUrl ? link(checkRun.htmlUrl, 'View details') : ''));
399
+ }
400
+ function formatReviewComment(comment) {
401
+ const location = comment.path
402
+ ? `**${comment.path}**${comment.line ? `:${comment.line}` : ''}`
403
+ : '';
404
+ const diffSection = comment.diff
405
+ ? `\n\n${codeBlock(comment.diff, 'diff')}`
406
+ : '';
407
+ return `@${comment.author} on ${location}:\n\n${blockQuote(comment.body)}${diffSection}`;
408
+ }
409
+ function formatActionItems(timeline) {
410
+ const changesRequested = timeline.filter((e) => e.type === 'review' && e.state === 'CHANGES_REQUESTED');
411
+ const needsResponse = timeline.filter((e) => e.type === 'review' && e.state === 'COMMENTED');
412
+ const items = [];
413
+ if (changesRequested.length > 0) {
414
+ items.push(h4('Changes Requested', ...changesRequested.map((r) => { var _a, _b; return `- @${r.author}: ${(_b = (_a = r.body) === null || _a === void 0 ? void 0 : _a.substring(0, 100)) !== null && _b !== void 0 ? _b : ''}...`; })));
415
+ }
416
+ if (needsResponse.length > 0) {
417
+ items.push(h4('Pending Responses', ...needsResponse.map((r) => { var _a, _b; return `- @${r.author}: ${(_b = (_a = r.body) === null || _a === void 0 ? void 0 : _a.substring(0, 100)) !== null && _b !== void 0 ? _b : ''}...`; })));
418
+ }
419
+ if (items.length === 0) {
420
+ items.push('No action items outstanding.');
421
+ }
422
+ return items.join('\n\n');
423
+ }
424
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { fetchPrData, formatDigest } from './digest';
2
+ export { getGitHubToken, parseGitHubUrl, validateOptions } from './utils';
3
+ export type { PrDigestInput, PrDigestOptions, PrInfo, TimelineEvent, } from './types';
4
+ export { default as cli } from './cli';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1E,YAAY,EACV,aAAa,EACb,eAAe,EACf,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { fetchPrData, formatDigest } from './digest';
2
+ export { getGitHubToken, parseGitHubUrl, validateOptions } from './utils';
3
+ export { default as cli } from './cli';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO1E,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC"}
@@ -0,0 +1,64 @@
1
+ export interface PrDigestOptions {
2
+ owner: string;
3
+ repo: string;
4
+ prNumber: number;
5
+ token?: string;
6
+ }
7
+ export interface PrDigestInput {
8
+ owner: string;
9
+ repo: string;
10
+ prNumber: number;
11
+ url?: string;
12
+ token?: string;
13
+ }
14
+ export interface PrInfo {
15
+ title: string;
16
+ number: number;
17
+ baseBranch: string;
18
+ headBranch: string;
19
+ description?: string;
20
+ url: string;
21
+ }
22
+ export interface ReviewComment {
23
+ id: string;
24
+ body: string;
25
+ author: string;
26
+ createdAt: string;
27
+ path?: string;
28
+ line?: number | null;
29
+ startLine?: number | null;
30
+ endLine?: number | null;
31
+ diff?: string | null;
32
+ }
33
+ export interface ReviewReply {
34
+ id: string;
35
+ body: string;
36
+ author: string;
37
+ createdAt: string;
38
+ }
39
+ export type TimelineEvent = {
40
+ type: 'push';
41
+ sha: string;
42
+ message: string;
43
+ url: string;
44
+ createdAt: string;
45
+ author?: {
46
+ login: string;
47
+ };
48
+ } | {
49
+ type: 'comment';
50
+ id: string;
51
+ body: string;
52
+ author: string;
53
+ createdAt: string;
54
+ } | {
55
+ type: 'review';
56
+ id: string;
57
+ author: string;
58
+ createdAt: string;
59
+ state: 'APPROVED' | 'CHANGES_REQUESTED' | 'COMMENTED' | 'DISMISSED';
60
+ body?: string;
61
+ comments: ReviewComment[];
62
+ replies: ReviewReply[];
63
+ };
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,WAAW,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { PrDigestInput } from './types';
2
+ export interface GitRepoInfo {
3
+ owner: string;
4
+ repo: string;
5
+ currentBranch: string;
6
+ }
7
+ export declare function getGitRepoInfo(): GitRepoInfo | null;
8
+ export declare function getGitHubToken(providedToken?: string): Promise<string | undefined>;
9
+ export declare function getPRFromBranch(owner: string, repo: string, branch: string, token?: string): Promise<number | undefined>;
10
+ export declare function parseGitHubUrl(url: string): {
11
+ owner: string;
12
+ repo: string;
13
+ prNumber: number;
14
+ } | null;
15
+ export declare function validateOptions(options: PrDigestInput): {
16
+ valid: boolean;
17
+ error?: string;
18
+ };
19
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAgCnD;AAID,wBAAsB,cAAc,CAClC,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA8B7B;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB1D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG;IACvD,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAYA"}
package/dist/utils.js ADDED
@@ -0,0 +1,115 @@
1
+ import { __awaiter } from "tslib";
2
+ import { execSync } from 'child_process';
3
+ import { Octokit } from '@octokit/rest';
4
+ export function getGitRepoInfo() {
5
+ try {
6
+ const remoteUrl = execSync('git remote get-url origin', {
7
+ encoding: 'utf8',
8
+ stdio: ['inherit', 'pipe'],
9
+ }).trim();
10
+ const patterns = [
11
+ /git@github\.com:([^/]+)\/([^/]+)\.git$/,
12
+ /github\.com[/:]([^/]+)\/([^/]+?)(\.git)?$/,
13
+ ];
14
+ for (const pattern of patterns) {
15
+ const match = remoteUrl.match(pattern);
16
+ if (match) {
17
+ const owner = match[1];
18
+ const repo = match[2];
19
+ const currentBranch = execSync('git branch --show-current', {
20
+ encoding: 'utf8',
21
+ stdio: ['inherit', 'pipe'],
22
+ }).trim();
23
+ return { owner, repo, currentBranch };
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ catch (error) {
29
+ console.error(`Failed to get git repo info: ${error}`);
30
+ return null;
31
+ }
32
+ }
33
+ let cachedToken = null;
34
+ export function getGitHubToken(providedToken) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ if (providedToken) {
37
+ return providedToken;
38
+ }
39
+ if (cachedToken !== null) {
40
+ return cachedToken;
41
+ }
42
+ if (process.env.GH_TOKEN) {
43
+ cachedToken = process.env.GH_TOKEN;
44
+ return cachedToken;
45
+ }
46
+ if (process.env.GITHUB_TOKEN) {
47
+ cachedToken = process.env.GITHUB_TOKEN;
48
+ return cachedToken;
49
+ }
50
+ try {
51
+ const token = execSync('gh auth token', {
52
+ encoding: 'utf8',
53
+ stdio: ['inherit', 'pipe', 'pipe'],
54
+ }).trim();
55
+ cachedToken = token;
56
+ return token;
57
+ }
58
+ catch (_a) {
59
+ cachedToken = undefined;
60
+ return undefined;
61
+ }
62
+ });
63
+ }
64
+ export function getPRFromBranch(owner, repo, branch, token) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const octokit = new Octokit(token ? { auth: token } : undefined);
67
+ try {
68
+ const { data: pulls } = yield octokit.rest.pulls.list({
69
+ owner,
70
+ repo,
71
+ head: `${owner}:${branch}`,
72
+ state: 'open',
73
+ per_page: 1,
74
+ });
75
+ if (pulls.length > 0) {
76
+ return pulls[0].number;
77
+ }
78
+ return undefined;
79
+ }
80
+ catch (error) {
81
+ console.error(`Failed to find PR for branch ${branch}: ${error}`);
82
+ return undefined;
83
+ }
84
+ });
85
+ }
86
+ export function parseGitHubUrl(url) {
87
+ const patterns = [
88
+ /github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/,
89
+ /github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)/,
90
+ ];
91
+ for (const pattern of patterns) {
92
+ const match = url.match(pattern);
93
+ if (match) {
94
+ return {
95
+ owner: match[1],
96
+ repo: match[2].replace(/\.git$/, ''),
97
+ prNumber: parseInt(match[3], 10),
98
+ };
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ export function validateOptions(options) {
104
+ if (options.url) {
105
+ const parsed = parseGitHubUrl(options.url);
106
+ if (!parsed) {
107
+ return {
108
+ valid: false,
109
+ error: `Invalid GitHub URL: ${options.url}`,
110
+ };
111
+ }
112
+ }
113
+ return { valid: true };
114
+ }
115
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "pr-digest",
3
+ "version": "0.1.0",
4
+ "author": {
5
+ "name": "Craigory Coppola",
6
+ "url": "https://craigory.dev"
7
+ },
8
+ "bugs": {
9
+ "url": "https://github.com/AgentEnder/craigory-dev/issues"
10
+ },
11
+ "homepage": "https://craigory.dev",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/AgentEnder/craigory-dev.git"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "license": "MIT",
20
+ "type": "module",
21
+ "bin": {
22
+ "pr-digest": "./dist/cli.js"
23
+ },
24
+ "main": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "import": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "default": "./dist/index.js"
31
+ }
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "22.18.1",
35
+ "@typescript-eslint/eslint-plugin": "7.16.1",
36
+ "@typescript-eslint/parser": "7.16.1",
37
+ "@vitest/coverage-v8": "4.0.9",
38
+ "cli-forge": "^1.2.0",
39
+ "eslint": "8.57.0",
40
+ "tsx": "^4.21.0",
41
+ "typescript": "5.9.2",
42
+ "vitest": "4.0.9"
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "README.md"
47
+ ],
48
+ "dependencies": {
49
+ "@octokit/rest": "^21.0.1"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.lib.json",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest",
55
+ "lint": "eslint .",
56
+ "typecheck": "tsc -p tsconfig.json --noEmit",
57
+ "cli": "node dist/cli.js"
58
+ }
59
+ }