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 +97 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +98 -0
- package/dist/cli.js.map +1 -0
- package/dist/digest.d.ts +20 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +424 -0
- package/dist/digest.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +64 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +115 -0
- package/dist/utils.js.map +1 -0
- package/package.json +59 -0
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/digest.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -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":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AASxC,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE;YACtD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;SAC3B,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,MAAM,QAAQ,GAAG;YACf,wCAAwC;YACxC,2CAA2C;SAC5C,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEtB,MAAM,aAAa,GAAG,QAAQ,CAAC,2BAA2B,EAAE;oBAC1D,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;iBAC3B,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,IAAI,WAAW,GAA8B,IAAI,CAAC;AAElD,MAAM,UAAgB,cAAc,CAClC,aAAsB;;QAEtB,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7B,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE;gBACtC,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;aACnC,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,WAAW,GAAG,KAAK,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,WAAM,CAAC;YACP,WAAW,GAAG,SAAS,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CAAA;AAED,MAAM,UAAgB,eAAe,CACnC,KAAa,EACb,IAAY,EACZ,MAAc,EACd,KAAc;;QAEd,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACpD,KAAK;gBACL,IAAI;gBACJ,IAAI,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE;gBAC1B,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;YAClE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CAAA;AAED,MAAM,UAAU,cAAc,CAC5B,GAAW;IAEX,MAAM,QAAQ,GAAG;QACf,4CAA4C;QAC5C,8CAA8C;KAC/C,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAsB;IAIpD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,uBAAuB,OAAO,CAAC,GAAG,EAAE;aAC5C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
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
|
+
}
|