@relayflows/github-primitive 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.
Files changed (66) hide show
  1. package/DESIGN.md +1054 -0
  2. package/README.md +129 -0
  3. package/dist/actions/branches.d.ts +13 -0
  4. package/dist/actions/branches.d.ts.map +1 -0
  5. package/dist/actions/branches.js +59 -0
  6. package/dist/actions/branches.js.map +1 -0
  7. package/dist/actions/commits.d.ts +15 -0
  8. package/dist/actions/commits.d.ts.map +1 -0
  9. package/dist/actions/commits.js +71 -0
  10. package/dist/actions/commits.js.map +1 -0
  11. package/dist/actions/files.d.ts +40 -0
  12. package/dist/actions/files.d.ts.map +1 -0
  13. package/dist/actions/files.js +133 -0
  14. package/dist/actions/files.js.map +1 -0
  15. package/dist/actions/issues.d.ts +29 -0
  16. package/dist/actions/issues.d.ts.map +1 -0
  17. package/dist/actions/issues.js +120 -0
  18. package/dist/actions/issues.js.map +1 -0
  19. package/dist/actions/pulls.d.ts +40 -0
  20. package/dist/actions/pulls.d.ts.map +1 -0
  21. package/dist/actions/pulls.js +169 -0
  22. package/dist/actions/pulls.js.map +1 -0
  23. package/dist/actions/repos.d.ts +18 -0
  24. package/dist/actions/repos.d.ts.map +1 -0
  25. package/dist/actions/repos.js +70 -0
  26. package/dist/actions/repos.js.map +1 -0
  27. package/dist/actions/users.d.ts +13 -0
  28. package/dist/actions/users.d.ts.map +1 -0
  29. package/dist/actions/users.js +51 -0
  30. package/dist/actions/users.js.map +1 -0
  31. package/dist/actions/utils.d.ts +39 -0
  32. package/dist/actions/utils.d.ts.map +1 -0
  33. package/dist/actions/utils.js +173 -0
  34. package/dist/actions/utils.js.map +1 -0
  35. package/dist/adapter.d.ts +49 -0
  36. package/dist/adapter.d.ts.map +1 -0
  37. package/dist/adapter.js +493 -0
  38. package/dist/adapter.js.map +1 -0
  39. package/dist/client.d.ts +149 -0
  40. package/dist/client.d.ts.map +1 -0
  41. package/dist/client.js +254 -0
  42. package/dist/client.js.map +1 -0
  43. package/dist/cloud-runtime.d.ts +31 -0
  44. package/dist/cloud-runtime.d.ts.map +1 -0
  45. package/dist/cloud-runtime.js +202 -0
  46. package/dist/cloud-runtime.js.map +1 -0
  47. package/dist/constants.d.ts +8 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +8 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/index.d.ts +14 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +14 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/local-runtime.d.ts +46 -0
  56. package/dist/local-runtime.d.ts.map +1 -0
  57. package/dist/local-runtime.js +225 -0
  58. package/dist/local-runtime.js.map +1 -0
  59. package/dist/types.d.ts +513 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +50 -0
  62. package/dist/types.js.map +1 -0
  63. package/docs/actions.md +49 -0
  64. package/examples/github-client.ts +38 -0
  65. package/package.json +43 -0
  66. package/templates/repository-inspection.yaml +28 -0
