gitgrip 0.2.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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/actions/cross-repo-sync/action.yml +55 -0
  4. package/assets/banner.svg +73 -0
  5. package/assets/icon.svg +30 -0
  6. package/assets/logo-dark.svg +36 -0
  7. package/assets/logo.svg +36 -0
  8. package/dist/commands/add.d.ts +9 -0
  9. package/dist/commands/add.d.ts.map +1 -0
  10. package/dist/commands/add.js +80 -0
  11. package/dist/commands/add.js.map +1 -0
  12. package/dist/commands/bench.d.ts +12 -0
  13. package/dist/commands/bench.d.ts.map +1 -0
  14. package/dist/commands/bench.js +136 -0
  15. package/dist/commands/bench.js.map +1 -0
  16. package/dist/commands/branch.d.ts +15 -0
  17. package/dist/commands/branch.d.ts.map +1 -0
  18. package/dist/commands/branch.js +159 -0
  19. package/dist/commands/branch.js.map +1 -0
  20. package/dist/commands/checkout.d.ts +10 -0
  21. package/dist/commands/checkout.d.ts.map +1 -0
  22. package/dist/commands/checkout.js +85 -0
  23. package/dist/commands/checkout.js.map +1 -0
  24. package/dist/commands/commit.d.ts +10 -0
  25. package/dist/commands/commit.d.ts.map +1 -0
  26. package/dist/commands/commit.js +94 -0
  27. package/dist/commands/commit.js.map +1 -0
  28. package/dist/commands/diff.d.ts +11 -0
  29. package/dist/commands/diff.d.ts.map +1 -0
  30. package/dist/commands/diff.js +105 -0
  31. package/dist/commands/diff.js.map +1 -0
  32. package/dist/commands/env.d.ts +8 -0
  33. package/dist/commands/env.d.ts.map +1 -0
  34. package/dist/commands/env.js +35 -0
  35. package/dist/commands/env.js.map +1 -0
  36. package/dist/commands/forall.d.ts +13 -0
  37. package/dist/commands/forall.d.ts.map +1 -0
  38. package/dist/commands/forall.js +116 -0
  39. package/dist/commands/forall.js.map +1 -0
  40. package/dist/commands/init.d.ts +15 -0
  41. package/dist/commands/init.d.ts.map +1 -0
  42. package/dist/commands/init.js +106 -0
  43. package/dist/commands/init.js.map +1 -0
  44. package/dist/commands/link.d.ts +11 -0
  45. package/dist/commands/link.d.ts.map +1 -0
  46. package/dist/commands/link.js +205 -0
  47. package/dist/commands/link.js.map +1 -0
  48. package/dist/commands/migrate.d.ts +17 -0
  49. package/dist/commands/migrate.d.ts.map +1 -0
  50. package/dist/commands/migrate.js +180 -0
  51. package/dist/commands/migrate.js.map +1 -0
  52. package/dist/commands/pr/create.d.ts +13 -0
  53. package/dist/commands/pr/create.d.ts.map +1 -0
  54. package/dist/commands/pr/create.js +202 -0
  55. package/dist/commands/pr/create.js.map +1 -0
  56. package/dist/commands/pr/index.d.ts +4 -0
  57. package/dist/commands/pr/index.d.ts.map +1 -0
  58. package/dist/commands/pr/index.js +4 -0
  59. package/dist/commands/pr/index.js.map +1 -0
  60. package/dist/commands/pr/merge.d.ts +11 -0
  61. package/dist/commands/pr/merge.d.ts.map +1 -0
  62. package/dist/commands/pr/merge.js +168 -0
  63. package/dist/commands/pr/merge.js.map +1 -0
  64. package/dist/commands/pr/status.d.ts +9 -0
  65. package/dist/commands/pr/status.d.ts.map +1 -0
  66. package/dist/commands/pr/status.js +139 -0
  67. package/dist/commands/pr/status.js.map +1 -0
  68. package/dist/commands/push.d.ts +10 -0
  69. package/dist/commands/push.d.ts.map +1 -0
  70. package/dist/commands/push.js +101 -0
  71. package/dist/commands/push.js.map +1 -0
  72. package/dist/commands/run.d.ts +8 -0
  73. package/dist/commands/run.d.ts.map +1 -0
  74. package/dist/commands/run.js +75 -0
  75. package/dist/commands/run.js.map +1 -0
  76. package/dist/commands/status.d.ts +9 -0
  77. package/dist/commands/status.d.ts.map +1 -0
  78. package/dist/commands/status.js +201 -0
  79. package/dist/commands/status.js.map +1 -0
  80. package/dist/commands/sync.d.ts +13 -0
  81. package/dist/commands/sync.d.ts.map +1 -0
  82. package/dist/commands/sync.js +183 -0
  83. package/dist/commands/sync.js.map +1 -0
  84. package/dist/index.d.ts +3 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +352 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/lib/__bench__/files.bench.d.ts +2 -0
  89. package/dist/lib/__bench__/files.bench.d.ts.map +1 -0
  90. package/dist/lib/__bench__/files.bench.js +52 -0
  91. package/dist/lib/__bench__/files.bench.js.map +1 -0
  92. package/dist/lib/__bench__/manifest.bench.d.ts +2 -0
  93. package/dist/lib/__bench__/manifest.bench.d.ts.map +1 -0
  94. package/dist/lib/__bench__/manifest.bench.js +74 -0
  95. package/dist/lib/__bench__/manifest.bench.js.map +1 -0
  96. package/dist/lib/files.d.ts +84 -0
  97. package/dist/lib/files.d.ts.map +1 -0
  98. package/dist/lib/files.js +492 -0
  99. package/dist/lib/files.js.map +1 -0
  100. package/dist/lib/git.d.ts +125 -0
  101. package/dist/lib/git.d.ts.map +1 -0
  102. package/dist/lib/git.js +370 -0
  103. package/dist/lib/git.js.map +1 -0
  104. package/dist/lib/github.d.ts +92 -0
  105. package/dist/lib/github.d.ts.map +1 -0
  106. package/dist/lib/github.js +284 -0
  107. package/dist/lib/github.js.map +1 -0
  108. package/dist/lib/hooks.d.ts +19 -0
  109. package/dist/lib/hooks.d.ts.map +1 -0
  110. package/dist/lib/hooks.js +63 -0
  111. package/dist/lib/hooks.js.map +1 -0
  112. package/dist/lib/linker.d.ts +56 -0
  113. package/dist/lib/linker.d.ts.map +1 -0
  114. package/dist/lib/linker.js +185 -0
  115. package/dist/lib/linker.js.map +1 -0
  116. package/dist/lib/manifest.d.ts +73 -0
  117. package/dist/lib/manifest.d.ts.map +1 -0
  118. package/dist/lib/manifest.js +400 -0
  119. package/dist/lib/manifest.js.map +1 -0
  120. package/dist/lib/scripts.d.ts +26 -0
  121. package/dist/lib/scripts.d.ts.map +1 -0
  122. package/dist/lib/scripts.js +123 -0
  123. package/dist/lib/scripts.js.map +1 -0
  124. package/dist/lib/timing.d.ts +100 -0
  125. package/dist/lib/timing.d.ts.map +1 -0
  126. package/dist/lib/timing.js +293 -0
  127. package/dist/lib/timing.js.map +1 -0
  128. package/dist/types.d.ts +312 -0
  129. package/dist/types.d.ts.map +1 -0
  130. package/dist/types.js +2 -0
  131. package/dist/types.js.map +1 -0
  132. package/package.json +60 -0
