@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.
Files changed (118) hide show
  1. package/LICENSE +191 -0
  2. package/dist/config.d.ts +25 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +22 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/errors/auth-error.d.ts +23 -0
  7. package/dist/errors/auth-error.d.ts.map +1 -0
  8. package/dist/errors/auth-error.js +33 -0
  9. package/dist/errors/auth-error.js.map +1 -0
  10. package/dist/errors/conflict-error.d.ts +31 -0
  11. package/dist/errors/conflict-error.d.ts.map +1 -0
  12. package/dist/errors/conflict-error.js +49 -0
  13. package/dist/errors/conflict-error.js.map +1 -0
  14. package/dist/errors/detached-head-error.d.ts +26 -0
  15. package/dist/errors/detached-head-error.d.ts.map +1 -0
  16. package/dist/errors/detached-head-error.js +32 -0
  17. package/dist/errors/detached-head-error.js.map +1 -0
  18. package/dist/errors/git-error.d.ts +25 -0
  19. package/dist/errors/git-error.d.ts.map +1 -0
  20. package/dist/errors/git-error.js +33 -0
  21. package/dist/errors/git-error.js.map +1 -0
  22. package/dist/errors/index.d.ts +9 -0
  23. package/dist/errors/index.d.ts.map +1 -0
  24. package/dist/errors/index.js +9 -0
  25. package/dist/errors/index.js.map +1 -0
  26. package/dist/errors/network-error.d.ts +30 -0
  27. package/dist/errors/network-error.d.ts.map +1 -0
  28. package/dist/errors/network-error.js +67 -0
  29. package/dist/errors/network-error.js.map +1 -0
  30. package/dist/index.d.ts +26 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +29 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/plugin.d.ts +28 -0
  35. package/dist/plugin.d.ts.map +1 -0
  36. package/dist/plugin.js +79 -0
  37. package/dist/plugin.js.map +1 -0
  38. package/dist/tools/blame.d.ts +9 -0
  39. package/dist/tools/blame.d.ts.map +1 -0
  40. package/dist/tools/blame.js +67 -0
  41. package/dist/tools/blame.js.map +1 -0
  42. package/dist/tools/branch.d.ts +9 -0
  43. package/dist/tools/branch.d.ts.map +1 -0
  44. package/dist/tools/branch.js +141 -0
  45. package/dist/tools/branch.js.map +1 -0
  46. package/dist/tools/checkout.d.ts +9 -0
  47. package/dist/tools/checkout.d.ts.map +1 -0
  48. package/dist/tools/checkout.js +94 -0
  49. package/dist/tools/checkout.js.map +1 -0
  50. package/dist/tools/commit.d.ts +9 -0
  51. package/dist/tools/commit.d.ts.map +1 -0
  52. package/dist/tools/commit.js +90 -0
  53. package/dist/tools/commit.js.map +1 -0
  54. package/dist/tools/diff.d.ts +9 -0
  55. package/dist/tools/diff.d.ts.map +1 -0
  56. package/dist/tools/diff.js +97 -0
  57. package/dist/tools/diff.js.map +1 -0
  58. package/dist/tools/index.d.ts +26 -0
  59. package/dist/tools/index.d.ts.map +1 -0
  60. package/dist/tools/index.js +55 -0
  61. package/dist/tools/index.js.map +1 -0
  62. package/dist/tools/log.d.ts +9 -0
  63. package/dist/tools/log.d.ts.map +1 -0
  64. package/dist/tools/log.js +91 -0
  65. package/dist/tools/log.js.map +1 -0
  66. package/dist/tools/merge.d.ts +9 -0
  67. package/dist/tools/merge.d.ts.map +1 -0
  68. package/dist/tools/merge.js +119 -0
  69. package/dist/tools/merge.js.map +1 -0
  70. package/dist/tools/pull.d.ts +9 -0
  71. package/dist/tools/pull.d.ts.map +1 -0
  72. package/dist/tools/pull.js +113 -0
  73. package/dist/tools/pull.js.map +1 -0
  74. package/dist/tools/push.d.ts +9 -0
  75. package/dist/tools/push.d.ts.map +1 -0
  76. package/dist/tools/push.js +116 -0
  77. package/dist/tools/push.js.map +1 -0
  78. package/dist/tools/rebase.d.ts +9 -0
  79. package/dist/tools/rebase.d.ts.map +1 -0
  80. package/dist/tools/rebase.js +147 -0
  81. package/dist/tools/rebase.js.map +1 -0
  82. package/dist/tools/stash.d.ts +9 -0
  83. package/dist/tools/stash.d.ts.map +1 -0
  84. package/dist/tools/stash.js +151 -0
  85. package/dist/tools/stash.js.map +1 -0
  86. package/dist/tools/status.d.ts +9 -0
  87. package/dist/tools/status.d.ts.map +1 -0
  88. package/dist/tools/status.js +76 -0
  89. package/dist/tools/status.js.map +1 -0
  90. package/dist/types.d.ts +297 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +7 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/utils/conflict-parser.d.ts +38 -0
  95. package/dist/utils/conflict-parser.d.ts.map +1 -0
  96. package/dist/utils/conflict-parser.js +158 -0
  97. package/dist/utils/conflict-parser.js.map +1 -0
  98. package/dist/utils/exec-git.d.ts +45 -0
  99. package/dist/utils/exec-git.d.ts.map +1 -0
  100. package/dist/utils/exec-git.js +180 -0
  101. package/dist/utils/exec-git.js.map +1 -0
  102. package/dist/utils/parse-blame.d.ts +29 -0
  103. package/dist/utils/parse-blame.d.ts.map +1 -0
  104. package/dist/utils/parse-blame.js +97 -0
  105. package/dist/utils/parse-blame.js.map +1 -0
  106. package/dist/utils/parse-diff.d.ts +25 -0
  107. package/dist/utils/parse-diff.d.ts.map +1 -0
  108. package/dist/utils/parse-diff.js +105 -0
  109. package/dist/utils/parse-diff.js.map +1 -0
  110. package/dist/utils/parse-log.d.ts +33 -0
  111. package/dist/utils/parse-log.d.ts.map +1 -0
  112. package/dist/utils/parse-log.js +90 -0
  113. package/dist/utils/parse-log.js.map +1 -0
  114. package/dist/utils/parse-status.d.ts +22 -0
  115. package/dist/utils/parse-status.d.ts.map +1 -0
  116. package/dist/utils/parse-status.js +173 -0
  117. package/dist/utils/parse-status.js.map +1 -0
  118. 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":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,gBAAgB;QAC7B,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,OAAO;QACtB,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC5B,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mBAAmB;iBACjC;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4BAA4B;iBAC1C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC;oBACrC,WAAW,EAAE,gBAAgB;iBAC9B;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,gBAAgB;iBAC9B;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QAED,KAAK,CAAC,OAAO,CAAC,MAAe;YAC3B,MAAM,EACJ,GAAG,EACH,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,MAAM,GAAG,KAAK,GACf,GAAI,MAAsB,IAAI,EAAE,CAAC;YAElC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,oBAAoB,CACzB,WAAW,CAAC,OAAO,CAAC,8BAA8B,CAAC,CACpD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,GAAa,CAAC,OAAO,CAAC,CAAC;gBAEjC,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC3B,CAAC;gBAED,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC5B,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAElB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAErE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC1B,sBAAsB;oBACtB,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAC5B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CACjC,CAAC;oBAEF,MAAM,eAAe,GAAG,4BAA4B,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAE1E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;wBAEtE,MAAM,IAAI,aAAa,CAAC,uBAAuB,MAAM,EAAE,EAAE;4BACvD,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;4BACzB,SAAS;yBACV,CAAC,CAAC;oBACL,CAAC;oBAED,cAAc;oBACd,MAAM,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAED,eAAe;gBACf,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAChE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;gBAE7D,IAAI,OAAe,CAAC;gBACpB,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,GAAG,oBAAoB,CAAC;gBACjC,CAAC;qBAAM,IAAI,aAAa,EAAE,CAAC;oBACzB,OAAO,GAAG,0BAA0B,MAAM,GAAG,CAAC;gBAChD,CAAC;qBAAM,IAAI,MAAM,EAAE,CAAC;oBAClB,OAAO,GAAG,kBAAkB,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,WAAW,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACtE,CAAC;gBAED,OAAO,oBAAoB,CACzB,WAAW,CAAC,OAAO,CACjB,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,IAAI;oBACb,MAAM;oBACN,QAAQ,EAAE,UAAU;oBACpB,WAAW,EAAE,aAAa;oBAC1B,MAAM;oBACN,QAAQ;oBACR,OAAO;iBACR,CAAC,CACH,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;oBACnC,OAAO,oBAAoB,CACzB,WAAW,CAAC,OAAO,CACjB,IAAI,CAAC,SAAS,CAAC;wBACb,KAAK,EAAE,UAAU;wBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,MAAM;wBACN,SAAS,EAAE,KAAK,CAAC,SAAS;qBAC3B,CAAC,CACH,CACF,CAAC;gBACJ,CAAC;gBAED,OAAO,oBAAoB,CACzB,WAAW,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -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"}