@generacy-ai/agency-plugin-git 0.0.0-preview-20260302182740
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/LICENSE +191 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/errors/auth-error.d.ts +23 -0
- package/dist/errors/auth-error.d.ts.map +1 -0
- package/dist/errors/auth-error.js +33 -0
- package/dist/errors/auth-error.js.map +1 -0
- package/dist/errors/conflict-error.d.ts +31 -0
- package/dist/errors/conflict-error.d.ts.map +1 -0
- package/dist/errors/conflict-error.js +49 -0
- package/dist/errors/conflict-error.js.map +1 -0
- package/dist/errors/detached-head-error.d.ts +26 -0
- package/dist/errors/detached-head-error.d.ts.map +1 -0
- package/dist/errors/detached-head-error.js +32 -0
- package/dist/errors/detached-head-error.js.map +1 -0
- package/dist/errors/git-error.d.ts +25 -0
- package/dist/errors/git-error.d.ts.map +1 -0
- package/dist/errors/git-error.js +33 -0
- package/dist/errors/git-error.js.map +1 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +9 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/network-error.d.ts +30 -0
- package/dist/errors/network-error.d.ts.map +1 -0
- package/dist/errors/network-error.js +67 -0
- package/dist/errors/network-error.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +28 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +79 -0
- package/dist/plugin.js.map +1 -0
- package/dist/tools/blame.d.ts +9 -0
- package/dist/tools/blame.d.ts.map +1 -0
- package/dist/tools/blame.js +67 -0
- package/dist/tools/blame.js.map +1 -0
- package/dist/tools/branch.d.ts +9 -0
- package/dist/tools/branch.d.ts.map +1 -0
- package/dist/tools/branch.js +141 -0
- package/dist/tools/branch.js.map +1 -0
- package/dist/tools/checkout.d.ts +9 -0
- package/dist/tools/checkout.d.ts.map +1 -0
- package/dist/tools/checkout.js +94 -0
- package/dist/tools/checkout.js.map +1 -0
- package/dist/tools/commit.d.ts +9 -0
- package/dist/tools/commit.d.ts.map +1 -0
- package/dist/tools/commit.js +90 -0
- package/dist/tools/commit.js.map +1 -0
- package/dist/tools/diff.d.ts +9 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +97 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +55 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/log.d.ts +9 -0
- package/dist/tools/log.d.ts.map +1 -0
- package/dist/tools/log.js +91 -0
- package/dist/tools/log.js.map +1 -0
- package/dist/tools/merge.d.ts +9 -0
- package/dist/tools/merge.d.ts.map +1 -0
- package/dist/tools/merge.js +119 -0
- package/dist/tools/merge.js.map +1 -0
- package/dist/tools/pull.d.ts +9 -0
- package/dist/tools/pull.d.ts.map +1 -0
- package/dist/tools/pull.js +113 -0
- package/dist/tools/pull.js.map +1 -0
- package/dist/tools/push.d.ts +9 -0
- package/dist/tools/push.d.ts.map +1 -0
- package/dist/tools/push.js +116 -0
- package/dist/tools/push.js.map +1 -0
- package/dist/tools/rebase.d.ts +9 -0
- package/dist/tools/rebase.d.ts.map +1 -0
- package/dist/tools/rebase.js +147 -0
- package/dist/tools/rebase.js.map +1 -0
- package/dist/tools/stash.d.ts +9 -0
- package/dist/tools/stash.d.ts.map +1 -0
- package/dist/tools/stash.js +151 -0
- package/dist/tools/stash.js.map +1 -0
- package/dist/tools/status.d.ts +9 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +76 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/types.d.ts +297 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/conflict-parser.d.ts +38 -0
- package/dist/utils/conflict-parser.d.ts.map +1 -0
- package/dist/utils/conflict-parser.js +158 -0
- package/dist/utils/conflict-parser.js.map +1 -0
- package/dist/utils/exec-git.d.ts +45 -0
- package/dist/utils/exec-git.d.ts.map +1 -0
- package/dist/utils/exec-git.js +180 -0
- package/dist/utils/exec-git.js.map +1 -0
- package/dist/utils/parse-blame.d.ts +29 -0
- package/dist/utils/parse-blame.d.ts.map +1 -0
- package/dist/utils/parse-blame.js +97 -0
- package/dist/utils/parse-blame.js.map +1 -0
- package/dist/utils/parse-diff.d.ts +25 -0
- package/dist/utils/parse-diff.d.ts.map +1 -0
- package/dist/utils/parse-diff.js +105 -0
- package/dist/utils/parse-diff.js.map +1 -0
- package/dist/utils/parse-log.d.ts +33 -0
- package/dist/utils/parse-log.d.ts.map +1 -0
- package/dist/utils/parse-log.js +90 -0
- package/dist/utils/parse-log.js.map +1 -0
- package/dist/utils/parse-status.d.ts +22 -0
- package/dist/utils/parse-status.d.ts.map +1 -0
- package/dist/utils/parse-status.js +173 -0
- package/dist/utils/parse-status.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.commit tool
|
|
3
|
+
*
|
|
4
|
+
* Create a commit with structured output.
|
|
5
|
+
*/
|
|
6
|
+
import { TerseOutput, terseToMcpToolResult } from '@generacy-ai/agency';
|
|
7
|
+
import { execGitOrThrow, execGit } from '../utils/exec-git.js';
|
|
8
|
+
export function createCommitTool(config) {
|
|
9
|
+
return {
|
|
10
|
+
name: 'source_control.commit',
|
|
11
|
+
description: 'Create a commit',
|
|
12
|
+
namespace: 'source_control',
|
|
13
|
+
outputPattern: 'terse',
|
|
14
|
+
modes: ['default', 'coding'],
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
cwd: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Working directory',
|
|
21
|
+
},
|
|
22
|
+
message: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Commit message (required)',
|
|
25
|
+
},
|
|
26
|
+
files: {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: { type: 'string' },
|
|
29
|
+
description: 'Specific files to commit. If omitted, commits all staged',
|
|
30
|
+
},
|
|
31
|
+
amend: {
|
|
32
|
+
type: 'boolean',
|
|
33
|
+
description: 'Amend the previous commit',
|
|
34
|
+
},
|
|
35
|
+
allowEmpty: {
|
|
36
|
+
type: 'boolean',
|
|
37
|
+
description: 'Allow empty commit',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ['message'],
|
|
41
|
+
},
|
|
42
|
+
async execute(params) {
|
|
43
|
+
const { cwd, message, files, amend = false, allowEmpty = false, } = params || {};
|
|
44
|
+
if (!message) {
|
|
45
|
+
return terseToMcpToolResult(TerseOutput.failure('message parameter is required'));
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
// If files specified, stage them first
|
|
49
|
+
if (files && files.length > 0) {
|
|
50
|
+
await execGitOrThrow(['add', '--', ...files], { cwd, timeout: config.timeout });
|
|
51
|
+
}
|
|
52
|
+
// Build commit args
|
|
53
|
+
const args = ['commit', '-m', message];
|
|
54
|
+
if (amend) {
|
|
55
|
+
args.push('--amend');
|
|
56
|
+
}
|
|
57
|
+
if (allowEmpty) {
|
|
58
|
+
args.push('--allow-empty');
|
|
59
|
+
}
|
|
60
|
+
if (config.signCommits) {
|
|
61
|
+
args.push('-S');
|
|
62
|
+
}
|
|
63
|
+
await execGitOrThrow(args, { cwd, timeout: config.timeout });
|
|
64
|
+
// Get commit info
|
|
65
|
+
const logResult = await execGit(['log', '-1', '--format=%H%n%h%n%D'], { cwd, timeout: config.timeout });
|
|
66
|
+
const [hash, shortHash, refs] = logResult.stdout.split('\n');
|
|
67
|
+
// Extract branch name from refs
|
|
68
|
+
const branchMatch = refs?.match(/HEAD -> ([^,]+)/);
|
|
69
|
+
const branch = branchMatch?.[1] ?? 'HEAD';
|
|
70
|
+
// Get files changed count
|
|
71
|
+
const diffResult = await execGit(['diff-tree', '--no-commit-id', '--name-only', '-r', 'HEAD'], { cwd, timeout: config.timeout });
|
|
72
|
+
const filesChanged = diffResult.stdout.split('\n').filter(Boolean).length;
|
|
73
|
+
const result = {
|
|
74
|
+
hash: hash ?? '',
|
|
75
|
+
shortHash: shortHash ?? '',
|
|
76
|
+
branch,
|
|
77
|
+
filesChanged,
|
|
78
|
+
};
|
|
79
|
+
return terseToMcpToolResult(TerseOutput.success(JSON.stringify({
|
|
80
|
+
...result,
|
|
81
|
+
summary: `Created commit ${shortHash} on ${branch} (${filesChanged} files)`,
|
|
82
|
+
})));
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return terseToMcpToolResult(TerseOutput.failure(error instanceof Error ? error : String(error)));
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/tools/commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.diff tool
|
|
3
|
+
*
|
|
4
|
+
* Show changes (staged, unstaged, or between refs).
|
|
5
|
+
*/
|
|
6
|
+
import type { AgencyTool } from '@generacy-ai/agency';
|
|
7
|
+
import type { GitPluginConfig } from '../config.js';
|
|
8
|
+
export declare function createDiffTool(config: GitPluginConfig): AgencyTool;
|
|
9
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/tools/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CAoHlE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.diff tool
|
|
3
|
+
*
|
|
4
|
+
* Show changes (staged, unstaged, or between refs).
|
|
5
|
+
*/
|
|
6
|
+
import { TerseOutput, terseToMcpToolResult } from '@generacy-ai/agency';
|
|
7
|
+
import { execGitOrThrow } from '../utils/exec-git.js';
|
|
8
|
+
import { parseDiffNumstat, formatDiffSummary } from '../utils/parse-diff.js';
|
|
9
|
+
export function createDiffTool(config) {
|
|
10
|
+
return {
|
|
11
|
+
name: 'source_control.diff',
|
|
12
|
+
description: 'Show changes (staged, unstaged, or between refs)',
|
|
13
|
+
namespace: 'source_control',
|
|
14
|
+
outputPattern: 'terse',
|
|
15
|
+
modes: ['default', 'research', 'coding', 'review'],
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: {
|
|
19
|
+
cwd: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Working directory',
|
|
22
|
+
},
|
|
23
|
+
staged: {
|
|
24
|
+
type: 'boolean',
|
|
25
|
+
description: 'Show staged changes only',
|
|
26
|
+
},
|
|
27
|
+
ref1: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'First ref for comparison (default: working tree)',
|
|
30
|
+
},
|
|
31
|
+
ref2: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Second ref for comparison',
|
|
34
|
+
},
|
|
35
|
+
files: {
|
|
36
|
+
type: 'array',
|
|
37
|
+
items: { type: 'string' },
|
|
38
|
+
description: 'Specific files to diff',
|
|
39
|
+
},
|
|
40
|
+
format: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
enum: ['summary', 'stat', 'full'],
|
|
43
|
+
description: 'Output format (default: summary)',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
async execute(params) {
|
|
48
|
+
const { cwd, staged = false, ref1, ref2, files, format = 'summary', } = params || {};
|
|
49
|
+
try {
|
|
50
|
+
// Build args based on mode
|
|
51
|
+
const args = ['diff'];
|
|
52
|
+
if (format !== 'full') {
|
|
53
|
+
args.push('--numstat');
|
|
54
|
+
}
|
|
55
|
+
if (staged) {
|
|
56
|
+
args.push('--cached');
|
|
57
|
+
}
|
|
58
|
+
if (ref1) {
|
|
59
|
+
args.push(ref1);
|
|
60
|
+
}
|
|
61
|
+
if (ref2) {
|
|
62
|
+
args.push(ref2);
|
|
63
|
+
}
|
|
64
|
+
if (files && files.length > 0) {
|
|
65
|
+
args.push('--', ...files);
|
|
66
|
+
}
|
|
67
|
+
const result = await execGitOrThrow(args, { cwd, timeout: config.timeout });
|
|
68
|
+
if (format === 'full') {
|
|
69
|
+
// For full format, return the raw diff
|
|
70
|
+
const diffResult = {
|
|
71
|
+
filesChanged: 0,
|
|
72
|
+
insertions: 0,
|
|
73
|
+
deletions: 0,
|
|
74
|
+
patch: result.stdout,
|
|
75
|
+
};
|
|
76
|
+
// Get stats separately
|
|
77
|
+
const statsResult = await execGitOrThrow([...args.filter((a) => a !== '--numstat'), '--numstat'], { cwd, timeout: config.timeout });
|
|
78
|
+
const stats = parseDiffNumstat(statsResult.stdout);
|
|
79
|
+
diffResult.filesChanged = stats.filesChanged;
|
|
80
|
+
diffResult.insertions = stats.insertions;
|
|
81
|
+
diffResult.deletions = stats.deletions;
|
|
82
|
+
return terseToMcpToolResult(TerseOutput.success(JSON.stringify(diffResult)));
|
|
83
|
+
}
|
|
84
|
+
const diffResult = parseDiffNumstat(result.stdout);
|
|
85
|
+
const summary = formatDiffSummary(diffResult);
|
|
86
|
+
return terseToMcpToolResult(TerseOutput.success(JSON.stringify({
|
|
87
|
+
...diffResult,
|
|
88
|
+
summary,
|
|
89
|
+
})));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return terseToMcpToolResult(TerseOutput.failure(error instanceof Error ? error : String(error)));
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/tools/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool exports and factory for @generacy-ai/agency-plugin-git
|
|
3
|
+
*/
|
|
4
|
+
import type { AgencyTool, AgencyCoreAPI } from '@generacy-ai/agency';
|
|
5
|
+
import type { GitPluginConfig } from '../config.js';
|
|
6
|
+
export { createStatusTool } from './status.js';
|
|
7
|
+
export { createDiffTool } from './diff.js';
|
|
8
|
+
export { createLogTool } from './log.js';
|
|
9
|
+
export { createBlameTool } from './blame.js';
|
|
10
|
+
export { createCommitTool } from './commit.js';
|
|
11
|
+
export { createPushTool } from './push.js';
|
|
12
|
+
export { createPullTool } from './pull.js';
|
|
13
|
+
export { createCheckoutTool } from './checkout.js';
|
|
14
|
+
export { createBranchTool } from './branch.js';
|
|
15
|
+
export { createStashTool } from './stash.js';
|
|
16
|
+
export { createMergeTool } from './merge.js';
|
|
17
|
+
export { createRebaseTool } from './rebase.js';
|
|
18
|
+
/**
|
|
19
|
+
* Create all git tools
|
|
20
|
+
*
|
|
21
|
+
* @param config - Plugin configuration
|
|
22
|
+
* @param core - Agency core API (needed for push escalation)
|
|
23
|
+
* @returns Array of all 12 git tools
|
|
24
|
+
*/
|
|
25
|
+
export declare function createTools(config: GitPluginConfig, core: AgencyCoreAPI): AgencyTool[];
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAiBpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,aAAa,GAClB,UAAU,EAAE,CAkBd"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool exports and factory for @generacy-ai/agency-plugin-git
|
|
3
|
+
*/
|
|
4
|
+
// Tool creators
|
|
5
|
+
import { createStatusTool } from './status.js';
|
|
6
|
+
import { createDiffTool } from './diff.js';
|
|
7
|
+
import { createLogTool } from './log.js';
|
|
8
|
+
import { createBlameTool } from './blame.js';
|
|
9
|
+
import { createCommitTool } from './commit.js';
|
|
10
|
+
import { createPushTool } from './push.js';
|
|
11
|
+
import { createPullTool } from './pull.js';
|
|
12
|
+
import { createCheckoutTool } from './checkout.js';
|
|
13
|
+
import { createBranchTool } from './branch.js';
|
|
14
|
+
import { createStashTool } from './stash.js';
|
|
15
|
+
import { createMergeTool } from './merge.js';
|
|
16
|
+
import { createRebaseTool } from './rebase.js';
|
|
17
|
+
// Re-export individual creators
|
|
18
|
+
export { createStatusTool } from './status.js';
|
|
19
|
+
export { createDiffTool } from './diff.js';
|
|
20
|
+
export { createLogTool } from './log.js';
|
|
21
|
+
export { createBlameTool } from './blame.js';
|
|
22
|
+
export { createCommitTool } from './commit.js';
|
|
23
|
+
export { createPushTool } from './push.js';
|
|
24
|
+
export { createPullTool } from './pull.js';
|
|
25
|
+
export { createCheckoutTool } from './checkout.js';
|
|
26
|
+
export { createBranchTool } from './branch.js';
|
|
27
|
+
export { createStashTool } from './stash.js';
|
|
28
|
+
export { createMergeTool } from './merge.js';
|
|
29
|
+
export { createRebaseTool } from './rebase.js';
|
|
30
|
+
/**
|
|
31
|
+
* Create all git tools
|
|
32
|
+
*
|
|
33
|
+
* @param config - Plugin configuration
|
|
34
|
+
* @param core - Agency core API (needed for push escalation)
|
|
35
|
+
* @returns Array of all 12 git tools
|
|
36
|
+
*/
|
|
37
|
+
export function createTools(config, core) {
|
|
38
|
+
return [
|
|
39
|
+
// Read-only tools (research, coding, review modes)
|
|
40
|
+
createStatusTool(config),
|
|
41
|
+
createDiffTool(config),
|
|
42
|
+
createLogTool(config),
|
|
43
|
+
createBlameTool(config),
|
|
44
|
+
// Write tools (coding mode only)
|
|
45
|
+
createCommitTool(config),
|
|
46
|
+
createPushTool(config, core),
|
|
47
|
+
createPullTool(config),
|
|
48
|
+
createCheckoutTool(config),
|
|
49
|
+
createBranchTool(config),
|
|
50
|
+
createStashTool(config),
|
|
51
|
+
createMergeTool(config),
|
|
52
|
+
createRebaseTool(config),
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,gBAAgB;AAChB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,gCAAgC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,MAAuB,EACvB,IAAmB;IAEnB,OAAO;QACL,mDAAmD;QACnD,gBAAgB,CAAC,MAAM,CAAC;QACxB,cAAc,CAAC,MAAM,CAAC;QACtB,aAAa,CAAC,MAAM,CAAC;QACrB,eAAe,CAAC,MAAM,CAAC;QAEvB,iCAAiC;QACjC,gBAAgB,CAAC,MAAM,CAAC;QACxB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5B,cAAc,CAAC,MAAM,CAAC;QACtB,kBAAkB,CAAC,MAAM,CAAC;QAC1B,gBAAgB,CAAC,MAAM,CAAC;QACxB,eAAe,CAAC,MAAM,CAAC;QACvB,eAAe,CAAC,MAAM,CAAC;QACvB,gBAAgB,CAAC,MAAM,CAAC;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.log tool
|
|
3
|
+
*
|
|
4
|
+
* View commit history with structured output.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgencyTool } from '@generacy-ai/agency';
|
|
7
|
+
import type { GitPluginConfig } from '../config.js';
|
|
8
|
+
export declare function createLogTool(config: GitPluginConfig): AgencyTool;
|
|
9
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/tools/log.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CA0GjE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.log tool
|
|
3
|
+
*
|
|
4
|
+
* View commit history with structured output.
|
|
5
|
+
*/
|
|
6
|
+
import { TerseOutput, terseToMcpToolResult } from '@generacy-ai/agency';
|
|
7
|
+
import { execGitOrThrow } from '../utils/exec-git.js';
|
|
8
|
+
import { parseLog, LOG_FORMAT, formatLogList } from '../utils/parse-log.js';
|
|
9
|
+
export function createLogTool(config) {
|
|
10
|
+
return {
|
|
11
|
+
name: 'source_control.log',
|
|
12
|
+
description: 'View commit history',
|
|
13
|
+
namespace: 'source_control',
|
|
14
|
+
outputPattern: 'terse',
|
|
15
|
+
modes: ['default', 'research', 'coding', 'review'],
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: {
|
|
19
|
+
cwd: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Working directory',
|
|
22
|
+
},
|
|
23
|
+
limit: {
|
|
24
|
+
type: 'number',
|
|
25
|
+
description: 'Maximum commits to return (default: 10)',
|
|
26
|
+
},
|
|
27
|
+
ref: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Starting ref (default: HEAD)',
|
|
30
|
+
},
|
|
31
|
+
file: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Show commits for specific file',
|
|
34
|
+
},
|
|
35
|
+
author: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Filter by author (email or name pattern)',
|
|
38
|
+
},
|
|
39
|
+
since: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Show commits since date (ISO format)',
|
|
42
|
+
},
|
|
43
|
+
until: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Show commits until date (ISO format)',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
async execute(params) {
|
|
50
|
+
const { cwd, limit = 10, ref, file, author, since, until, } = params || {};
|
|
51
|
+
try {
|
|
52
|
+
const args = [
|
|
53
|
+
'log',
|
|
54
|
+
`--format=format:${LOG_FORMAT}`,
|
|
55
|
+
`-n${limit + 1}`, // +1 to detect hasMore
|
|
56
|
+
];
|
|
57
|
+
if (ref) {
|
|
58
|
+
args.push(ref);
|
|
59
|
+
}
|
|
60
|
+
if (author) {
|
|
61
|
+
args.push(`--author=${author}`);
|
|
62
|
+
}
|
|
63
|
+
if (since) {
|
|
64
|
+
args.push(`--since=${since}`);
|
|
65
|
+
}
|
|
66
|
+
if (until) {
|
|
67
|
+
args.push(`--until=${until}`);
|
|
68
|
+
}
|
|
69
|
+
if (file) {
|
|
70
|
+
args.push('--', file);
|
|
71
|
+
}
|
|
72
|
+
const result = await execGitOrThrow(args, { cwd, timeout: config.timeout });
|
|
73
|
+
const logResult = parseLog(result.stdout, limit);
|
|
74
|
+
// Trim to actual limit
|
|
75
|
+
if (logResult.commits.length > limit) {
|
|
76
|
+
logResult.commits = logResult.commits.slice(0, limit);
|
|
77
|
+
logResult.hasMore = true;
|
|
78
|
+
}
|
|
79
|
+
const summary = formatLogList(logResult);
|
|
80
|
+
return terseToMcpToolResult(TerseOutput.success(JSON.stringify({
|
|
81
|
+
...logResult,
|
|
82
|
+
summary,
|
|
83
|
+
})));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return terseToMcpToolResult(TerseOutput.failure(error instanceof Error ? error : String(error)));
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/tools/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.merge tool
|
|
3
|
+
*
|
|
4
|
+
* Merge branches with conflict detection.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgencyTool } from '@generacy-ai/agency';
|
|
7
|
+
import type { GitPluginConfig } from '../config.js';
|
|
8
|
+
export declare function createMergeTool(config: GitPluginConfig): AgencyTool;
|
|
9
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CA8InE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.merge tool
|
|
3
|
+
*
|
|
4
|
+
* Merge branches with conflict detection.
|
|
5
|
+
*/
|
|
6
|
+
import { TerseOutput, terseToMcpToolResult } from '@generacy-ai/agency';
|
|
7
|
+
import { execGit, classifyError } from '../utils/exec-git.js';
|
|
8
|
+
import { parseConflictsFromFiles, getConflictedFilesFromStatus } from '../utils/conflict-parser.js';
|
|
9
|
+
import { ConflictError } from '../errors/index.js';
|
|
10
|
+
export function createMergeTool(config) {
|
|
11
|
+
return {
|
|
12
|
+
name: 'source_control.merge',
|
|
13
|
+
description: 'Merge branches',
|
|
14
|
+
namespace: 'source_control',
|
|
15
|
+
outputPattern: 'terse',
|
|
16
|
+
modes: ['default', 'coding'],
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
cwd: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Working directory',
|
|
23
|
+
},
|
|
24
|
+
branch: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Branch to merge (required)',
|
|
27
|
+
},
|
|
28
|
+
noCommit: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: "Don't auto-commit the merge",
|
|
31
|
+
},
|
|
32
|
+
strategy: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
enum: ['ours', 'theirs', 'recursive'],
|
|
35
|
+
description: 'Merge strategy',
|
|
36
|
+
},
|
|
37
|
+
squash: {
|
|
38
|
+
type: 'boolean',
|
|
39
|
+
description: 'Squash commits',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ['branch'],
|
|
43
|
+
},
|
|
44
|
+
async execute(params) {
|
|
45
|
+
const { cwd, branch, noCommit = false, strategy, squash = false, } = params || {};
|
|
46
|
+
if (!branch) {
|
|
47
|
+
return terseToMcpToolResult(TerseOutput.failure('branch parameter is required'));
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const args = ['merge'];
|
|
51
|
+
if (noCommit) {
|
|
52
|
+
args.push('--no-commit');
|
|
53
|
+
}
|
|
54
|
+
if (strategy) {
|
|
55
|
+
args.push('-s', strategy);
|
|
56
|
+
}
|
|
57
|
+
if (squash) {
|
|
58
|
+
args.push('--squash');
|
|
59
|
+
}
|
|
60
|
+
args.push(branch);
|
|
61
|
+
const result = await execGit(args, { cwd, timeout: config.timeout });
|
|
62
|
+
if (result.exitCode !== 0) {
|
|
63
|
+
// Check for conflicts
|
|
64
|
+
const statusResult = await execGit(['status', '--porcelain=v2'], { cwd, timeout: config.timeout });
|
|
65
|
+
const conflictedFiles = getConflictedFilesFromStatus(statusResult.stdout);
|
|
66
|
+
if (conflictedFiles.length > 0) {
|
|
67
|
+
const conflicts = await parseConflictsFromFiles(conflictedFiles, cwd);
|
|
68
|
+
throw new ConflictError(`Merge conflict with ${branch}`, {
|
|
69
|
+
command: result.command,
|
|
70
|
+
exitCode: result.exitCode,
|
|
71
|
+
stderr: result.stderr,
|
|
72
|
+
cwd: cwd ?? process.cwd(),
|
|
73
|
+
conflicts,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Other error
|
|
77
|
+
throw classifyError(result, cwd ?? process.cwd());
|
|
78
|
+
}
|
|
79
|
+
// Parse result
|
|
80
|
+
const isUpToDate = result.stdout.includes('Already up to date');
|
|
81
|
+
const isFastForward = result.stdout.includes('Fast-forward');
|
|
82
|
+
let summary;
|
|
83
|
+
if (isUpToDate) {
|
|
84
|
+
summary = 'Already up to date';
|
|
85
|
+
}
|
|
86
|
+
else if (isFastForward) {
|
|
87
|
+
summary = `Fast-forward merge of '${branch}'`;
|
|
88
|
+
}
|
|
89
|
+
else if (squash) {
|
|
90
|
+
summary = `Squash merged '${branch}'${noCommit ? ' (not committed)' : ''}`;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
summary = `Merged '${branch}'${noCommit ? ' (not committed)' : ''}`;
|
|
94
|
+
}
|
|
95
|
+
return terseToMcpToolResult(TerseOutput.success(JSON.stringify({
|
|
96
|
+
success: true,
|
|
97
|
+
branch,
|
|
98
|
+
upToDate: isUpToDate,
|
|
99
|
+
fastForward: isFastForward,
|
|
100
|
+
squash,
|
|
101
|
+
noCommit,
|
|
102
|
+
summary,
|
|
103
|
+
})));
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error instanceof ConflictError) {
|
|
107
|
+
return terseToMcpToolResult(TerseOutput.failure(JSON.stringify({
|
|
108
|
+
error: 'conflict',
|
|
109
|
+
message: error.message,
|
|
110
|
+
branch,
|
|
111
|
+
conflicts: error.conflicts,
|
|
112
|
+
})));
|
|
113
|
+
}
|
|
114
|
+
return terseToMcpToolResult(TerseOutput.failure(error instanceof Error ? error : String(error)));
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* source_control.pull tool
|
|
3
|
+
*
|
|
4
|
+
* Pull from remote with conflict detection.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgencyTool } from '@generacy-ai/agency';
|
|
7
|
+
import type { GitPluginConfig } from '../config.js';
|
|
8
|
+
export declare function createPullTool(config: GitPluginConfig): AgencyTool;
|
|
9
|
+
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/tools/pull.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CAqIlE"}
|