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.
- package/README.md +319 -92
- package/dist/cli/commands/add.d.ts +174 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +131 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/merge.d.ts +106 -0
- package/dist/cli/commands/merge.d.ts.map +1 -0
- package/dist/cli/commands/merge.js +55 -0
- package/dist/cli/commands/merge.js.map +1 -0
- package/dist/cli/fsx-cli-adapter.d.ts +359 -0
- package/dist/cli/fsx-cli-adapter.d.ts.map +1 -0
- package/dist/cli/fsx-cli-adapter.js +619 -0
- package/dist/cli/fsx-cli-adapter.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/do/BashModule.d.ts +871 -0
- package/dist/do/BashModule.d.ts.map +1 -0
- package/dist/do/BashModule.js +1143 -0
- package/dist/do/BashModule.js.map +1 -0
- package/dist/do/FsModule.d.ts +601 -0
- package/dist/do/FsModule.d.ts.map +1 -0
- package/dist/do/FsModule.js +1120 -0
- package/dist/do/FsModule.js.map +1 -0
- package/dist/do/GitModule.d.ts +635 -0
- package/dist/do/GitModule.d.ts.map +1 -0
- package/dist/do/GitModule.js +781 -0
- package/dist/do/GitModule.js.map +1 -0
- package/dist/do/GitRepoDO.d.ts +281 -0
- package/dist/do/GitRepoDO.d.ts.map +1 -0
- package/dist/do/GitRepoDO.js +479 -0
- package/dist/do/GitRepoDO.js.map +1 -0
- package/dist/do/bash-ast.d.ts +246 -0
- package/dist/do/bash-ast.d.ts.map +1 -0
- package/dist/do/bash-ast.js +888 -0
- package/dist/do/bash-ast.js.map +1 -0
- package/dist/do/container-executor.d.ts +491 -0
- package/dist/do/container-executor.d.ts.map +1 -0
- package/dist/do/container-executor.js +730 -0
- package/dist/do/container-executor.js.map +1 -0
- package/dist/do/index.d.ts +53 -0
- package/dist/do/index.d.ts.map +1 -0
- package/dist/do/index.js +91 -0
- package/dist/do/index.js.map +1 -0
- package/dist/do/tiered-storage.d.ts +403 -0
- package/dist/do/tiered-storage.d.ts.map +1 -0
- package/dist/do/tiered-storage.js +689 -0
- package/dist/do/tiered-storage.js.map +1 -0
- package/dist/do/withBash.d.ts +231 -0
- package/dist/do/withBash.d.ts.map +1 -0
- package/dist/do/withBash.js +244 -0
- package/dist/do/withBash.js.map +1 -0
- package/dist/do/withFs.d.ts +237 -0
- package/dist/do/withFs.d.ts.map +1 -0
- package/dist/do/withFs.js +387 -0
- package/dist/do/withFs.js.map +1 -0
- package/dist/do/withGit.d.ts +180 -0
- package/dist/do/withGit.d.ts.map +1 -0
- package/dist/do/withGit.js +271 -0
- package/dist/do/withGit.js.map +1 -0
- package/dist/durable-object/object-store.d.ts +157 -15
- package/dist/durable-object/object-store.d.ts.map +1 -1
- package/dist/durable-object/object-store.js +432 -47
- package/dist/durable-object/object-store.js.map +1 -1
- package/dist/durable-object/schema.d.ts +12 -1
- package/dist/durable-object/schema.d.ts.map +1 -1
- package/dist/durable-object/schema.js +87 -2
- package/dist/durable-object/schema.js.map +1 -1
- package/dist/index.d.ts +29 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/sandbox/miniflare-evaluator.d.ts +22 -0
- package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +1 -0
- package/dist/mcp/sandbox/miniflare-evaluator.js +140 -0
- package/dist/mcp/sandbox/miniflare-evaluator.js.map +1 -0
- package/dist/mcp/sandbox/object-store-proxy.d.ts +32 -0
- package/dist/mcp/sandbox/object-store-proxy.d.ts.map +1 -0
- package/dist/mcp/sandbox/object-store-proxy.js +30 -0
- package/dist/mcp/sandbox/object-store-proxy.js.map +1 -0
- package/dist/mcp/sandbox/template.d.ts +17 -0
- package/dist/mcp/sandbox/template.d.ts.map +1 -0
- package/dist/mcp/sandbox/template.js +71 -0
- package/dist/mcp/sandbox/template.js.map +1 -0
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +16 -4
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/mcp/tools/do.d.ts +32 -0
- package/dist/mcp/tools/do.d.ts.map +1 -0
- package/dist/mcp/tools/do.js +115 -0
- package/dist/mcp/tools/do.js.map +1 -0
- package/dist/pack/delta.d.ts +8 -0
- package/dist/pack/delta.d.ts.map +1 -1
- package/dist/pack/delta.js +236 -29
- package/dist/pack/delta.js.map +1 -1
- package/dist/refs/branch.d.ts +22 -24
- package/dist/refs/branch.d.ts.map +1 -1
- package/dist/refs/branch.js +409 -66
- package/dist/refs/branch.js.map +1 -1
- package/dist/refs/storage.d.ts +77 -5
- package/dist/refs/storage.d.ts.map +1 -1
- package/dist/refs/storage.js +193 -43
- package/dist/refs/storage.js.map +1 -1
- package/dist/refs/tag.d.ts +44 -24
- package/dist/refs/tag.d.ts.map +1 -1
- package/dist/refs/tag.js +411 -70
- package/dist/refs/tag.js.map +1 -1
- package/dist/storage/backend.d.ts +425 -0
- package/dist/storage/backend.d.ts.map +1 -0
- package/dist/storage/backend.js +41 -0
- package/dist/storage/backend.js.map +1 -0
- package/dist/storage/fsx-adapter.d.ts +204 -0
- package/dist/storage/fsx-adapter.d.ts.map +1 -0
- package/dist/storage/fsx-adapter.js +470 -0
- package/dist/storage/fsx-adapter.js.map +1 -0
- package/dist/types/capability.d.ts +1385 -0
- package/dist/types/capability.d.ts.map +1 -0
- package/dist/types/capability.js +36 -0
- package/dist/types/capability.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/objects.d.ts +182 -0
- package/dist/types/objects.d.ts.map +1 -1
- package/dist/types/objects.js +249 -4
- package/dist/types/objects.js.map +1 -1
- package/dist/types/storage.d.ts +114 -0
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/storage.js +160 -1
- package/dist/types/storage.js.map +1 -1
- package/dist/types/worker-loader.d.ts +60 -0
- package/dist/types/worker-loader.d.ts.map +1 -0
- package/dist/types/worker-loader.js +62 -0
- package/dist/types/worker-loader.js.map +1 -0
- package/dist/utils/hash.d.ts +125 -80
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +187 -100
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/sha1.d.ts +171 -0
- package/dist/utils/sha1.d.ts.map +1 -1
- package/dist/utils/sha1.js +352 -0
- package/dist/utils/sha1.js.map +1 -1
- package/dist/wire/path-security.d.ts +157 -0
- package/dist/wire/path-security.d.ts.map +1 -0
- package/dist/wire/path-security.js +307 -0
- package/dist/wire/path-security.js.map +1 -0
- package/dist/wire/receive-pack.d.ts +7 -0
- package/dist/wire/receive-pack.d.ts.map +1 -1
- package/dist/wire/receive-pack.js +29 -1
- package/dist/wire/receive-pack.js.map +1 -1
- 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
|