scai 0.1.81 ā 0.1.82
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 +11 -4
- package/dist/commands/ReviewCmd.js +16 -4
- package/dist/github/github.js +38 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -149,15 +149,22 @@ SCAI supports an integrated review flow for GitHub pull requests. To get started
|
|
|
149
149
|
|
|
150
150
|
```sh
|
|
151
151
|
$ scai git review -a
|
|
152
|
-
š Fetching pull requests and diffs...
|
|
153
152
|
š¦ Resolving GitHub repo info from indexDir: ./
|
|
154
153
|
š Git origin URL: git@github.com:org/repo.git
|
|
155
154
|
ā
Parsed: owner='org', repo='repo'
|
|
156
|
-
š¤ Authenticated user:
|
|
155
|
+
š¤ Authenticated user: dev-user123
|
|
156
|
+
|
|
157
|
+
š Fetching pull requests and diffs...
|
|
158
|
+
ā
Fetched 5 PR(s) with diffs.
|
|
157
159
|
|
|
158
160
|
š¦ Open Pull Requests with review requested:
|
|
159
|
-
|
|
160
|
-
|
|
161
|
+
| # | ID | TITLE | AUTHOR | STATUS | CREATED | REVIEWERS | REVIEWS |
|
|
162
|
+
| - | ---- | ----------------------------- | ---------- | ------ | ---------- | ----------------------------- | ------------------- |
|
|
163
|
+
| 1 | #120 | fix/session-timeout | dev-alice | Open | 2025-08-08 | code-analyzer\[bot], dev-bob | ā
Approved |
|
|
164
|
+
| 2 | #118 | feature/1482-support-wfs2 | dev-carol | Open | 2025-08-07 | code-analyzer\[bot], dev-dave | ā
Approved |
|
|
165
|
+
| 3 | #117 | refactor/win-server-support | dev-erin | Open | 2025-08-06 | dev-frank, dev-alice | ā Changes Requested |
|
|
166
|
+
| 4 | #114 | bump/vue-i18n-9.14.5 | dependabot | Open | 2025-08-04 | code-analyzer\[bot] | ā
Approved |
|
|
167
|
+
| 5 | #113 | bugfix/null-navigator-check | dev-bob | Open | 2025-08-03 | dev-alice, dev-carol | ā
Approved |
|
|
161
168
|
|
|
162
169
|
š Choose a PR to review [1-2]: 1
|
|
163
170
|
ā
Model response received.
|
|
@@ -85,11 +85,21 @@ function askUserToPickPR(prs) {
|
|
|
85
85
|
const rows = prs.map((pr, i) => ({
|
|
86
86
|
'#': i + 1,
|
|
87
87
|
ID: `#${pr.number}`,
|
|
88
|
-
Title: truncate(pr.title, 50),
|
|
89
|
-
Author: pr.user || 'ā',
|
|
88
|
+
Title: chalk.gray(truncate(pr.title, 50)),
|
|
89
|
+
Author: chalk.magentaBright(pr.user || 'ā'),
|
|
90
90
|
Status: pr.draft ? 'Draft' : 'Open',
|
|
91
91
|
Created: pr.created_at?.split('T')[0] || '',
|
|
92
|
-
Reviewers: pr.requested_reviewers?.
|
|
92
|
+
'Requested Reviewers': pr.requested_reviewers?.length
|
|
93
|
+
? pr.requested_reviewers.join(', ')
|
|
94
|
+
: chalk.gray('ā'),
|
|
95
|
+
'Actual Reviewers': pr.reviewers?.length
|
|
96
|
+
? chalk.cyan(pr.reviewers.join(', '))
|
|
97
|
+
: chalk.gray('ā'),
|
|
98
|
+
Reviews: pr.review_status === 'Approved'
|
|
99
|
+
? chalk.green('Approved')
|
|
100
|
+
: pr.review_status === 'Changes Requested'
|
|
101
|
+
? chalk.red('Changes Requested')
|
|
102
|
+
: chalk.gray('ā'),
|
|
93
103
|
}));
|
|
94
104
|
console.log(chalk.blue("\nš¦ Open Pull Requests:"));
|
|
95
105
|
console.log(columnify(rows, {
|
|
@@ -97,7 +107,9 @@ function askUserToPickPR(prs) {
|
|
|
97
107
|
headingTransform: (h) => chalk.cyan(h.toUpperCase()),
|
|
98
108
|
config: {
|
|
99
109
|
Title: { maxWidth: 50 },
|
|
100
|
-
Reviewers: { maxWidth: 30 }
|
|
110
|
+
'Requested Reviewers': { maxWidth: 30 },
|
|
111
|
+
'Actual Reviewers': { maxWidth: 30 },
|
|
112
|
+
Reviews: { maxWidth: 20 },
|
|
101
113
|
}
|
|
102
114
|
}));
|
|
103
115
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
package/dist/github/github.js
CHANGED
|
@@ -12,16 +12,45 @@ export async function fetchOpenPullRequests(token, owner, repo) {
|
|
|
12
12
|
throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);
|
|
13
13
|
}
|
|
14
14
|
const prs = await res.json();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
const augmentedPRs = await Promise.all(prs.map(async (pr) => {
|
|
16
|
+
const reviewsRes = await fetch(`${pr.url}/reviews`, {
|
|
17
|
+
headers: {
|
|
18
|
+
Authorization: `token ${token}`,
|
|
19
|
+
Accept: 'application/vnd.github.v3+json',
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
let latestState = 'ā';
|
|
23
|
+
let reviewers = [];
|
|
24
|
+
if (reviewsRes.ok) {
|
|
25
|
+
const reviews = await reviewsRes.json();
|
|
26
|
+
const latestPerUser = new Map();
|
|
27
|
+
for (const review of reviews) {
|
|
28
|
+
latestPerUser.set(review.user.login, review.state);
|
|
29
|
+
}
|
|
30
|
+
reviewers = [...latestPerUser.keys()]; // ā
actual reviewers
|
|
31
|
+
if ([...latestPerUser.values()].includes('CHANGES_REQUESTED')) {
|
|
32
|
+
latestState = 'Changes Requested';
|
|
33
|
+
}
|
|
34
|
+
else if ([...latestPerUser.values()].includes('APPROVED')) {
|
|
35
|
+
latestState = 'Approved';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
number: pr.number,
|
|
40
|
+
title: pr.title,
|
|
41
|
+
url: pr.url,
|
|
42
|
+
diff_url: pr.diff_url,
|
|
43
|
+
draft: pr.draft,
|
|
44
|
+
merged_at: pr.merged_at,
|
|
45
|
+
base: pr.base,
|
|
46
|
+
user: pr.user?.login || 'unknown',
|
|
47
|
+
created_at: pr.created_at,
|
|
48
|
+
requested_reviewers: pr.requested_reviewers?.map((r) => r.login) || [],
|
|
49
|
+
reviewers,
|
|
50
|
+
review_status: latestState,
|
|
51
|
+
};
|
|
24
52
|
}));
|
|
53
|
+
return augmentedPRs;
|
|
25
54
|
}
|
|
26
55
|
export async function getGitHubUsername(token) {
|
|
27
56
|
const res = await fetch('https://api.github.com/user', {
|