@@ -0,0 +1,284 @@
1
+ import { Octokit } from '@octokit/rest';
2
+ import { execSync } from 'child_process';
3
+ let octokitInstance = null;
4
+ /**
5
+ * Get GitHub token from environment or gh CLI
6
+ */
7
+ export function getGitHubToken() {
8
+ // Try environment variable first
9
+ if (process.env.GITHUB_TOKEN) {
10
+ return process.env.GITHUB_TOKEN;
11
+ }
12
+ // Try gh CLI
13
+ try {
14
+ const token = execSync('gh auth token', { encoding: 'utf-8' }).trim();
15
+ if (token) {
16
+ return token;
17
+ }
18
+ }
19
+ catch {
20
+ // gh CLI not available or not authenticated
21
+ }
22
+ throw new Error('GitHub token not found. Set GITHUB_TOKEN environment variable or run "gh auth login"');
23
+ }
24
+ /**
25
+ * Get or create Octokit instance
26
+ */
27
+ export function getOctokit() {
28
+ if (!octokitInstance) {
29
+ const token = getGitHubToken();
30
+ octokitInstance = new Octokit({ auth: token });
31
+ }
32
+ return octokitInstance;
33
+ }
34
+ /**
35
+ * Create a pull request
36
+ */
37
+ export async function createPullRequest(owner, repo, head, base, title, body, draft = false) {
38
+ const octokit = getOctokit();
39
+ const response = await octokit.pulls.create({
40
+ owner,
41
+ repo,
42
+ head,
43
+ base,
44
+ title,
45
+ body,
46
+ draft,
47
+ });
48
+ return {
49
+ number: response.data.number,
50
+ url: response.data.html_url,
51
+ };
52
+ }
53
+ /**
54
+ * Update a pull request body
55
+ */
56
+ export async function updatePullRequestBody(owner, repo, pullNumber, body) {
57
+ const octokit = getOctokit();
58
+ await octokit.pulls.update({
59
+ owner,
60
+ repo,
61
+ pull_number: pullNumber,
62
+ body,
63
+ });
64
+ }
65
+ /**
66
+ * Get pull request details
67
+ */
68
+ export async function getPullRequest(owner, repo, pullNumber) {
69
+ const octokit = getOctokit();
70
+ const response = await octokit.pulls.get({
71
+ owner,
72
+ repo,
73
+ pull_number: pullNumber,
74
+ });
75
+ return {
76
+ number: response.data.number,
77
+ url: response.data.html_url,
78
+ title: response.data.title,
79
+ body: response.data.body ?? '',
80
+ state: response.data.state,
81
+ merged: response.data.merged,
82
+ mergeable: response.data.mergeable,
83
+ head: {
84
+ ref: response.data.head.ref,
85
+ sha: response.data.head.sha,
86
+ },
87
+ base: {
88
+ ref: response.data.base.ref,
89
+ },
90
+ };
91
+ }
92
+ /**
93
+ * Get reviews for a pull request
94
+ */
95
+ export async function getPullRequestReviews(owner, repo, pullNumber) {
96
+ const octokit = getOctokit();
97
+ const response = await octokit.pulls.listReviews({
98
+ owner,
99
+ repo,
100
+ pull_number: pullNumber,
101
+ });
102
+ return response.data.map((review) => ({
103
+ state: review.state,
104
+ user: review.user?.login ?? 'unknown',
105
+ }));
106
+ }
107
+ /**
108
+ * Check if a PR is approved
109
+ */
110
+ export async function isPullRequestApproved(owner, repo, pullNumber) {
111
+ const reviews = await getPullRequestReviews(owner, repo, pullNumber);
112
+ // Consider approved if at least one APPROVED review and no CHANGES_REQUESTED
113
+ const hasApproval = reviews.some((r) => r.state === 'APPROVED');
114
+ const hasChangesRequested = reviews.some((r) => r.state === 'CHANGES_REQUESTED');
115
+ return hasApproval && !hasChangesRequested;
116
+ }
117
+ /**
118
+ * Get combined status checks for a PR
119
+ */
120
+ export async function getStatusChecks(owner, repo, ref) {
121
+ const octokit = getOctokit();
122
+ const response = await octokit.repos.getCombinedStatusForRef({
123
+ owner,
124
+ repo,
125
+ ref,
126
+ });
127
+ return {
128
+ state: response.data.state,
129
+ statuses: response.data.statuses.map((s) => ({
130
+ context: s.context,
131
+ state: s.state,
132
+ })),
133
+ };
134
+ }
135
+ /**
136
+ * Merge a pull request
137
+ */
138
+ export async function mergePullRequest(owner, repo, pullNumber, options = {}) {
139
+ const octokit = getOctokit();
140
+ const mergeMethod = options.method ?? 'merge';
141
+ try {
142
+ await octokit.pulls.merge({
143
+ owner,
144
+ repo,
145
+ pull_number: pullNumber,
146
+ merge_method: mergeMethod,
147
+ });
148
+ // Delete branch if requested
149
+ if (options.deleteBranch) {
150
+ const pr = await getPullRequest(owner, repo, pullNumber);
151
+ try {
152
+ await octokit.git.deleteRef({
153
+ owner,
154
+ repo,
155
+ ref: `heads/${pr.head.ref}`,
156
+ });
157
+ }
158
+ catch {
159
+ // Branch deletion failure is not critical
160
+ }
161
+ }
162
+ return true;
163
+ }
164
+ catch (error) {
165
+ return false;
166
+ }
167
+ }
168
+ /**
169
+ * Get full linked PR information
170
+ */
171
+ export async function getLinkedPRInfo(owner, repo, pullNumber, repoName) {
172
+ const pr = await getPullRequest(owner, repo, pullNumber);
173
+ const approved = await isPullRequestApproved(owner, repo, pullNumber);
174
+ const checks = await getStatusChecks(owner, repo, pr.head.sha);
175
+ let state;
176
+ if (pr.merged) {
177
+ state = 'merged';
178
+ }
179
+ else {
180
+ state = pr.state;
181
+ }
182
+ return {
183
+ repoName,
184
+ owner,
185
+ repo,
186
+ number: pr.number,
187
+ url: pr.url,
188
+ state,
189
+ approved,
190
+ checksPass: checks.state === 'success',
191
+ mergeable: pr.mergeable ?? false,
192
+ };
193
+ }
194
+ /**
195
+ * Find PRs with a specific branch name
196
+ */
197
+ export async function findPRByBranch(owner, repo, branch) {
198
+ const octokit = getOctokit();
199
+ const response = await octokit.pulls.list({
200
+ owner,
201
+ repo,
202
+ head: `${owner}:${branch}`,
203
+ state: 'open',
204
+ });
205
+ if (response.data.length > 0) {
206
+ return {
207
+ number: response.data[0].number,
208
+ url: response.data[0].html_url,
209
+ };
210
+ }
211
+ return null;
212
+ }
213
+ /**
214
+ * Create PRs for all repos with changes
215
+ */
216
+ export async function createLinkedPRs(repos, branchName, options, manifestPRNumber) {
217
+ const linkedPRs = [];
218
+ for (const repo of repos) {
219
+ // Check if PR already exists
220
+ const existing = await findPRByBranch(repo.owner, repo.repo, branchName);
221
+ if (existing) {
222
+ const info = await getLinkedPRInfo(repo.owner, repo.repo, existing.number, repo.name);
223
+ linkedPRs.push(info);
224
+ continue;
225
+ }
226
+ // Create title with manifest reference if available
227
+ const title = manifestPRNumber
228
+ ? `[manifest#${manifestPRNumber}] ${options.title}`
229
+ : options.title;
230
+ // Create body with cross-reference
231
+ let body = options.body ?? '';
232
+ if (manifestPRNumber) {
233
+ body = `Part of manifest PR #${manifestPRNumber}\n\n${body}`;
234
+ }
235
+ const pr = await createPullRequest(repo.owner, repo.repo, branchName, options.base ?? repo.default_branch, title, body, options.draft);
236
+ const info = await getLinkedPRInfo(repo.owner, repo.repo, pr.number, repo.name);
237
+ linkedPRs.push(info);
238
+ }
239
+ return linkedPRs;
240
+ }
241
+ /**
242
+ * Generate manifest PR body with linked PR table
243
+ */
244
+ export function generateManifestPRBody(title, linkedPRs, additionalBody) {
245
+ const prTable = linkedPRs
246
+ .map((pr) => {
247
+ const statusIcon = pr.state === 'merged' ? ':white_check_mark:' : pr.state === 'open' ? ':hourglass:' : ':x:';
248
+ const approvalIcon = pr.approved ? ':white_check_mark:' : ':hourglass:';
249
+ const checksIcon = pr.checksPass ? ':white_check_mark:' : ':hourglass:';
250
+ return `| ${pr.repoName} | [#${pr.number}](${pr.url}) | ${statusIcon} ${pr.state} | ${approvalIcon} | ${checksIcon} |`;
251
+ })
252
+ .join('\n');
253
+ const prLinks = linkedPRs.map((pr) => `${pr.repoName}#${pr.number}`).join(',');
254
+ return `## Cross-Repository PR
255
+
256
+ ${additionalBody ?? ''}
257
+
258
+ ### Linked Pull Requests
259
+
260
+ | Repository | PR | Status | Approved | Checks |
261
+ |------------|-----|--------|----------|--------|
262
+ ${prTable}
263
+
264
+ **Merge Policy:** All-or-nothing - all linked PRs must be approved before merge.
265
+
266
+ ---
267
+ <!-- codi-repo:links:${prLinks} -->
268
+ `;
269
+ }
270
+ /**
271
+ * Parse linked PRs from manifest PR body
272
+ */
273
+ export function parseLinkedPRsFromBody(body) {
274
+ const match = body.match(/<!-- codi-repo:links:(.+?) -->/);
275
+ if (!match) {
276
+ return [];
277
+ }
278
+ const links = match[1].split(',');
279
+ return links.map((link) => {
280
+ const [repoName, numStr] = link.split('#');
281
+ return { repoName, number: parseInt(numStr, 10) };
282
+ });
283
+ }
284
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/lib/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { HookCommand } from '../types.js';
2
+ export interface HookResult {
3
+ command: string;
4
+ cwd: string;
5
+ success: boolean;
6
+ exitCode: number | null;
7
+ stdout: string;
8
+ stderr: string;
9
+ error?: string;
10
+ }
11
+ /**
12
+ * Run a single hook command
13
+ */
14
+ export declare function runHookCommand(hook: HookCommand, rootDir: string, env?: Record<string, string>): Promise<HookResult>;
15
+ /**
16
+ * Run a list of hook commands sequentially
17
+ */
18
+ export declare function runHooks(hooks: HookCommand[], rootDir: string, env?: Record<string, string>): Promise<HookResult[]>;
19
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,UAAU,CAAC,CA+CrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAcvB"}
@@ -0,0 +1,63 @@
1
+ import { spawn } from 'child_process';
2
+ import { resolve } from 'path';
3
+ /**
4
+ * Run a single hook command
5
+ */
6
+ export async function runHookCommand(hook, rootDir, env) {
7
+ const cwd = hook.cwd ? resolve(rootDir, hook.cwd) : rootDir;
8
+ return new Promise((resolvePromise) => {
9
+ const proc = spawn(hook.command, [], {
10
+ cwd,
11
+ shell: true,
12
+ env: {
13
+ ...process.env,
14
+ ...env,
15
+ },
16
+ });
17
+ let stdout = '';
18
+ let stderr = '';
19
+ proc.stdout?.on('data', (data) => {
20
+ stdout += data.toString();
21
+ });
22
+ proc.stderr?.on('data', (data) => {
23
+ stderr += data.toString();
24
+ });
25
+ proc.on('close', (exitCode) => {
26
+ resolvePromise({
27
+ command: hook.command,
28
+ cwd,
29
+ success: exitCode === 0,
30
+ exitCode,
31
+ stdout,
32
+ stderr,
33
+ });
34
+ });
35
+ proc.on('error', (error) => {
36
+ resolvePromise({
37
+ command: hook.command,
38
+ cwd,
39
+ success: false,
40
+ exitCode: null,
41
+ stdout,
42
+ stderr,
43
+ error: error.message,
44
+ });
45
+ });
46
+ });
47
+ }
48
+ /**
49
+ * Run a list of hook commands sequentially
50
+ */
51
+ export async function runHooks(hooks, rootDir, env) {
52
+ const results = [];
53
+ for (const hook of hooks) {
54
+ const result = await runHookCommand(hook, rootDir, env);
55
+ results.push(result);
56
+ // Stop on first failure
57
+ if (!result.success) {
58
+ break;
59
+ }
60
+ }
61
+ return results;
62
+ }
63
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAa/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAiB,EACjB,OAAe,EACf,GAA4B;IAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5D,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE;YACnC,GAAG;YACH,KAAK,EAAE,IAAI;YACX,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,GAAG;aACP;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC5B,cAAc,CAAC;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG;gBACH,OAAO,EAAE,QAAQ,KAAK,CAAC;gBACvB,QAAQ;gBACR,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,cAAc,CAAC;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,IAAI;gBACd,MAAM;gBACN,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAoB,EACpB,OAAe,EACf,GAA4B;IAE5B,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { LinkedPR, ManifestPR, RepoInfo } from '../types.js';
2
+ import type { Manifest } from '../types.js';
3
+ /**
4
+ * Link a branch to a manifest PR in state
5
+ */
6
+ export declare function linkBranchToManifestPR(rootDir: string, branchName: string, manifestPRNumber: number): Promise<void>;
7
+ /**
8
+ * Save linked PRs for a manifest PR
9
+ */
10
+ export declare function saveLinkedPRs(rootDir: string, manifestPRNumber: number, linkedPRs: LinkedPR[]): Promise<void>;
11
+ /**
12
+ * Get the manifest PR number for a branch
13
+ */
14
+ export declare function getManifestPRForBranch(rootDir: string, branchName: string): Promise<number | undefined>;
15
+ /**
16
+ * Get linked PRs for a manifest PR from state
17
+ */
18
+ export declare function getLinkedPRsFromState(rootDir: string, manifestPRNumber: number): Promise<LinkedPR[] | undefined>;
19
+ /**
20
+ * Refresh linked PR status from GitHub
21
+ */
22
+ export declare function refreshLinkedPRStatus(manifest: Manifest, rootDir: string, linkedPRs: LinkedPR[]): Promise<LinkedPR[]>;
23
+ /**
24
+ * Get full manifest PR info with refreshed linked PR status
25
+ */
26
+ export declare function getManifestPRInfo(manifest: Manifest, rootDir: string, manifestOwner: string, manifestRepo: string, manifestPRNumber: number): Promise<ManifestPR>;
27
+ /**
28
+ * Update manifest PR body with current linked PR status
29
+ */
30
+ export declare function syncManifestPRBody(manifest: Manifest, rootDir: string, manifestOwner: string, manifestRepo: string, manifestPRNumber: number): Promise<void>;
31
+ /**
32
+ * Merge all linked PRs in order, then merge manifest PR
33
+ */
34
+ export declare function mergeAllLinkedPRs(manifest: Manifest, rootDir: string, manifestOwner: string, manifestRepo: string, manifestPRNumber: number, options?: {
35
+ method?: 'merge' | 'squash' | 'rebase';
36
+ deleteBranch?: boolean;
37
+ }): Promise<{
38
+ success: boolean;
39
+ mergedPRs: {
40
+ repoName: string;
41
+ number: number;
42
+ }[];
43
+ failedPR?: {
44
+ repoName: string;
45
+ number: number;
46
+ error: string;
47
+ };
48
+ }>;
49
+ /**
50
+ * Check if all linked PRs are in sync (same branch name exists)
51
+ */
52
+ export declare function checkBranchSync(repos: RepoInfo[], branchName: string): Promise<{
53
+ inSync: boolean;
54
+ missing: string[];
55
+ }>;
56
+ //# sourceMappingURL=linker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../../src/lib/linker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAC;AAW7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG7B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,CAGjC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAerB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/E,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE,CAAC,CA4ED;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgBjD"}
@@ -0,0 +1,185 @@
1
+ import { getLinkedPRInfo, getPullRequest, updatePullRequestBody, generateManifestPRBody, parseLinkedPRsFromBody, mergePullRequest, } from './github.js';
2
+ import { loadState, saveState, getAllRepoInfo } from './manifest.js';
3
+ /**
4
+ * Link a branch to a manifest PR in state
5
+ */
6
+ export async function linkBranchToManifestPR(rootDir, branchName, manifestPRNumber) {
7
+ const state = await loadState(rootDir);
8
+ state.branchToPR[branchName] = manifestPRNumber;
9
+ state.currentManifestPR = manifestPRNumber;
10
+ await saveState(rootDir, state);
11
+ }
12
+ /**
13
+ * Save linked PRs for a manifest PR
14
+ */
15
+ export async function saveLinkedPRs(rootDir, manifestPRNumber, linkedPRs) {
16
+ const state = await loadState(rootDir);
17
+ state.prLinks[manifestPRNumber] = linkedPRs;
18
+ await saveState(rootDir, state);
19
+ }
20
+ /**
21
+ * Get the manifest PR number for a branch
22
+ */
23
+ export async function getManifestPRForBranch(rootDir, branchName) {
24
+ const state = await loadState(rootDir);
25
+ return state.branchToPR[branchName];
26
+ }
27
+ /**
28
+ * Get linked PRs for a manifest PR from state
29
+ */
30
+ export async function getLinkedPRsFromState(rootDir, manifestPRNumber) {
31
+ const state = await loadState(rootDir);
32
+ return state.prLinks[manifestPRNumber];
33
+ }
34
+ /**
35
+ * Refresh linked PR status from GitHub
36
+ */
37
+ export async function refreshLinkedPRStatus(manifest, rootDir, linkedPRs) {
38
+ const repos = getAllRepoInfo(manifest, rootDir);
39
+ const repoMap = new Map(repos.map((r) => [r.name, r]));
40
+ const refreshed = await Promise.all(linkedPRs.map(async (pr) => {
41
+ const repoInfo = repoMap.get(pr.repoName);
42
+ if (!repoInfo) {
43
+ return pr; // Keep old info if repo not found
44
+ }
45
+ return getLinkedPRInfo(repoInfo.owner, repoInfo.repo, pr.number, pr.repoName);
46
+ }));
47
+ return refreshed;
48
+ }
49
+ /**
50
+ * Get full manifest PR info with refreshed linked PR status
51
+ */
52
+ export async function getManifestPRInfo(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber) {
53
+ const pr = await getPullRequest(manifestOwner, manifestRepo, manifestPRNumber);
54
+ // Parse linked PRs from body
55
+ const parsedLinks = parseLinkedPRsFromBody(pr.body);
56
+ const repos = getAllRepoInfo(manifest, rootDir);
57
+ const repoMap = new Map(repos.map((r) => [r.name, r]));
58
+ // Get fresh status for each linked PR
59
+ const linkedPRs = await Promise.all(parsedLinks.map(async ({ repoName, number }) => {
60
+ const repoInfo = repoMap.get(repoName);
61
+ if (!repoInfo) {
62
+ // Return placeholder if repo not in manifest
63
+ return {
64
+ repoName,
65
+ owner: '',
66
+ repo: '',
67
+ number,
68
+ url: '',
69
+ state: 'closed',
70
+ approved: false,
71
+ checksPass: false,
72
+ mergeable: false,
73
+ };
74
+ }
75
+ return getLinkedPRInfo(repoInfo.owner, repoInfo.repo, number, repoName);
76
+ }));
77
+ // Determine overall state
78
+ let state;
79
+ if (pr.merged) {
80
+ state = 'merged';
81
+ }
82
+ else {
83
+ state = pr.state;
84
+ }
85
+ // Check if ready to merge (all linked PRs approved and checks pass)
86
+ const readyToMerge = state === 'open' &&
87
+ linkedPRs.every((p) => p.approved && p.checksPass && p.mergeable && p.state === 'open');
88
+ return {
89
+ number: pr.number,
90
+ url: pr.url,
91
+ title: pr.title,
92
+ linkedPRs,
93
+ state,
94
+ readyToMerge,
95
+ };
96
+ }
97
+ /**
98
+ * Update manifest PR body with current linked PR status
99
+ */
100
+ export async function syncManifestPRBody(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber) {
101
+ const manifestPR = await getManifestPRInfo(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber);
102
+ // Get original PR for title
103
+ const pr = await getPullRequest(manifestOwner, manifestRepo, manifestPRNumber);
104
+ // Generate updated body
105
+ const newBody = generateManifestPRBody(pr.title, manifestPR.linkedPRs);
106
+ // Update PR
107
+ await updatePullRequestBody(manifestOwner, manifestRepo, manifestPRNumber, newBody);
108
+ }
109
+ /**
110
+ * Merge all linked PRs in order, then merge manifest PR
111
+ */
112
+ export async function mergeAllLinkedPRs(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber, options = {}) {
113
+ const manifestPR = await getManifestPRInfo(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber);
114
+ if (!manifestPR.readyToMerge) {
115
+ const notReady = manifestPR.linkedPRs.find((p) => !p.approved || !p.checksPass || !p.mergeable || p.state !== 'open');
116
+ return {
117
+ success: false,
118
+ mergedPRs: [],
119
+ failedPR: notReady
120
+ ? {
121
+ repoName: notReady.repoName,
122
+ number: notReady.number,
123
+ error: !notReady.approved
124
+ ? 'Not approved'
125
+ : !notReady.checksPass
126
+ ? 'Checks not passing'
127
+ : !notReady.mergeable
128
+ ? 'Not mergeable'
129
+ : 'PR not open',
130
+ }
131
+ : undefined,
132
+ };
133
+ }
134
+ const mergedPRs = [];
135
+ // Merge each linked PR
136
+ for (const linkedPR of manifestPR.linkedPRs) {
137
+ const merged = await mergePullRequest(linkedPR.owner, linkedPR.repo, linkedPR.number, options);
138
+ if (!merged) {
139
+ return {
140
+ success: false,
141
+ mergedPRs,
142
+ failedPR: {
143
+ repoName: linkedPR.repoName,
144
+ number: linkedPR.number,
145
+ error: 'Merge failed',
146
+ },
147
+ };
148
+ }
149
+ mergedPRs.push({ repoName: linkedPR.repoName, number: linkedPR.number });
150
+ }
151
+ // Merge manifest PR
152
+ const manifestMerged = await mergePullRequest(manifestOwner, manifestRepo, manifestPRNumber, options);
153
+ if (!manifestMerged) {
154
+ return {
155
+ success: false,
156
+ mergedPRs,
157
+ failedPR: {
158
+ repoName: 'manifest',
159
+ number: manifestPRNumber,
160
+ error: 'Manifest PR merge failed',
161
+ },
162
+ };
163
+ }
164
+ mergedPRs.push({ repoName: 'manifest', number: manifestPRNumber });
165
+ return {
166
+ success: true,
167
+ mergedPRs,
168
+ };
169
+ }
170
+ /**
171
+ * Check if all linked PRs are in sync (same branch name exists)
172
+ */
173
+ export async function checkBranchSync(repos, branchName) {
174
+ const { branchExists } = await import('./git.js');
175
+ const results = await Promise.all(repos.map(async (repo) => {
176
+ const exists = await branchExists(repo.absolutePath, branchName);
177
+ return { name: repo.name, exists };
178
+ }));
179
+ const missing = results.filter((r) => !r.exists).map((r) => r.name);
180
+ return {
181
+ inSync: missing.length === 0,
182
+ missing,
183
+ };
184
+ }
185
+ //# sourceMappingURL=linker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linker.js","sourceRoot":"","sources":["../../src/lib/linker.ts"],"names":[],"mappings":"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"}