@jterrats/smart-deployment 1.3.1 → 1.4.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/README.md +38 -0
- package/lib/analysis/metadata-capability-definitions.d.ts +2 -0
- package/lib/analysis/metadata-capability-definitions.js +260 -0
- package/lib/analysis/metadata-capability-definitions.js.map +1 -0
- package/lib/analysis/metadata-capability-registry.d.ts +11 -0
- package/lib/analysis/metadata-capability-registry.js +142 -0
- package/lib/analysis/metadata-capability-registry.js.map +1 -0
- package/lib/analysis/metadata-gap-analysis-service.d.ts +51 -0
- package/lib/analysis/metadata-gap-analysis-service.js +277 -0
- package/lib/analysis/metadata-gap-analysis-service.js.map +1 -0
- package/lib/commands/ci-publish.d.ts +6 -2
- package/lib/commands/ci-publish.js +23 -8
- package/lib/commands/ci-publish.js.map +1 -1
- package/lib/commands/metadata/gaps.d.ts +15 -0
- package/lib/commands/metadata/gaps.js +84 -0
- package/lib/commands/metadata/gaps.js.map +1 -0
- package/lib/commands/resume.js +5 -4
- package/lib/commands/resume.js.map +1 -1
- package/lib/commands/start.d.ts +6 -0
- package/lib/commands/start.js +43 -14
- 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.d.ts +7 -0
- package/lib/commands/validate.js +24 -2
- package/lib/commands/validate.js.map +1 -1
- package/lib/constants/deployment-order.js +1 -0
- package/lib/constants/deployment-order.js.map +1 -1
- package/lib/deployment/commit-scope-service.d.ts +7 -0
- package/lib/deployment/commit-scope-service.js +104 -21
- package/lib/deployment/commit-scope-service.js.map +1 -1
- package/lib/deployment/deployment-runner.d.ts +1 -1
- package/lib/deployment/deployment-runner.js +23 -22
- package/lib/deployment/deployment-runner.js.map +1 -1
- package/lib/deployment/deployment-status-service.d.ts +8 -7
- package/lib/deployment/deployment-status-service.js +45 -27
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/deployment-validation-service.d.ts +2 -0
- package/lib/deployment/deployment-validation-service.js +2 -0
- package/lib/deployment/deployment-validation-service.js.map +1 -1
- package/lib/deployment/resume-deployment-service.d.ts +5 -4
- package/lib/deployment/resume-deployment-service.js +18 -21
- package/lib/deployment/resume-deployment-service.js.map +1 -1
- package/lib/deployment/sf-cli-integration.d.ts +5 -2
- package/lib/deployment/sf-cli-integration.js +26 -14
- package/lib/deployment/sf-cli-integration.js.map +1 -1
- package/lib/deployment/special-deployment-plan.js +36 -49
- package/lib/deployment/special-deployment-plan.js.map +1 -1
- package/lib/deployment/start-execution-service.js +1 -1
- package/lib/deployment/start-execution-service.js.map +1 -1
- package/lib/presentation/release-report-presenter.d.ts +10 -0
- package/lib/presentation/release-report-presenter.js +35 -0
- package/lib/presentation/release-report-presenter.js.map +1 -0
- package/lib/presentation/validate-command-presenter.js +13 -0
- package/lib/presentation/validate-command-presenter.js.map +1 -1
- package/lib/reports/release-report-builder.d.ts +6 -0
- package/lib/reports/release-report-builder.js +115 -0
- package/lib/reports/release-report-builder.js.map +1 -0
- package/lib/reports/release-report-command-adapter.d.ts +14 -0
- package/lib/reports/release-report-command-adapter.js +28 -0
- package/lib/reports/release-report-command-adapter.js.map +1 -0
- package/lib/reports/release-report-facts-factory.d.ts +14 -0
- package/lib/reports/release-report-facts-factory.js +140 -0
- package/lib/reports/release-report-facts-factory.js.map +1 -0
- package/lib/reports/release-report-sanitizer.d.ts +5 -0
- package/lib/reports/release-report-sanitizer.js +120 -0
- package/lib/reports/release-report-sanitizer.js.map +1 -0
- package/lib/reports/release-report-service.d.ts +43 -0
- package/lib/reports/release-report-service.js +80 -0
- package/lib/reports/release-report-service.js.map +1 -0
- package/lib/reports/release-report-store.d.ts +30 -0
- package/lib/reports/release-report-store.js +57 -0
- package/lib/reports/release-report-store.js.map +1 -0
- package/lib/reports/start-release-report-coordinator.d.ts +15 -0
- package/lib/reports/start-release-report-coordinator.js +23 -0
- package/lib/reports/start-release-report-coordinator.js.map +1 -0
- package/lib/services/metadata-scanner-service.js +12 -2
- package/lib/services/metadata-scanner-service.js.map +1 -1
- package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +2 -1
- package/lib/services/scanners/automation-ai-metadata-scanner.js +48 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -1
- package/lib/types/index.d.ts +2 -0
- package/lib/types/index.js +2 -0
- package/lib/types/index.js.map +1 -1
- package/lib/types/metadata-capability.d.ts +39 -0
- package/lib/types/metadata-capability.js +2 -0
- package/lib/types/metadata-capability.js.map +1 -0
- package/lib/types/metadata.d.ts +7 -1
- package/lib/types/release-report.d.ts +89 -0
- package/lib/types/release-report.js +42 -0
- package/lib/types/release-report.js.map +1 -0
- package/messages/metadata.gaps.json +12 -0
- package/messages/start.json +2 -0
- package/messages/validate.json +3 -1
- package/npm-shrinkwrap.json +417 -901
- package/oclif.lock +415 -718
- package/oclif.manifest.json +93 -10
- package/package.json +18 -14
package/README.md
CHANGED
|
@@ -32,6 +32,7 @@ What is working today:
|
|
|
32
32
|
- `sf smart-deployment ci-publish`
|
|
33
33
|
- `sf smart-deployment retrieve`
|
|
34
34
|
- JSON and HTML analysis reports
|
|
35
|
+
- release-owner CLI summaries and stable JSON release reports for `start`, `validate`, and `ci-publish`
|
|
35
36
|
- repo-level AI configuration via `.smart-deployment.json`
|
|
36
37
|
|
|
37
38
|
What is still partial:
|
|
@@ -119,6 +120,25 @@ sf smart-deployment validate \
|
|
|
119
120
|
--use-ai
|
|
120
121
|
```
|
|
121
122
|
|
|
123
|
+
Generate a story scope manifest from reviewed commits, then use it as the CI release contract:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
sf smart-deployment validate \
|
|
127
|
+
--source-path . \
|
|
128
|
+
--scope-commits abc123,def456 \
|
|
129
|
+
--scope-manifest-output manifests/story-scope.generated.json
|
|
130
|
+
|
|
131
|
+
sf smart-deployment ci preset \
|
|
132
|
+
--source-path . \
|
|
133
|
+
--scope-manifest manifests/story-scope.generated.json \
|
|
134
|
+
--validation-mode strict
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Story scope manifests are JSON objects with `schemaVersion: 1`, top-level `commits`, optional `changes`, and a
|
|
138
|
+
`scope` object containing `changedComponents`, `dependencyComponents`, `explicitComponents`, `includedComponents`, and
|
|
139
|
+
`ignoredComponents`. CI treats `scope.includedComponents` as the deployment boundary; metadata outside that list is
|
|
140
|
+
ignored unless it is added through `includeComponents` or `stories[].includeComponents`.
|
|
141
|
+
|
|
122
142
|
When to use each:
|
|
123
143
|
|
|
124
144
|
- use `validate` for local wave plan readiness and risk checks
|
|
@@ -170,6 +190,24 @@ When executing deploy phases, Smart Deployment respects `.forceignore` by buildi
|
|
|
170
190
|
For retrieve flows, `sf smart-deployment retrieve` runs `sf project retrieve start`, detects touched paths, restores `.forceignore`-protected bundle sub-paths with `git checkout HEAD -- <path>` or untracked cleanup, and can fail the command with `--strict-ignore`. Use `--normalize-meta` to opt into deterministic formatting for DigitalExperience `*_meta.json` files.
|
|
171
191
|
When `--target-org` is provided, the coordinated publish flow also passes the org through to Salesforce CLI commands and checks AI evaluation subjects against source metadata or the target org before deploy.
|
|
172
192
|
|
|
193
|
+
### Release Report
|
|
194
|
+
|
|
195
|
+
`start`, `validate`, and `ci-publish` print a release-owner summary and write:
|
|
196
|
+
|
|
197
|
+
```text
|
|
198
|
+
.smart-deployment/reports/release-report.json
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`start --report-dir <path>` relocates the report alongside the other requested report artifacts. The versioned
|
|
202
|
+
`schemaVersion: "1.0"` contract includes the command, target org when supplied, deterministic or AI-enriched analysis
|
|
203
|
+
mode, enrichment availability, overall outcome, totals, phases, metadata items, safe command evidence, and remediation.
|
|
204
|
+
Operations (`deploy`, `publish`, `activate`, `validate`) are separate from statuses (`succeeded`, `failed`, `skipped`,
|
|
205
|
+
`needs_review`) so CI can parse the artifact without scraping logs.
|
|
206
|
+
|
|
207
|
+
Report creation is advisory. A build, sanitization, serialization, persistence, or optional enrichment failure emits a
|
|
208
|
+
warning but does not replace the underlying command result or exit behavior. Evidence excludes raw arguments,
|
|
209
|
+
stdout/stderr, stack traces, credentials, and paths outside the Salesforce project.
|
|
210
|
+
|
|
173
211
|
## Commands
|
|
174
212
|
|
|
175
213
|
See:
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { DEPLOYMENT_ORDER } from '../constants/deployment-order.js';
|
|
2
|
+
const API_67 = '67.0';
|
|
3
|
+
const REPOSITORY_SOURCE_ID = 'smart-deployment-repository';
|
|
4
|
+
const RESEARCH_SOURCE_ID = 'metadata-catalog-research';
|
|
5
|
+
const REPOSITORY_SOURCE = {
|
|
6
|
+
id: REPOSITORY_SOURCE_ID,
|
|
7
|
+
kind: 'repository',
|
|
8
|
+
locator: 'smart-deployment source and focused tests',
|
|
9
|
+
};
|
|
10
|
+
const RESEARCH_SOURCE = {
|
|
11
|
+
id: RESEARCH_SOURCE_ID,
|
|
12
|
+
kind: 'repository',
|
|
13
|
+
locator: 'docs/research/metadata-catalog',
|
|
14
|
+
retrievedAt: '2026-07-23',
|
|
15
|
+
};
|
|
16
|
+
const SALESFORCE_COVERAGE_SOURCE = {
|
|
17
|
+
id: 'salesforce-metadata-coverage-67',
|
|
18
|
+
kind: 'vendor-documentation',
|
|
19
|
+
locator: 'https://developer.salesforce.com/docs/success/metadata-coverage-report/references/coverage-report/v67.0',
|
|
20
|
+
retrievedAt: '2026-07-23',
|
|
21
|
+
};
|
|
22
|
+
const LEGACY_SCANNER_TYPES = [
|
|
23
|
+
'ApexClass',
|
|
24
|
+
'ApexTrigger',
|
|
25
|
+
'AuraDefinitionBundle',
|
|
26
|
+
'Bot',
|
|
27
|
+
'BrandingSet',
|
|
28
|
+
'CustomSite',
|
|
29
|
+
'DigitalExperienceBundle',
|
|
30
|
+
'EmailTemplate',
|
|
31
|
+
'EmbeddedServiceConfig',
|
|
32
|
+
'FlexiPage',
|
|
33
|
+
'Layout',
|
|
34
|
+
'LightningComponentBundle',
|
|
35
|
+
'Network',
|
|
36
|
+
'Profile',
|
|
37
|
+
'Queue',
|
|
38
|
+
'StandardValueSet',
|
|
39
|
+
];
|
|
40
|
+
const P0_DEFINITIONS = [
|
|
41
|
+
metadataDefinition('ApexComponent', 'VisualforceComponent', 'C1', '61.0', {
|
|
42
|
+
discovery: proven('code-metadata-scanner.ts CODE_FILE_SCANNERS discovers Visualforce components.'),
|
|
43
|
+
parsing: proven('experience-metadata-scanner.ts parses Visualforce components.'),
|
|
44
|
+
dependencies: proven('Visualforce component dependency extraction is implemented.'),
|
|
45
|
+
ordering: proven('VisualforceComponent is present in DEPLOYMENT_ORDER.'),
|
|
46
|
+
lifecycle: notApplicable(),
|
|
47
|
+
fixtures: proven('Focused Visualforce scanner fixtures exist.'),
|
|
48
|
+
}),
|
|
49
|
+
metadataDefinition('ApexPage', 'VisualforcePage', 'C1', '61.0', {
|
|
50
|
+
discovery: proven('code-metadata-scanner.ts CODE_FILE_SCANNERS discovers Visualforce pages.'),
|
|
51
|
+
parsing: proven('experience-metadata-scanner.ts parses Visualforce pages.'),
|
|
52
|
+
dependencies: proven('Visualforce page dependency extraction is implemented.'),
|
|
53
|
+
ordering: proven('VisualforcePage is present in DEPLOYMENT_ORDER.'),
|
|
54
|
+
lifecycle: notApplicable(),
|
|
55
|
+
fixtures: proven('Focused Visualforce scanner fixtures exist.'),
|
|
56
|
+
}),
|
|
57
|
+
metadataDefinition('CustomApplication', 'LightningApp', 'C1', '61.0', {
|
|
58
|
+
discovery: partial('Source-path and manifest discovery exist without a component scanner.'),
|
|
59
|
+
parsing: absent('No CustomApplication parser is registered.'),
|
|
60
|
+
dependencies: partial('Security parsers can emit LightningApp references.'),
|
|
61
|
+
ordering: absent('Vendor CustomApplication has no proven ordering contract.'),
|
|
62
|
+
lifecycle: notApplicable(),
|
|
63
|
+
fixtures: absent('No focused end-to-end CustomApplication fixture exists.'),
|
|
64
|
+
}),
|
|
65
|
+
metadataDefinition('CustomMetadata', 'CustomMetadataRecord', 'C1', '61.0', {
|
|
66
|
+
discovery: proven('data-metadata-scanner.ts discovers custom metadata records.'),
|
|
67
|
+
parsing: proven('parseCustomMetadataComponents parses custom metadata records.'),
|
|
68
|
+
dependencies: proven('Custom metadata dependency extraction is implemented.'),
|
|
69
|
+
ordering: proven('CustomMetadataRecord is present in DEPLOYMENT_ORDER.'),
|
|
70
|
+
lifecycle: notApplicable(),
|
|
71
|
+
fixtures: proven('Focused custom metadata fixtures exist.'),
|
|
72
|
+
}),
|
|
73
|
+
metadataDefinition('CustomObject', 'CustomObject', 'C1', '61.0', {
|
|
74
|
+
discovery: proven('data-metadata-scanner.ts discovers CustomObject components.'),
|
|
75
|
+
parsing: proven('custom-object-parser.ts parses CustomObject metadata.'),
|
|
76
|
+
dependencies: partial('Only a subset of parsed object references reaches typed graph edges.'),
|
|
77
|
+
ordering: proven('CustomObject is present in DEPLOYMENT_ORDER.'),
|
|
78
|
+
lifecycle: notApplicable(),
|
|
79
|
+
fixtures: proven('Focused CustomObject parser and scanner fixtures exist.'),
|
|
80
|
+
}),
|
|
81
|
+
metadataDefinition('Flow', 'Flow', 'C1', '61.0', {
|
|
82
|
+
discovery: proven('automation-ai-metadata-scanner.ts discovers Flow components.'),
|
|
83
|
+
parsing: proven('flow-parser.ts parses Flow metadata.'),
|
|
84
|
+
dependencies: partial('Scanner assembly retains only part of the parsed Flow dependency set.'),
|
|
85
|
+
ordering: proven('Flow is present in DEPLOYMENT_ORDER.'),
|
|
86
|
+
lifecycle: notApplicable(),
|
|
87
|
+
fixtures: proven('Focused Flow parser and scanner fixtures exist.'),
|
|
88
|
+
}),
|
|
89
|
+
metadataDefinition('MatchingRules', 'MatchingRules', 'C1', '61.0', {
|
|
90
|
+
discovery: partial('Manifest and matchingRule source suffix detection exist.'),
|
|
91
|
+
parsing: absent('No MatchingRules parser is registered.'),
|
|
92
|
+
dependencies: absent('No MatchingRules dependency extraction is registered.'),
|
|
93
|
+
ordering: absent('MatchingRules is absent from DEPLOYMENT_ORDER.'),
|
|
94
|
+
lifecycle: notApplicable(),
|
|
95
|
+
fixtures: absent('Only metadata-gap detection coverage exists.'),
|
|
96
|
+
}),
|
|
97
|
+
metadataDefinition('PermissionSet', 'PermissionSet', 'C1', '61.0', {
|
|
98
|
+
discovery: proven('security-metadata-scanner.ts discovers PermissionSet components.'),
|
|
99
|
+
parsing: proven('permission-set-parser.ts parses PermissionSet metadata.'),
|
|
100
|
+
dependencies: partial('Several security references are not consistently normalized to typed node IDs.'),
|
|
101
|
+
ordering: proven('PermissionSet is present in DEPLOYMENT_ORDER.'),
|
|
102
|
+
lifecycle: notApplicable(),
|
|
103
|
+
fixtures: proven('Focused PermissionSet parser and scanner fixtures exist.'),
|
|
104
|
+
}),
|
|
105
|
+
metadataDefinition('OrderManagementSettings', 'OrderManagementSettings', 'C1', '67.0', {
|
|
106
|
+
discovery: partial('Manifest discovery preserves the vendor type; source inference remains generic.'),
|
|
107
|
+
parsing: absent('No OrderManagementSettings parser is registered.'),
|
|
108
|
+
dependencies: absent('No dependency extraction is registered.'),
|
|
109
|
+
ordering: absent('No validated deployment order exists.'),
|
|
110
|
+
lifecycle: absent('Enablement and rollback behavior require licensed-org evidence.'),
|
|
111
|
+
fixtures: absent('No licensed-org fixture or CLI contract exists.'),
|
|
112
|
+
}),
|
|
113
|
+
metadataDefinition('AiAuthoringBundle', 'AiAuthoringBundle', 'C2', '66.0', {
|
|
114
|
+
discovery: proven('automation-ai-metadata-scanner.ts discovers AiAuthoringBundle source.'),
|
|
115
|
+
parsing: partial('Bundle descriptor and Agent Script references are not fully parsed.'),
|
|
116
|
+
dependencies: absent('No complete AiAuthoringBundle dependency graph is emitted.'),
|
|
117
|
+
ordering: proven('AiAuthoringBundle has explicit special deployment ordering.'),
|
|
118
|
+
lifecycle: proven('special-deployment executor publishes and optionally activates authoring bundles.'),
|
|
119
|
+
fixtures: proven('API 66 authoring bundle and special deployment fixtures exist.'),
|
|
120
|
+
}, 'source-format-composite'),
|
|
121
|
+
metadataDefinition('GenAiPlannerBundle', 'GenAiPlannerBundle', 'C2', '66.0', {
|
|
122
|
+
discovery: proven('automation-ai-metadata-scanner.ts discovers planner bundles.'),
|
|
123
|
+
parsing: partial('Planner parsing covers actions and references but not all provenance.'),
|
|
124
|
+
dependencies: proven('Flow, Apex, and prompt references are extracted.'),
|
|
125
|
+
ordering: proven('GenAiPlannerBundle is present in DEPLOYMENT_ORDER.'),
|
|
126
|
+
lifecycle: partial('Generated-versus-owned publish provenance is not persisted.'),
|
|
127
|
+
fixtures: proven('API 66 planner bundle dependency fixtures exist.'),
|
|
128
|
+
}),
|
|
129
|
+
metadataDefinition('GenAiPromptTemplate', 'GenAiPromptTemplate', 'C2', '66.0', {
|
|
130
|
+
discovery: proven('automation-ai-metadata-scanner.ts discovers prompt templates.'),
|
|
131
|
+
parsing: proven('genai-prompt-parser.ts parses prompt metadata.'),
|
|
132
|
+
dependencies: partial('Model, field, and provider facts are not fully projected into graph edges.'),
|
|
133
|
+
ordering: proven('GenAiPromptTemplate is present in DEPLOYMENT_ORDER.'),
|
|
134
|
+
lifecycle: partial('Activation is separate and not fully modeled.'),
|
|
135
|
+
fixtures: proven('Focused prompt-template parser fixtures exist.'),
|
|
136
|
+
}),
|
|
137
|
+
metadataDefinition('AiEvaluationDefinition', 'AiEvaluationDefinition', 'C2', '67.0', {
|
|
138
|
+
discovery: proven('Canonical AiEvaluationDefinition source files are scanned deterministically.'),
|
|
139
|
+
parsing: proven('Required agent subject fields are parsed and validated.'),
|
|
140
|
+
dependencies: proven('The schema-proven Bot subject reference is emitted as a hard parser dependency.'),
|
|
141
|
+
ordering: proven('Evaluations are excluded from core deployment and owned by the ordered special phase.'),
|
|
142
|
+
lifecycle: partial('Connect API execution is separate from metadata deployment.'),
|
|
143
|
+
fixtures: proven('Evaluation definition validation fixtures exist.'),
|
|
144
|
+
}),
|
|
145
|
+
externalDefinition('BotVersion', 'BotVersion', 'C2', 'provider-lifecycle', {
|
|
146
|
+
discovery: absent('No independent BotVersion scanner exists.'),
|
|
147
|
+
parsing: absent('No independent BotVersion parser exists.'),
|
|
148
|
+
dependencies: absent('No independent BotVersion dependency extraction exists.'),
|
|
149
|
+
ordering: absent('A generic order entry does not prove provider lifecycle ordering.'),
|
|
150
|
+
lifecycle: partial('Bot version lifecycle is provider-managed and only partially represented.'),
|
|
151
|
+
fixtures: absent('No independent BotVersion lifecycle fixture exists.'),
|
|
152
|
+
}),
|
|
153
|
+
metadataDefinition('SlackApp', 'SlackApp', 'C1', '67.0', absentCapabilities()),
|
|
154
|
+
externalDefinition('SlackAppManifest', 'SlackAppManifest', 'C1', 'external-provider', {
|
|
155
|
+
discovery: absent('No Slack provider adapter is registered.'),
|
|
156
|
+
parsing: notApplicable(),
|
|
157
|
+
dependencies: notApplicable(),
|
|
158
|
+
ordering: notApplicable(),
|
|
159
|
+
lifecycle: absent('No Slack install or reinstall lifecycle is registered.'),
|
|
160
|
+
fixtures: absent('No secret-safe Slack manifest fixture exists.'),
|
|
161
|
+
}),
|
|
162
|
+
externalDefinition('FSLManagedConfiguration', 'FSLManagedConfiguration', 'C1', 'managed-package-data', {
|
|
163
|
+
discovery: absent('No package-aware FSL configuration data adapter is registered.'),
|
|
164
|
+
parsing: notApplicable(),
|
|
165
|
+
dependencies: notApplicable(),
|
|
166
|
+
ordering: notApplicable(),
|
|
167
|
+
lifecycle: absent('No package-version-aware data lifecycle is registered.'),
|
|
168
|
+
fixtures: absent('No licensed FSL configuration fixture exists.'),
|
|
169
|
+
}),
|
|
170
|
+
externalDefinition('FieldServiceOperationalRecords', 'FieldServiceOperationalRecords', 'C1', 'managed-package-data', {
|
|
171
|
+
discovery: notApplicable('Operational records are deliberately excluded from metadata discovery.'),
|
|
172
|
+
parsing: notApplicable(),
|
|
173
|
+
dependencies: notApplicable(),
|
|
174
|
+
ordering: notApplicable(),
|
|
175
|
+
lifecycle: absent('Operational data migration is outside smart-deployment.'),
|
|
176
|
+
fixtures: absent('No operational data fixture belongs in this plugin.'),
|
|
177
|
+
}),
|
|
178
|
+
];
|
|
179
|
+
export const METADATA_CAPABILITY_DEFINITIONS = [
|
|
180
|
+
...Object.keys(DEPLOYMENT_ORDER)
|
|
181
|
+
.filter((metadataType) => !isExplicitlyDefined(metadataType) && !isLegacyScannerType(metadataType))
|
|
182
|
+
.map((metadataType) => orderedDefinition(metadataType)),
|
|
183
|
+
...LEGACY_SCANNER_TYPES.filter((metadataType) => !isExplicitlyDefined(metadataType)).map((metadataType) => scannerDefinition(metadataType)),
|
|
184
|
+
...P0_DEFINITIONS,
|
|
185
|
+
];
|
|
186
|
+
function metadataDefinition(vendorType, canonicalType, canonicalOwner, minimumApiVersion, capabilities, deploymentChannel = 'metadata-api') {
|
|
187
|
+
return definition(vendorType, canonicalType, canonicalOwner, API_67, minimumApiVersion, deploymentChannel, capabilities);
|
|
188
|
+
}
|
|
189
|
+
function externalDefinition(vendorType, canonicalType, canonicalOwner, deploymentChannel, capabilities) {
|
|
190
|
+
return definition(vendorType, canonicalType, canonicalOwner, 'n/a', 'n/a', deploymentChannel, capabilities);
|
|
191
|
+
}
|
|
192
|
+
function scannerDefinition(metadataType) {
|
|
193
|
+
return metadataDefinition(metadataType, metadataType, 'legacy-repository', '61.0', {
|
|
194
|
+
discovery: proven('Existing metadata scanner coverage.'),
|
|
195
|
+
parsing: partial('Parser depth varies by metadata family.'),
|
|
196
|
+
dependencies: partial('Dependency evidence varies by metadata family.'),
|
|
197
|
+
ordering: Object.hasOwn(DEPLOYMENT_ORDER, metadataType)
|
|
198
|
+
? proven(`${metadataType} is present in DEPLOYMENT_ORDER.`)
|
|
199
|
+
: absent(`${metadataType} is absent from DEPLOYMENT_ORDER.`),
|
|
200
|
+
lifecycle: notApplicable(),
|
|
201
|
+
fixtures: partial('Focused fixture coverage varies by metadata family.'),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function orderedDefinition(metadataType) {
|
|
205
|
+
return metadataDefinition(metadataType, metadataType, 'legacy-repository', '61.0', {
|
|
206
|
+
discovery: absent(`No scanner is registered for ordered type ${metadataType}.`),
|
|
207
|
+
parsing: absent(`No parser is registered for ordered type ${metadataType}.`),
|
|
208
|
+
dependencies: absent(`No dependency extractor is registered for ordered type ${metadataType}.`),
|
|
209
|
+
ordering: proven(`${metadataType} is present in DEPLOYMENT_ORDER.`),
|
|
210
|
+
lifecycle: notApplicable(),
|
|
211
|
+
fixtures: absent(`No focused fixture proves support for ordered-only type ${metadataType}.`),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function definition(vendorType, canonicalType, canonicalOwner, apiVersion, minimumApiVersion, deploymentChannel, capabilities) {
|
|
215
|
+
return {
|
|
216
|
+
apiVersion,
|
|
217
|
+
minimumApiVersion,
|
|
218
|
+
deploymentChannel,
|
|
219
|
+
vendorType,
|
|
220
|
+
canonicalType,
|
|
221
|
+
internalAliases: [],
|
|
222
|
+
canonicalOwner,
|
|
223
|
+
capabilities,
|
|
224
|
+
evidenceSources: apiVersion === 'n/a'
|
|
225
|
+
? [REPOSITORY_SOURCE, RESEARCH_SOURCE]
|
|
226
|
+
: [REPOSITORY_SOURCE, RESEARCH_SOURCE, SALESFORCE_COVERAGE_SOURCE],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function isExplicitlyDefined(metadataType) {
|
|
230
|
+
return P0_DEFINITIONS.some((entry) => entry.vendorType === metadataType || entry.canonicalType === metadataType);
|
|
231
|
+
}
|
|
232
|
+
function isLegacyScannerType(metadataType) {
|
|
233
|
+
return LEGACY_SCANNER_TYPES.includes(metadataType);
|
|
234
|
+
}
|
|
235
|
+
function absentCapabilities() {
|
|
236
|
+
return {
|
|
237
|
+
discovery: absent('No deterministic discovery is registered.'),
|
|
238
|
+
parsing: absent('No semantic parser is registered.'),
|
|
239
|
+
dependencies: absent('No dependency extraction is registered.'),
|
|
240
|
+
ordering: absent('No deployment ordering is registered.'),
|
|
241
|
+
lifecycle: absent('No deployment or provider lifecycle is registered.'),
|
|
242
|
+
fixtures: absent('No deterministic fixture or CLI evidence is registered.'),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function proven(detail) {
|
|
246
|
+
return evidence('proven', REPOSITORY_SOURCE_ID, detail);
|
|
247
|
+
}
|
|
248
|
+
function partial(detail) {
|
|
249
|
+
return evidence('partial', REPOSITORY_SOURCE_ID, detail);
|
|
250
|
+
}
|
|
251
|
+
function absent(detail) {
|
|
252
|
+
return evidence('absent', RESEARCH_SOURCE_ID, detail);
|
|
253
|
+
}
|
|
254
|
+
function notApplicable(detail = 'Capability does not apply to this deployment channel.') {
|
|
255
|
+
return evidence('not-applicable', RESEARCH_SOURCE_ID, detail);
|
|
256
|
+
}
|
|
257
|
+
function evidence(status, sourceId, detail) {
|
|
258
|
+
return { status, evidence: [{ sourceId, detail }] };
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=metadata-capability-definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-capability-definitions.js","sourceRoot":"","sources":["../../src/analysis/metadata-capability-definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MetadataCapabilityDefinition, MetadataCapabilityEntry, MetadataDeploymentChannel } from '../types/metadata-capability.js';
|
|
2
|
+
export declare class MetadataCapabilityRegistry {
|
|
3
|
+
private readonly entriesByKey;
|
|
4
|
+
private readonly sortedEntries;
|
|
5
|
+
constructor(definitions: readonly MetadataCapabilityDefinition[]);
|
|
6
|
+
list(): readonly MetadataCapabilityEntry[];
|
|
7
|
+
getByCatalogKey(catalogKey: string): MetadataCapabilityEntry | undefined;
|
|
8
|
+
resolve(metadataType: string, projectApiVersion: string, deploymentChannel?: MetadataDeploymentChannel): MetadataCapabilityEntry | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildMetadataCapabilityCatalogKey(apiVersion: string, deploymentChannel: MetadataDeploymentChannel, vendorType: string): string;
|
|
11
|
+
export declare const metadataCapabilityRegistry: MetadataCapabilityRegistry;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { METADATA_CAPABILITY_DEFINITIONS } from './metadata-capability-definitions.js';
|
|
2
|
+
const CAPABILITY_NAMES = ['discovery', 'parsing', 'dependencies', 'ordering', 'lifecycle', 'fixtures'];
|
|
3
|
+
export class MetadataCapabilityRegistry {
|
|
4
|
+
entriesByKey;
|
|
5
|
+
sortedEntries;
|
|
6
|
+
constructor(definitions) {
|
|
7
|
+
const entriesByKey = new Map();
|
|
8
|
+
const aliasesByScope = new Map();
|
|
9
|
+
const entries = definitions.map((definition) => normalizeDefinition(definition));
|
|
10
|
+
for (const entry of entries) {
|
|
11
|
+
if (entriesByKey.has(entry.catalogKey)) {
|
|
12
|
+
throw new Error(`Duplicate metadata capability catalog key: ${entry.catalogKey}`);
|
|
13
|
+
}
|
|
14
|
+
entriesByKey.set(entry.catalogKey, entry);
|
|
15
|
+
for (const name of [entry.vendorType, entry.canonicalType, ...entry.internalAliases]) {
|
|
16
|
+
const aliasKey = buildAliasKey(entry.apiVersion, entry.deploymentChannel, name);
|
|
17
|
+
const existing = aliasesByScope.get(aliasKey);
|
|
18
|
+
if (existing && existing.catalogKey !== entry.catalogKey) {
|
|
19
|
+
throw new Error(`Duplicate metadata capability name "${name}" for ${entry.apiVersion}|${entry.deploymentChannel}`);
|
|
20
|
+
}
|
|
21
|
+
aliasesByScope.set(aliasKey, entry);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
this.entriesByKey = entriesByKey;
|
|
25
|
+
this.sortedEntries = Object.freeze([...entries].sort((left, right) => compareText(left.catalogKey, right.catalogKey)));
|
|
26
|
+
}
|
|
27
|
+
list() {
|
|
28
|
+
return this.sortedEntries;
|
|
29
|
+
}
|
|
30
|
+
getByCatalogKey(catalogKey) {
|
|
31
|
+
return this.entriesByKey.get(catalogKey);
|
|
32
|
+
}
|
|
33
|
+
resolve(metadataType, projectApiVersion, deploymentChannel) {
|
|
34
|
+
const candidates = this.sortedEntries.filter((entry) => (deploymentChannel === undefined || entry.deploymentChannel === deploymentChannel) &&
|
|
35
|
+
[entry.vendorType, entry.canonicalType, ...entry.internalAliases].includes(metadataType) &&
|
|
36
|
+
isCompatibleWithProject(entry.minimumApiVersion, projectApiVersion));
|
|
37
|
+
const channels = new Set(candidates.map((entry) => entry.deploymentChannel));
|
|
38
|
+
if (channels.size !== 1) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return [...candidates].sort((left, right) => compareApiVersion(left.apiVersion, right.apiVersion)).at(-1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function buildMetadataCapabilityCatalogKey(apiVersion, deploymentChannel, vendorType) {
|
|
45
|
+
return `${apiVersion}|${deploymentChannel}|${vendorType}`;
|
|
46
|
+
}
|
|
47
|
+
export const metadataCapabilityRegistry = new MetadataCapabilityRegistry(METADATA_CAPABILITY_DEFINITIONS);
|
|
48
|
+
function normalizeDefinition(definition) {
|
|
49
|
+
validateApiVersion(definition.apiVersion, 'apiVersion');
|
|
50
|
+
validateApiVersion(definition.minimumApiVersion, 'minimumApiVersion');
|
|
51
|
+
validateText(definition.vendorType, 'vendorType');
|
|
52
|
+
validateText(definition.canonicalType, 'canonicalType');
|
|
53
|
+
const aliases = [...definition.internalAliases].sort(compareText);
|
|
54
|
+
if (new Set(aliases).size !== aliases.length) {
|
|
55
|
+
throw new Error(`Duplicate aliases in metadata capability definition: ${definition.vendorType}`);
|
|
56
|
+
}
|
|
57
|
+
const evidenceSources = normalizeEvidenceSources(definition.evidenceSources, definition.vendorType);
|
|
58
|
+
const sourceIds = new Set(evidenceSources.map((source) => source.id));
|
|
59
|
+
const capabilities = normalizeCapabilities(definition.capabilities, sourceIds, definition.vendorType);
|
|
60
|
+
return Object.freeze({
|
|
61
|
+
...definition,
|
|
62
|
+
internalAliases: Object.freeze(aliases),
|
|
63
|
+
capabilities,
|
|
64
|
+
evidenceSources,
|
|
65
|
+
catalogKey: buildMetadataCapabilityCatalogKey(definition.apiVersion, definition.deploymentChannel, definition.vendorType),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function normalizeEvidenceSources(sources, vendorType) {
|
|
69
|
+
const normalized = [...sources]
|
|
70
|
+
.map((source) => {
|
|
71
|
+
validateText(source.id, 'evidence source id');
|
|
72
|
+
validateText(source.locator, 'evidence source locator');
|
|
73
|
+
if (source.retrievedAt !== undefined && !/^\d{4}-\d{2}-\d{2}$/u.test(source.retrievedAt)) {
|
|
74
|
+
throw new Error(`Invalid metadata capability evidence retrieval date: "${source.retrievedAt}"`);
|
|
75
|
+
}
|
|
76
|
+
return Object.freeze({ ...source });
|
|
77
|
+
})
|
|
78
|
+
.sort((left, right) => compareText(left.id, right.id));
|
|
79
|
+
if (new Set(normalized.map((source) => source.id)).size !== normalized.length) {
|
|
80
|
+
throw new Error(`Duplicate evidence sources in metadata capability definition: ${vendorType}`);
|
|
81
|
+
}
|
|
82
|
+
return Object.freeze(normalized);
|
|
83
|
+
}
|
|
84
|
+
function normalizeCapabilities(capabilities, sourceIds, vendorType) {
|
|
85
|
+
const actualNames = Object.keys(capabilities).sort(compareText);
|
|
86
|
+
const expectedNames = [...CAPABILITY_NAMES].sort(compareText);
|
|
87
|
+
if (actualNames.join('|') !== expectedNames.join('|')) {
|
|
88
|
+
throw new Error(`Invalid capability dimensions in metadata capability definition: ${vendorType}`);
|
|
89
|
+
}
|
|
90
|
+
return Object.freeze(Object.fromEntries(CAPABILITY_NAMES.map((name) => {
|
|
91
|
+
const capability = capabilities[name];
|
|
92
|
+
return [
|
|
93
|
+
name,
|
|
94
|
+
Object.freeze({
|
|
95
|
+
...capability,
|
|
96
|
+
evidence: Object.freeze(capability.evidence.map((reference) => normalizeEvidenceReference(reference, sourceIds, vendorType))),
|
|
97
|
+
}),
|
|
98
|
+
];
|
|
99
|
+
})));
|
|
100
|
+
}
|
|
101
|
+
function normalizeEvidenceReference(reference, sourceIds, vendorType) {
|
|
102
|
+
validateText(reference.sourceId, 'evidence sourceId');
|
|
103
|
+
validateText(reference.detail, 'evidence detail');
|
|
104
|
+
if (!sourceIds.has(reference.sourceId)) {
|
|
105
|
+
throw new Error(`Unknown evidence source "${reference.sourceId}" in metadata capability definition: ${vendorType}`);
|
|
106
|
+
}
|
|
107
|
+
return Object.freeze({ ...reference });
|
|
108
|
+
}
|
|
109
|
+
function buildAliasKey(apiVersion, deploymentChannel, name) {
|
|
110
|
+
return `${apiVersion}|${deploymentChannel}|${name}`;
|
|
111
|
+
}
|
|
112
|
+
function validateApiVersion(value, field) {
|
|
113
|
+
validateText(value, field);
|
|
114
|
+
if (value !== 'n/a' && !/^\d+\.\d+$/u.test(value)) {
|
|
115
|
+
throw new Error(`Invalid metadata capability ${field}: "${value}"`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function validateText(value, field) {
|
|
119
|
+
if (value.trim().length === 0 || value !== value.trim() || value.includes('|')) {
|
|
120
|
+
throw new Error(`Invalid metadata capability ${field}: "${value}"`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function isCompatibleWithProject(minimumApiVersion, projectApiVersion) {
|
|
124
|
+
if (minimumApiVersion === 'n/a') {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
const requestedVersion = Number.parseFloat(projectApiVersion);
|
|
128
|
+
return Number.isFinite(requestedVersion) && Number.parseFloat(minimumApiVersion) <= requestedVersion;
|
|
129
|
+
}
|
|
130
|
+
function compareText(left, right) {
|
|
131
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
132
|
+
}
|
|
133
|
+
function compareApiVersion(left, right) {
|
|
134
|
+
if (left === right)
|
|
135
|
+
return 0;
|
|
136
|
+
if (left === 'n/a')
|
|
137
|
+
return -1;
|
|
138
|
+
if (right === 'n/a')
|
|
139
|
+
return 1;
|
|
140
|
+
return Number.parseFloat(left) - Number.parseFloat(right);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=metadata-capability-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-capability-registry.js","sourceRoot":"","sources":["../../src/analysis/metadata-capability-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { MetadataCapabilityRegistry } from './metadata-capability-registry.js';
|
|
2
|
+
export type MetadataGapClassification = 'registry-only' | 'dependency-rule' | 'ordering-special' | 'provider-owned' | 'human-review-required';
|
|
3
|
+
export type MetadataGapSupportStatus = 'supported' | 'ordered-only' | 'unsupported';
|
|
4
|
+
export type MetadataGapDetectedType = {
|
|
5
|
+
metadataType: string;
|
|
6
|
+
supportStatus: MetadataGapSupportStatus;
|
|
7
|
+
evidence: string[];
|
|
8
|
+
detectedFrom: Array<'package-manifest' | 'source-path'>;
|
|
9
|
+
};
|
|
10
|
+
export type MetadataGapFinding = MetadataGapDetectedType & {
|
|
11
|
+
classification: MetadataGapClassification;
|
|
12
|
+
reason: string;
|
|
13
|
+
suggestedImplementation: string[];
|
|
14
|
+
requiresHumanReview: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type MetadataGapAIContext = {
|
|
17
|
+
mode: 'workflow-prompt';
|
|
18
|
+
directProviderApiAllowed: false;
|
|
19
|
+
recommendedCommand: string;
|
|
20
|
+
prompt: string;
|
|
21
|
+
};
|
|
22
|
+
export type MetadataGapAnalysisResult = {
|
|
23
|
+
success: boolean;
|
|
24
|
+
analysisMode: 'deterministic' | 'deterministic-with-ai-context';
|
|
25
|
+
projectRoot: string;
|
|
26
|
+
apiVersion: string;
|
|
27
|
+
detectedTypes: MetadataGapDetectedType[];
|
|
28
|
+
gaps: MetadataGapFinding[];
|
|
29
|
+
aiContext?: MetadataGapAIContext;
|
|
30
|
+
summary: {
|
|
31
|
+
detectedTypeCount: number;
|
|
32
|
+
supportedTypeCount: number;
|
|
33
|
+
gapCount: number;
|
|
34
|
+
humanReviewCount: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type MetadataGapAnalysisOptions = {
|
|
38
|
+
sourcePath?: string;
|
|
39
|
+
aiExplain?: boolean;
|
|
40
|
+
};
|
|
41
|
+
export declare class MetadataGapAnalysisService {
|
|
42
|
+
private readonly capabilityRegistry;
|
|
43
|
+
constructor(capabilityRegistry?: MetadataCapabilityRegistry);
|
|
44
|
+
analyze(options?: MetadataGapAnalysisOptions): Promise<MetadataGapAnalysisResult>;
|
|
45
|
+
private collectManifestTypes;
|
|
46
|
+
private collectSourceTypes;
|
|
47
|
+
private addEvidence;
|
|
48
|
+
private toDetectedType;
|
|
49
|
+
private toGap;
|
|
50
|
+
private buildAIContext;
|
|
51
|
+
}
|