@awcp/transport-git 0.0.11
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/dist/git-transport.d.ts +26 -0
- package/dist/git-transport.d.ts.map +1 -0
- package/dist/git-transport.js +151 -0
- package/dist/git-transport.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git-utils.d.ts +5 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +41 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Transport Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements TransportAdapter interface for Git-based workspace transfer.
|
|
5
|
+
* Supports GitHub, GitLab, Gitea, and self-hosted Git servers.
|
|
6
|
+
*/
|
|
7
|
+
import type { TransportAdapter, TransportCapabilities, TransportPrepareParams, TransportPrepareResult, TransportSetupParams, TransportTeardownParams, TransportTeardownResult, TransportApplySnapshotParams, DependencyCheckResult } from '@awcp/core';
|
|
8
|
+
import type { GitTransportConfig } from './types.js';
|
|
9
|
+
export declare class GitTransport implements TransportAdapter {
|
|
10
|
+
readonly type: "git";
|
|
11
|
+
readonly capabilities: TransportCapabilities;
|
|
12
|
+
private tempDir;
|
|
13
|
+
private branchPrefix;
|
|
14
|
+
private config;
|
|
15
|
+
private activeRepos;
|
|
16
|
+
private activeSetups;
|
|
17
|
+
constructor(config?: GitTransportConfig);
|
|
18
|
+
prepare(params: TransportPrepareParams): Promise<TransportPrepareResult>;
|
|
19
|
+
applySnapshot(params: TransportApplySnapshotParams): Promise<void>;
|
|
20
|
+
cleanup(delegationId: string): Promise<void>;
|
|
21
|
+
shutdown(): Promise<void>;
|
|
22
|
+
checkDependency(): Promise<DependencyCheckResult>;
|
|
23
|
+
setup(params: TransportSetupParams): Promise<string>;
|
|
24
|
+
teardown(params: TransportTeardownParams): Promise<TransportTeardownResult>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=git-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-transport.d.ts","sourceRoot":"","sources":["../src/git-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,kBAAkB,EAAmB,MAAM,YAAY,CAAC;AAGtE,qBAAa,YAAa,YAAW,gBAAgB;IACnD,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAG1C;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAA0D;IAC7E,OAAO,CAAC,YAAY,CAAgE;gBAExE,MAAM,GAAE,kBAAuB;IAQrC,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAwCxE,aAAa,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,eAAe,IAAI,OAAO,CAAC,qBAAqB,CAAC;IASjD,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCpD,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAsClF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Transport Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements TransportAdapter interface for Git-based workspace transfer.
|
|
5
|
+
* Supports GitHub, GitLab, Gitea, and self-hosted Git servers.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import { applyResultToResources } from '@awcp/transport-archive';
|
|
11
|
+
import { execGit, configureAuth, cleanupAuth } from './utils/index.js';
|
|
12
|
+
export class GitTransport {
|
|
13
|
+
type = 'git';
|
|
14
|
+
capabilities = {
|
|
15
|
+
supportsSnapshots: true,
|
|
16
|
+
liveSync: false,
|
|
17
|
+
};
|
|
18
|
+
tempDir;
|
|
19
|
+
branchPrefix;
|
|
20
|
+
config;
|
|
21
|
+
activeRepos = new Map();
|
|
22
|
+
activeSetups = new Map();
|
|
23
|
+
constructor(config = {}) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.tempDir = config.delegator?.tempDir ?? config.executor?.tempDir ?? path.join(os.tmpdir(), 'awcp-git');
|
|
26
|
+
this.branchPrefix = config.delegator?.branchPrefix ?? 'awcp/';
|
|
27
|
+
}
|
|
28
|
+
// ========== Delegator Side ==========
|
|
29
|
+
async prepare(params) {
|
|
30
|
+
const { delegationId, exportPath } = params;
|
|
31
|
+
const delegatorConfig = this.config.delegator;
|
|
32
|
+
if (!delegatorConfig?.remoteUrl) {
|
|
33
|
+
throw new Error('GitTransport: delegator.remoteUrl is required');
|
|
34
|
+
}
|
|
35
|
+
await fs.promises.mkdir(this.tempDir, { recursive: true });
|
|
36
|
+
const gitWorkDir = path.join(this.tempDir, delegationId);
|
|
37
|
+
// Copy files (dereference symlinks)
|
|
38
|
+
await fs.promises.cp(exportPath, gitWorkDir, { recursive: true, dereference: true });
|
|
39
|
+
await fs.promises.rm(path.join(gitWorkDir, '.awcp'), { recursive: true, force: true });
|
|
40
|
+
// Initialize git and commit
|
|
41
|
+
await execGit(gitWorkDir, ['init']);
|
|
42
|
+
await execGit(gitWorkDir, ['add', '-A']);
|
|
43
|
+
await execGit(gitWorkDir, ['commit', '-m', `AWCP: Initial workspace for ${delegationId}`, '--allow-empty']);
|
|
44
|
+
const baseCommit = (await execGit(gitWorkDir, ['rev-parse', 'HEAD'])).trim();
|
|
45
|
+
// Configure remote and push
|
|
46
|
+
await configureAuth(gitWorkDir, delegatorConfig.auth);
|
|
47
|
+
await execGit(gitWorkDir, ['remote', 'add', 'origin', delegatorConfig.remoteUrl]);
|
|
48
|
+
await execGit(gitWorkDir, ['push', '-u', 'origin', 'main', '--force']);
|
|
49
|
+
this.activeRepos.set(delegationId, { workDir: gitWorkDir, branch: 'main' });
|
|
50
|
+
const workDirInfo = {
|
|
51
|
+
transport: 'git',
|
|
52
|
+
repoUrl: delegatorConfig.remoteUrl,
|
|
53
|
+
baseBranch: 'main',
|
|
54
|
+
baseCommit,
|
|
55
|
+
auth: delegatorConfig.auth,
|
|
56
|
+
};
|
|
57
|
+
return { workDirInfo };
|
|
58
|
+
}
|
|
59
|
+
async applySnapshot(params) {
|
|
60
|
+
const { delegationId, snapshotData, resources } = params;
|
|
61
|
+
const snapshotInfo = JSON.parse(snapshotData);
|
|
62
|
+
const repo = this.activeRepos.get(delegationId);
|
|
63
|
+
if (!repo) {
|
|
64
|
+
throw new Error(`GitTransport: No active repo for delegation ${delegationId}`);
|
|
65
|
+
}
|
|
66
|
+
await execGit(repo.workDir, ['fetch', 'origin', snapshotInfo.branch]);
|
|
67
|
+
await execGit(repo.workDir, ['merge', `origin/${snapshotInfo.branch}`, '--no-edit']);
|
|
68
|
+
await applyResultToResources(repo.workDir, resources);
|
|
69
|
+
}
|
|
70
|
+
async cleanup(delegationId) {
|
|
71
|
+
const repo = this.activeRepos.get(delegationId);
|
|
72
|
+
if (!repo)
|
|
73
|
+
return;
|
|
74
|
+
if (this.config.delegator?.cleanupRemoteBranch !== false) {
|
|
75
|
+
const taskBranch = `${this.branchPrefix}${delegationId}`;
|
|
76
|
+
await execGit(repo.workDir, ['push', 'origin', '--delete', taskBranch]).catch(() => { });
|
|
77
|
+
}
|
|
78
|
+
await fs.promises.rm(repo.workDir, { recursive: true, force: true });
|
|
79
|
+
this.activeRepos.delete(delegationId);
|
|
80
|
+
}
|
|
81
|
+
async shutdown() {
|
|
82
|
+
for (const [delegationId] of this.activeRepos) {
|
|
83
|
+
await this.cleanup(delegationId);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ========== Executor Side ==========
|
|
87
|
+
async checkDependency() {
|
|
88
|
+
try {
|
|
89
|
+
await execGit(null, ['--version']);
|
|
90
|
+
return { available: true };
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return { available: false, hint: 'Git is not installed or not in PATH' };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async setup(params) {
|
|
97
|
+
const { delegationId, workDirInfo, workDir } = params;
|
|
98
|
+
if (workDirInfo.transport !== 'git') {
|
|
99
|
+
throw new Error(`GitTransport: unexpected transport type: ${workDirInfo.transport}`);
|
|
100
|
+
}
|
|
101
|
+
const info = workDirInfo;
|
|
102
|
+
// Clone repository
|
|
103
|
+
await execGit(null, [
|
|
104
|
+
'clone',
|
|
105
|
+
'--branch', info.baseBranch,
|
|
106
|
+
'--single-branch',
|
|
107
|
+
info.repoUrl,
|
|
108
|
+
workDir,
|
|
109
|
+
]);
|
|
110
|
+
// Configure auth for push
|
|
111
|
+
await configureAuth(workDir, info.auth);
|
|
112
|
+
// Create task branch
|
|
113
|
+
const taskBranch = `${this.branchPrefix}${delegationId}`;
|
|
114
|
+
await execGit(workDir, ['checkout', '-b', taskBranch]);
|
|
115
|
+
// Configure git user
|
|
116
|
+
await execGit(workDir, ['config', 'user.name', 'AWCP Executor']);
|
|
117
|
+
await execGit(workDir, ['config', 'user.email', 'executor@awcp.local']);
|
|
118
|
+
this.activeSetups.set(delegationId, { workDir, info });
|
|
119
|
+
return workDir;
|
|
120
|
+
}
|
|
121
|
+
async teardown(params) {
|
|
122
|
+
const { delegationId, workDir } = params;
|
|
123
|
+
const setup = this.activeSetups.get(delegationId);
|
|
124
|
+
if (!setup) {
|
|
125
|
+
return {};
|
|
126
|
+
}
|
|
127
|
+
const taskBranch = `${this.branchPrefix}${delegationId}`;
|
|
128
|
+
// Check for changes
|
|
129
|
+
const status = await execGit(workDir, ['status', '--porcelain']);
|
|
130
|
+
if (status.trim()) {
|
|
131
|
+
await execGit(workDir, ['add', '-A']);
|
|
132
|
+
await execGit(workDir, ['commit', '-m', `AWCP: Task completed for ${delegationId}`]);
|
|
133
|
+
}
|
|
134
|
+
// Push task branch
|
|
135
|
+
await execGit(workDir, ['push', '-u', 'origin', taskBranch]);
|
|
136
|
+
// Get snapshot info
|
|
137
|
+
const commitHash = (await execGit(workDir, ['rev-parse', 'HEAD'])).trim();
|
|
138
|
+
const changedFilesOutput = await execGit(workDir, ['diff', '--name-only', setup.info.baseCommit, 'HEAD']);
|
|
139
|
+
const changedFiles = changedFilesOutput.trim().split('\n').filter(Boolean);
|
|
140
|
+
this.activeSetups.delete(delegationId);
|
|
141
|
+
await cleanupAuth(workDir);
|
|
142
|
+
const snapshotInfo = {
|
|
143
|
+
branch: taskBranch,
|
|
144
|
+
commitHash,
|
|
145
|
+
baseCommit: setup.info.baseCommit,
|
|
146
|
+
changedFiles,
|
|
147
|
+
};
|
|
148
|
+
return { snapshotBase64: JSON.stringify(snapshotInfo) };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=git-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-transport.js","sourceRoot":"","sources":["../src/git-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @awcp/transport-git
|
|
3
|
+
*
|
|
4
|
+
* Git-based transport for AWCP workspace delegation.
|
|
5
|
+
* Supports GitHub, GitLab, Gitea, and self-hosted Git servers.
|
|
6
|
+
*/
|
|
7
|
+
export { GitTransport } from './git-transport.js';
|
|
8
|
+
export type { GitTransportConfig, GitDelegatorConfig, GitExecutorConfig, GitSnapshotInfo, } from './types.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GitCredential } from '@awcp/core';
|
|
2
|
+
export type { GitWorkDirInfo, GitCredential } from '@awcp/core';
|
|
3
|
+
export interface GitDelegatorConfig {
|
|
4
|
+
remoteUrl: string;
|
|
5
|
+
auth: GitCredential;
|
|
6
|
+
tempDir?: string;
|
|
7
|
+
branchPrefix?: string;
|
|
8
|
+
cleanupRemoteBranch?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface GitExecutorConfig {
|
|
11
|
+
tempDir?: string;
|
|
12
|
+
gitPath?: string;
|
|
13
|
+
cloneTimeout?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface GitTransportConfig {
|
|
16
|
+
delegator?: GitDelegatorConfig;
|
|
17
|
+
executor?: GitExecutorConfig;
|
|
18
|
+
}
|
|
19
|
+
export interface GitSnapshotInfo {
|
|
20
|
+
branch: string;
|
|
21
|
+
commitHash: string;
|
|
22
|
+
baseCommit: string;
|
|
23
|
+
changedFiles: string[];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GitCredential } from '@awcp/core';
|
|
2
|
+
export declare function execGit(cwd: string | null, args: string[]): Promise<string>;
|
|
3
|
+
export declare function configureAuth(workDir: string, auth?: GitCredential): Promise<void>;
|
|
4
|
+
export declare function cleanupAuth(workDir: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=git-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjF;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxF;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
export async function execGit(cwd, args) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const proc = spawn('git', args, {
|
|
7
|
+
cwd: cwd ?? undefined,
|
|
8
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
|
|
9
|
+
});
|
|
10
|
+
let stdout = '';
|
|
11
|
+
let stderr = '';
|
|
12
|
+
proc.stdout.on('data', (data) => { stdout += data.toString(); });
|
|
13
|
+
proc.stderr.on('data', (data) => { stderr += data.toString(); });
|
|
14
|
+
proc.on('close', (code) => {
|
|
15
|
+
if (code === 0) {
|
|
16
|
+
resolve(stdout);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
reject(new Error(`git ${args[0]} failed: ${stderr || stdout}`));
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
proc.on('error', reject);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export async function configureAuth(workDir, auth) {
|
|
26
|
+
if (!auth || auth.type === 'none')
|
|
27
|
+
return;
|
|
28
|
+
if (auth.type === 'token') {
|
|
29
|
+
await execGit(workDir, ['config', 'credential.helper', 'store']);
|
|
30
|
+
}
|
|
31
|
+
else if (auth.type === 'ssh' && auth.privateKey) {
|
|
32
|
+
const keyPath = path.join(workDir, '.git', 'awcp-key');
|
|
33
|
+
await fs.promises.writeFile(keyPath, auth.privateKey, { mode: 0o600 });
|
|
34
|
+
await execGit(workDir, ['config', 'core.sshCommand', `ssh -i ${keyPath} -o StrictHostKeyChecking=no`]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function cleanupAuth(workDir) {
|
|
38
|
+
const keyPath = path.join(workDir, '.git', 'awcp-key');
|
|
39
|
+
await fs.promises.unlink(keyPath).catch(() => { });
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=git-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAkB,EAAE,IAAc;IAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC9B,GAAG,EAAE,GAAG,IAAI,SAAS;YACrB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE;SAClD,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,IAAoB;IACvE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO;IAE1C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,OAAO,8BAA8B,CAAC,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@awcp/transport-git",
|
|
3
|
+
"version": "0.0.11",
|
|
4
|
+
"description": "AWCP Git Transport - Git-based workspace transfer with version history",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.build.json",
|
|
20
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@awcp/core": "^0.0.11",
|
|
26
|
+
"@awcp/transport-archive": "^0.0.11"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"awcp",
|
|
30
|
+
"git",
|
|
31
|
+
"transport",
|
|
32
|
+
"version-control"
|
|
33
|
+
],
|
|
34
|
+
"license": "Apache-2.0",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/anthropics/awcp.git",
|
|
38
|
+
"directory": "packages/transport-git"
|
|
39
|
+
}
|
|
40
|
+
}
|