gitx.do 0.0.3 → 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 (150) hide show
  1. package/README.md +319 -92
  2. package/dist/cli/commands/add.d.ts +174 -0
  3. package/dist/cli/commands/add.d.ts.map +1 -0
  4. package/dist/cli/commands/add.js +131 -0
  5. package/dist/cli/commands/add.js.map +1 -0
  6. package/dist/cli/commands/merge.d.ts +106 -0
  7. package/dist/cli/commands/merge.d.ts.map +1 -0
  8. package/dist/cli/commands/merge.js +55 -0
  9. package/dist/cli/commands/merge.js.map +1 -0
  10. package/dist/cli/fsx-cli-adapter.d.ts +359 -0
  11. package/dist/cli/fsx-cli-adapter.d.ts.map +1 -0
  12. package/dist/cli/fsx-cli-adapter.js +619 -0
  13. package/dist/cli/fsx-cli-adapter.js.map +1 -0
  14. package/dist/cli/index.js +0 -0
  15. package/dist/do/BashModule.d.ts +871 -0
  16. package/dist/do/BashModule.d.ts.map +1 -0
  17. package/dist/do/BashModule.js +1143 -0
  18. package/dist/do/BashModule.js.map +1 -0
  19. package/dist/do/FsModule.d.ts +601 -0
  20. package/dist/do/FsModule.d.ts.map +1 -0
  21. package/dist/do/FsModule.js +1120 -0
  22. package/dist/do/FsModule.js.map +1 -0
  23. package/dist/do/GitModule.d.ts +635 -0
  24. package/dist/do/GitModule.d.ts.map +1 -0
  25. package/dist/do/GitModule.js +781 -0
  26. package/dist/do/GitModule.js.map +1 -0
  27. package/dist/do/GitRepoDO.d.ts +281 -0
  28. package/dist/do/GitRepoDO.d.ts.map +1 -0
  29. package/dist/do/GitRepoDO.js +479 -0
  30. package/dist/do/GitRepoDO.js.map +1 -0
  31. package/dist/do/bash-ast.d.ts +246 -0
  32. package/dist/do/bash-ast.d.ts.map +1 -0
  33. package/dist/do/bash-ast.js +888 -0
  34. package/dist/do/bash-ast.js.map +1 -0
  35. package/dist/do/container-executor.d.ts +491 -0
  36. package/dist/do/container-executor.d.ts.map +1 -0
  37. package/dist/do/container-executor.js +730 -0
  38. package/dist/do/container-executor.js.map +1 -0
  39. package/dist/do/index.d.ts +53 -0
  40. package/dist/do/index.d.ts.map +1 -0
  41. package/dist/do/index.js +91 -0
  42. package/dist/do/index.js.map +1 -0
  43. package/dist/do/tiered-storage.d.ts +403 -0
  44. package/dist/do/tiered-storage.d.ts.map +1 -0
  45. package/dist/do/tiered-storage.js +689 -0
  46. package/dist/do/tiered-storage.js.map +1 -0
  47. package/dist/do/withBash.d.ts +231 -0
  48. package/dist/do/withBash.d.ts.map +1 -0
  49. package/dist/do/withBash.js +244 -0
  50. package/dist/do/withBash.js.map +1 -0
  51. package/dist/do/withFs.d.ts +237 -0
  52. package/dist/do/withFs.d.ts.map +1 -0
  53. package/dist/do/withFs.js +387 -0
  54. package/dist/do/withFs.js.map +1 -0
  55. package/dist/do/withGit.d.ts +180 -0
  56. package/dist/do/withGit.d.ts.map +1 -0
  57. package/dist/do/withGit.js +271 -0
  58. package/dist/do/withGit.js.map +1 -0
  59. package/dist/durable-object/object-store.d.ts +157 -15
  60. package/dist/durable-object/object-store.d.ts.map +1 -1
  61. package/dist/durable-object/object-store.js +432 -47
  62. package/dist/durable-object/object-store.js.map +1 -1
  63. package/dist/durable-object/schema.d.ts +12 -1
  64. package/dist/durable-object/schema.d.ts.map +1 -1
  65. package/dist/durable-object/schema.js +87 -2
  66. package/dist/durable-object/schema.js.map +1 -1
  67. package/dist/index.d.ts +29 -1
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +34 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/mcp/sandbox/miniflare-evaluator.d.ts +22 -0
  72. package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +1 -0
  73. package/dist/mcp/sandbox/miniflare-evaluator.js +140 -0
  74. package/dist/mcp/sandbox/miniflare-evaluator.js.map +1 -0
  75. package/dist/mcp/sandbox/object-store-proxy.d.ts +32 -0
  76. package/dist/mcp/sandbox/object-store-proxy.d.ts.map +1 -0
  77. package/dist/mcp/sandbox/object-store-proxy.js +30 -0
  78. package/dist/mcp/sandbox/object-store-proxy.js.map +1 -0
  79. package/dist/mcp/sandbox/template.d.ts +17 -0
  80. package/dist/mcp/sandbox/template.d.ts.map +1 -0
  81. package/dist/mcp/sandbox/template.js +71 -0
  82. package/dist/mcp/sandbox/template.js.map +1 -0
  83. package/dist/mcp/sandbox.d.ts.map +1 -1
  84. package/dist/mcp/sandbox.js +16 -4
  85. package/dist/mcp/sandbox.js.map +1 -1
  86. package/dist/mcp/tools/do.d.ts +32 -0
  87. package/dist/mcp/tools/do.d.ts.map +1 -0
  88. package/dist/mcp/tools/do.js +115 -0
  89. package/dist/mcp/tools/do.js.map +1 -0
  90. package/dist/pack/delta.d.ts +8 -0
  91. package/dist/pack/delta.d.ts.map +1 -1
  92. package/dist/pack/delta.js +236 -29
  93. package/dist/pack/delta.js.map +1 -1
  94. package/dist/refs/branch.d.ts +22 -24
  95. package/dist/refs/branch.d.ts.map +1 -1
  96. package/dist/refs/branch.js +409 -66
  97. package/dist/refs/branch.js.map +1 -1
  98. package/dist/refs/storage.d.ts +77 -5
  99. package/dist/refs/storage.d.ts.map +1 -1
  100. package/dist/refs/storage.js +193 -43
  101. package/dist/refs/storage.js.map +1 -1
  102. package/dist/refs/tag.d.ts +44 -24
  103. package/dist/refs/tag.d.ts.map +1 -1
  104. package/dist/refs/tag.js +411 -70
  105. package/dist/refs/tag.js.map +1 -1
  106. package/dist/storage/backend.d.ts +425 -0
  107. package/dist/storage/backend.d.ts.map +1 -0
  108. package/dist/storage/backend.js +41 -0
  109. package/dist/storage/backend.js.map +1 -0
  110. package/dist/storage/fsx-adapter.d.ts +204 -0
  111. package/dist/storage/fsx-adapter.d.ts.map +1 -0
  112. package/dist/storage/fsx-adapter.js +470 -0
  113. package/dist/storage/fsx-adapter.js.map +1 -0
  114. package/dist/types/capability.d.ts +1385 -0
  115. package/dist/types/capability.d.ts.map +1 -0
  116. package/dist/types/capability.js +36 -0
  117. package/dist/types/capability.js.map +1 -0
  118. package/dist/types/index.d.ts +13 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/index.js +18 -0
  121. package/dist/types/index.js.map +1 -0
  122. package/dist/types/objects.d.ts +182 -0
  123. package/dist/types/objects.d.ts.map +1 -1
  124. package/dist/types/objects.js +249 -4
  125. package/dist/types/objects.js.map +1 -1
  126. package/dist/types/storage.d.ts +114 -0
  127. package/dist/types/storage.d.ts.map +1 -1
  128. package/dist/types/storage.js +160 -1
  129. package/dist/types/storage.js.map +1 -1
  130. package/dist/types/worker-loader.d.ts +60 -0
  131. package/dist/types/worker-loader.d.ts.map +1 -0
  132. package/dist/types/worker-loader.js +62 -0
  133. package/dist/types/worker-loader.js.map +1 -0
  134. package/dist/utils/hash.d.ts +125 -80
  135. package/dist/utils/hash.d.ts.map +1 -1
  136. package/dist/utils/hash.js +187 -100
  137. package/dist/utils/hash.js.map +1 -1
  138. package/dist/utils/sha1.d.ts +171 -0
  139. package/dist/utils/sha1.d.ts.map +1 -1
  140. package/dist/utils/sha1.js +352 -0
  141. package/dist/utils/sha1.js.map +1 -1
  142. package/dist/wire/path-security.d.ts +157 -0
  143. package/dist/wire/path-security.d.ts.map +1 -0
  144. package/dist/wire/path-security.js +307 -0
  145. package/dist/wire/path-security.js.map +1 -0
  146. package/dist/wire/receive-pack.d.ts +7 -0
  147. package/dist/wire/receive-pack.d.ts.map +1 -1
  148. package/dist/wire/receive-pack.js +29 -1
  149. package/dist/wire/receive-pack.js.map +1 -1
  150. package/package.json +10 -1