@@ -0,0 +1,225 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { BaseGitHubAdapter } from './adapter.js';
3
+ import { appendQuery } from './actions/utils.js';
4
+ import { GitHubApiError, } from './types.js';
5
+ export class GhCliError extends Error {
6
+ command;
7
+ args;
8
+ exitCode;
9
+ stdout;
10
+ stderr;
11
+ cause;
12
+ constructor(message, options) {
13
+ super(message);
14
+ this.name = 'GhCliError';
15
+ this.command = options.command;
16
+ this.args = options.args;
17
+ this.exitCode = options.exitCode;
18
+ this.stdout = options.stdout ?? '';
19
+ this.stderr = options.stderr ?? '';
20
+ this.cause = options.cause;
21
+ }
22
+ }
23
+ export class GhCliClient extends BaseGitHubAdapter {
24
+ constructor(config = {}) {
25
+ super({
26
+ ...config,
27
+ runtime: 'local',
28
+ });
29
+ }
30
+ getRuntime() {
31
+ return 'local';
32
+ }
33
+ async isAuthenticated() {
34
+ try {
35
+ await this.runGhCommand(['auth', 'status'], {
36
+ parseJson: false,
37
+ timeout: Math.min(this.config.timeout, 10_000),
38
+ });
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ async getCurrentUser() {
46
+ const user = await this.request('GET', '/user');
47
+ if (!user.login) {
48
+ throw new GitHubApiError('GitHub user response did not include a login.');
49
+ }
50
+ return {
51
+ login: user.login,
52
+ name: user.name ?? undefined,
53
+ id: user.id,
54
+ type: user.type,
55
+ };
56
+ }
57
+ async request(method, path, options = {}) {
58
+ return this.executeWithRetries(async () => {
59
+ const request = this.buildApiCommand(method, path, options);
60
+ const result = await this.runGhCommand(request.args, {
61
+ input: request.input,
62
+ parseJson: true,
63
+ allowEmpty: true,
64
+ timeout: options.timeout ?? this.config.timeout,
65
+ signal: options.signal,
66
+ });
67
+ return result.data;
68
+ });
69
+ }
70
+ runGhCommand(args, options = {}) {
71
+ const command = this.config.ghPath;
72
+ const timeout = options.timeout ?? this.config.timeout;
73
+ const env = {
74
+ ...process.env,
75
+ ...this.config.env,
76
+ ...options.env,
77
+ };
78
+ return new Promise((resolve, reject) => {
79
+ const child = spawn(command, args, {
80
+ cwd: options.cwd ?? this.config.cwd,
81
+ env,
82
+ stdio: ['pipe', 'pipe', 'pipe'],
83
+ });
84
+ let stdout = '';
85
+ let stderr = '';
86
+ let finished = false;
87
+ const finish = (callback) => {
88
+ if (finished) {
89
+ return;
90
+ }
91
+ finished = true;
92
+ clearTimeout(timer);
93
+ options.signal?.removeEventListener('abort', abort);
94
+ callback();
95
+ };
96
+ const rejectWith = (error) => {
97
+ finish(() => reject(error));
98
+ };
99
+ const abort = () => {
100
+ child.kill('SIGTERM');
101
+ rejectWith(new GhCliError(`gh command aborted: ${command} ${args.join(' ')}`, {
102
+ command,
103
+ args,
104
+ stdout,
105
+ stderr,
106
+ }));
107
+ };
108
+ const timer = setTimeout(() => {
109
+ child.kill('SIGTERM');
110
+ rejectWith(new GhCliError(`gh command timed out after ${timeout}ms: ${command} ${args.join(' ')}`, {
111
+ command,
112
+ args,
113
+ stdout,
114
+ stderr,
115
+ }));
116
+ }, timeout);
117
+ if (options.signal?.aborted) {
118
+ abort();
119
+ return;
120
+ }
121
+ options.signal?.addEventListener('abort', abort, { once: true });
122
+ child.stdout.setEncoding('utf8');
123
+ child.stderr.setEncoding('utf8');
124
+ child.stdout.on('data', (chunk) => {
125
+ stdout += chunk;
126
+ });
127
+ child.stderr.on('data', (chunk) => {
128
+ stderr += chunk;
129
+ });
130
+ child.on('error', (error) => {
131
+ rejectWith(new GhCliError(`Failed to start gh command: ${error.message}`, {
132
+ command,
133
+ args,
134
+ stdout,
135
+ stderr,
136
+ cause: error,
137
+ }));
138
+ });
139
+ child.on('close', (exitCode) => {
140
+ if (finished) {
141
+ return;
142
+ }
143
+ if (exitCode !== 0) {
144
+ rejectWith(new GhCliError(stderr.trim() || `gh command failed with exit code ${exitCode}`, {
145
+ command,
146
+ args,
147
+ exitCode: exitCode ?? undefined,
148
+ stdout,
149
+ stderr,
150
+ }));
151
+ return;
152
+ }
153
+ try {
154
+ const data = this.parseCommandOutput(stdout, options);
155
+ finish(() => resolve({
156
+ args,
157
+ command,
158
+ exitCode: exitCode ?? 0,
159
+ stdout,
160
+ stderr,
161
+ data,
162
+ }));
163
+ }
164
+ catch (error) {
165
+ rejectWith(new GhCliError(error instanceof Error ? error.message : String(error), {
166
+ command,
167
+ args,
168
+ exitCode: exitCode ?? undefined,
169
+ stdout,
170
+ stderr,
171
+ cause: error,
172
+ }));
173
+ }
174
+ });
175
+ if (typeof options.input === 'string') {
176
+ child.stdin.end(options.input);
177
+ }
178
+ else {
179
+ child.stdin.end();
180
+ }
181
+ });
182
+ }
183
+ buildApiCommand(method, path, options) {
184
+ const args = [
185
+ 'api',
186
+ appendQuery(path, options.query),
187
+ '--method',
188
+ method,
189
+ '--header',
190
+ 'Accept: application/vnd.github+json',
191
+ '--header',
192
+ 'X-GitHub-Api-Version: 2022-11-28',
193
+ ];
194
+ for (const [name, value] of Object.entries(options.headers ?? {})) {
195
+ args.push('--header', `${name}: ${value}`);
196
+ }
197
+ if (typeof options.body !== 'undefined') {
198
+ args.push('--input', '-');
199
+ return {
200
+ args,
201
+ input: JSON.stringify(options.body),
202
+ };
203
+ }
204
+ return { args };
205
+ }
206
+ parseCommandOutput(stdout, options) {
207
+ if (options.parseJson === false) {
208
+ return stdout;
209
+ }
210
+ const trimmed = stdout.trim();
211
+ if (!trimmed) {
212
+ if (options.allowEmpty) {
213
+ return undefined;
214
+ }
215
+ throw new Error('gh command returned empty output where JSON was expected.');
216
+ }
217
+ try {
218
+ return JSON.parse(trimmed);
219
+ }
220
+ catch (error) {
221
+ throw new Error(`Failed to parse gh JSON output: ${error instanceof Error ? error.message : String(error)}`);
222
+ }
223
+ }
224
+ }
225
+ //# sourceMappingURL=local-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runtime.js","sourceRoot":"","sources":["../src/local-runtime.ts"],"names":[],"mappings":"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"}