@acquis-consulting/asm 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/dist/apps/gitDiffReview/gitDiffParser.d.ts +6 -0
- package/dist/apps/gitDiffReview/gitDiffParser.js +1 -0
- package/dist/apps/gitDiffReview/packageXml.d.ts +8 -0
- package/dist/apps/gitDiffReview/packageXml.js +1 -0
- package/dist/apps/gitDiffReview/tools.d.ts +42 -0
- package/dist/apps/gitDiffReview/tools.js +1 -0
- package/dist/apps/gitDiffReview/types.d.ts +19 -0
- package/dist/apps/gitDiffReview/types.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata-diff.html +98 -0
- package/dist/tools/aggregateQuery.d.ts +85 -0
- package/dist/tools/aggregateQuery.js +110 -0
- package/dist/tools/aggregateQuery.js.map +1 -0
- package/dist/tools/bulkExportAbort.d.ts +37 -0
- package/dist/tools/bulkExportAbort.js +44 -0
- package/dist/tools/bulkExportAbort.js.map +1 -0
- package/dist/tools/bulkExportResults.d.ts +51 -0
- package/dist/tools/bulkExportResults.js +76 -0
- package/dist/tools/bulkExportResults.js.map +1 -0
- package/dist/tools/bulkExportStart.d.ts +61 -0
- package/dist/tools/bulkExportStart.js +68 -0
- package/dist/tools/bulkExportStart.js.map +1 -0
- package/dist/tools/bulkExportStatus.d.ts +37 -0
- package/dist/tools/bulkExportStatus.js +54 -0
- package/dist/tools/bulkExportStatus.js.map +1 -0
- package/dist/tools/crossObjectSearch.d.ts +155 -0
- package/dist/tools/crossObjectSearch.js +145 -0
- package/dist/tools/crossObjectSearch.js.map +1 -0
- package/dist/tools/debugLogs.d.ts +106 -0
- package/dist/tools/debugLogs.js +189 -0
- package/dist/tools/debugLogs.js.map +1 -0
- package/dist/tools/deployMetadata.d.ts +60 -0
- package/dist/tools/deployMetadata.js +106 -0
- package/dist/tools/deployMetadata.js.map +1 -0
- package/dist/tools/deployPackage.d.ts +49 -0
- package/dist/tools/deployPackage.js +1 -0
- package/dist/tools/dml.d.ts +70 -0
- package/dist/tools/dml.js +105 -0
- package/dist/tools/dml.js.map +1 -0
- package/dist/tools/dmlDelete.d.ts +51 -0
- package/dist/tools/dmlDelete.js +71 -0
- package/dist/tools/dmlDelete.js.map +1 -0
- package/dist/tools/executeAnonymous.d.ts +63 -0
- package/dist/tools/executeAnonymous.js +77 -0
- package/dist/tools/executeAnonymous.js.map +1 -0
- package/dist/tools/fieldManagement.d.ts +222 -0
- package/dist/tools/fieldManagement.js +234 -0
- package/dist/tools/fieldManagement.js.map +1 -0
- package/dist/tools/fieldPermissions.d.ts +94 -0
- package/dist/tools/fieldPermissions.js +191 -0
- package/dist/tools/fieldPermissions.js.map +1 -0
- package/dist/tools/getDependencies.d.ts +58 -0
- package/dist/tools/getDependencies.js +105 -0
- package/dist/tools/getDependencies.js.map +1 -0
- package/dist/tools/listUserPermissions.d.ts +36 -0
- package/dist/tools/listUserPermissions.js +59 -0
- package/dist/tools/listUserPermissions.js.map +1 -0
- package/dist/tools/metadataDescribe.d.ts +37 -0
- package/dist/tools/metadataDescribe.js +35 -0
- package/dist/tools/metadataDescribe.js.map +1 -0
- package/dist/tools/metadataDiff.d.ts +66 -0
- package/dist/tools/metadataDiff.js +215 -0
- package/dist/tools/metadataDiff.js.map +1 -0
- package/dist/tools/metadataDiffFileDetail.d.ts +44 -0
- package/dist/tools/metadataDiffFileDetail.js +84 -0
- package/dist/tools/metadataDiffFileDetail.js.map +1 -0
- package/dist/tools/metadataDiffFiles.d.ts +37 -0
- package/dist/tools/metadataDiffFiles.js +72 -0
- package/dist/tools/metadataDiffFiles.js.map +1 -0
- package/dist/tools/metadataDiffGeneratePackage.d.ts +73 -0
- package/dist/tools/metadataDiffGeneratePackage.js +122 -0
- package/dist/tools/metadataDiffGeneratePackage.js.map +1 -0
- package/dist/tools/metadataImport.d.ts +63 -0
- package/dist/tools/metadataImport.js +122 -0
- package/dist/tools/metadataImport.js.map +1 -0
- package/dist/tools/metadataJobStatus.d.ts +44 -0
- package/dist/tools/metadataJobStatus.js +101 -0
- package/dist/tools/metadataJobStatus.js.map +1 -0
- package/dist/tools/metadataList.d.ts +44 -0
- package/dist/tools/metadataList.js +49 -0
- package/dist/tools/metadataList.js.map +1 -0
- package/dist/tools/metadataRead.d.ts +47 -0
- package/dist/tools/metadataRead.js +52 -0
- package/dist/tools/metadataRead.js.map +1 -0
- package/dist/tools/metadataTypeSchema.d.ts +44 -0
- package/dist/tools/metadataTypeSchema.js +101 -0
- package/dist/tools/metadataTypeSchema.js.map +1 -0
- package/dist/tools/metadataWsdl.d.ts +19 -0
- package/dist/tools/metadataWsdl.js +1 -0
- package/dist/tools/objectManagement.d.ts +107 -0
- package/dist/tools/objectManagement.js +123 -0
- package/dist/tools/objectManagement.js.map +1 -0
- package/dist/tools/objectPermissions.d.ts +101 -0
- package/dist/tools/objectPermissions.js +157 -0
- package/dist/tools/objectPermissions.js.map +1 -0
- package/dist/tools/objectSchema.d.ts +37 -0
- package/dist/tools/objectSchema.js +66 -0
- package/dist/tools/objectSchema.js.map +1 -0
- package/dist/tools/objectSearch.d.ts +37 -0
- package/dist/tools/objectSearch.js +44 -0
- package/dist/tools/objectSearch.js.map +1 -0
- package/dist/tools/packageStatus.d.ts +24 -0
- package/dist/tools/packageStatus.js +1 -0
- package/dist/tools/permissionSetAssignment.d.ts +39 -0
- package/dist/tools/permissionSetAssignment.js +1 -0
- package/dist/tools/readApexClasses.d.ts +50 -0
- package/dist/tools/readApexClasses.js +83 -0
- package/dist/tools/readApexClasses.js.map +1 -0
- package/dist/tools/readApexTriggers.d.ts +50 -0
- package/dist/tools/readApexTriggers.js +82 -0
- package/dist/tools/readApexTriggers.js.map +1 -0
- package/dist/tools/recordPicker.d.ts +48 -0
- package/dist/tools/recordPicker.js +1 -0
- package/dist/tools/recordQuery.d.ts +68 -0
- package/dist/tools/recordQuery.js +131 -0
- package/dist/tools/recordQuery.js.map +1 -0
- package/dist/tools/retrieveJobStatus.d.ts +51 -0
- package/dist/tools/retrieveJobStatus.js +192 -0
- package/dist/tools/retrieveJobStatus.js.map +1 -0
- package/dist/tools/retrieveMetadata.d.ts +79 -0
- package/dist/tools/retrieveMetadata.js +225 -0
- package/dist/tools/retrieveMetadata.js.map +1 -0
- package/dist/tools/retrievePackage.d.ts +37 -0
- package/dist/tools/retrievePackage.js +1 -0
- package/dist/tools/salesforceLogin.d.ts +36 -0
- package/dist/tools/salesforceLogin.js +75 -0
- package/dist/tools/salesforceLogin.js.map +1 -0
- package/dist/tools/selectOrg.d.ts +25 -0
- package/dist/tools/selectOrg.js +91 -0
- package/dist/tools/selectOrg.js.map +1 -0
- package/dist/tools/toolingQuery.d.ts +37 -0
- package/dist/tools/toolingQuery.js +54 -0
- package/dist/tools/toolingQuery.js.map +1 -0
- package/dist/tools/userPermissions.d.ts +76 -0
- package/dist/tools/userPermissions.js +130 -0
- package/dist/tools/userPermissions.js.map +1 -0
- package/dist/tools/versionMetadataComplete.d.ts +45 -0
- package/dist/tools/versionMetadataComplete.js +1 -0
- package/dist/tools/versionMetadataStart.d.ts +25 -0
- package/dist/tools/versionMetadataStart.js +1 -0
- package/dist/tools/versionMetadataStatus.d.ts +25 -0
- package/dist/tools/versionMetadataStatus.js +1 -0
- package/dist/tools/writeApexClasses.d.ts +64 -0
- package/dist/tools/writeApexClasses.js +79 -0
- package/dist/tools/writeApexClasses.js.map +1 -0
- package/dist/tools/writeApexTriggers.d.ts +71 -0
- package/dist/tools/writeApexTriggers.js +96 -0
- package/dist/tools/writeApexTriggers.js.map +1 -0
- package/dist/types/connection.d.ts +20 -0
- package/dist/types/connection.js +9 -0
- package/dist/types/connection.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metadata.d.ts +44 -0
- package/dist/types/metadata.js +2 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/salesforce.d.ts +38 -0
- package/dist/types/salesforce.js +2 -0
- package/dist/types/salesforce.js.map +1 -0
- package/dist/utils/apexContainer.d.ts +18 -0
- package/dist/utils/apexContainer.js +79 -0
- package/dist/utils/apexContainer.js.map +1 -0
- package/dist/utils/connection.d.ts +3 -0
- package/dist/utils/connection.js +135 -0
- package/dist/utils/connection.js.map +1 -0
- package/dist/utils/decomposePermissions.d.ts +16 -0
- package/dist/utils/decomposePermissions.js +188 -0
- package/dist/utils/decomposePermissions.js.map +1 -0
- package/dist/utils/dxPathMapper.d.ts +16 -0
- package/dist/utils/dxPathMapper.js +217 -0
- package/dist/utils/dxPathMapper.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.js +40 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/oauthWebFlow.d.ts +8 -0
- package/dist/utils/oauthWebFlow.js +172 -0
- package/dist/utils/oauthWebFlow.js.map +1 -0
- package/dist/utils/packageJobs.d.ts +17 -0
- package/dist/utils/packageJobs.js +1 -0
- package/dist/utils/packageXml.d.ts +18 -0
- package/dist/utils/packageXml.js +1 -0
- package/dist/utils/permissionSetResolver.d.ts +14 -0
- package/dist/utils/permissionSetResolver.js +1 -0
- package/dist/utils/preSelectMatcher.d.ts +18 -0
- package/dist/utils/preSelectMatcher.js +1 -0
- package/dist/utils/profileCleanup.d.ts +18 -0
- package/dist/utils/profileCleanup.js +1 -0
- package/dist/utils/retrieveStore.d.ts +12 -0
- package/dist/utils/retrieveStore.js +1 -0
- package/dist/utils/sfCli.d.ts +18 -0
- package/dist/utils/sfCli.js +130 -0
- package/dist/utils/sfCli.js.map +1 -0
- package/dist/utils/tokenBroker.d.ts +13 -0
- package/dist/utils/tokenBroker.js +73 -0
- package/dist/utils/tokenBroker.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { toolResponse } from '../utils/index.js';
|
|
6
|
+
import { mapDxPathToMetadata } from '../utils/dxPathMapper.js';
|
|
7
|
+
import gitDiffParser from 'gitdiff-parser';
|
|
8
|
+
export const metadataDiffTool = {
|
|
9
|
+
name: 'salesforce_metadata_diff',
|
|
10
|
+
description: 'Compare metadata between source and target Salesforce orgs. ' +
|
|
11
|
+
'Requires a working directory with target/ and source/ subdirs created by salesforce_retrieve_metadata. ' +
|
|
12
|
+
'Uses git diff --no-index to compare the two directory trees. ' +
|
|
13
|
+
'Returns structured diff data grouped by metadata type with component-level detail.',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
workingDir: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'The working directory containing target/ and source/ subdirs from retrieve operations',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: ['workingDir'],
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export async function handleMetadataDiff(args) {
|
|
26
|
+
const { workingDir } = args;
|
|
27
|
+
if (!existsSync(workingDir)) {
|
|
28
|
+
return toolResponse(`Directory does not exist: ${workingDir}`, true);
|
|
29
|
+
}
|
|
30
|
+
const targetDir = join(workingDir, 'target');
|
|
31
|
+
const sourceDir = join(workingDir, 'source');
|
|
32
|
+
if (!existsSync(targetDir)) {
|
|
33
|
+
return toolResponse(`Target directory not found: ${targetDir}. ` +
|
|
34
|
+
'Retrieve target org metadata first with salesforce_retrieve_metadata using tag: "target".', true);
|
|
35
|
+
}
|
|
36
|
+
if (!existsSync(sourceDir)) {
|
|
37
|
+
return toolResponse(`Source directory not found: ${sourceDir}. ` +
|
|
38
|
+
'Retrieve source org metadata with salesforce_retrieve_metadata using tag: "source".', true);
|
|
39
|
+
}
|
|
40
|
+
// Read org-info.json from each side (best-effort)
|
|
41
|
+
const readOrgInfo = (side) => {
|
|
42
|
+
try {
|
|
43
|
+
const infoPath = join(workingDir, side, '.metadata-diff', 'org-info.json');
|
|
44
|
+
return JSON.parse(readFileSync(infoPath, 'utf-8'));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const sourceOrg = readOrgInfo('source');
|
|
51
|
+
const targetOrg = readOrgInfo('target');
|
|
52
|
+
// Use git diff --no-index to compare target/ vs source/ directories
|
|
53
|
+
// Exit code 0 = no differences, 1 = differences found, 2+ = errors
|
|
54
|
+
let diffOutput;
|
|
55
|
+
try {
|
|
56
|
+
diffOutput = execSync('git diff --no-index --no-renames -- target source', {
|
|
57
|
+
cwd: workingDir,
|
|
58
|
+
encoding: 'utf-8',
|
|
59
|
+
maxBuffer: 50 * 1024 * 1024, // 50MB
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err.status === 1) {
|
|
64
|
+
// Exit code 1 means differences found — this is expected
|
|
65
|
+
diffOutput = err.stdout?.toString() || '';
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
return toolResponse(`Failed to run git diff: ${err.message}`, true);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!diffOutput.trim()) {
|
|
72
|
+
return toolResponse(JSON.stringify({
|
|
73
|
+
workingDir,
|
|
74
|
+
summary: { added: 0, modified: 0, deleted: 0, totalFiles: 0 },
|
|
75
|
+
files: [],
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
// Parse diff
|
|
79
|
+
let parsedFiles;
|
|
80
|
+
try {
|
|
81
|
+
parsedFiles = gitDiffParser.parse(diffOutput);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return toolResponse(`Failed to parse diff output: ${err.message}`, true);
|
|
85
|
+
}
|
|
86
|
+
// Filter out .metadata-diff/, .git/, and .gitignore operational files from diff output
|
|
87
|
+
parsedFiles = parsedFiles.filter(f => {
|
|
88
|
+
const skip = (p) => p.includes('.metadata-diff/') || p.includes('.git/') || p.endsWith('.gitignore');
|
|
89
|
+
return !skip(f.oldPath) && !skip(f.newPath);
|
|
90
|
+
});
|
|
91
|
+
// Enrich with metadata mapping — strip target/ or source/ prefix for metadata resolution
|
|
92
|
+
const stripTagPrefix = (p) => p.replace(/^(target|source)\//, '');
|
|
93
|
+
const files = parsedFiles.map((file) => {
|
|
94
|
+
const rawPath = file.type === 'delete' ? file.oldPath : file.newPath;
|
|
95
|
+
const strippedPath = stripTagPrefix(rawPath);
|
|
96
|
+
const mapping = mapDxPathToMetadata(strippedPath);
|
|
97
|
+
return {
|
|
98
|
+
oldPath: file.oldPath,
|
|
99
|
+
newPath: file.newPath,
|
|
100
|
+
type: file.type === 'copy' ? 'add' : file.type,
|
|
101
|
+
metadataType: mapping?.metadataType ?? null,
|
|
102
|
+
componentName: mapping?.componentName ?? null,
|
|
103
|
+
hunks: file.hunks.map((hunk) => ({
|
|
104
|
+
oldStart: hunk.oldStart,
|
|
105
|
+
newStart: hunk.newStart,
|
|
106
|
+
changes: hunk.changes.map((change) => {
|
|
107
|
+
const base = {
|
|
108
|
+
content: change.content,
|
|
109
|
+
type: change.type,
|
|
110
|
+
};
|
|
111
|
+
if (change.type === 'normal') {
|
|
112
|
+
base.oldLineNumber = change.oldLineNumber;
|
|
113
|
+
base.newLineNumber = change.newLineNumber;
|
|
114
|
+
}
|
|
115
|
+
else if (change.type === 'insert') {
|
|
116
|
+
base.newLineNumber = change.lineNumber;
|
|
117
|
+
}
|
|
118
|
+
else if (change.type === 'delete') {
|
|
119
|
+
base.oldLineNumber = change.lineNumber;
|
|
120
|
+
}
|
|
121
|
+
return base;
|
|
122
|
+
}),
|
|
123
|
+
})),
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
// Filter out -meta.xml companion files for UI display only
|
|
127
|
+
const META_XML_REGEX = /-meta\.xml$/;
|
|
128
|
+
const sourceFileTypes = new Set(['ApexClass', 'ApexTrigger', 'ApexPage', 'ApexComponent']);
|
|
129
|
+
const displayFiles = files.filter((file) => {
|
|
130
|
+
const path = file.newPath || file.oldPath;
|
|
131
|
+
if (!META_XML_REGEX.test(path))
|
|
132
|
+
return true;
|
|
133
|
+
if (!file.metadataType || !sourceFileTypes.has(file.metadataType))
|
|
134
|
+
return true;
|
|
135
|
+
// Keep meta.xml only if no source file exists for this component
|
|
136
|
+
return !files.some((other) => other !== file &&
|
|
137
|
+
other.metadataType === file.metadataType &&
|
|
138
|
+
other.componentName === file.componentName &&
|
|
139
|
+
!META_XML_REGEX.test(other.newPath || other.oldPath || ''));
|
|
140
|
+
});
|
|
141
|
+
const fullSummary = {
|
|
142
|
+
added: files.filter(f => f.type === 'add').length,
|
|
143
|
+
modified: files.filter(f => f.type === 'modify').length,
|
|
144
|
+
deleted: files.filter(f => f.type === 'delete').length,
|
|
145
|
+
totalFiles: files.length,
|
|
146
|
+
};
|
|
147
|
+
const result = { workingDir, summary: fullSummary, files };
|
|
148
|
+
// Write full result to disk for lazy-loading hunks per file
|
|
149
|
+
try {
|
|
150
|
+
const cacheDir = join(workingDir, '.metadata-diff');
|
|
151
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
152
|
+
writeFileSync(join(cacheDir, 'diff-result.json'), JSON.stringify(result), 'utf-8');
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
console.error(`Failed to write diff cache: ${err.message}`);
|
|
156
|
+
}
|
|
157
|
+
const summary = {
|
|
158
|
+
added: displayFiles.filter(f => f.type === 'add').length,
|
|
159
|
+
modified: displayFiles.filter(f => f.type === 'modify').length,
|
|
160
|
+
deleted: displayFiles.filter(f => f.type === 'delete').length,
|
|
161
|
+
totalFiles: displayFiles.length,
|
|
162
|
+
};
|
|
163
|
+
// Build compact result (summary only, no files) to stay within token limits.
|
|
164
|
+
// The UI fetches the full file list separately via salesforce_metadata_diff_files.
|
|
165
|
+
const compactResult = { workingDir, summary, sourceOrg, targetOrg };
|
|
166
|
+
// Build text fallback for non-UI hosts
|
|
167
|
+
const textLines = [
|
|
168
|
+
`Metadata Diff Summary:`,
|
|
169
|
+
` Added: ${summary.added} | Modified: ${summary.modified} | Deleted: ${summary.deleted} | Total: ${summary.totalFiles}`,
|
|
170
|
+
'',
|
|
171
|
+
];
|
|
172
|
+
// Group by metadata type for text summary (type-level only, no per-file lines)
|
|
173
|
+
const byType = new Map();
|
|
174
|
+
for (const file of displayFiles) {
|
|
175
|
+
const key = file.metadataType || 'Other';
|
|
176
|
+
if (!byType.has(key))
|
|
177
|
+
byType.set(key, { added: 0, modified: 0, deleted: 0 });
|
|
178
|
+
const counts = byType.get(key);
|
|
179
|
+
if (file.type === 'add')
|
|
180
|
+
counts.added++;
|
|
181
|
+
else if (file.type === 'delete')
|
|
182
|
+
counts.deleted++;
|
|
183
|
+
else
|
|
184
|
+
counts.modified++;
|
|
185
|
+
}
|
|
186
|
+
for (const [type, counts] of byType) {
|
|
187
|
+
const total = counts.added + counts.modified + counts.deleted;
|
|
188
|
+
const parts = [];
|
|
189
|
+
if (counts.added)
|
|
190
|
+
parts.push(`+${counts.added}`);
|
|
191
|
+
if (counts.modified)
|
|
192
|
+
parts.push(`~${counts.modified}`);
|
|
193
|
+
if (counts.deleted)
|
|
194
|
+
parts.push(`-${counts.deleted}`);
|
|
195
|
+
textLines.push(` ${type} (${total}): ${parts.join(' ')}`);
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
content: [
|
|
199
|
+
{ type: 'text', text: textLines.join('\n') },
|
|
200
|
+
{ type: 'text', text: JSON.stringify(compactResult) },
|
|
201
|
+
],
|
|
202
|
+
isError: false,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
export const metadataDiffSchema = {
|
|
206
|
+
workingDir: z.string().describe('The working directory containing target/ and source/ subdirs from retrieve operations'),
|
|
207
|
+
};
|
|
208
|
+
export const metadataDiffDescriptor = {
|
|
209
|
+
name: 'salesforce_metadata_diff',
|
|
210
|
+
description: metadataDiffTool.description,
|
|
211
|
+
schema: metadataDiffSchema,
|
|
212
|
+
handler: handleMetadataDiff,
|
|
213
|
+
noConnection: true,
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=metadataDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataDiff.js","sourceRoot":"","sources":["../../src/tools/metadataDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
export declare const metadataDiffFileDetailTool: {
|
|
3
|
+
name: "salesforce_metadata_diff_file_detail";
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
workingDir: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
filePath: {
|
|
13
|
+
type: string;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
required: string[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export interface MetadataDiffFileDetailArgs {
|
|
21
|
+
workingDir: string;
|
|
22
|
+
filePath: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function handleMetadataDiffFileDetail(args: MetadataDiffFileDetailArgs): Promise<{
|
|
25
|
+
content: {
|
|
26
|
+
type: "text";
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
isError: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
export declare const metadataDiffFileDetailSchema: {
|
|
32
|
+
workingDir: z.ZodString;
|
|
33
|
+
filePath: z.ZodString;
|
|
34
|
+
};
|
|
35
|
+
export declare const metadataDiffFileDetailDescriptor: {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
schema: {
|
|
39
|
+
workingDir: z.ZodString;
|
|
40
|
+
filePath: z.ZodString;
|
|
41
|
+
};
|
|
42
|
+
handler: typeof handleMetadataDiffFileDetail;
|
|
43
|
+
noConnection: boolean;
|
|
44
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { toolResponse } from '../utils/index.js';
|
|
5
|
+
export const metadataDiffFileDetailTool = {
|
|
6
|
+
name: 'salesforce_metadata_diff_file_detail',
|
|
7
|
+
description: 'Retrieve the diff hunks for a single file from a previous metadata diff result. ' +
|
|
8
|
+
'Used by the metadata diff UI to lazy-load line-by-line changes when a file row is expanded.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
workingDir: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'The working directory containing source/ and target/ subdirs from a metadata diff',
|
|
15
|
+
},
|
|
16
|
+
filePath: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'The file path (newPath or oldPath) to retrieve hunks for',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ['workingDir', 'filePath'],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export async function handleMetadataDiffFileDetail(args) {
|
|
25
|
+
const { workingDir, filePath } = args;
|
|
26
|
+
const cachePath = join(workingDir, '.metadata-diff', 'diff-result.json');
|
|
27
|
+
if (!existsSync(cachePath)) {
|
|
28
|
+
return toolResponse(`Diff cache not found at ${cachePath}. Run salesforce_metadata_diff first.`, true);
|
|
29
|
+
}
|
|
30
|
+
let result;
|
|
31
|
+
try {
|
|
32
|
+
result = JSON.parse(readFileSync(cachePath, 'utf-8'));
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return toolResponse(`Failed to read diff cache: ${err.message}`, true);
|
|
36
|
+
}
|
|
37
|
+
const file = result.files.find(f => f.newPath === filePath || f.oldPath === filePath);
|
|
38
|
+
if (!file) {
|
|
39
|
+
return toolResponse(`File not found in diff result: ${filePath}`, true);
|
|
40
|
+
}
|
|
41
|
+
let hunks = file.hunks;
|
|
42
|
+
// For deleted files with no hunks, generate fake deletion hunks from the file on disk
|
|
43
|
+
if (hunks.length === 0 && file.type === 'delete' && file.oldPath) {
|
|
44
|
+
const absPath = join(workingDir, file.oldPath);
|
|
45
|
+
if (existsSync(absPath)) {
|
|
46
|
+
try {
|
|
47
|
+
const content = readFileSync(absPath, 'utf-8');
|
|
48
|
+
const lines = content.split('\n');
|
|
49
|
+
// Remove trailing empty line from split if file ends with newline
|
|
50
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') {
|
|
51
|
+
lines.pop();
|
|
52
|
+
}
|
|
53
|
+
hunks = [{
|
|
54
|
+
oldStart: 1,
|
|
55
|
+
newStart: 0,
|
|
56
|
+
changes: lines.map((line, i) => ({
|
|
57
|
+
content: line,
|
|
58
|
+
type: 'delete',
|
|
59
|
+
oldLineNumber: i + 1,
|
|
60
|
+
})),
|
|
61
|
+
}];
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Fall through with empty hunks if file can't be read
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: 'text', text: JSON.stringify({ hunks }) }],
|
|
70
|
+
isError: false,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export const metadataDiffFileDetailSchema = {
|
|
74
|
+
workingDir: z.string().describe('The working directory containing source/ and target/ subdirs from a metadata diff'),
|
|
75
|
+
filePath: z.string().describe('The file path (newPath or oldPath) to retrieve hunks for'),
|
|
76
|
+
};
|
|
77
|
+
export const metadataDiffFileDetailDescriptor = {
|
|
78
|
+
name: 'salesforce_metadata_diff_file_detail',
|
|
79
|
+
description: metadataDiffFileDetailTool.description,
|
|
80
|
+
schema: metadataDiffFileDetailSchema,
|
|
81
|
+
handler: handleMetadataDiffFileDetail,
|
|
82
|
+
noConnection: true,
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=metadataDiffFileDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataDiffFileDetail.js","sourceRoot":"","sources":["../../src/tools/metadataDiffFileDetail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
export declare const metadataDiffFilesTool: {
|
|
3
|
+
name: "salesforce_metadata_diff_files";
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
workingDir: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
required: string[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export interface MetadataDiffFilesArgs {
|
|
17
|
+
workingDir: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function handleMetadataDiffFiles(args: MetadataDiffFilesArgs): Promise<{
|
|
20
|
+
content: {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
isError: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
export declare const metadataDiffFilesSchema: {
|
|
27
|
+
workingDir: z.ZodString;
|
|
28
|
+
};
|
|
29
|
+
export declare const metadataDiffFilesDescriptor: {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
schema: {
|
|
33
|
+
workingDir: z.ZodString;
|
|
34
|
+
};
|
|
35
|
+
handler: typeof handleMetadataDiffFiles;
|
|
36
|
+
noConnection: boolean;
|
|
37
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { toolResponse } from '../utils/index.js';
|
|
5
|
+
export const metadataDiffFilesTool = {
|
|
6
|
+
name: 'salesforce_metadata_diff_files',
|
|
7
|
+
description: 'Return the full compact file list from a previous metadata diff result. ' +
|
|
8
|
+
'Reads from the on-disk cache written by salesforce_metadata_diff. ' +
|
|
9
|
+
'Used by the metadata diff UI to lazy-load the file list after the initial summary.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
workingDir: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
description: 'The working directory containing the .metadata-diff-result.json cache',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
required: ['workingDir'],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export async function handleMetadataDiffFiles(args) {
|
|
22
|
+
const { workingDir } = args;
|
|
23
|
+
const cachePath = join(workingDir, '.metadata-diff', 'diff-result.json');
|
|
24
|
+
if (!existsSync(cachePath)) {
|
|
25
|
+
return toolResponse(`Diff cache not found at ${cachePath}. Run salesforce_metadata_diff first.`, true);
|
|
26
|
+
}
|
|
27
|
+
let result;
|
|
28
|
+
try {
|
|
29
|
+
result = JSON.parse(readFileSync(cachePath, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
return toolResponse(`Failed to read diff cache: ${err.message}`, true);
|
|
33
|
+
}
|
|
34
|
+
// Filter out -meta.xml companion files (same logic as metadataDiff.ts)
|
|
35
|
+
const META_XML_REGEX = /-meta\.xml$/;
|
|
36
|
+
const sourceFileTypes = new Set(['ApexClass', 'ApexTrigger', 'ApexPage', 'ApexComponent']);
|
|
37
|
+
const displayFiles = result.files.filter((file) => {
|
|
38
|
+
const path = file.newPath || file.oldPath;
|
|
39
|
+
if (!META_XML_REGEX.test(path))
|
|
40
|
+
return true;
|
|
41
|
+
if (!file.metadataType || !sourceFileTypes.has(file.metadataType))
|
|
42
|
+
return true;
|
|
43
|
+
return !result.files.some((other) => other !== file &&
|
|
44
|
+
other.metadataType === file.metadataType &&
|
|
45
|
+
other.componentName === file.componentName &&
|
|
46
|
+
!META_XML_REGEX.test(other.newPath || other.oldPath || ''));
|
|
47
|
+
});
|
|
48
|
+
// Return files with empty hunks (hunks are lazy-loaded per file)
|
|
49
|
+
const compactFiles = displayFiles.map(f => ({
|
|
50
|
+
oldPath: f.oldPath,
|
|
51
|
+
newPath: f.newPath,
|
|
52
|
+
type: f.type,
|
|
53
|
+
metadataType: f.metadataType,
|
|
54
|
+
componentName: f.componentName,
|
|
55
|
+
hunks: [],
|
|
56
|
+
}));
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: JSON.stringify({ files: compactFiles }) }],
|
|
59
|
+
isError: false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export const metadataDiffFilesSchema = {
|
|
63
|
+
workingDir: z.string().describe('The working directory containing the .metadata-diff-result.json cache'),
|
|
64
|
+
};
|
|
65
|
+
export const metadataDiffFilesDescriptor = {
|
|
66
|
+
name: 'salesforce_metadata_diff_files',
|
|
67
|
+
description: metadataDiffFilesTool.description,
|
|
68
|
+
schema: metadataDiffFilesSchema,
|
|
69
|
+
handler: handleMetadataDiffFiles,
|
|
70
|
+
noConnection: true,
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=metadataDiffFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataDiffFiles.js","sourceRoot":"","sources":["../../src/tools/metadataDiffFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,gCAAyC;IAC/C,WAAW,EACT,0EAA0E;QAC1E,oEAAoE;QACpE,oFAAoF;IACtF,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uEAAuE;aACrF;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;CACF,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA2B;IACvE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACzE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,YAAY,CACjB,2BAA2B,SAAS,uCAAuC,EAC3E,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,uEAAuE;IACvE,MAAM,cAAc,GAAG,aAAa,CAAC;IACrC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3F,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CACvB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,IAAI;YACd,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;YACxC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa;YAC1C,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,KAAK,EAAE,EAAE;KACV,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACnF,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;CACzG,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,IAAI,EAAE,gCAAgC;IACtC,WAAW,EAAE,qBAAqB,CAAC,WAAW;IAC9C,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,uBAAuB;IAChC,YAAY,EAAE,IAAI;CACnB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
export declare const metadataDiffGeneratePackageTool: {
|
|
3
|
+
name: "salesforce_generate_diff_package";
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
workingDir: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
selectedComponents: {
|
|
13
|
+
type: string;
|
|
14
|
+
items: {
|
|
15
|
+
type: string;
|
|
16
|
+
properties: {
|
|
17
|
+
metadataType: {
|
|
18
|
+
type: string;
|
|
19
|
+
};
|
|
20
|
+
componentName: {
|
|
21
|
+
type: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
required: string[];
|
|
25
|
+
};
|
|
26
|
+
description: string;
|
|
27
|
+
};
|
|
28
|
+
apiVersion: {
|
|
29
|
+
type: string;
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
required: string[];
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export interface SelectedComponent {
|
|
37
|
+
metadataType: string;
|
|
38
|
+
componentName: string;
|
|
39
|
+
}
|
|
40
|
+
export interface MetadataDiffGeneratePackageArgs {
|
|
41
|
+
workingDir: string;
|
|
42
|
+
selectedComponents: SelectedComponent[];
|
|
43
|
+
apiVersion?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function handleMetadataDiffGeneratePackage(args: MetadataDiffGeneratePackageArgs): Promise<{
|
|
46
|
+
content: {
|
|
47
|
+
type: "text";
|
|
48
|
+
text: string;
|
|
49
|
+
}[];
|
|
50
|
+
isError: boolean;
|
|
51
|
+
}>;
|
|
52
|
+
export declare const metadataDiffGeneratePackageSchema: {
|
|
53
|
+
workingDir: z.ZodString;
|
|
54
|
+
selectedComponents: z.ZodArray<z.ZodObject<{
|
|
55
|
+
metadataType: z.ZodString;
|
|
56
|
+
componentName: z.ZodString;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
59
|
+
};
|
|
60
|
+
export declare const metadataDiffGeneratePackageDescriptor: {
|
|
61
|
+
name: string;
|
|
62
|
+
description: string;
|
|
63
|
+
schema: {
|
|
64
|
+
workingDir: z.ZodString;
|
|
65
|
+
selectedComponents: z.ZodArray<z.ZodObject<{
|
|
66
|
+
metadataType: z.ZodString;
|
|
67
|
+
componentName: z.ZodString;
|
|
68
|
+
}, z.core.$strip>>;
|
|
69
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
70
|
+
};
|
|
71
|
+
handler: typeof handleMetadataDiffGeneratePackage;
|
|
72
|
+
noConnection: boolean;
|
|
73
|
+
};
|