@jterrats/smart-deployment 1.4.0 → 1.5.0
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/lib/analysis/metadata-capability-definitions.js +24 -0
- package/lib/analysis/metadata-capability-definitions.js.map +1 -1
- package/lib/commands/ci/preset.js +2 -1
- package/lib/commands/ci/preset.js.map +1 -1
- package/lib/commands/resume.d.ts +7 -0
- package/lib/commands/resume.js +54 -2
- package/lib/commands/resume.js.map +1 -1
- package/lib/commands/start.d.ts +3 -0
- package/lib/commands/start.js +47 -16
- package/lib/commands/start.js.map +1 -1
- package/lib/commands/status.js +5 -2
- package/lib/commands/status.js.map +1 -1
- package/lib/commands/validate.js +2 -1
- package/lib/commands/validate.js.map +1 -1
- package/lib/config/repo-config.d.ts +3 -0
- package/lib/config/repo-config.js +12 -0
- package/lib/config/repo-config.js.map +1 -1
- package/lib/deployment/ci-preset-service.d.ts +2 -0
- package/lib/deployment/ci-preset-service.js +7 -0
- package/lib/deployment/ci-preset-service.js.map +1 -1
- package/lib/deployment/deployment-runner.d.ts +17 -3
- package/lib/deployment/deployment-runner.js +113 -12
- package/lib/deployment/deployment-runner.js.map +1 -1
- package/lib/deployment/deployment-state-summary.d.ts +7 -1
- package/lib/deployment/deployment-state-summary.js +24 -6
- package/lib/deployment/deployment-state-summary.js.map +1 -1
- package/lib/deployment/deployment-status-service.d.ts +7 -1
- package/lib/deployment/deployment-status-service.js +9 -2
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/resume-deployment-service.d.ts +20 -1
- package/lib/deployment/resume-deployment-service.js +89 -1
- package/lib/deployment/resume-deployment-service.js.map +1 -1
- package/lib/deployment/start-execution-service.d.ts +11 -1
- package/lib/deployment/start-execution-service.js +12 -4
- package/lib/deployment/start-execution-service.js.map +1 -1
- package/lib/deployment/state-manager.d.ts +22 -0
- package/lib/deployment/state-manager.js +40 -5
- package/lib/deployment/state-manager.js.map +1 -1
- package/lib/reports/deployment-plan-report-service.d.ts +3 -0
- package/lib/reports/deployment-plan-report-service.js +9 -0
- package/lib/reports/deployment-plan-report-service.js.map +1 -1
- package/lib/services/scanners/additional-metadata-scanner.js +37 -3
- package/lib/services/scanners/additional-metadata-scanner.js.map +1 -1
- package/lib/types/manual-checkpoint.d.ts +27 -0
- package/lib/types/manual-checkpoint.js +89 -0
- package/lib/types/manual-checkpoint.js.map +1 -0
- package/lib/waves/wave-priority-policy.js +2 -25
- package/lib/waves/wave-priority-policy.js.map +1 -1
- package/messages/resume.json +5 -3
- package/npm-shrinkwrap.json +2 -2
- package/oclif.manifest.json +82 -74
- package/package.json +1 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
export function validateManualCheckpoints(checkpoints, waves) {
|
|
5
|
+
const waveNumbers = new Set(waves.map((wave) => wave.number));
|
|
6
|
+
const ids = new Set();
|
|
7
|
+
const positions = new Set();
|
|
8
|
+
for (const checkpoint of checkpoints) {
|
|
9
|
+
if (!checkpoint.id.trim()) {
|
|
10
|
+
throw new Error('Manual checkpoint id must not be empty.');
|
|
11
|
+
}
|
|
12
|
+
if (checkpoint.phase !== 'before' && checkpoint.phase !== 'after') {
|
|
13
|
+
throw new Error(`Manual checkpoint ${checkpoint.id} has invalid phase: ${String(checkpoint.phase)}`);
|
|
14
|
+
}
|
|
15
|
+
if (ids.has(checkpoint.id)) {
|
|
16
|
+
throw new Error(`Duplicate manual checkpoint id: ${checkpoint.id}`);
|
|
17
|
+
}
|
|
18
|
+
if (!waveNumbers.has(checkpoint.waveNumber)) {
|
|
19
|
+
throw new Error(`Manual checkpoint ${checkpoint.id} references missing wave ${checkpoint.waveNumber}.`);
|
|
20
|
+
}
|
|
21
|
+
const position = `${checkpoint.phase}:${checkpoint.waveNumber}`;
|
|
22
|
+
if (positions.has(position)) {
|
|
23
|
+
throw new Error(`Multiple manual checkpoints target ${position}.`);
|
|
24
|
+
}
|
|
25
|
+
ids.add(checkpoint.id);
|
|
26
|
+
positions.add(position);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function createDeploymentPlanFingerprint(options) {
|
|
30
|
+
const value = JSON.stringify({
|
|
31
|
+
waves: options.waves.map((wave) => ({ number: wave.number, components: [...wave.components].sort() })),
|
|
32
|
+
checkpoints: [...options.checkpoints].sort((left, right) => left.id.localeCompare(right.id)),
|
|
33
|
+
destructive: options.destructive,
|
|
34
|
+
skipTests: options.skipTests,
|
|
35
|
+
apiVersion: options.apiVersion,
|
|
36
|
+
sourceFingerprint: options.sourceFingerprint,
|
|
37
|
+
});
|
|
38
|
+
return `sha256:${createHash('sha256').update(value).digest('hex')}`;
|
|
39
|
+
}
|
|
40
|
+
export async function createSourceFingerprint(components) {
|
|
41
|
+
const entries = await Promise.all([...components.entries()]
|
|
42
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
43
|
+
.map(async ([nodeId, component]) => {
|
|
44
|
+
try {
|
|
45
|
+
return [nodeId, await hashComponentSource(component.filePath)];
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [nodeId, 'unreadable'];
|
|
49
|
+
}
|
|
50
|
+
}));
|
|
51
|
+
return `sha256:${createHash('sha256').update(JSON.stringify(entries)).digest('hex')}`;
|
|
52
|
+
}
|
|
53
|
+
async function hashComponentSource(componentPath) {
|
|
54
|
+
const componentStats = await stat(componentPath);
|
|
55
|
+
if (componentStats.isDirectory()) {
|
|
56
|
+
return hashSourcePath(componentPath);
|
|
57
|
+
}
|
|
58
|
+
const directoryPath = path.dirname(componentPath);
|
|
59
|
+
const basename = path.basename(componentPath);
|
|
60
|
+
const stem = basename.split('.')[0];
|
|
61
|
+
const siblingPaths = (await readdir(directoryPath, { withFileTypes: true }))
|
|
62
|
+
.filter((entry) => entry.isFile() && (entry.name === basename || entry.name.startsWith(`${stem}.`)))
|
|
63
|
+
.map((entry) => path.join(directoryPath, entry.name))
|
|
64
|
+
.sort();
|
|
65
|
+
const contents = await Promise.all(siblingPaths.map(async (filePath) => [path.basename(filePath), await readFile(filePath, 'base64')]));
|
|
66
|
+
return createHash('sha256').update(JSON.stringify(contents)).digest('hex');
|
|
67
|
+
}
|
|
68
|
+
async function hashSourcePath(sourcePath) {
|
|
69
|
+
const sourceStats = await stat(sourcePath);
|
|
70
|
+
if (sourceStats.isFile()) {
|
|
71
|
+
return createHash('sha256')
|
|
72
|
+
.update(await readFile(sourcePath))
|
|
73
|
+
.digest('hex');
|
|
74
|
+
}
|
|
75
|
+
const files = await collectFiles(sourcePath);
|
|
76
|
+
const contents = await Promise.all(files.map(async (filePath) => [path.relative(sourcePath, filePath), await readFile(filePath, 'base64')]));
|
|
77
|
+
return createHash('sha256').update(JSON.stringify(contents)).digest('hex');
|
|
78
|
+
}
|
|
79
|
+
async function collectFiles(directoryPath) {
|
|
80
|
+
const entries = await readdir(directoryPath, { withFileTypes: true });
|
|
81
|
+
const nested = await Promise.all(entries
|
|
82
|
+
.sort((left, right) => left.name.localeCompare(right.name))
|
|
83
|
+
.map(async (entry) => {
|
|
84
|
+
const entryPath = path.join(directoryPath, entry.name);
|
|
85
|
+
return entry.isDirectory() ? collectFiles(entryPath) : [entryPath];
|
|
86
|
+
}));
|
|
87
|
+
return nested.flat();
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=manual-checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-checkpoint.js","sourceRoot":"","sources":["../../src/types/manual-checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
'CustomObject',
|
|
3
|
-
'CustomField',
|
|
4
|
-
'RecordType',
|
|
5
|
-
'BusinessProcess',
|
|
6
|
-
'Queue',
|
|
7
|
-
'CompactLayout',
|
|
8
|
-
'Layout',
|
|
9
|
-
'ApexClass',
|
|
10
|
-
'ApexTrigger',
|
|
11
|
-
'Flow',
|
|
12
|
-
'ValidationRule',
|
|
13
|
-
'WorkflowRule',
|
|
14
|
-
'EmailTemplate',
|
|
15
|
-
'BrandingSet',
|
|
16
|
-
'CustomSite',
|
|
17
|
-
'Network',
|
|
18
|
-
'DigitalExperienceBundle',
|
|
19
|
-
'EmbeddedServiceConfig',
|
|
20
|
-
'FlexiPage',
|
|
21
|
-
'Profile',
|
|
22
|
-
'PermissionSet',
|
|
23
|
-
];
|
|
1
|
+
import { getDeploymentPriority } from '../constants/deployment-order.js';
|
|
24
2
|
export function buildEdgeTypesByFrom(dependencyEdges) {
|
|
25
3
|
const edgeTypesByFrom = new Map();
|
|
26
4
|
for (const edge of dependencyEdges) {
|
|
@@ -54,8 +32,7 @@ function createWavePriorityProfile(edgeTypesByFrom, nodeId) {
|
|
|
54
32
|
};
|
|
55
33
|
}
|
|
56
34
|
function getMetadataTypeDeploymentOrder(type) {
|
|
57
|
-
|
|
58
|
-
return order === -1 ? 9999 : order;
|
|
35
|
+
return getDeploymentPriority(type);
|
|
59
36
|
}
|
|
60
37
|
function getDependencyRiskProfile(edgeTypesByFrom, nodeId) {
|
|
61
38
|
const edgeTypes = edgeTypesByFrom.get(nodeId) ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wave-priority-policy.js","sourceRoot":"","sources":["../../src/waves/wave-priority-policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wave-priority-policy.js","sourceRoot":"","sources":["../../src/waves/wave-priority-policy.ts"],"names":[],"mappings":"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"}
|
package/messages/resume.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
"summary": "Resume a failed deployment",
|
|
2
|
+
"summary": "Resume a failed or paused deployment",
|
|
3
3
|
"examples": [
|
|
4
4
|
"<%= config.bin %> <%= command.id %> --source-path force-app",
|
|
5
|
-
"<%= config.bin %> <%= command.id %> --source-path force-app --retry-strategy quick"
|
|
5
|
+
"<%= config.bin %> <%= command.id %> --source-path force-app --retry-strategy quick",
|
|
6
|
+
"<%= config.bin %> <%= command.id %> --source-path . --approve-checkpoint activate-decision-table"
|
|
6
7
|
],
|
|
7
8
|
"flags.target-org.summary": "Target Salesforce org alias or username for remote deployment resume",
|
|
8
9
|
"flags.source-path.summary": "Path to the Salesforce project containing deployment state",
|
|
9
|
-
"flags.retry-strategy.summary": "Retry strategy to use when resuming the deployment"
|
|
10
|
+
"flags.retry-strategy.summary": "Retry strategy to use when resuming the deployment",
|
|
11
|
+
"flags.approve-checkpoint.summary": "Approve a paused manual checkpoint and continue the remaining waves"
|
|
10
12
|
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jterrats/smart-deployment",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@jterrats/smart-deployment",
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.5.0",
|
|
10
10
|
"hasInstallScript": true,
|
|
11
11
|
"license": "BSD-3-Clause",
|
|
12
12
|
"dependencies": {
|
package/oclif.manifest.json
CHANGED
|
@@ -537,7 +537,8 @@
|
|
|
537
537
|
"args": {},
|
|
538
538
|
"examples": [
|
|
539
539
|
"<%= config.bin %> <%= command.id %> --source-path force-app",
|
|
540
|
-
"<%= config.bin %> <%= command.id %> --source-path force-app --retry-strategy quick"
|
|
540
|
+
"<%= config.bin %> <%= command.id %> --source-path force-app --retry-strategy quick",
|
|
541
|
+
"<%= config.bin %> <%= command.id %> --source-path . --approve-checkpoint activate-decision-table"
|
|
541
542
|
],
|
|
542
543
|
"flags": {
|
|
543
544
|
"json": {
|
|
@@ -582,6 +583,13 @@
|
|
|
582
583
|
"validate-only"
|
|
583
584
|
],
|
|
584
585
|
"type": "option"
|
|
586
|
+
},
|
|
587
|
+
"approve-checkpoint": {
|
|
588
|
+
"name": "approve-checkpoint",
|
|
589
|
+
"summary": "Approve a paused manual checkpoint and continue the remaining waves",
|
|
590
|
+
"hasDynamicHelp": false,
|
|
591
|
+
"multiple": false,
|
|
592
|
+
"type": "option"
|
|
585
593
|
}
|
|
586
594
|
},
|
|
587
595
|
"hasDynamicHelp": false,
|
|
@@ -591,7 +599,7 @@
|
|
|
591
599
|
"pluginName": "@jterrats/smart-deployment",
|
|
592
600
|
"pluginType": "core",
|
|
593
601
|
"strict": true,
|
|
594
|
-
"summary": "Resume a failed deployment",
|
|
602
|
+
"summary": "Resume a failed or paused deployment",
|
|
595
603
|
"enableJsonFlag": true,
|
|
596
604
|
"isESM": true,
|
|
597
605
|
"relativePath": [
|
|
@@ -1332,77 +1340,6 @@
|
|
|
1332
1340
|
"export:graph"
|
|
1333
1341
|
]
|
|
1334
1342
|
},
|
|
1335
|
-
"metadata:gaps": {
|
|
1336
|
-
"aliases": [
|
|
1337
|
-
"smart-deployment:metadata:gaps"
|
|
1338
|
-
],
|
|
1339
|
-
"args": {},
|
|
1340
|
-
"description": "Scans package manifests and Salesforce source paths, compares detected metadata types against smart-deployment support, and reports safe next steps for unsupported or partially supported metadata.",
|
|
1341
|
-
"examples": [
|
|
1342
|
-
"<%= config.bin %> <%= command.id %> --source-path force-app --json",
|
|
1343
|
-
"<%= config.bin %> smart-deployment metadata gaps --ai-explain"
|
|
1344
|
-
],
|
|
1345
|
-
"flags": {
|
|
1346
|
-
"json": {
|
|
1347
|
-
"description": "Format output as json.",
|
|
1348
|
-
"helpGroup": "GLOBAL",
|
|
1349
|
-
"name": "json",
|
|
1350
|
-
"allowNo": false,
|
|
1351
|
-
"type": "boolean"
|
|
1352
|
-
},
|
|
1353
|
-
"flags-dir": {
|
|
1354
|
-
"helpGroup": "GLOBAL",
|
|
1355
|
-
"name": "flags-dir",
|
|
1356
|
-
"summary": "Import flag values from a directory.",
|
|
1357
|
-
"hasDynamicHelp": false,
|
|
1358
|
-
"multiple": false,
|
|
1359
|
-
"type": "option"
|
|
1360
|
-
},
|
|
1361
|
-
"source-path": {
|
|
1362
|
-
"description": "Path used to locate sfdx-project.json and scan configured package directories.",
|
|
1363
|
-
"name": "source-path",
|
|
1364
|
-
"summary": "Salesforce project or source path to scan",
|
|
1365
|
-
"hasDynamicHelp": false,
|
|
1366
|
-
"multiple": false,
|
|
1367
|
-
"type": "option"
|
|
1368
|
-
},
|
|
1369
|
-
"ai-explain": {
|
|
1370
|
-
"description": "Adds a deterministic prompt and setup-agents workflow command for Codex-assisted review. The plugin does not call an AI provider directly.",
|
|
1371
|
-
"name": "ai-explain",
|
|
1372
|
-
"summary": "Include workflow-ready AI explanation context",
|
|
1373
|
-
"allowNo": false,
|
|
1374
|
-
"type": "boolean"
|
|
1375
|
-
}
|
|
1376
|
-
},
|
|
1377
|
-
"hasDynamicHelp": false,
|
|
1378
|
-
"hiddenAliases": [],
|
|
1379
|
-
"id": "metadata:gaps",
|
|
1380
|
-
"pluginAlias": "@jterrats/smart-deployment",
|
|
1381
|
-
"pluginName": "@jterrats/smart-deployment",
|
|
1382
|
-
"pluginType": "core",
|
|
1383
|
-
"strict": true,
|
|
1384
|
-
"summary": "Analyze unsupported Salesforce metadata types",
|
|
1385
|
-
"enableJsonFlag": true,
|
|
1386
|
-
"isESM": true,
|
|
1387
|
-
"relativePath": [
|
|
1388
|
-
"lib",
|
|
1389
|
-
"commands",
|
|
1390
|
-
"metadata",
|
|
1391
|
-
"gaps.js"
|
|
1392
|
-
],
|
|
1393
|
-
"aliasPermutations": [
|
|
1394
|
-
"smart-deployment:metadata:gaps",
|
|
1395
|
-
"metadata:smart-deployment:gaps",
|
|
1396
|
-
"metadata:gaps:smart-deployment",
|
|
1397
|
-
"smart-deployment:gaps:metadata",
|
|
1398
|
-
"gaps:smart-deployment:metadata",
|
|
1399
|
-
"gaps:metadata:smart-deployment"
|
|
1400
|
-
],
|
|
1401
|
-
"permutations": [
|
|
1402
|
-
"metadata:gaps",
|
|
1403
|
-
"gaps:metadata"
|
|
1404
|
-
]
|
|
1405
|
-
},
|
|
1406
1343
|
"plan:explain": {
|
|
1407
1344
|
"aliases": [
|
|
1408
1345
|
"smart-deployment:plan:explain"
|
|
@@ -1555,7 +1492,78 @@
|
|
|
1555
1492
|
"plan:explain",
|
|
1556
1493
|
"explain:plan"
|
|
1557
1494
|
]
|
|
1495
|
+
},
|
|
1496
|
+
"metadata:gaps": {
|
|
1497
|
+
"aliases": [
|
|
1498
|
+
"smart-deployment:metadata:gaps"
|
|
1499
|
+
],
|
|
1500
|
+
"args": {},
|
|
1501
|
+
"description": "Scans package manifests and Salesforce source paths, compares detected metadata types against smart-deployment support, and reports safe next steps for unsupported or partially supported metadata.",
|
|
1502
|
+
"examples": [
|
|
1503
|
+
"<%= config.bin %> <%= command.id %> --source-path force-app --json",
|
|
1504
|
+
"<%= config.bin %> smart-deployment metadata gaps --ai-explain"
|
|
1505
|
+
],
|
|
1506
|
+
"flags": {
|
|
1507
|
+
"json": {
|
|
1508
|
+
"description": "Format output as json.",
|
|
1509
|
+
"helpGroup": "GLOBAL",
|
|
1510
|
+
"name": "json",
|
|
1511
|
+
"allowNo": false,
|
|
1512
|
+
"type": "boolean"
|
|
1513
|
+
},
|
|
1514
|
+
"flags-dir": {
|
|
1515
|
+
"helpGroup": "GLOBAL",
|
|
1516
|
+
"name": "flags-dir",
|
|
1517
|
+
"summary": "Import flag values from a directory.",
|
|
1518
|
+
"hasDynamicHelp": false,
|
|
1519
|
+
"multiple": false,
|
|
1520
|
+
"type": "option"
|
|
1521
|
+
},
|
|
1522
|
+
"source-path": {
|
|
1523
|
+
"description": "Path used to locate sfdx-project.json and scan configured package directories.",
|
|
1524
|
+
"name": "source-path",
|
|
1525
|
+
"summary": "Salesforce project or source path to scan",
|
|
1526
|
+
"hasDynamicHelp": false,
|
|
1527
|
+
"multiple": false,
|
|
1528
|
+
"type": "option"
|
|
1529
|
+
},
|
|
1530
|
+
"ai-explain": {
|
|
1531
|
+
"description": "Adds a deterministic prompt and setup-agents workflow command for Codex-assisted review. The plugin does not call an AI provider directly.",
|
|
1532
|
+
"name": "ai-explain",
|
|
1533
|
+
"summary": "Include workflow-ready AI explanation context",
|
|
1534
|
+
"allowNo": false,
|
|
1535
|
+
"type": "boolean"
|
|
1536
|
+
}
|
|
1537
|
+
},
|
|
1538
|
+
"hasDynamicHelp": false,
|
|
1539
|
+
"hiddenAliases": [],
|
|
1540
|
+
"id": "metadata:gaps",
|
|
1541
|
+
"pluginAlias": "@jterrats/smart-deployment",
|
|
1542
|
+
"pluginName": "@jterrats/smart-deployment",
|
|
1543
|
+
"pluginType": "core",
|
|
1544
|
+
"strict": true,
|
|
1545
|
+
"summary": "Analyze unsupported Salesforce metadata types",
|
|
1546
|
+
"enableJsonFlag": true,
|
|
1547
|
+
"isESM": true,
|
|
1548
|
+
"relativePath": [
|
|
1549
|
+
"lib",
|
|
1550
|
+
"commands",
|
|
1551
|
+
"metadata",
|
|
1552
|
+
"gaps.js"
|
|
1553
|
+
],
|
|
1554
|
+
"aliasPermutations": [
|
|
1555
|
+
"smart-deployment:metadata:gaps",
|
|
1556
|
+
"metadata:smart-deployment:gaps",
|
|
1557
|
+
"metadata:gaps:smart-deployment",
|
|
1558
|
+
"smart-deployment:gaps:metadata",
|
|
1559
|
+
"gaps:smart-deployment:metadata",
|
|
1560
|
+
"gaps:metadata:smart-deployment"
|
|
1561
|
+
],
|
|
1562
|
+
"permutations": [
|
|
1563
|
+
"metadata:gaps",
|
|
1564
|
+
"gaps:metadata"
|
|
1565
|
+
]
|
|
1558
1566
|
}
|
|
1559
1567
|
},
|
|
1560
|
-
"version": "1.
|
|
1568
|
+
"version": "1.5.0"
|
|
1561
1569
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jterrats/smart-deployment",
|
|
3
3
|
"description": "Intelligent Salesforce metadata deployment plugin that automatically analyzes dependencies, generates optimal deployment",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.5.0",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "4.11.4",
|
|
7
7
|
"@salesforce/core": "^8.31.0",
|