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
package/dist/index.js ADDED
@@ -0,0 +1,352 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { init } from './commands/init.js';
5
+ import { migrate } from './commands/migrate.js';
6
+ import { sync } from './commands/sync.js';
7
+ import { status } from './commands/status.js';
8
+ import { branch, listBranches } from './commands/branch.js';
9
+ import { checkout } from './commands/checkout.js';
10
+ import { createPR, prStatus, mergePRs } from './commands/pr/index.js';
11
+ import { link } from './commands/link.js';
12
+ import { run } from './commands/run.js';
13
+ import { env } from './commands/env.js';
14
+ import { bench } from './commands/bench.js';
15
+ import { commit } from './commands/commit.js';
16
+ import { push } from './commands/push.js';
17
+ import { add } from './commands/add.js';
18
+ import { diff } from './commands/diff.js';
19
+ import { forall } from './commands/forall.js';
20
+ import { TimingContext, formatTimingReport, setTimingContext, getTimingContext } from './lib/timing.js';
21
+ const program = new Command();
22
+ program
23
+ .name('gitgrip')
24
+ .description('git a grip - Multi-repo workflow tool\n\nShorthand: Use "gr" instead of "gitgrip"')
25
+ .version('0.2.0')
26
+ .option('--timing', 'Show timing breakdown for operations');
27
+ // Set up timing hooks
28
+ program.hook('preAction', (thisCommand) => {
29
+ const opts = thisCommand.optsWithGlobals();
30
+ if (opts.timing) {
31
+ setTimingContext(new TimingContext(true));
32
+ }
33
+ });
34
+ program.hook('postAction', () => {
35
+ const ctx = getTimingContext();
36
+ if (ctx && ctx.isEnabled()) {
37
+ console.log('\n' + formatTimingReport(ctx.getReport()));
38
+ setTimingContext(undefined);
39
+ }
40
+ });
41
+ // Init command - AOSP-style with manifest URL
42
+ program
43
+ .command('init <manifest-url>')
44
+ .description('Initialize a gitgrip workspace from a manifest repository')
45
+ .option('-b, --branch <branch>', 'Branch to clone from manifest repository')
46
+ .action(async (manifestUrl, options) => {
47
+ try {
48
+ await init(manifestUrl, { branch: options.branch });
49
+ }
50
+ catch (error) {
51
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
52
+ process.exit(1);
53
+ }
54
+ });
55
+ // Migrate command - convert legacy format to new structure
56
+ program
57
+ .command('migrate')
58
+ .description('Migrate from legacy format to .gitgrip/manifests/ structure')
59
+ .option('-f, --force', 'Skip confirmation prompts')
60
+ .option('-r, --remote <url>', 'Remote URL to push manifest repository')
61
+ .action(async (options) => {
62
+ try {
63
+ await migrate(options);
64
+ }
65
+ catch (error) {
66
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
67
+ process.exit(1);
68
+ }
69
+ });
70
+ // Sync command
71
+ program
72
+ .command('sync')
73
+ .description('Pull latest changes from manifest and all repositories')
74
+ .option('--fetch', 'Fetch only (do not merge)')
75
+ .option('--no-link', 'Skip processing copyfile/linkfile entries')
76
+ .option('--no-hooks', 'Skip running post-sync hooks')
77
+ .action(async (options) => {
78
+ try {
79
+ await sync({
80
+ fetch: options.fetch,
81
+ noLink: !options.link,
82
+ noHooks: !options.hooks,
83
+ });
84
+ }
85
+ catch (error) {
86
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
87
+ process.exit(1);
88
+ }
89
+ });
90
+ // Status command
91
+ program
92
+ .command('status')
93
+ .description('Show status of all repositories')
94
+ .option('--json', 'Output as JSON')
95
+ .action(async (options) => {
96
+ try {
97
+ await status(options);
98
+ }
99
+ catch (error) {
100
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
101
+ process.exit(1);
102
+ }
103
+ });
104
+ // Branch command
105
+ program
106
+ .command('branch [name]')
107
+ .description('Create or list branches across all repositories')
108
+ .option('-c, --create', 'Create a new branch')
109
+ .option('-r, --repo <repos...>', 'Only operate on specific repositories')
110
+ .option('--include-manifest', 'Include manifest repo in branch operation')
111
+ .action(async (name, options) => {
112
+ try {
113
+ if (name) {
114
+ await branch(name, { create: options.create, repo: options.repo, includeManifest: options.includeManifest });
115
+ }
116
+ else {
117
+ await listBranches();
118
+ }
119
+ }
120
+ catch (error) {
121
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
122
+ process.exit(1);
123
+ }
124
+ });
125
+ // Checkout command
126
+ program
127
+ .command('checkout <branch>')
128
+ .description('Checkout a branch across all repositories')
129
+ .option('-b', 'Create the branch if it does not exist')
130
+ .option('--no-hooks', 'Skip running post-checkout hooks')
131
+ .action(async (branchName, options) => {
132
+ try {
133
+ await checkout(branchName, { create: options.b, noHooks: !options.hooks });
134
+ }
135
+ catch (error) {
136
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
137
+ process.exit(1);
138
+ }
139
+ });
140
+ // Link command
141
+ program
142
+ .command('link')
143
+ .description('Create/update copyfile and linkfile entries')
144
+ .option('--status', 'Show link status (valid, broken, missing)')
145
+ .option('--clean', 'Remove orphaned links')
146
+ .option('--force', 'Overwrite existing files/links')
147
+ .option('--dry-run', 'Preview changes without executing')
148
+ .action(async (options) => {
149
+ try {
150
+ await link(options);
151
+ }
152
+ catch (error) {
153
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
154
+ process.exit(1);
155
+ }
156
+ });
157
+ // Run command
158
+ program
159
+ .command('run [script]')
160
+ .description('Run a workspace script')
161
+ .option('--list', 'List available scripts')
162
+ .allowUnknownOption(true)
163
+ .action(async (scriptName, options, command) => {
164
+ try {
165
+ // Get remaining args after "--"
166
+ const args = command.args.slice(1);
167
+ await run(scriptName, args, { list: options.list });
168
+ }
169
+ catch (error) {
170
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
171
+ process.exit(1);
172
+ }
173
+ });
174
+ // Env command
175
+ program
176
+ .command('env')
177
+ .description('Show workspace environment variables')
178
+ .option('--json', 'Output as JSON')
179
+ .action(async (options) => {
180
+ try {
181
+ await env(options);
182
+ }
183
+ catch (error) {
184
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
185
+ process.exit(1);
186
+ }
187
+ });
188
+ // PR commands
189
+ const pr = program.command('pr').description('Pull request management');
190
+ pr.command('create')
191
+ .description('Create linked PRs across repositories')
192
+ .option('-t, --title <title>', 'PR title')
193
+ .option('-b, --body <body>', 'PR body')
194
+ .option('-d, --draft', 'Create as draft PR')
195
+ .option('--base <branch>', 'Base branch to merge into')
196
+ .option('--push', 'Push branches to remote if needed')
197
+ .action(async (options) => {
198
+ try {
199
+ await createPR(options);
200
+ }
201
+ catch (error) {
202
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
203
+ process.exit(1);
204
+ }
205
+ });
206
+ pr.command('status')
207
+ .description('Show status of PRs for current branch')
208
+ .option('--json', 'Output as JSON')
209
+ .action(async (options) => {
210
+ try {
211
+ await prStatus(options);
212
+ }
213
+ catch (error) {
214
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
215
+ process.exit(1);
216
+ }
217
+ });
218
+ pr.command('merge')
219
+ .description('Merge all PRs for current branch')
220
+ .option('-m, --method <method>', 'Merge method: merge, squash, rebase', 'merge')
221
+ .option('--no-delete-branch', 'Do not delete branch after merge')
222
+ .option('-f, --force', 'Merge even if not all checks pass')
223
+ .action(async (options) => {
224
+ try {
225
+ await mergePRs({
226
+ method: options.method,
227
+ deleteBranch: options.deleteBranch,
228
+ force: options.force,
229
+ });
230
+ }
231
+ catch (error) {
232
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
233
+ process.exit(1);
234
+ }
235
+ });
236
+ // Bench command
237
+ program
238
+ .command('bench [operation]')
239
+ .description('Benchmark workspace operations')
240
+ .option('--list', 'List available benchmarks')
241
+ .option('-n, --iterations <n>', 'Number of iterations', '5')
242
+ .option('-w, --warmup <n>', 'Number of warmup iterations', '1')
243
+ .option('--json', 'Output as JSON')
244
+ .action(async (operation, options) => {
245
+ try {
246
+ await bench(operation, {
247
+ list: options.list,
248
+ iterations: parseInt(options.iterations, 10),
249
+ warmup: parseInt(options.warmup, 10),
250
+ json: options.json,
251
+ });
252
+ }
253
+ catch (error) {
254
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
255
+ process.exit(1);
256
+ }
257
+ });
258
+ // Commit command
259
+ program
260
+ .command('commit')
261
+ .description('Commit staged changes across all repositories')
262
+ .option('-m, --message <message>', 'Commit message')
263
+ .option('-a, --all', 'Stage all changes before committing')
264
+ .action(async (options) => {
265
+ try {
266
+ await commit({
267
+ message: options.message,
268
+ all: options.all,
269
+ });
270
+ }
271
+ catch (error) {
272
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
273
+ process.exit(1);
274
+ }
275
+ });
276
+ // Push command
277
+ program
278
+ .command('push')
279
+ .description('Push current branch to remote across all repositories')
280
+ .option('-u, --set-upstream', 'Set upstream tracking for the branch')
281
+ .option('-f, --force', 'Force push (use with caution)')
282
+ .action(async (options) => {
283
+ try {
284
+ await push({
285
+ setUpstream: options.setUpstream,
286
+ force: options.force,
287
+ });
288
+ }
289
+ catch (error) {
290
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
291
+ process.exit(1);
292
+ }
293
+ });
294
+ // Add command
295
+ program
296
+ .command('add [files...]')
297
+ .description('Stage changes across all repositories')
298
+ .option('-A, --all', 'Stage all changes (same as git add -A)')
299
+ .action(async (files, options) => {
300
+ try {
301
+ await add(files ?? [], { all: options.all });
302
+ }
303
+ catch (error) {
304
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
305
+ process.exit(1);
306
+ }
307
+ });
308
+ // Diff command
309
+ program
310
+ .command('diff')
311
+ .description('Show diff across all repositories')
312
+ .option('--staged', 'Show staged changes')
313
+ .option('--stat', 'Show diffstat')
314
+ .option('--name-only', 'Show only file names')
315
+ .action(async (options) => {
316
+ try {
317
+ await diff({
318
+ staged: options.staged,
319
+ stat: options.stat,
320
+ nameOnly: options.nameOnly,
321
+ });
322
+ }
323
+ catch (error) {
324
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
325
+ process.exit(1);
326
+ }
327
+ });
328
+ // Forall command - run command in all repos (like AOSP repo forall)
329
+ program
330
+ .command('forall')
331
+ .description('Run a command in each repository (like AOSP repo forall)')
332
+ .requiredOption('-c, --command <command>', 'Command to run in each repo')
333
+ .option('-r, --repo <repos...>', 'Only run in specific repositories')
334
+ .option('--include-manifest', 'Include manifest repo')
335
+ .option('--continue-on-error', 'Continue running in other repos if command fails')
336
+ .action(async (options) => {
337
+ try {
338
+ await forall({
339
+ command: options.command,
340
+ repo: options.repo,
341
+ includeManifest: options.includeManifest,
342
+ continueOnError: options.continueOnError,
343
+ });
344
+ }
345
+ catch (error) {
346
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
347
+ process.exit(1);
348
+ }
349
+ });
350
+ // Parse and execute
351
+ program.parse();
352
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=files.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.bench.d.ts","sourceRoot":"","sources":["../../../src/lib/__bench__/files.bench.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { describe, bench, beforeAll, afterAll } from 'vitest';
2
+ import { mkdir, rm, writeFile, symlink } from 'fs/promises';
3
+ import { join, relative, dirname } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { validatePath, getLinkStatus } from '../files.js';
6
+ describe('Path Validation', () => {
7
+ bench('validatePath - valid path', () => {
8
+ validatePath('/workspace', './src/index.ts');
9
+ });
10
+ bench('validatePath - nested path', () => {
11
+ validatePath('/workspace', './src/lib/utils/helpers.ts');
12
+ });
13
+ bench('validatePath - path with dots', () => {
14
+ validatePath('/workspace', './src/../src/index.ts');
15
+ });
16
+ });
17
+ describe('Link Status', () => {
18
+ let testDir;
19
+ let srcFile;
20
+ let destCopy;
21
+ let destLink;
22
+ beforeAll(async () => {
23
+ testDir = join(tmpdir(), `codi-repo-files-bench-${Date.now()}`);
24
+ const srcDir = join(testDir, 'repo');
25
+ const destDir = join(testDir, 'workspace');
26
+ await mkdir(srcDir, { recursive: true });
27
+ await mkdir(destDir, { recursive: true });
28
+ // Create source file
29
+ srcFile = join(srcDir, 'file.txt');
30
+ await writeFile(srcFile, 'test content');
31
+ // Create destination copy
32
+ destCopy = join(destDir, 'copy.txt');
33
+ await writeFile(destCopy, 'test content');
34
+ // Create destination symlink
35
+ destLink = join(destDir, 'link.txt');
36
+ const relativePath = relative(dirname(destLink), srcFile);
37
+ await symlink(relativePath, destLink);
38
+ });
39
+ afterAll(async () => {
40
+ await rm(testDir, { recursive: true, force: true });
41
+ });
42
+ bench('getLinkStatus - copyfile valid', async () => {
43
+ await getLinkStatus('copyfile', 'repo', srcFile, destCopy);
44
+ });
45
+ bench('getLinkStatus - linkfile valid', async () => {
46
+ await getLinkStatus('linkfile', 'repo', srcFile, destLink);
47
+ });
48
+ bench('getLinkStatus - missing dest', async () => {
49
+ await getLinkStatus('copyfile', 'repo', srcFile, join(testDir, 'nonexistent.txt'));
50
+ });
51
+ });
52
+ //# sourceMappingURL=files.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.bench.js","sourceRoot":"","sources":["../../../src/lib/__bench__/files.bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=manifest.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.bench.d.ts","sourceRoot":"","sources":["../../../src/lib/__bench__/manifest.bench.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, bench, beforeAll, afterAll } from 'vitest';
2
+ import { mkdir, rm, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { parseGitHubUrl, loadManifest, getManifestPath } from '../manifest.js';
6
+ describe('Manifest Operations', () => {
7
+ bench('parseGitHubUrl - SSH', () => {
8
+ parseGitHubUrl('git@github.com:owner/repo.git');
9
+ });
10
+ bench('parseGitHubUrl - HTTPS', () => {
11
+ parseGitHubUrl('https://github.com/owner/repo.git');
12
+ });
13
+ bench('parseGitHubUrl - SSH without .git', () => {
14
+ parseGitHubUrl('git@github.com:owner/repo');
15
+ });
16
+ bench('parseGitHubUrl - HTTPS without .git', () => {
17
+ parseGitHubUrl('https://github.com/owner/repo');
18
+ });
19
+ });
20
+ describe('Manifest Loading', () => {
21
+ let testDir;
22
+ let manifestPath;
23
+ beforeAll(async () => {
24
+ testDir = join(tmpdir(), `codi-repo-bench-${Date.now()}`);
25
+ const manifestsDir = join(testDir, '.codi-repo', 'manifests');
26
+ await mkdir(manifestsDir, { recursive: true });
27
+ // Create a realistic manifest
28
+ const manifest = `
29
+ version: 1
30
+ repos:
31
+ repo1:
32
+ url: git@github.com:owner/repo1.git
33
+ path: ./repo1
34
+ default_branch: main
35
+ repo2:
36
+ url: git@github.com:owner/repo2.git
37
+ path: ./repo2
38
+ default_branch: main
39
+ repo3:
40
+ url: git@github.com:owner/repo3.git
41
+ path: ./repo3
42
+ default_branch: main
43
+ settings:
44
+ pr_prefix: "[cross-repo]"
45
+ merge_strategy: all-or-nothing
46
+ workspace:
47
+ env:
48
+ NODE_ENV: development
49
+ scripts:
50
+ build:
51
+ description: Build all packages
52
+ command: npm run build
53
+ test:
54
+ description: Run tests
55
+ steps:
56
+ - name: lint
57
+ command: npm run lint
58
+ - name: test
59
+ command: npm test
60
+ `;
61
+ manifestPath = join(manifestsDir, 'manifest.yaml');
62
+ await writeFile(manifestPath, manifest);
63
+ });
64
+ afterAll(async () => {
65
+ await rm(testDir, { recursive: true, force: true });
66
+ });
67
+ bench('loadManifest', async () => {
68
+ await loadManifest(manifestPath);
69
+ });
70
+ bench('getManifestPath', () => {
71
+ getManifestPath('/workspace/test');
72
+ });
73
+ });
74
+ //# sourceMappingURL=manifest.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.bench.js","sourceRoot":"","sources":["../../../src/lib/__bench__/manifest.bench.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE/E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,KAAK,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACjC,cAAc,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACnC,cAAc,CAAC,mCAAmC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC9C,cAAc,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAChD,cAAc,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,OAAe,CAAC;IACpB,IAAI,YAAoB,CAAC;IAEzB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,8BAA8B;QAC9B,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCpB,CAAC;QACE,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC5B,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,84 @@
1
+ import type { Manifest, RepoConfig, LinkStatus } from '../types.js';
2
+ /**
3
+ * Validate that a path does not escape its boundary
4
+ */
5
+ export declare function validatePath(basePath: string, targetPath: string): boolean;
6
+ export interface CopyFileOptions {
7
+ /** Create backup of existing file */
8
+ backup?: boolean;
9
+ /** Overwrite existing file */
10
+ force?: boolean;
11
+ /** Preview only, don't actually copy */
12
+ dryRun?: boolean;
13
+ }
14
+ /**
15
+ * Copy a file from source to destination
16
+ */
17
+ export declare function copyFile(src: string, dest: string, options?: CopyFileOptions): Promise<{
18
+ copied: boolean;
19
+ backupPath?: string;
20
+ message?: string;
21
+ }>;
22
+ export interface CreateSymlinkOptions {
23
+ /** Overwrite existing link/file */
24
+ force?: boolean;
25
+ /** Preview only, don't actually create */
26
+ dryRun?: boolean;
27
+ }
28
+ /**
29
+ * Create a relative symlink from dest pointing to src
30
+ */
31
+ export declare function createSymlink(src: string, dest: string, options?: CreateSymlinkOptions): Promise<{
32
+ created: boolean;
33
+ message?: string;
34
+ }>;
35
+ /**
36
+ * Get the status of a single link
37
+ */
38
+ export declare function getLinkStatus(type: 'copyfile' | 'linkfile', repoName: string, src: string, dest: string): Promise<LinkStatus>;
39
+ export interface ProcessLinksOptions {
40
+ force?: boolean;
41
+ dryRun?: boolean;
42
+ }
43
+ export interface ProcessLinksResult {
44
+ repoName: string;
45
+ copyfiles: {
46
+ src: string;
47
+ dest: string;
48
+ success: boolean;
49
+ message?: string;
50
+ }[];
51
+ linkfiles: {
52
+ src: string;
53
+ dest: string;
54
+ success: boolean;
55
+ message?: string;
56
+ }[];
57
+ }
58
+ /**
59
+ * Process all copyfile and linkfile entries for a repository
60
+ */
61
+ export declare function processRepoLinks(repoName: string, repoConfig: RepoConfig, repoPath: string, rootDir: string, options?: ProcessLinksOptions): Promise<ProcessLinksResult>;
62
+ /**
63
+ * Process links for manifest-level copyfile/linkfile entries
64
+ */
65
+ export declare function processManifestLinks(manifest: Manifest, manifestsDir: string, rootDir: string, options?: ProcessLinksOptions): Promise<ProcessLinksResult>;
66
+ /**
67
+ * Process all links for all repositories and manifest
68
+ */
69
+ export declare function processAllLinks(manifest: Manifest, rootDir: string, options?: ProcessLinksOptions, manifestsDir?: string): Promise<ProcessLinksResult[]>;
70
+ /**
71
+ * Get status of all links (including manifest-level links)
72
+ */
73
+ export declare function getAllLinkStatus(manifest: Manifest, rootDir: string, manifestsDir?: string): Promise<LinkStatus[]>;
74
+ /**
75
+ * Find and remove orphaned links (links that exist but are no longer in manifest)
76
+ */
77
+ export declare function cleanOrphanedLinks(manifest: Manifest, rootDir: string, options?: {
78
+ dryRun?: boolean;
79
+ }): Promise<{
80
+ path: string;
81
+ removed: boolean;
82
+ message?: string;
83
+ }[]>;
84
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAkC,MAAM,aAAa,CAAC;AA4BpG;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI1E;AAUD,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCrE;AAED,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqCjD;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,GAAG,UAAU,EAC7B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CA2ErB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA0F7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA8F7B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,EACjC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmB/B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CAgDvB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA6EjE"}