@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.
@@ -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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"}
@@ -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,8 @@
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
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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,2 @@
1
+ export { execGit, configureAuth, cleanupAuth } from './git-utils.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { execGit, configureAuth, cleanupAuth } from './git-utils.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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
+ }