@@ -0,0 +1,619 @@
1
+ /**
2
+ * @fileoverview FSx CLI Adapter for Git Repository Operations
3
+ *
4
+ * This module provides a CLI adapter that uses the FSxStorageAdapter for Git
5
+ * repository operations. It bridges the CLI interface (FSAdapter-compatible)
6
+ * with the fsx-backed storage, allowing the CLI to work with any fsx storage.
7
+ *
8
+ * **Features**:
9
+ * - Compatible with FSAdapter interface from fs-adapter.ts
10
+ * - Uses FSxStorageAdapter for underlying storage operations
11
+ * - Provides object retrieval, ref resolution, and listing operations
12
+ * - Handles both loose objects and references
13
+ *
14
+ * **Note**: Pack file operations are not implemented as fsx uses CAS storage.
15
+ * For pack file reading, use the standard fs-adapter.ts instead.
16
+ *
17
+ * @module cli/fsx-cli-adapter
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { createFSxCLIAdapter } from './fsx-cli-adapter'
22
+ *
23
+ * const adapter = await createFSxCLIAdapter('/path/to/repo')
24
+ * const head = await adapter.getHead()
25
+ * const commit = await adapter.getObject(head.target)
26
+ * ```
27
+ */
28
+ import * as path from 'path';
29
+ import * as fs from 'fs/promises';
30
+ import { createFSxAdapter } from '../storage/fsx-adapter';
31
+ /**
32
+ * Error thrown by FSx CLI adapter operations.
33
+ */
34
+ export class FSxCLIAdapterError extends Error {
35
+ code;
36
+ path;
37
+ constructor(message, code, path) {
38
+ super(message);
39
+ this.code = code;
40
+ this.path = path;
41
+ this.name = 'FSxCLIAdapterError';
42
+ }
43
+ }
44
+ // ============================================================================
45
+ // Helper Functions
46
+ // ============================================================================
47
+ const decoder = new TextDecoder();
48
+ function isValidSha(sha) {
49
+ return /^[0-9a-f]{40}$/i.test(sha);
50
+ }
51
+ /**
52
+ * Parse a tree object's binary content into entries.
53
+ */
54
+ function parseTreeContent(data) {
55
+ const entries = [];
56
+ let offset = 0;
57
+ while (offset < data.length) {
58
+ // Format: "<mode> <name>\0<20-byte-sha>"
59
+ // Find the space between mode and name
60
+ let spaceIndex = offset;
61
+ while (spaceIndex < data.length && data[spaceIndex] !== 0x20) {
62
+ spaceIndex++;
63
+ }
64
+ const mode = parseInt(decoder.decode(data.subarray(offset, spaceIndex)), 8);
65
+ offset = spaceIndex + 1;
66
+ // Find the null terminator after the name
67
+ let nullIndex = offset;
68
+ while (nullIndex < data.length && data[nullIndex] !== 0) {
69
+ nullIndex++;
70
+ }
71
+ const name = decoder.decode(data.subarray(offset, nullIndex));
72
+ offset = nullIndex + 1;
73
+ // Read 20-byte SHA
74
+ const shaBytes = data.subarray(offset, offset + 20);
75
+ const sha = Array.from(shaBytes).map(b => b.toString(16).padStart(2, '0')).join('');
76
+ offset += 20;
77
+ // Determine type from mode
78
+ const type = (mode & 0o170000) === 0o040000 ? 'tree' : 'blob';
79
+ entries.push({ mode, name, sha, type });
80
+ }
81
+ return entries;
82
+ }
83
+ /**
84
+ * Parse author/committer line.
85
+ */
86
+ function parseIdentityLine(line) {
87
+ // Format: "Name <email> timestamp timezone"
88
+ const match = line.match(/^(.+) <(.+)> (\d+) ([+-]\d{4})$/);
89
+ if (!match) {
90
+ return { name: '', email: '', timestamp: 0, timezone: '+0000' };
91
+ }
92
+ return {
93
+ name: match[1],
94
+ email: match[2],
95
+ timestamp: parseInt(match[3], 10),
96
+ timezone: match[4]
97
+ };
98
+ }
99
+ /**
100
+ * Parse a commit object's content.
101
+ */
102
+ function parseCommitContent(data) {
103
+ const content = decoder.decode(data);
104
+ const lines = content.split('\n');
105
+ let tree = '';
106
+ const parents = [];
107
+ let author = { name: '', email: '', timestamp: 0, timezone: '+0000' };
108
+ let committer = { name: '', email: '', timestamp: 0, timezone: '+0000' };
109
+ let gpgSig;
110
+ let messageStart = 0;
111
+ let inGpgSig = false;
112
+ let gpgSigLines = [];
113
+ for (let i = 0; i < lines.length; i++) {
114
+ const line = lines[i];
115
+ if (inGpgSig) {
116
+ gpgSigLines.push(line);
117
+ if (line.includes('-----END')) {
118
+ inGpgSig = false;
119
+ gpgSig = gpgSigLines.join('\n');
120
+ }
121
+ continue;
122
+ }
123
+ if (line === '') {
124
+ // Empty line marks start of message
125
+ messageStart = i + 1;
126
+ break;
127
+ }
128
+ if (line.startsWith('tree ')) {
129
+ tree = line.slice(5);
130
+ }
131
+ else if (line.startsWith('parent ')) {
132
+ parents.push(line.slice(7));
133
+ }
134
+ else if (line.startsWith('author ')) {
135
+ author = parseIdentityLine(line.slice(7));
136
+ }
137
+ else if (line.startsWith('committer ')) {
138
+ committer = parseIdentityLine(line.slice(10));
139
+ }
140
+ else if (line.startsWith('gpgsig ')) {
141
+ inGpgSig = true;
142
+ gpgSigLines = [line.slice(7)];
143
+ }
144
+ }
145
+ const message = lines.slice(messageStart).join('\n');
146
+ return {
147
+ tree,
148
+ parents,
149
+ author,
150
+ committer,
151
+ message,
152
+ gpgSig
153
+ };
154
+ }
155
+ // ============================================================================
156
+ // FSxCLIAdapter Implementation
157
+ // ============================================================================
158
+ /**
159
+ * CLI adapter that uses fsx for Git repository operations.
160
+ *
161
+ * @description
162
+ * This adapter wraps FSxStorageAdapter to provide a CLI-friendly interface
163
+ * compatible with the FSAdapter interface from fs-adapter.ts. It allows
164
+ * the CLI to work with any fsx-backed storage.
165
+ *
166
+ * @example
167
+ * ```typescript
168
+ * const adapter = await createFSxCLIAdapter('/path/to/repo')
169
+ *
170
+ * // Get HEAD reference
171
+ * const head = await adapter.getHead()
172
+ *
173
+ * // Resolve to SHA
174
+ * const resolved = await adapter.resolveRef('HEAD')
175
+ * console.log(`Current commit: ${resolved.sha}`)
176
+ *
177
+ * // Get commit object
178
+ * const commit = await adapter.getCommit(resolved.sha)
179
+ * console.log(`Message: ${commit.message}`)
180
+ * ```
181
+ */
182
+ export class FSxCLIAdapter {
183
+ backend;
184
+ gitDir;
185
+ repoPath;
186
+ /**
187
+ * Create a new FSxCLIAdapter.
188
+ *
189
+ * @param repoPath - Path to the repository root
190
+ * @param options - Optional configuration
191
+ */
192
+ constructor(repoPath, options) {
193
+ this.repoPath = repoPath;
194
+ this.gitDir = options?.gitDir ?? path.join(repoPath, '.git');
195
+ this.backend = createFSxAdapter(this.gitDir);
196
+ }
197
+ // ==========================================================================
198
+ // Object Operations
199
+ // ==========================================================================
200
+ /**
201
+ * Get a git object by its SHA.
202
+ *
203
+ * @param sha - 40-character SHA-1 hash
204
+ * @returns The object if found, null otherwise
205
+ */
206
+ async getObject(sha) {
207
+ if (!sha || sha.length !== 40) {
208
+ throw new FSxCLIAdapterError(`Invalid SHA: ${sha}`, 'INVALID_SHA');
209
+ }
210
+ if (!isValidSha(sha)) {
211
+ return null;
212
+ }
213
+ const normalizedSha = sha.toLowerCase();
214
+ const result = await this.backend.getObject(normalizedSha);
215
+ if (!result) {
216
+ return null;
217
+ }
218
+ return {
219
+ sha: normalizedSha,
220
+ type: result.type,
221
+ size: result.content.length,
222
+ data: result.content,
223
+ source: 'loose'
224
+ };
225
+ }
226
+ /**
227
+ * Check if an object exists.
228
+ *
229
+ * @param sha - 40-character SHA-1 hash
230
+ * @returns true if the object exists
231
+ */
232
+ async hasObject(sha) {
233
+ if (!isValidSha(sha)) {
234
+ return false;
235
+ }
236
+ return this.backend.hasObject(sha.toLowerCase());
237
+ }
238
+ /**
239
+ * Get object type without loading full data.
240
+ *
241
+ * @param sha - 40-character SHA-1 hash
242
+ * @returns The object type if found, null otherwise
243
+ */
244
+ async getObjectType(sha) {
245
+ const obj = await this.getObject(sha);
246
+ return obj ? obj.type : null;
247
+ }
248
+ /**
249
+ * Get object size without loading full data.
250
+ *
251
+ * @param sha - 40-character SHA-1 hash
252
+ * @returns The object size in bytes if found, null otherwise
253
+ */
254
+ async getObjectSize(sha) {
255
+ const obj = await this.getObject(sha);
256
+ return obj ? obj.size : null;
257
+ }
258
+ /**
259
+ * Read a blob object's content.
260
+ *
261
+ * @param sha - 40-character SHA-1 hash of a blob
262
+ * @returns The blob content as Uint8Array
263
+ */
264
+ async readBlob(sha) {
265
+ const obj = await this.getObject(sha);
266
+ if (!obj) {
267
+ throw new FSxCLIAdapterError(`Blob not found: ${sha}`, 'OBJECT_NOT_FOUND');
268
+ }
269
+ if (obj.type !== 'blob') {
270
+ throw new FSxCLIAdapterError(`Object is not a blob: ${sha}`, 'CORRUPT_OBJECT');
271
+ }
272
+ return obj.data;
273
+ }
274
+ /**
275
+ * Read a tree object's entries.
276
+ *
277
+ * @param sha - 40-character SHA-1 hash of a tree
278
+ * @returns Array of tree entries
279
+ */
280
+ async readTree(sha) {
281
+ const obj = await this.getObject(sha);
282
+ if (!obj) {
283
+ throw new FSxCLIAdapterError(`Tree not found: ${sha}`, 'OBJECT_NOT_FOUND');
284
+ }
285
+ if (obj.type !== 'tree') {
286
+ throw new FSxCLIAdapterError(`Object is not a tree: ${sha}`, 'CORRUPT_OBJECT');
287
+ }
288
+ return parseTreeContent(obj.data);
289
+ }
290
+ /**
291
+ * Get a parsed commit object.
292
+ *
293
+ * @param sha - 40-character SHA-1 hash of a commit
294
+ * @returns Parsed commit object
295
+ */
296
+ async getCommit(sha) {
297
+ const obj = await this.getObject(sha);
298
+ if (!obj) {
299
+ throw new FSxCLIAdapterError(`Commit not found: ${sha}`, 'OBJECT_NOT_FOUND');
300
+ }
301
+ if (obj.type !== 'commit') {
302
+ throw new FSxCLIAdapterError(`Object is not a commit: ${sha}`, 'CORRUPT_OBJECT');
303
+ }
304
+ return parseCommitContent(obj.data);
305
+ }
306
+ // ==========================================================================
307
+ // Reference Operations
308
+ // ==========================================================================
309
+ /**
310
+ * Get HEAD reference.
311
+ *
312
+ * @returns HEAD reference (symbolic or direct), or null if not found
313
+ */
314
+ async getHead() {
315
+ const ref = await this.backend.getRef('HEAD');
316
+ if (!ref) {
317
+ return null;
318
+ }
319
+ return {
320
+ name: ref.name,
321
+ target: ref.target,
322
+ type: ref.type
323
+ };
324
+ }
325
+ /**
326
+ * Get a reference by name.
327
+ *
328
+ * @param name - Full ref name (e.g., 'refs/heads/main', 'HEAD')
329
+ * @returns The ref if found, null otherwise
330
+ */
331
+ async getRef(name) {
332
+ const ref = await this.backend.getRef(name);
333
+ if (!ref) {
334
+ return null;
335
+ }
336
+ return {
337
+ name: ref.name,
338
+ target: ref.target,
339
+ type: ref.type
340
+ };
341
+ }
342
+ /**
343
+ * Resolve a reference to its final SHA.
344
+ *
345
+ * @param name - Ref name to resolve
346
+ * @returns Resolved ref with SHA and resolution chain, or null if not found
347
+ */
348
+ async resolveRef(name) {
349
+ const chain = [];
350
+ let current = name;
351
+ const visited = new Set();
352
+ while (true) {
353
+ if (visited.has(current)) {
354
+ throw new FSxCLIAdapterError(`Circular ref: ${current}`, 'CORRUPT_OBJECT');
355
+ }
356
+ visited.add(current);
357
+ const ref = await this.getRef(current);
358
+ if (!ref) {
359
+ return null;
360
+ }
361
+ chain.push(ref);
362
+ if (ref.type === 'direct') {
363
+ return {
364
+ ref,
365
+ sha: ref.target,
366
+ chain
367
+ };
368
+ }
369
+ current = ref.target;
370
+ }
371
+ }
372
+ /**
373
+ * Check if HEAD is detached (pointing directly to a SHA).
374
+ *
375
+ * @returns true if HEAD points directly to a SHA
376
+ */
377
+ async isHeadDetached() {
378
+ const head = await this.getHead();
379
+ return head ? head.type === 'direct' : false;
380
+ }
381
+ /**
382
+ * List all branches.
383
+ *
384
+ * @returns Array of branch names (without 'refs/heads/' prefix)
385
+ */
386
+ async listBranches() {
387
+ const refs = await this.backend.listRefs('refs/heads/');
388
+ return refs.map(ref => ref.name.replace(/^refs\/heads\//, ''));
389
+ }
390
+ /**
391
+ * List all tags.
392
+ *
393
+ * @returns Array of tag names (without 'refs/tags/' prefix)
394
+ */
395
+ async listTags() {
396
+ const refs = await this.backend.listRefs('refs/tags/');
397
+ return refs.map(ref => ref.name.replace(/^refs\/tags\//, ''));
398
+ }
399
+ /**
400
+ * List all refs matching an optional prefix.
401
+ *
402
+ * @param prefix - Optional prefix to filter refs
403
+ * @returns Array of refs
404
+ */
405
+ async listRefs(prefix) {
406
+ const refs = await this.backend.listRefs(prefix);
407
+ return refs.map(ref => ({
408
+ name: ref.name,
409
+ target: ref.target,
410
+ type: ref.type
411
+ }));
412
+ }
413
+ // ==========================================================================
414
+ // Repository Information
415
+ // ==========================================================================
416
+ /**
417
+ * Get the repository path.
418
+ */
419
+ getRepoPath() {
420
+ return this.repoPath;
421
+ }
422
+ /**
423
+ * Get the git directory path.
424
+ */
425
+ getGitDir() {
426
+ return this.gitDir;
427
+ }
428
+ /**
429
+ * Check if this is a valid git repository.
430
+ *
431
+ * @returns true if valid git repository structure exists
432
+ */
433
+ async isGitRepository() {
434
+ const headExists = await this.backend.exists('HEAD');
435
+ const objectsExists = await this.backend.exists('objects');
436
+ const refsExists = await this.backend.exists('refs');
437
+ return headExists && objectsExists && refsExists;
438
+ }
439
+ /**
440
+ * Get repository description.
441
+ *
442
+ * @returns Contents of .git/description file, or null
443
+ */
444
+ async getDescription() {
445
+ const data = await this.backend.readFile('description');
446
+ if (!data) {
447
+ return null;
448
+ }
449
+ return decoder.decode(data).trim();
450
+ }
451
+ // ==========================================================================
452
+ // Index Operations (Not Implemented)
453
+ // ==========================================================================
454
+ /**
455
+ * Get index entries.
456
+ *
457
+ * @description Index operations are not implemented in the fsx adapter.
458
+ * Use the standard fs-adapter for index operations.
459
+ */
460
+ async getIndexEntries() {
461
+ throw new FSxCLIAdapterError('Index operations not implemented in fsx adapter', 'NOT_IMPLEMENTED');
462
+ }
463
+ // ==========================================================================
464
+ // Pack Operations (Not Implemented)
465
+ // ==========================================================================
466
+ /**
467
+ * List pack files.
468
+ *
469
+ * @description Pack file operations are not implemented in the fsx adapter.
470
+ * fsx uses CAS storage instead of pack files.
471
+ */
472
+ async listPackFiles() {
473
+ // fsx doesn't use pack files - return empty array
474
+ return [];
475
+ }
476
+ }
477
+ // ============================================================================
478
+ // Factory Functions
479
+ // ============================================================================
480
+ /**
481
+ * Check if a directory is a git repository.
482
+ *
483
+ * @description Validates whether the given path is a valid git repository
484
+ * by checking for the presence of .git directory and required git files.
485
+ *
486
+ * @param repoPath - Path to check
487
+ * @returns true if the path is a valid git repository
488
+ *
489
+ * @example
490
+ * ```typescript
491
+ * if (await isGitRepository('/path/to/repo')) {
492
+ * console.log('Valid git repository')
493
+ * }
494
+ * ```
495
+ */
496
+ export async function isGitRepository(repoPath) {
497
+ try {
498
+ const gitPath = path.join(repoPath, '.git');
499
+ // Check if .git exists (file or directory)
500
+ try {
501
+ const stat = await fs.stat(gitPath);
502
+ if (stat.isFile()) {
503
+ // .git file (worktree) - read the actual gitdir path
504
+ const content = await fs.readFile(gitPath, 'utf8');
505
+ const match = content.match(/^gitdir:\s*(.+)$/m);
506
+ if (match) {
507
+ const actualGitDir = path.resolve(repoPath, match[1].trim());
508
+ return await isValidGitDir(actualGitDir);
509
+ }
510
+ return false;
511
+ }
512
+ else if (stat.isDirectory()) {
513
+ return await isValidGitDir(gitPath);
514
+ }
515
+ }
516
+ catch {
517
+ // .git doesn't exist, check if repoPath itself is a bare repo
518
+ }
519
+ // Check if repoPath itself is a bare repo
520
+ return await isValidGitDir(repoPath);
521
+ }
522
+ catch {
523
+ return false;
524
+ }
525
+ }
526
+ /**
527
+ * Check if a directory is a valid git directory.
528
+ */
529
+ async function isValidGitDir(gitDir) {
530
+ try {
531
+ const [headExists, objectsExists, refsExists] = await Promise.all([
532
+ fs.access(path.join(gitDir, 'HEAD')).then(() => true).catch(() => false),
533
+ fs.stat(path.join(gitDir, 'objects')).then(s => s.isDirectory()).catch(() => false),
534
+ fs.stat(path.join(gitDir, 'refs')).then(s => s.isDirectory()).catch(() => false)
535
+ ]);
536
+ return headExists && objectsExists && refsExists;
537
+ }
538
+ catch {
539
+ return false;
540
+ }
541
+ }
542
+ /**
543
+ * Create an FSx CLI adapter for a local git repository.
544
+ *
545
+ * @description Factory function that creates an FSxCLIAdapter for a git repository.
546
+ * Uses fsx storage backend for all operations.
547
+ *
548
+ * @param repoPath - Path to the repository root
549
+ * @param options - Optional configuration
550
+ * @returns A fully initialized FSxCLIAdapter instance
551
+ *
552
+ * @throws {FSxCLIAdapterError} With code 'NOT_A_GIT_REPO' if the path is not a valid git repository
553
+ *
554
+ * @example
555
+ * ```typescript
556
+ * // Create adapter for a regular repository
557
+ * const adapter = await createFSxCLIAdapter('/path/to/repo')
558
+ *
559
+ * // Create adapter with custom git directory
560
+ * const adapter = await createFSxCLIAdapter('/path/to/repo', {
561
+ * gitDir: '/path/to/custom/.git'
562
+ * })
563
+ * ```
564
+ */
565
+ export async function createFSxCLIAdapter(repoPath, options) {
566
+ // Check if path exists
567
+ try {
568
+ await fs.access(repoPath);
569
+ }
570
+ catch {
571
+ throw new FSxCLIAdapterError(`Path does not exist: ${repoPath}`, 'NOT_A_GIT_REPO', repoPath);
572
+ }
573
+ let gitDir;
574
+ if (options?.gitDir) {
575
+ gitDir = options.gitDir;
576
+ }
577
+ else {
578
+ // Detect git directory
579
+ const gitPath = path.join(repoPath, '.git');
580
+ try {
581
+ const stat = await fs.stat(gitPath);
582
+ if (stat.isFile()) {
583
+ // .git file (worktree)
584
+ const content = await fs.readFile(gitPath, 'utf8');
585
+ const match = content.match(/^gitdir:\s*(.+)$/m);
586
+ if (match) {
587
+ gitDir = path.resolve(repoPath, match[1].trim());
588
+ }
589
+ else {
590
+ throw new FSxCLIAdapterError(`Invalid .git file: ${gitPath}`, 'NOT_A_GIT_REPO', gitPath);
591
+ }
592
+ }
593
+ else if (stat.isDirectory()) {
594
+ gitDir = gitPath;
595
+ }
596
+ else {
597
+ throw new FSxCLIAdapterError(`Not a git repository: ${repoPath}`, 'NOT_A_GIT_REPO', repoPath);
598
+ }
599
+ }
600
+ catch (error) {
601
+ if (error instanceof FSxCLIAdapterError) {
602
+ throw error;
603
+ }
604
+ // .git doesn't exist, check if repoPath is a bare repo
605
+ if (await isValidGitDir(repoPath)) {
606
+ gitDir = repoPath;
607
+ }
608
+ else {
609
+ throw new FSxCLIAdapterError(`Not a git repository: ${repoPath}`, 'NOT_A_GIT_REPO', repoPath);
610
+ }
611
+ }
612
+ }
613
+ // Validate the git directory
614
+ if (!await isValidGitDir(gitDir)) {
615
+ throw new FSxCLIAdapterError(`Invalid git directory: ${gitDir}`, 'NOT_A_GIT_REPO', gitDir);
616
+ }
617
+ return new FSxCLIAdapter(repoPath, { gitDir });
618
+ }
619
+ //# sourceMappingURL=fsx-cli-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsx-cli-adapter.js","sourceRoot":"","sources":["../../src/cli/fsx-cli-adapter.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
File without changes