@zhin.js/adapter-github 0.1.35 → 0.1.36
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/lib/adapter.d.ts +52 -9
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +254 -189
- package/lib/adapter.js.map +1 -1
- package/lib/bot.d.ts +5 -2
- package/lib/bot.d.ts.map +1 -1
- package/lib/bot.js +19 -26
- package/lib/bot.js.map +1 -1
- package/lib/{api.d.ts → gh-client.d.ts} +113 -42
- package/lib/gh-client.d.ts.map +1 -0
- package/lib/gh-client.js +555 -0
- package/lib/gh-client.js.map +1 -0
- package/lib/index.d.ts +4 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +212 -126
- package/lib/index.js.map +1 -1
- package/lib/types.d.ts +23 -29
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +2 -2
- package/lib/types.js.map +1 -1
- package/package.json +2 -2
- package/plugin.yml +1 -1
- package/skills/github/SKILL.md +17 -8
- package/src/adapter.ts +265 -188
- package/src/bot.ts +19 -25
- package/src/gh-client.ts +640 -0
- package/src/index.ts +219 -123
- package/src/types.ts +29 -34
- package/lib/api.d.ts.map +0 -1
- package/lib/api.js +0 -300
- package/lib/api.js.map +0 -1
- package/src/api.ts +0 -353
package/lib/api.js
DELETED
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub REST API 客户端
|
|
3
|
-
*
|
|
4
|
-
* 两种认证方式:
|
|
5
|
-
* 1. GitHub App (JWT): app_id + private_key → JWT → Installation Access Token
|
|
6
|
-
* 2. OAuth User: access_token → 以用户身份调用 API
|
|
7
|
-
*
|
|
8
|
-
* 零外部依赖,使用 Node.js 原生 crypto + fetch
|
|
9
|
-
*/
|
|
10
|
-
import crypto from 'node:crypto';
|
|
11
|
-
const API_BASE = 'https://api.github.com';
|
|
12
|
-
const ACCEPT = 'application/vnd.github+json';
|
|
13
|
-
const API_VERSION = '2022-11-28';
|
|
14
|
-
// ── JWT ──────────────────────────────────────────────────────────────
|
|
15
|
-
function createAppJWT(appId, privateKey) {
|
|
16
|
-
const now = Math.floor(Date.now() / 1000);
|
|
17
|
-
const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');
|
|
18
|
-
const payload = Buffer.from(JSON.stringify({
|
|
19
|
-
iss: appId,
|
|
20
|
-
iat: now - 60,
|
|
21
|
-
exp: now + 600,
|
|
22
|
-
})).toString('base64url');
|
|
23
|
-
const sign = crypto.createSign('RSA-SHA256');
|
|
24
|
-
sign.update(`${header}.${payload}`);
|
|
25
|
-
const signature = sign.sign(privateKey, 'base64url');
|
|
26
|
-
return `${header}.${payload}.${signature}`;
|
|
27
|
-
}
|
|
28
|
-
// ── API Client ───────────────────────────────────────────────────────
|
|
29
|
-
export class GitHubAPI {
|
|
30
|
-
appId;
|
|
31
|
-
privateKey;
|
|
32
|
-
installationId;
|
|
33
|
-
installationToken = null;
|
|
34
|
-
tokenExpiresAt = 0;
|
|
35
|
-
_user = null;
|
|
36
|
-
constructor(appId, privateKey, installationId) {
|
|
37
|
-
this.appId = appId;
|
|
38
|
-
this.privateKey = privateKey;
|
|
39
|
-
this.installationId = installationId;
|
|
40
|
-
}
|
|
41
|
-
get authenticatedUser() { return this._user; }
|
|
42
|
-
async getToken() {
|
|
43
|
-
if (this.installationToken && Date.now() < this.tokenExpiresAt - 60_000) {
|
|
44
|
-
return this.installationToken;
|
|
45
|
-
}
|
|
46
|
-
const jwt = createAppJWT(this.appId, this.privateKey);
|
|
47
|
-
if (!this.installationId) {
|
|
48
|
-
const res = await fetch(`${API_BASE}/app/installations`, {
|
|
49
|
-
headers: { Authorization: `Bearer ${jwt}`, Accept: ACCEPT, 'X-GitHub-Api-Version': API_VERSION },
|
|
50
|
-
});
|
|
51
|
-
if (!res.ok)
|
|
52
|
-
throw new Error(`获取 installations 失败: ${res.status} ${await res.text()}`);
|
|
53
|
-
const installations = await res.json();
|
|
54
|
-
if (!installations.length)
|
|
55
|
-
throw new Error('此 GitHub App 没有任何 installation');
|
|
56
|
-
this.installationId = installations[0].id;
|
|
57
|
-
}
|
|
58
|
-
const res = await fetch(`${API_BASE}/app/installations/${this.installationId}/access_tokens`, {
|
|
59
|
-
method: 'POST',
|
|
60
|
-
headers: { Authorization: `Bearer ${jwt}`, Accept: ACCEPT, 'X-GitHub-Api-Version': API_VERSION },
|
|
61
|
-
});
|
|
62
|
-
if (!res.ok)
|
|
63
|
-
throw new Error(`获取 installation token 失败: ${res.status} ${await res.text()}`);
|
|
64
|
-
const data = await res.json();
|
|
65
|
-
this.installationToken = data.token;
|
|
66
|
-
this.tokenExpiresAt = new Date(data.expires_at).getTime();
|
|
67
|
-
return this.installationToken;
|
|
68
|
-
}
|
|
69
|
-
async request(method, path, body) {
|
|
70
|
-
const token = await this.getToken();
|
|
71
|
-
const url = path.startsWith('http') ? path : `${API_BASE}${path}`;
|
|
72
|
-
const res = await fetch(url, {
|
|
73
|
-
method,
|
|
74
|
-
headers: {
|
|
75
|
-
Authorization: `Bearer ${token}`,
|
|
76
|
-
Accept: ACCEPT,
|
|
77
|
-
'X-GitHub-Api-Version': API_VERSION,
|
|
78
|
-
...(body ? { 'Content-Type': 'application/json' } : {}),
|
|
79
|
-
},
|
|
80
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
81
|
-
});
|
|
82
|
-
const text = await res.text();
|
|
83
|
-
let data;
|
|
84
|
-
try {
|
|
85
|
-
data = JSON.parse(text);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
data = text;
|
|
89
|
-
}
|
|
90
|
-
return { ok: res.ok, status: res.status, data };
|
|
91
|
-
}
|
|
92
|
-
async get(path) { return this.request('GET', path); }
|
|
93
|
-
async post(path, body) { return this.request('POST', path, body); }
|
|
94
|
-
async patch(path, body) { return this.request('PATCH', path, body); }
|
|
95
|
-
async put(path, body) { return this.request('PUT', path, body); }
|
|
96
|
-
async del(path, body) { return this.request('DELETE', path, body); }
|
|
97
|
-
// ── 连接验证 ──────────────────────────────────────────────────────
|
|
98
|
-
async verifyAuth() {
|
|
99
|
-
try {
|
|
100
|
-
await this.getToken();
|
|
101
|
-
const jwt = createAppJWT(this.appId, this.privateKey);
|
|
102
|
-
const res = await fetch(`${API_BASE}/app`, {
|
|
103
|
-
headers: { Authorization: `Bearer ${jwt}`, Accept: ACCEPT, 'X-GitHub-Api-Version': API_VERSION },
|
|
104
|
-
});
|
|
105
|
-
if (!res.ok)
|
|
106
|
-
return { ok: false, user: '', message: `App 认证失败: ${res.status}` };
|
|
107
|
-
const app = await res.json();
|
|
108
|
-
this._user = `${app.slug}[bot]`;
|
|
109
|
-
return { ok: true, user: this._user, message: `GitHub App: ${app.name}` };
|
|
110
|
-
}
|
|
111
|
-
catch (e) {
|
|
112
|
-
return { ok: false, user: '', message: e.message };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// ── Issue 评论 (聊天核心) ─────────────────────────────────────────
|
|
116
|
-
async createIssueComment(repo, issueNumber, body) {
|
|
117
|
-
return this.post(`/repos/${repo}/issues/${issueNumber}/comments`, { body });
|
|
118
|
-
}
|
|
119
|
-
async deleteIssueComment(repo, commentId) {
|
|
120
|
-
return this.del(`/repos/${repo}/issues/comments/${commentId}`);
|
|
121
|
-
}
|
|
122
|
-
async createPRComment(repo, prNumber, body) {
|
|
123
|
-
return this.createIssueComment(repo, prNumber, body);
|
|
124
|
-
}
|
|
125
|
-
async deletePRReviewComment(repo, commentId) {
|
|
126
|
-
return this.del(`/repos/${repo}/pulls/comments/${commentId}`);
|
|
127
|
-
}
|
|
128
|
-
// ── Pull Requests ─────────────────────────────────────────────────
|
|
129
|
-
async listPRs(repo, state = 'open', limit = 15) {
|
|
130
|
-
return this.get(`/repos/${repo}/pulls?state=${state}&per_page=${limit}`);
|
|
131
|
-
}
|
|
132
|
-
async getPR(repo, number) {
|
|
133
|
-
return this.get(`/repos/${repo}/pulls/${number}`);
|
|
134
|
-
}
|
|
135
|
-
async getPRDiff(repo, number) {
|
|
136
|
-
const token = await this.getToken();
|
|
137
|
-
const res = await fetch(`${API_BASE}/repos/${repo}/pulls/${number}`, {
|
|
138
|
-
headers: {
|
|
139
|
-
Authorization: `Bearer ${token}`,
|
|
140
|
-
Accept: 'application/vnd.github.diff',
|
|
141
|
-
'X-GitHub-Api-Version': API_VERSION,
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
return { ok: res.ok, data: await res.text() };
|
|
145
|
-
}
|
|
146
|
-
async mergePR(repo, number, method = 'squash') {
|
|
147
|
-
return this.put(`/repos/${repo}/pulls/${number}/merge`, { merge_method: method });
|
|
148
|
-
}
|
|
149
|
-
async createPR(repo, title, body, head, base = 'main') {
|
|
150
|
-
return this.post(`/repos/${repo}/pulls`, { title, body, head, base });
|
|
151
|
-
}
|
|
152
|
-
async createPRReview(repo, number, event, body) {
|
|
153
|
-
return this.post(`/repos/${repo}/pulls/${number}/reviews`, { event, body: body || '' });
|
|
154
|
-
}
|
|
155
|
-
async closePR(repo, number) {
|
|
156
|
-
return this.patch(`/repos/${repo}/pulls/${number}`, { state: 'closed' });
|
|
157
|
-
}
|
|
158
|
-
// ── Issues ────────────────────────────────────────────────────────
|
|
159
|
-
async listIssues(repo, state = 'open', limit = 15) {
|
|
160
|
-
return this.get(`/repos/${repo}/issues?state=${state}&per_page=${limit}&direction=desc`);
|
|
161
|
-
}
|
|
162
|
-
async getIssue(repo, number) {
|
|
163
|
-
return this.get(`/repos/${repo}/issues/${number}`);
|
|
164
|
-
}
|
|
165
|
-
async createIssue(repo, title, body, labels) {
|
|
166
|
-
return this.post(`/repos/${repo}/issues`, { title, body, labels });
|
|
167
|
-
}
|
|
168
|
-
async closeIssue(repo, number) {
|
|
169
|
-
return this.patch(`/repos/${repo}/issues/${number}`, { state: 'closed', state_reason: 'completed' });
|
|
170
|
-
}
|
|
171
|
-
// ── Repository ────────────────────────────────────────────────────
|
|
172
|
-
async getRepo(repo) {
|
|
173
|
-
return this.get(`/repos/${repo}`);
|
|
174
|
-
}
|
|
175
|
-
async listBranches(repo, limit = 30) {
|
|
176
|
-
return this.get(`/repos/${repo}/branches?per_page=${limit}`);
|
|
177
|
-
}
|
|
178
|
-
async listReleases(repo, limit = 10) {
|
|
179
|
-
return this.get(`/repos/${repo}/releases?per_page=${limit}`);
|
|
180
|
-
}
|
|
181
|
-
async listWorkflowRuns(repo, limit = 10) {
|
|
182
|
-
return this.get(`/repos/${repo}/actions/runs?per_page=${limit}`);
|
|
183
|
-
}
|
|
184
|
-
// ── Search ───────────────────────────────────────────────────────
|
|
185
|
-
async searchIssues(query, limit = 15) {
|
|
186
|
-
return this.get(`/search/issues?q=${encodeURIComponent(query)}&per_page=${limit}`);
|
|
187
|
-
}
|
|
188
|
-
async searchRepos(query, limit = 15) {
|
|
189
|
-
return this.get(`/search/repositories?q=${encodeURIComponent(query)}&per_page=${limit}`);
|
|
190
|
-
}
|
|
191
|
-
async searchCode(query, limit = 15) {
|
|
192
|
-
return this.get(`/search/code?q=${encodeURIComponent(query)}&per_page=${limit}`);
|
|
193
|
-
}
|
|
194
|
-
// ── Labels ───────────────────────────────────────────────────────
|
|
195
|
-
async listLabels(repo) {
|
|
196
|
-
return this.get(`/repos/${repo}/labels?per_page=100`);
|
|
197
|
-
}
|
|
198
|
-
async addLabels(repo, issueNumber, labels) {
|
|
199
|
-
return this.post(`/repos/${repo}/issues/${issueNumber}/labels`, { labels });
|
|
200
|
-
}
|
|
201
|
-
async removeLabel(repo, issueNumber, label) {
|
|
202
|
-
return this.del(`/repos/${repo}/issues/${issueNumber}/labels/${encodeURIComponent(label)}`);
|
|
203
|
-
}
|
|
204
|
-
// ── Assignees ────────────────────────────────────────────────────
|
|
205
|
-
async addAssignees(repo, issueNumber, assignees) {
|
|
206
|
-
return this.post(`/repos/${repo}/issues/${issueNumber}/assignees`, { assignees });
|
|
207
|
-
}
|
|
208
|
-
async removeAssignees(repo, issueNumber, assignees) {
|
|
209
|
-
return this.del(`/repos/${repo}/issues/${issueNumber}/assignees`, { assignees });
|
|
210
|
-
}
|
|
211
|
-
// ── File Content ─────────────────────────────────────────────────
|
|
212
|
-
async getFileContent(repo, filePath, ref) {
|
|
213
|
-
const qs = ref ? `?ref=${encodeURIComponent(ref)}` : '';
|
|
214
|
-
return this.get(`/repos/${repo}/contents/${filePath}${qs}`);
|
|
215
|
-
}
|
|
216
|
-
// ── Commits ──────────────────────────────────────────────────────
|
|
217
|
-
async listCommits(repo, sha, filePath, limit = 15) {
|
|
218
|
-
const params = new URLSearchParams({ per_page: String(limit) });
|
|
219
|
-
if (sha)
|
|
220
|
-
params.set('sha', sha);
|
|
221
|
-
if (filePath)
|
|
222
|
-
params.set('path', filePath);
|
|
223
|
-
return this.get(`/repos/${repo}/commits?${params}`);
|
|
224
|
-
}
|
|
225
|
-
async compareCommits(repo, base, head) {
|
|
226
|
-
return this.get(`/repos/${repo}/compare/${encodeURIComponent(base)}...${encodeURIComponent(head)}`);
|
|
227
|
-
}
|
|
228
|
-
// ── Update Issue / PR ────────────────────────────────────────────
|
|
229
|
-
async updateIssue(repo, number, data) {
|
|
230
|
-
return this.patch(`/repos/${repo}/issues/${number}`, data);
|
|
231
|
-
}
|
|
232
|
-
async updatePR(repo, number, data) {
|
|
233
|
-
return this.patch(`/repos/${repo}/pulls/${number}`, data);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// ── OAuth Token Exchange ─────────────────────────────────────────────
|
|
237
|
-
export async function exchangeOAuthCode(clientId, clientSecret, code) {
|
|
238
|
-
const res = await fetch('https://github.com/login/oauth/access_token', {
|
|
239
|
-
method: 'POST',
|
|
240
|
-
headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
|
|
241
|
-
body: JSON.stringify({ client_id: clientId, client_secret: clientSecret, code }),
|
|
242
|
-
});
|
|
243
|
-
if (!res.ok)
|
|
244
|
-
throw new Error(`OAuth token exchange failed: ${res.status}`);
|
|
245
|
-
const data = await res.json();
|
|
246
|
-
if (data.error)
|
|
247
|
-
throw new Error(`OAuth error: ${data.error_description || data.error}`);
|
|
248
|
-
return data;
|
|
249
|
-
}
|
|
250
|
-
export class GitHubOAuthClient {
|
|
251
|
-
accessToken;
|
|
252
|
-
constructor(accessToken) {
|
|
253
|
-
this.accessToken = accessToken;
|
|
254
|
-
}
|
|
255
|
-
async request(method, path, body) {
|
|
256
|
-
const url = path.startsWith('http') ? path : `${API_BASE}${path}`;
|
|
257
|
-
const res = await fetch(url, {
|
|
258
|
-
method,
|
|
259
|
-
headers: {
|
|
260
|
-
Authorization: `Bearer ${this.accessToken}`,
|
|
261
|
-
Accept: ACCEPT,
|
|
262
|
-
'X-GitHub-Api-Version': API_VERSION,
|
|
263
|
-
...(body ? { 'Content-Type': 'application/json' } : {}),
|
|
264
|
-
},
|
|
265
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
266
|
-
});
|
|
267
|
-
const text = await res.text();
|
|
268
|
-
let data;
|
|
269
|
-
try {
|
|
270
|
-
data = JSON.parse(text);
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
data = text;
|
|
274
|
-
}
|
|
275
|
-
return { ok: res.ok, status: res.status, data };
|
|
276
|
-
}
|
|
277
|
-
async getUser() {
|
|
278
|
-
return this.request('GET', '/user');
|
|
279
|
-
}
|
|
280
|
-
async starRepo(repo) {
|
|
281
|
-
return this.request('PUT', `/user/starred/${repo}`);
|
|
282
|
-
}
|
|
283
|
-
async unstarRepo(repo) {
|
|
284
|
-
return this.request('DELETE', `/user/starred/${repo}`);
|
|
285
|
-
}
|
|
286
|
-
async isStarred(repo) {
|
|
287
|
-
const res = await this.request('GET', `/user/starred/${repo}`);
|
|
288
|
-
return res.status === 204;
|
|
289
|
-
}
|
|
290
|
-
async forkRepo(repo) {
|
|
291
|
-
return this.request('POST', `/repos/${repo}/forks`);
|
|
292
|
-
}
|
|
293
|
-
async createIssue(repo, title, body, labels) {
|
|
294
|
-
return this.request('POST', `/repos/${repo}/issues`, { title, body, labels });
|
|
295
|
-
}
|
|
296
|
-
async createPR(repo, title, body, head, base = 'main') {
|
|
297
|
-
return this.request('POST', `/repos/${repo}/pulls`, { title, body, head, base });
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
//# sourceMappingURL=api.js.map
|
package/lib/api.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|