@dailephd/my-frontend-observer 0.8.1
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/CHANGELOG.md +397 -0
- package/LICENSE +21 -0
- package/README.md +255 -0
- package/dist/application/browserCaptureService.d.ts +11 -0
- package/dist/application/browserCaptureService.js +12 -0
- package/dist/application/browserCaptureService.js.map +1 -0
- package/dist/application/comparisonService.d.ts +56 -0
- package/dist/application/comparisonService.js +77 -0
- package/dist/application/comparisonService.js.map +1 -0
- package/dist/application/externalReferencePersistenceService.d.ts +75 -0
- package/dist/application/externalReferencePersistenceService.js +182 -0
- package/dist/application/externalReferencePersistenceService.js.map +1 -0
- package/dist/application/frontendContractEvaluationService.d.ts +49 -0
- package/dist/application/frontendContractEvaluationService.js +112 -0
- package/dist/application/frontendContractEvaluationService.js.map +1 -0
- package/dist/application/frontendContractPersistenceService.d.ts +56 -0
- package/dist/application/frontendContractPersistenceService.js +91 -0
- package/dist/application/frontendContractPersistenceService.js.map +1 -0
- package/dist/application/observationPersistence.d.ts +59 -0
- package/dist/application/observationPersistence.js +79 -0
- package/dist/application/observationPersistence.js.map +1 -0
- package/dist/application/projectCheckService.d.ts +3 -0
- package/dist/application/projectCheckService.js +169 -0
- package/dist/application/projectCheckService.js.map +1 -0
- package/dist/application/projectWorkflowService.d.ts +46 -0
- package/dist/application/projectWorkflowService.js +92 -0
- package/dist/application/projectWorkflowService.js.map +1 -0
- package/dist/application/referenceFidelityEvaluationService.d.ts +28 -0
- package/dist/application/referenceFidelityEvaluationService.js +45 -0
- package/dist/application/referenceFidelityEvaluationService.js.map +1 -0
- package/dist/artifacts/artifactReader.d.ts +19 -0
- package/dist/artifacts/artifactReader.js +36 -0
- package/dist/artifacts/artifactReader.js.map +1 -0
- package/dist/artifacts/artifactWriter.d.ts +25 -0
- package/dist/artifacts/artifactWriter.js +68 -0
- package/dist/artifacts/artifactWriter.js.map +1 -0
- package/dist/artifacts/comparisonArtifactReader.d.ts +18 -0
- package/dist/artifacts/comparisonArtifactReader.js +35 -0
- package/dist/artifacts/comparisonArtifactReader.js.map +1 -0
- package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
- package/dist/artifacts/comparisonArtifactWriter.js +67 -0
- package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactReader.d.ts +18 -0
- package/dist/artifacts/externalReferenceArtifactReader.js +35 -0
- package/dist/artifacts/externalReferenceArtifactReader.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactWriter.d.ts +44 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js +77 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactReader.d.ts +24 -0
- package/dist/artifacts/frontendContractArtifactReader.js +47 -0
- package/dist/artifacts/frontendContractArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactWriter.d.ts +34 -0
- package/dist/artifacts/frontendContractArtifactWriter.js +70 -0
- package/dist/artifacts/frontendContractArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.d.ts +17 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js +34 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.d.ts +32 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js +58 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js.map +1 -0
- package/dist/artifacts/types.d.ts +17 -0
- package/dist/artifacts/types.js +2 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/browser/chromiumAdapter.d.ts +21 -0
- package/dist/browser/chromiumAdapter.js +204 -0
- package/dist/browser/chromiumAdapter.js.map +1 -0
- package/dist/browser/evidenceCapture.d.ts +62 -0
- package/dist/browser/evidenceCapture.js +500 -0
- package/dist/browser/evidenceCapture.js.map +1 -0
- package/dist/browser/scrollCapture.d.ts +32 -0
- package/dist/browser/scrollCapture.js +163 -0
- package/dist/browser/scrollCapture.js.map +1 -0
- package/dist/browser/types.d.ts +24 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +2411 -0
- package/dist/cli.js.map +1 -0
- package/dist/domain/boundedAgentContext.d.ts +226 -0
- package/dist/domain/boundedAgentContext.js +355 -0
- package/dist/domain/boundedAgentContext.js.map +1 -0
- package/dist/domain/boundedAgentContextCorrelation.d.ts +74 -0
- package/dist/domain/boundedAgentContextCorrelation.js +441 -0
- package/dist/domain/boundedAgentContextCorrelation.js.map +1 -0
- package/dist/domain/boundedAgentContextIdentity.d.ts +26 -0
- package/dist/domain/boundedAgentContextIdentity.js +69 -0
- package/dist/domain/boundedAgentContextIdentity.js.map +1 -0
- package/dist/domain/boundedAgentContextProjection.d.ts +71 -0
- package/dist/domain/boundedAgentContextProjection.js +477 -0
- package/dist/domain/boundedAgentContextProjection.js.map +1 -0
- package/dist/domain/comparison.d.ts +220 -0
- package/dist/domain/comparison.js +350 -0
- package/dist/domain/comparison.js.map +1 -0
- package/dist/domain/comparisonEngine.d.ts +76 -0
- package/dist/domain/comparisonEngine.js +734 -0
- package/dist/domain/comparisonEngine.js.map +1 -0
- package/dist/domain/comparisonIdentity.d.ts +13 -0
- package/dist/domain/comparisonIdentity.js +46 -0
- package/dist/domain/comparisonIdentity.js.map +1 -0
- package/dist/domain/completion.d.ts +30 -0
- package/dist/domain/completion.js +22 -0
- package/dist/domain/completion.js.map +1 -0
- package/dist/domain/diagnostics.d.ts +17 -0
- package/dist/domain/diagnostics.js +77 -0
- package/dist/domain/diagnostics.js.map +1 -0
- package/dist/domain/evidence.d.ts +29 -0
- package/dist/domain/evidence.js +59 -0
- package/dist/domain/evidence.js.map +1 -0
- package/dist/domain/explicitState.d.ts +40 -0
- package/dist/domain/explicitState.js +54 -0
- package/dist/domain/explicitState.js.map +1 -0
- package/dist/domain/externalReference.d.ts +158 -0
- package/dist/domain/externalReference.js +167 -0
- package/dist/domain/externalReference.js.map +1 -0
- package/dist/domain/externalReferenceApplicability.d.ts +43 -0
- package/dist/domain/externalReferenceApplicability.js +52 -0
- package/dist/domain/externalReferenceApplicability.js.map +1 -0
- package/dist/domain/externalReferenceCompatibility.d.ts +40 -0
- package/dist/domain/externalReferenceCompatibility.js +48 -0
- package/dist/domain/externalReferenceCompatibility.js.map +1 -0
- package/dist/domain/externalReferenceFidelity.d.ts +171 -0
- package/dist/domain/externalReferenceFidelity.js +419 -0
- package/dist/domain/externalReferenceFidelity.js.map +1 -0
- package/dist/domain/externalReferenceIdentity.d.ts +38 -0
- package/dist/domain/externalReferenceIdentity.js +70 -0
- package/dist/domain/externalReferenceIdentity.js.map +1 -0
- package/dist/domain/externalReferenceImage.d.ts +35 -0
- package/dist/domain/externalReferenceImage.js +160 -0
- package/dist/domain/externalReferenceImage.js.map +1 -0
- package/dist/domain/externalReferenceRegionRelationships.d.ts +63 -0
- package/dist/domain/externalReferenceRegionRelationships.js +98 -0
- package/dist/domain/externalReferenceRegionRelationships.js.map +1 -0
- package/dist/domain/externalReferenceRegions.d.ts +65 -0
- package/dist/domain/externalReferenceRegions.js +105 -0
- package/dist/domain/externalReferenceRegions.js.map +1 -0
- package/dist/domain/externalReferenceRequirementIdentity.d.ts +12 -0
- package/dist/domain/externalReferenceRequirementIdentity.js +35 -0
- package/dist/domain/externalReferenceRequirementIdentity.js.map +1 -0
- package/dist/domain/externalReferenceRequirements.d.ts +215 -0
- package/dist/domain/externalReferenceRequirements.js +401 -0
- package/dist/domain/externalReferenceRequirements.js.map +1 -0
- package/dist/domain/externalReferenceRuntimeBinding.d.ts +146 -0
- package/dist/domain/externalReferenceRuntimeBinding.js +183 -0
- package/dist/domain/externalReferenceRuntimeBinding.js.map +1 -0
- package/dist/domain/frontendContractEvaluation.d.ts +57 -0
- package/dist/domain/frontendContractEvaluation.js +454 -0
- package/dist/domain/frontendContractEvaluation.js.map +1 -0
- package/dist/domain/frontendContractEvaluationArtifact.d.ts +65 -0
- package/dist/domain/frontendContractEvaluationArtifact.js +108 -0
- package/dist/domain/frontendContractEvaluationArtifact.js.map +1 -0
- package/dist/domain/frontendContractIdentity.d.ts +39 -0
- package/dist/domain/frontendContractIdentity.js +70 -0
- package/dist/domain/frontendContractIdentity.js.map +1 -0
- package/dist/domain/frontendContracts.d.ts +188 -0
- package/dist/domain/frontendContracts.js +260 -0
- package/dist/domain/frontendContracts.js.map +1 -0
- package/dist/domain/identity.d.ts +21 -0
- package/dist/domain/identity.js +47 -0
- package/dist/domain/identity.js.map +1 -0
- package/dist/domain/referenceCorrectionIdentity.d.ts +40 -0
- package/dist/domain/referenceCorrectionIdentity.js +77 -0
- package/dist/domain/referenceCorrectionIdentity.js.map +1 -0
- package/dist/domain/referenceCorrectionWorkflow.d.ts +160 -0
- package/dist/domain/referenceCorrectionWorkflow.js +165 -0
- package/dist/domain/referenceCorrectionWorkflow.js.map +1 -0
- package/dist/domain/referenceFidelityProjection.d.ts +65 -0
- package/dist/domain/referenceFidelityProjection.js +135 -0
- package/dist/domain/referenceFidelityProjection.js.map +1 -0
- package/dist/domain/relationships.d.ts +210 -0
- package/dist/domain/relationships.js +352 -0
- package/dist/domain/relationships.js.map +1 -0
- package/dist/domain/schema.d.ts +269 -0
- package/dist/domain/schema.js +442 -0
- package/dist/domain/schema.js.map +1 -0
- package/dist/domain/scrollEvidence.d.ts +51 -0
- package/dist/domain/scrollEvidence.js +134 -0
- package/dist/domain/scrollEvidence.js.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/projectWorkflow/aliasCatalog.d.ts +21 -0
- package/dist/projectWorkflow/aliasCatalog.js +67 -0
- package/dist/projectWorkflow/aliasCatalog.js.map +1 -0
- package/dist/projectWorkflow/checkAcceptance.d.ts +25 -0
- package/dist/projectWorkflow/checkAcceptance.js +55 -0
- package/dist/projectWorkflow/checkAcceptance.js.map +1 -0
- package/dist/projectWorkflow/checkResult.d.ts +85 -0
- package/dist/projectWorkflow/checkResult.js +101 -0
- package/dist/projectWorkflow/checkResult.js.map +1 -0
- package/dist/projectWorkflow/projectConfig.d.ts +43 -0
- package/dist/projectWorkflow/projectConfig.js +84 -0
- package/dist/projectWorkflow/projectConfig.js.map +1 -0
- package/dist/projectWorkflow/projectDiscovery.d.ts +9 -0
- package/dist/projectWorkflow/projectDiscovery.js +20 -0
- package/dist/projectWorkflow/projectDiscovery.js.map +1 -0
- package/dist/projectWorkflow/projectPaths.d.ts +8 -0
- package/dist/projectWorkflow/projectPaths.js +23 -0
- package/dist/projectWorkflow/projectPaths.js.map +1 -0
- package/dist/request/paths.d.ts +14 -0
- package/dist/request/paths.js +33 -0
- package/dist/request/paths.js.map +1 -0
- package/dist/request/request.d.ts +111 -0
- package/dist/request/request.js +464 -0
- package/dist/request/request.js.map +1 -0
- package/dist/safety/policy.d.ts +14 -0
- package/dist/safety/policy.js +81 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/viewer/assets/index-CN_yb9Uf.css +1 -0
- package/dist/viewer/assets/index-D98S1_2d.js +9 -0
- package/dist/viewer/icons/icon-192.png +0 -0
- package/dist/viewer/icons/icon-512.png +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.webmanifest +1 -0
- package/dist/viewer/registerSW.js +1 -0
- package/dist/viewer/sw.js +1 -0
- package/dist/viewer/workbox-9c191d2f.js +1 -0
- package/dist/viewerServer/context.d.ts +48 -0
- package/dist/viewerServer/context.js +60 -0
- package/dist/viewerServer/context.js.map +1 -0
- package/dist/viewerServer/evidence/classify.d.ts +59 -0
- package/dist/viewerServer/evidence/classify.js +124 -0
- package/dist/viewerServer/evidence/classify.js.map +1 -0
- package/dist/viewerServer/evidence/comparisonView.d.ts +28 -0
- package/dist/viewerServer/evidence/comparisonView.js +43 -0
- package/dist/viewerServer/evidence/comparisonView.js.map +1 -0
- package/dist/viewerServer/evidence/contextSourceView.d.ts +25 -0
- package/dist/viewerServer/evidence/contextSourceView.js +20 -0
- package/dist/viewerServer/evidence/contextSourceView.js.map +1 -0
- package/dist/viewerServer/evidence/discovery.d.ts +31 -0
- package/dist/viewerServer/evidence/discovery.js +78 -0
- package/dist/viewerServer/evidence/discovery.js.map +1 -0
- package/dist/viewerServer/evidence/evaluationView.d.ts +32 -0
- package/dist/viewerServer/evidence/evaluationView.js +50 -0
- package/dist/viewerServer/evidence/evaluationView.js.map +1 -0
- package/dist/viewerServer/evidence/handles.d.ts +21 -0
- package/dist/viewerServer/evidence/handles.js +43 -0
- package/dist/viewerServer/evidence/handles.js.map +1 -0
- package/dist/viewerServer/evidence/index.d.ts +41 -0
- package/dist/viewerServer/evidence/index.js +82 -0
- package/dist/viewerServer/evidence/index.js.map +1 -0
- package/dist/viewerServer/evidence/limits.d.ts +27 -0
- package/dist/viewerServer/evidence/limits.js +28 -0
- package/dist/viewerServer/evidence/limits.js.map +1 -0
- package/dist/viewerServer/evidence/linkedEvidence.d.ts +43 -0
- package/dist/viewerServer/evidence/linkedEvidence.js +151 -0
- package/dist/viewerServer/evidence/linkedEvidence.js.map +1 -0
- package/dist/viewerServer/evidence/mediaResolver.d.ts +16 -0
- package/dist/viewerServer/evidence/mediaResolver.js +85 -0
- package/dist/viewerServer/evidence/mediaResolver.js.map +1 -0
- package/dist/viewerServer/evidence/observationView.d.ts +29 -0
- package/dist/viewerServer/evidence/observationView.js +46 -0
- package/dist/viewerServer/evidence/observationView.js.map +1 -0
- package/dist/viewerServer/evidence/pathSafety.d.ts +11 -0
- package/dist/viewerServer/evidence/pathSafety.js +31 -0
- package/dist/viewerServer/evidence/pathSafety.js.map +1 -0
- package/dist/viewerServer/evidence/projection.d.ts +55 -0
- package/dist/viewerServer/evidence/projection.js +152 -0
- package/dist/viewerServer/evidence/projection.js.map +1 -0
- package/dist/viewerServer/evidence/referenceView.d.ts +133 -0
- package/dist/viewerServer/evidence/referenceView.js +169 -0
- package/dist/viewerServer/evidence/referenceView.js.map +1 -0
- package/dist/viewerServer/httpServer.d.ts +27 -0
- package/dist/viewerServer/httpServer.js +381 -0
- package/dist/viewerServer/httpServer.js.map +1 -0
- package/dist/viewerServer/openBrowser.d.ts +7 -0
- package/dist/viewerServer/openBrowser.js +32 -0
- package/dist/viewerServer/openBrowser.js.map +1 -0
- package/dist/viewerServer/port.d.ts +16 -0
- package/dist/viewerServer/port.js +19 -0
- package/dist/viewerServer/port.js.map +1 -0
- package/dist/viewerServer/viewerService.d.ts +62 -0
- package/dist/viewerServer/viewerService.js +88 -0
- package/dist/viewerServer/viewerService.js.map +1 -0
- package/docs/ARCHITECTURE.md +1286 -0
- package/docs/CI_CD.md +250 -0
- package/docs/COMMANDS.md +972 -0
- package/docs/CONTRACTS.md +1856 -0
- package/docs/CURRENT_STATE.md +1049 -0
- package/docs/DEVELOPMENT.md +202 -0
- package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -0
- package/docs/PROJECT_DESCRIPTION.md +2221 -0
- package/docs/PROJECT_MILESTONES.md +2526 -0
- package/docs/PROJECT_OVERVIEW.md +150 -0
- package/docs/QUICKSTART.md +83 -0
- package/docs/RELEASE.md +27 -0
- package/docs/ROADMAP.md +641 -0
- package/docs/SECURITY.md +218 -0
- package/docs/WORKFLOWS.md +642 -0
- package/docs/plans/v0.8-implementation-plan.md +655 -0
- package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -0
- package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -0
- package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -0
- package/docs/reports/v0.7-pre-release-readiness.md +337 -0
- package/docs/reports/v0.7-reference-binding-prompt5.md +223 -0
- package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -0
- package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -0
- package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -0
- package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -0
- package/docs/reports/v0.7-reference-regions-prompt2.md +195 -0
- package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -0
- package/docs/reports/v0.7-release-prep.md +423 -0
- package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -0
- package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -0
- package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -0
- package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -0
- package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -0
- package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -0
- package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -0
- package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -0
- package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -0
- package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -0
- package/docs/reports/v0.8.1-check-orchestration-prompt2.md +69 -0
- package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -0
- package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -0
- package/docs/reports/v0.8.1-project-workflow-foundation-prompt1.md +66 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectWorkflowService.js","sourceRoot":"","sources":["../../src/application/projectWorkflowService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EvaluateReferenceCandidateFidelityOptions, ReferenceCandidateFidelityEvaluation } from '../domain/externalReferenceFidelity.js';
|
|
2
|
+
import type { ReferenceRuntimeBindingDeclaration } from '../domain/externalReferenceRuntimeBinding.js';
|
|
3
|
+
import type { Diagnostic } from '../domain/diagnostics.js';
|
|
4
|
+
export type EvaluateReferenceFidelityOptions = EvaluateReferenceCandidateFidelityOptions;
|
|
5
|
+
export type ApplicationReferenceFidelityResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
evaluation: ReferenceCandidateFidelityEvaluation;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
diagnostics: Diagnostic[];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The canonical CLI-facing orchestration for Prompt 6, mirroring
|
|
14
|
+
* `comparisonService.ts#compareAndPersistFromArtifactRoots`'s exact shape:
|
|
15
|
+
* reads one already-persisted `ExternalReferenceArtifact` and one already-
|
|
16
|
+
* persisted `ObservationArtifact` by their root directories through the
|
|
17
|
+
* existing readers, then delegates to the pure
|
|
18
|
+
* `evaluateReferenceCandidateFidelity` exactly once. A thin wrapper only -
|
|
19
|
+
* artifact reading stays owned by `artifacts/`, evaluation semantics stay
|
|
20
|
+
* owned by `domain/externalReferenceFidelity.ts`. Kept in `application/`
|
|
21
|
+
* (not `artifacts/`) so `src/cli.ts` can depend on it without importing the
|
|
22
|
+
* artifacts layer directly, matching every other command's import-boundary
|
|
23
|
+
* convention. Never launches a browser, never re-resolves targets, and -
|
|
24
|
+
* deliberately, per this prompt's persistence decision - never persists
|
|
25
|
+
* anything: the caller receives the structured in-memory evaluation result
|
|
26
|
+
* directly.
|
|
27
|
+
*/
|
|
28
|
+
export declare function evaluateReferenceCandidateFidelityFromArtifactRoots(referenceRoot: string, candidateRoot: string, bindingDeclarations: readonly ReferenceRuntimeBindingDeclaration[], options?: EvaluateReferenceFidelityOptions): Promise<ApplicationReferenceFidelityResult>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readExternalReferenceArtifact } from '../artifacts/externalReferenceArtifactReader.js';
|
|
3
|
+
import { EXTERNAL_REFERENCE_MANIFEST_FILENAME } from '../artifacts/externalReferenceArtifactWriter.js';
|
|
4
|
+
import { readObservationArtifact } from '../artifacts/artifactReader.js';
|
|
5
|
+
import { MANIFEST_FILENAME as OBSERVATION_MANIFEST_FILENAME } from '../artifacts/artifactWriter.js';
|
|
6
|
+
import { evaluateReferenceCandidateFidelity } from '../domain/externalReferenceFidelity.js';
|
|
7
|
+
import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
|
|
8
|
+
/**
|
|
9
|
+
* The canonical CLI-facing orchestration for Prompt 6, mirroring
|
|
10
|
+
* `comparisonService.ts#compareAndPersistFromArtifactRoots`'s exact shape:
|
|
11
|
+
* reads one already-persisted `ExternalReferenceArtifact` and one already-
|
|
12
|
+
* persisted `ObservationArtifact` by their root directories through the
|
|
13
|
+
* existing readers, then delegates to the pure
|
|
14
|
+
* `evaluateReferenceCandidateFidelity` exactly once. A thin wrapper only -
|
|
15
|
+
* artifact reading stays owned by `artifacts/`, evaluation semantics stay
|
|
16
|
+
* owned by `domain/externalReferenceFidelity.ts`. Kept in `application/`
|
|
17
|
+
* (not `artifacts/`) so `src/cli.ts` can depend on it without importing the
|
|
18
|
+
* artifacts layer directly, matching every other command's import-boundary
|
|
19
|
+
* convention. Never launches a browser, never re-resolves targets, and -
|
|
20
|
+
* deliberately, per this prompt's persistence decision - never persists
|
|
21
|
+
* anything: the caller receives the structured in-memory evaluation result
|
|
22
|
+
* directly.
|
|
23
|
+
*/
|
|
24
|
+
export async function evaluateReferenceCandidateFidelityFromArtifactRoots(referenceRoot, candidateRoot, bindingDeclarations, options = {}) {
|
|
25
|
+
const referenceRead = await readExternalReferenceArtifact(path.join(referenceRoot, EXTERNAL_REFERENCE_MANIFEST_FILENAME));
|
|
26
|
+
if (!referenceRead.ok) {
|
|
27
|
+
return {
|
|
28
|
+
ok: false,
|
|
29
|
+
diagnostics: [{ code: 'invalid-request', severity: DIAGNOSTIC_SEVERITY['invalid-request'], message: `--reference external-reference artifact: ${referenceRead.reason}` }],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const candidateRead = await readObservationArtifact(path.join(candidateRoot, OBSERVATION_MANIFEST_FILENAME));
|
|
33
|
+
if (!candidateRead.ok) {
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
diagnostics: [{ code: 'invalid-request', severity: DIAGNOSTIC_SEVERITY['invalid-request'], message: `--candidate observation artifact: ${candidateRead.reason}` }],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const result = evaluateReferenceCandidateFidelity(referenceRead.artifact, candidateRead.artifact, bindingDeclarations, options);
|
|
40
|
+
if (!result.ok) {
|
|
41
|
+
return { ok: false, diagnostics: [{ code: 'invalid-request', severity: DIAGNOSTIC_SEVERITY['invalid-request'], message: result.reason }] };
|
|
42
|
+
}
|
|
43
|
+
return { ok: true, evaluation: result.evaluation };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=referenceFidelityEvaluationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenceFidelityEvaluationService.js","sourceRoot":"","sources":["../../src/application/referenceFidelityEvaluationService.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAChG,OAAO,EAAE,oCAAoC,EAAE,MAAM,iDAAiD,CAAC;AACvG,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,iBAAiB,IAAI,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,kCAAkC,EAAE,MAAM,wCAAwC,CAAC;AAI5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAM/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,mDAAmD,CACvE,aAAqB,EACrB,aAAqB,EACrB,mBAAkE,EAClE,UAA4C,EAAE;IAE9C,MAAM,aAAa,GAAG,MAAM,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,oCAAoC,CAAC,CAAC,CAAC;IAC1H,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,4CAA4C,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;SAC1K,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAC7G,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,qCAAqC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;SACnK,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,kCAAkC,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAChI,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7I,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ObservationArtifact } from '../domain/schema.js';
|
|
2
|
+
export type ReadObservationArtifactResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
artifact: ObservationArtifact;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Narrow canonical reader counterpart to `artifactWriter.ts#writeObservationArtifact`:
|
|
11
|
+
* reads one `manifest.json`, parses it, and validates it through the same
|
|
12
|
+
* `isValidObservationArtifact` structural gate the writer itself uses -
|
|
13
|
+
* never a second validator. Read-only: never mutates the file, never
|
|
14
|
+
* launches a browser, never resolves the sibling screenshot's bytes (the
|
|
15
|
+
* manifest's `screenshot.path` field is returned as-is for the caller to
|
|
16
|
+
* resolve if it needs to). Established here as the canonical reader ahead of
|
|
17
|
+
* the Batch 4 `compare` CLI's `--before`/`--after` path arguments.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readObservationArtifact(manifestPath: string): Promise<ReadObservationArtifactResult>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { isValidObservationArtifact } from '../domain/schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Narrow canonical reader counterpart to `artifactWriter.ts#writeObservationArtifact`:
|
|
5
|
+
* reads one `manifest.json`, parses it, and validates it through the same
|
|
6
|
+
* `isValidObservationArtifact` structural gate the writer itself uses -
|
|
7
|
+
* never a second validator. Read-only: never mutates the file, never
|
|
8
|
+
* launches a browser, never resolves the sibling screenshot's bytes (the
|
|
9
|
+
* manifest's `screenshot.path` field is returned as-is for the caller to
|
|
10
|
+
* resolve if it needs to). Established here as the canonical reader ahead of
|
|
11
|
+
* the Batch 4 `compare` CLI's `--before`/`--after` path arguments.
|
|
12
|
+
*/
|
|
13
|
+
export async function readObservationArtifact(manifestPath) {
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = await readFile(manifestPath, 'utf8');
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
20
|
+
return { ok: false, reason: `failed to read observation artifact manifest at "${manifestPath}": ${message}` };
|
|
21
|
+
}
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
28
|
+
return { ok: false, reason: `observation artifact manifest at "${manifestPath}" is not valid JSON: ${message}` };
|
|
29
|
+
}
|
|
30
|
+
const validation = isValidObservationArtifact(parsed);
|
|
31
|
+
if (!validation.valid) {
|
|
32
|
+
return { ok: false, reason: `observation artifact manifest at "${manifestPath}" failed structural validation: ${validation.reason}` };
|
|
33
|
+
}
|
|
34
|
+
return { ok: true, artifact: parsed };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=artifactReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifactReader.js","sourceRoot":"","sources":["../../src/artifacts/artifactReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAIjE;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,YAAoB;IAChE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oDAAoD,YAAY,MAAM,OAAO,EAAE,EAAE,CAAC;IAChH,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,YAAY,wBAAwB,OAAO,EAAE,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,UAAU,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,YAAY,mCAAmC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IACxI,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAA6B,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ObservationArtifact } from '../domain/schema.js';
|
|
2
|
+
import type { PersistedObservationResult } from './types.js';
|
|
3
|
+
export declare const MANIFEST_FILENAME = "manifest.json";
|
|
4
|
+
export declare const SCREENSHOT_FILENAME = "screenshot.png";
|
|
5
|
+
export interface WriteObservationArtifactOptions {
|
|
6
|
+
/** Base directory that `artifact.requestConfig.outputLocation` is resolved against. Defaults to `process.cwd()`. */
|
|
7
|
+
cwd?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Persists one already-assembled, already-validated ObservationArtifact plus
|
|
11
|
+
* its screenshot bytes as one portable artifact directory:
|
|
12
|
+
* `<outputLocation>/<observationId>/{manifest.json,screenshot.png}`.
|
|
13
|
+
*
|
|
14
|
+
* `observationId` is guaranteed fresh per capture (see
|
|
15
|
+
* domain/identity.ts#buildObservationIdentity's "never collides" contract),
|
|
16
|
+
* so each write targets its own unique subdirectory - no destructive
|
|
17
|
+
* overwrite decision is needed for the normal case; an existing directory at
|
|
18
|
+
* that path is treated as a genuine collision and rejected rather than
|
|
19
|
+
* overwritten. Writing happens in a sibling temporary directory first,
|
|
20
|
+
* `screenshot.png` before `manifest.json` (manifest-last), and the whole
|
|
21
|
+
* temporary directory is only exposed under its real name via one atomic
|
|
22
|
+
* rename - a consumer can never observe a partially-written artifact under
|
|
23
|
+
* its final name.
|
|
24
|
+
*/
|
|
25
|
+
export declare function writeObservationArtifact(artifact: ObservationArtifact, screenshotBytes: Uint8Array, options?: WriteObservationArtifactOptions): Promise<PersistedObservationResult>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { mkdir, writeFile, rename, rm, access } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isValidObservationArtifact } from '../domain/schema.js';
|
|
4
|
+
import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
|
|
5
|
+
export const MANIFEST_FILENAME = 'manifest.json';
|
|
6
|
+
export const SCREENSHOT_FILENAME = 'screenshot.png';
|
|
7
|
+
function writeFailure(message, details) {
|
|
8
|
+
const diagnostic = {
|
|
9
|
+
code: 'artifact-write-failure',
|
|
10
|
+
severity: DIAGNOSTIC_SEVERITY['artifact-write-failure'],
|
|
11
|
+
message,
|
|
12
|
+
...(details === undefined ? {} : { details }),
|
|
13
|
+
};
|
|
14
|
+
return { ok: false, diagnostics: [diagnostic] };
|
|
15
|
+
}
|
|
16
|
+
async function pathExists(candidate) {
|
|
17
|
+
return access(candidate).then(() => true, () => false);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Persists one already-assembled, already-validated ObservationArtifact plus
|
|
21
|
+
* its screenshot bytes as one portable artifact directory:
|
|
22
|
+
* `<outputLocation>/<observationId>/{manifest.json,screenshot.png}`.
|
|
23
|
+
*
|
|
24
|
+
* `observationId` is guaranteed fresh per capture (see
|
|
25
|
+
* domain/identity.ts#buildObservationIdentity's "never collides" contract),
|
|
26
|
+
* so each write targets its own unique subdirectory - no destructive
|
|
27
|
+
* overwrite decision is needed for the normal case; an existing directory at
|
|
28
|
+
* that path is treated as a genuine collision and rejected rather than
|
|
29
|
+
* overwritten. Writing happens in a sibling temporary directory first,
|
|
30
|
+
* `screenshot.png` before `manifest.json` (manifest-last), and the whole
|
|
31
|
+
* temporary directory is only exposed under its real name via one atomic
|
|
32
|
+
* rename - a consumer can never observe a partially-written artifact under
|
|
33
|
+
* its final name.
|
|
34
|
+
*/
|
|
35
|
+
export async function writeObservationArtifact(artifact, screenshotBytes, options = {}) {
|
|
36
|
+
const validation = isValidObservationArtifact(artifact);
|
|
37
|
+
if (!validation.valid) {
|
|
38
|
+
return writeFailure(`refusing to persist an invalid ObservationArtifact: ${validation.reason}`);
|
|
39
|
+
}
|
|
40
|
+
const cwd = options.cwd ?? process.cwd();
|
|
41
|
+
const outputRoot = path.resolve(cwd, artifact.requestConfig.outputLocation);
|
|
42
|
+
const finalRoot = path.join(outputRoot, artifact.observationId);
|
|
43
|
+
const tempRoot = path.join(outputRoot, `.tmp-${artifact.observationId}`);
|
|
44
|
+
if (await pathExists(finalRoot)) {
|
|
45
|
+
return writeFailure(`an observation artifact already exists at "${artifact.observationId}"; refusing to overwrite it`, {
|
|
46
|
+
artifactRoot: finalRoot,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
await rm(tempRoot, { recursive: true, force: true });
|
|
51
|
+
await mkdir(tempRoot, { recursive: true });
|
|
52
|
+
await writeFile(path.join(tempRoot, SCREENSHOT_FILENAME), screenshotBytes);
|
|
53
|
+
await writeFile(path.join(tempRoot, MANIFEST_FILENAME), JSON.stringify(artifact, null, 2), 'utf8');
|
|
54
|
+
await rename(tempRoot, finalRoot);
|
|
55
|
+
return {
|
|
56
|
+
ok: true,
|
|
57
|
+
artifactRoot: finalRoot,
|
|
58
|
+
manifestPath: path.join(finalRoot, MANIFEST_FILENAME),
|
|
59
|
+
screenshotPath: path.join(finalRoot, SCREENSHOT_FILENAME),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
await rm(tempRoot, { recursive: true, force: true }).catch(() => undefined);
|
|
64
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
65
|
+
return writeFailure(`failed to persist observation artifact: ${message}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=artifactWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifactWriter.js","sourceRoot":"","sources":["../../src/artifacts/artifactWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ComparisonArtifact } from '../domain/comparison.js';
|
|
2
|
+
export type ReadComparisonArtifactResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
artifact: ComparisonArtifact;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* v0.5 Batch 3 addition: no canonical comparison-artifact reader existed
|
|
11
|
+
* before this batch (only `readObservationArtifact` did). Narrow counterpart
|
|
12
|
+
* to `artifacts/comparisonArtifactWriter.ts#writeComparisonArtifact`: reads
|
|
13
|
+
* one `manifest.json`, parses it, and validates it through the same
|
|
14
|
+
* `isValidComparisonArtifact` structural gate the writer uses - never a
|
|
15
|
+
* second validator, never a schema upgrade. Comparison schema remains
|
|
16
|
+
* `1.0.0`; this reader changes no comparison semantics.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readComparisonArtifact(manifestPath: string): Promise<ReadComparisonArtifactResult>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { isValidComparisonArtifact } from '../domain/comparison.js';
|
|
3
|
+
/**
|
|
4
|
+
* v0.5 Batch 3 addition: no canonical comparison-artifact reader existed
|
|
5
|
+
* before this batch (only `readObservationArtifact` did). Narrow counterpart
|
|
6
|
+
* to `artifacts/comparisonArtifactWriter.ts#writeComparisonArtifact`: reads
|
|
7
|
+
* one `manifest.json`, parses it, and validates it through the same
|
|
8
|
+
* `isValidComparisonArtifact` structural gate the writer uses - never a
|
|
9
|
+
* second validator, never a schema upgrade. Comparison schema remains
|
|
10
|
+
* `1.0.0`; this reader changes no comparison semantics.
|
|
11
|
+
*/
|
|
12
|
+
export async function readComparisonArtifact(manifestPath) {
|
|
13
|
+
let raw;
|
|
14
|
+
try {
|
|
15
|
+
raw = await readFile(manifestPath, 'utf8');
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
19
|
+
return { ok: false, reason: `failed to read comparison artifact manifest at "${manifestPath}": ${message}` };
|
|
20
|
+
}
|
|
21
|
+
let parsed;
|
|
22
|
+
try {
|
|
23
|
+
parsed = JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
27
|
+
return { ok: false, reason: `comparison artifact manifest at "${manifestPath}" is not valid JSON: ${message}` };
|
|
28
|
+
}
|
|
29
|
+
const validation = isValidComparisonArtifact(parsed);
|
|
30
|
+
if (!validation.valid) {
|
|
31
|
+
return { ok: false, reason: `comparison artifact manifest at "${manifestPath}" failed structural validation: ${validation.reason}` };
|
|
32
|
+
}
|
|
33
|
+
return { ok: true, artifact: parsed };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=comparisonArtifactReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparisonArtifactReader.js","sourceRoot":"","sources":["../../src/artifacts/comparisonArtifactReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAIpE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,YAAoB;IAC/D,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mDAAmD,YAAY,MAAM,OAAO,EAAE,EAAE,CAAC;IAC/G,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,YAAY,wBAAwB,OAAO,EAAE,EAAE,CAAC;IAClH,CAAC;IAED,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,YAAY,mCAAmC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IACvI,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAA4B,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ComparisonArtifact } from '../domain/comparison.js';
|
|
2
|
+
import type { Diagnostic } from '../domain/diagnostics.js';
|
|
3
|
+
export declare const COMPARISON_MANIFEST_FILENAME = "manifest.json";
|
|
4
|
+
/**
|
|
5
|
+
* Observer-owned result of persisting one ComparisonArtifact. Mirrors
|
|
6
|
+
* `PersistedObservationResult`'s shape/semantics but is its own type: a
|
|
7
|
+
* comparison directory has no screenshot file, and this writer never touches
|
|
8
|
+
* `src/artifacts/artifactWriter.ts` or its observation-persistence
|
|
9
|
+
* guarantees.
|
|
10
|
+
*/
|
|
11
|
+
export type PersistedComparisonResult = {
|
|
12
|
+
ok: true;
|
|
13
|
+
artifactRoot: string;
|
|
14
|
+
manifestPath: string;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
diagnostics: Diagnostic[];
|
|
18
|
+
};
|
|
19
|
+
export interface WriteComparisonArtifactOptions {
|
|
20
|
+
/** Base directory that `outputLocation` is resolved against. Defaults to `process.cwd()`. */
|
|
21
|
+
cwd?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Persists one already-assembled, already-validated `ComparisonArtifact` as
|
|
25
|
+
* one portable artifact directory: `<outputLocation>/<comparisonId>/manifest.json`
|
|
26
|
+
* only - no screenshot is copied (the manifest's `before`/`after.screenshot`
|
|
27
|
+
* fields already point back to the source observations; see
|
|
28
|
+
* `domain/comparisonEngine.ts#sourceReference`), and no `relationships.json`/
|
|
29
|
+
* `differences.json`/`diff.png` side files are produced.
|
|
30
|
+
*
|
|
31
|
+
* Follows the same atomic-write discipline as
|
|
32
|
+
* `artifacts/artifactWriter.ts#writeObservationArtifact` (sibling temporary
|
|
33
|
+
* directory, then one atomic rename onto the final name) without sharing its
|
|
34
|
+
* implementation - a comparison directory has a different, smaller content
|
|
35
|
+
* shape, and this function never touches observation persistence. A fresh
|
|
36
|
+
* `comparisonId` per execution normally prevents collisions; an existing
|
|
37
|
+
* directory at the final path is treated as a genuine collision and
|
|
38
|
+
* rejected rather than overwritten, so prior comparison evidence is never
|
|
39
|
+
* destructively replaced.
|
|
40
|
+
*/
|
|
41
|
+
export declare function writeComparisonArtifact(artifact: ComparisonArtifact, outputLocation: string, options?: WriteComparisonArtifactOptions): Promise<PersistedComparisonResult>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { mkdir, writeFile, rename, rm, access } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isValidComparisonArtifact } from '../domain/comparison.js';
|
|
4
|
+
import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
|
|
5
|
+
export const COMPARISON_MANIFEST_FILENAME = 'manifest.json';
|
|
6
|
+
function writeFailure(message, details) {
|
|
7
|
+
const diagnostic = {
|
|
8
|
+
code: 'artifact-write-failure',
|
|
9
|
+
severity: DIAGNOSTIC_SEVERITY['artifact-write-failure'],
|
|
10
|
+
message,
|
|
11
|
+
...(details === undefined ? {} : { details }),
|
|
12
|
+
};
|
|
13
|
+
return { ok: false, diagnostics: [diagnostic] };
|
|
14
|
+
}
|
|
15
|
+
async function pathExists(candidate) {
|
|
16
|
+
return access(candidate).then(() => true, () => false);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Persists one already-assembled, already-validated `ComparisonArtifact` as
|
|
20
|
+
* one portable artifact directory: `<outputLocation>/<comparisonId>/manifest.json`
|
|
21
|
+
* only - no screenshot is copied (the manifest's `before`/`after.screenshot`
|
|
22
|
+
* fields already point back to the source observations; see
|
|
23
|
+
* `domain/comparisonEngine.ts#sourceReference`), and no `relationships.json`/
|
|
24
|
+
* `differences.json`/`diff.png` side files are produced.
|
|
25
|
+
*
|
|
26
|
+
* Follows the same atomic-write discipline as
|
|
27
|
+
* `artifacts/artifactWriter.ts#writeObservationArtifact` (sibling temporary
|
|
28
|
+
* directory, then one atomic rename onto the final name) without sharing its
|
|
29
|
+
* implementation - a comparison directory has a different, smaller content
|
|
30
|
+
* shape, and this function never touches observation persistence. A fresh
|
|
31
|
+
* `comparisonId` per execution normally prevents collisions; an existing
|
|
32
|
+
* directory at the final path is treated as a genuine collision and
|
|
33
|
+
* rejected rather than overwritten, so prior comparison evidence is never
|
|
34
|
+
* destructively replaced.
|
|
35
|
+
*/
|
|
36
|
+
export async function writeComparisonArtifact(artifact, outputLocation, options = {}) {
|
|
37
|
+
const validation = isValidComparisonArtifact(artifact);
|
|
38
|
+
if (!validation.valid) {
|
|
39
|
+
return writeFailure(`refusing to persist an invalid ComparisonArtifact: ${validation.reason}`);
|
|
40
|
+
}
|
|
41
|
+
const cwd = options.cwd ?? process.cwd();
|
|
42
|
+
const outputRoot = path.resolve(cwd, outputLocation);
|
|
43
|
+
const finalRoot = path.join(outputRoot, artifact.comparisonId);
|
|
44
|
+
const tempRoot = path.join(outputRoot, `.tmp-${artifact.comparisonId}`);
|
|
45
|
+
if (await pathExists(finalRoot)) {
|
|
46
|
+
return writeFailure(`a comparison artifact already exists at "${artifact.comparisonId}"; refusing to overwrite it`, {
|
|
47
|
+
artifactRoot: finalRoot,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
await rm(tempRoot, { recursive: true, force: true });
|
|
52
|
+
await mkdir(tempRoot, { recursive: true });
|
|
53
|
+
await writeFile(path.join(tempRoot, COMPARISON_MANIFEST_FILENAME), JSON.stringify(artifact, null, 2), 'utf8');
|
|
54
|
+
await rename(tempRoot, finalRoot);
|
|
55
|
+
return {
|
|
56
|
+
ok: true,
|
|
57
|
+
artifactRoot: finalRoot,
|
|
58
|
+
manifestPath: path.join(finalRoot, COMPARISON_MANIFEST_FILENAME),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
await rm(tempRoot, { recursive: true, force: true }).catch(() => undefined);
|
|
63
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
+
return writeFailure(`failed to persist comparison artifact: ${message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=comparisonArtifactWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparisonArtifactWriter.js","sourceRoot":"","sources":["../../src/artifacts/comparisonArtifactWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ExternalReferenceArtifact } from '../domain/externalReference.js';
|
|
2
|
+
export type ReadExternalReferenceArtifactResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
artifact: ExternalReferenceArtifact;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Narrow canonical reader counterpart to
|
|
11
|
+
* `externalReferenceArtifactWriter.ts#writeExternalReferenceArtifact`: reads
|
|
12
|
+
* one `manifest.json`, parses it, and validates it through the same
|
|
13
|
+
* `isValidExternalReferenceArtifact` structural gate the writer itself uses -
|
|
14
|
+
* never a second validator. Read-only: never mutates the file, never resolves
|
|
15
|
+
* the sibling image file's bytes (an 'imported' manifest's `image.path` field
|
|
16
|
+
* is returned as-is for the caller to resolve if it needs the bytes).
|
|
17
|
+
*/
|
|
18
|
+
export declare function readExternalReferenceArtifact(manifestPath: string): Promise<ReadExternalReferenceArtifactResult>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { isValidExternalReferenceArtifact } from '../domain/externalReference.js';
|
|
3
|
+
/**
|
|
4
|
+
* Narrow canonical reader counterpart to
|
|
5
|
+
* `externalReferenceArtifactWriter.ts#writeExternalReferenceArtifact`: reads
|
|
6
|
+
* one `manifest.json`, parses it, and validates it through the same
|
|
7
|
+
* `isValidExternalReferenceArtifact` structural gate the writer itself uses -
|
|
8
|
+
* never a second validator. Read-only: never mutates the file, never resolves
|
|
9
|
+
* the sibling image file's bytes (an 'imported' manifest's `image.path` field
|
|
10
|
+
* is returned as-is for the caller to resolve if it needs the bytes).
|
|
11
|
+
*/
|
|
12
|
+
export async function readExternalReferenceArtifact(manifestPath) {
|
|
13
|
+
let raw;
|
|
14
|
+
try {
|
|
15
|
+
raw = await readFile(manifestPath, 'utf8');
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
19
|
+
return { ok: false, reason: `failed to read external-reference artifact manifest at "${manifestPath}": ${message}` };
|
|
20
|
+
}
|
|
21
|
+
let parsed;
|
|
22
|
+
try {
|
|
23
|
+
parsed = JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
27
|
+
return { ok: false, reason: `external-reference artifact manifest at "${manifestPath}" is not valid JSON: ${message}` };
|
|
28
|
+
}
|
|
29
|
+
const validation = isValidExternalReferenceArtifact(parsed);
|
|
30
|
+
if (!validation.valid) {
|
|
31
|
+
return { ok: false, reason: `external-reference artifact manifest at "${manifestPath}" failed structural validation: ${validation.reason}` };
|
|
32
|
+
}
|
|
33
|
+
return { ok: true, artifact: parsed };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=externalReferenceArtifactReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalReferenceArtifactReader.js","sourceRoot":"","sources":["../../src/artifacts/externalReferenceArtifactReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAIlF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,YAAoB;IACtE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2DAA2D,YAAY,MAAM,OAAO,EAAE,EAAE,CAAC;IACvH,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4CAA4C,YAAY,wBAAwB,OAAO,EAAE,EAAE,CAAC;IAC1H,CAAC;IAED,MAAM,UAAU,GAAG,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4CAA4C,YAAY,mCAAmC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IAC/I,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAmC,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ExternalReferenceArtifact } from '../domain/externalReference.js';
|
|
2
|
+
import type { Diagnostic } from '../domain/diagnostics.js';
|
|
3
|
+
export declare const EXTERNAL_REFERENCE_MANIFEST_FILENAME = "manifest.json";
|
|
4
|
+
/**
|
|
5
|
+
* Observer-owned result of persisting one ExternalReferenceArtifact. Mirrors
|
|
6
|
+
* PersistedObservationResult/PersistedComparisonResult's shape but is its own
|
|
7
|
+
* type: an 'imported' artifact's directory has one owned image file; an
|
|
8
|
+
* 'approved' artifact's directory has only manifest.json.
|
|
9
|
+
*/
|
|
10
|
+
export type PersistedExternalReferenceResult = {
|
|
11
|
+
ok: true;
|
|
12
|
+
artifactRoot: string;
|
|
13
|
+
manifestPath: string;
|
|
14
|
+
imagePath?: string;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
diagnostics: Diagnostic[];
|
|
18
|
+
};
|
|
19
|
+
export interface WriteExternalReferenceArtifactOptions {
|
|
20
|
+
/** Base directory that `outputLocation` is resolved against. Defaults to `process.cwd()`. */
|
|
21
|
+
cwd?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Persists one already-assembled, already-validated ExternalReferenceArtifact
|
|
25
|
+
* as one portable artifact directory: `<outputLocation>/<referenceId>/`.
|
|
26
|
+
* For an 'imported' artifact (which owns its reference image), `imageBytes`
|
|
27
|
+
* is required and is written before manifest.json, mirroring
|
|
28
|
+
* `artifacts/artifactWriter.ts#writeObservationArtifact`'s media-before-manifest
|
|
29
|
+
* discipline. For an 'approved' artifact (which only ever carries a
|
|
30
|
+
* `sourceReference` back to the imported artifact that owns the image - see
|
|
31
|
+
* `domain/externalReference.ts`), no image bytes are written at all, mirroring
|
|
32
|
+
* `artifacts/comparisonArtifactWriter.ts#writeComparisonArtifact`'s
|
|
33
|
+
* manifest-only, no-media-copy persistence.
|
|
34
|
+
*
|
|
35
|
+
* `referenceId` is guaranteed fresh per persisted instance (see
|
|
36
|
+
* `domain/externalReferenceIdentity.ts#buildExternalReferenceInstanceIdentity`'s
|
|
37
|
+
* "never collides" contract), so each write targets its own unique
|
|
38
|
+
* subdirectory; an existing directory at that path is treated as a genuine
|
|
39
|
+
* collision and rejected rather than overwritten - no persisted evidence,
|
|
40
|
+
* imported or approved, is ever destructively replaced. Writing happens in a
|
|
41
|
+
* sibling temporary directory first, and the whole temporary directory is
|
|
42
|
+
* only exposed under its real name via one atomic rename.
|
|
43
|
+
*/
|
|
44
|
+
export declare function writeExternalReferenceArtifact(artifact: ExternalReferenceArtifact, imageBytes: Uint8Array | undefined, outputLocation: string, options?: WriteExternalReferenceArtifactOptions): Promise<PersistedExternalReferenceResult>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdir, writeFile, rename, rm, access } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isValidExternalReferenceArtifact, isImportedExternalReferenceArtifact } from '../domain/externalReference.js';
|
|
4
|
+
import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
|
|
5
|
+
export const EXTERNAL_REFERENCE_MANIFEST_FILENAME = 'manifest.json';
|
|
6
|
+
function writeFailure(message, details) {
|
|
7
|
+
const diagnostic = {
|
|
8
|
+
code: 'artifact-write-failure',
|
|
9
|
+
severity: DIAGNOSTIC_SEVERITY['artifact-write-failure'],
|
|
10
|
+
message,
|
|
11
|
+
...(details === undefined ? {} : { details }),
|
|
12
|
+
};
|
|
13
|
+
return { ok: false, diagnostics: [diagnostic] };
|
|
14
|
+
}
|
|
15
|
+
async function pathExists(candidate) {
|
|
16
|
+
return access(candidate).then(() => true, () => false);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Persists one already-assembled, already-validated ExternalReferenceArtifact
|
|
20
|
+
* as one portable artifact directory: `<outputLocation>/<referenceId>/`.
|
|
21
|
+
* For an 'imported' artifact (which owns its reference image), `imageBytes`
|
|
22
|
+
* is required and is written before manifest.json, mirroring
|
|
23
|
+
* `artifacts/artifactWriter.ts#writeObservationArtifact`'s media-before-manifest
|
|
24
|
+
* discipline. For an 'approved' artifact (which only ever carries a
|
|
25
|
+
* `sourceReference` back to the imported artifact that owns the image - see
|
|
26
|
+
* `domain/externalReference.ts`), no image bytes are written at all, mirroring
|
|
27
|
+
* `artifacts/comparisonArtifactWriter.ts#writeComparisonArtifact`'s
|
|
28
|
+
* manifest-only, no-media-copy persistence.
|
|
29
|
+
*
|
|
30
|
+
* `referenceId` is guaranteed fresh per persisted instance (see
|
|
31
|
+
* `domain/externalReferenceIdentity.ts#buildExternalReferenceInstanceIdentity`'s
|
|
32
|
+
* "never collides" contract), so each write targets its own unique
|
|
33
|
+
* subdirectory; an existing directory at that path is treated as a genuine
|
|
34
|
+
* collision and rejected rather than overwritten - no persisted evidence,
|
|
35
|
+
* imported or approved, is ever destructively replaced. Writing happens in a
|
|
36
|
+
* sibling temporary directory first, and the whole temporary directory is
|
|
37
|
+
* only exposed under its real name via one atomic rename.
|
|
38
|
+
*/
|
|
39
|
+
export async function writeExternalReferenceArtifact(artifact, imageBytes, outputLocation, options = {}) {
|
|
40
|
+
const validation = isValidExternalReferenceArtifact(artifact);
|
|
41
|
+
if (!validation.valid) {
|
|
42
|
+
return writeFailure(`refusing to persist an invalid ExternalReferenceArtifact: ${validation.reason}`);
|
|
43
|
+
}
|
|
44
|
+
if (artifact.lifecycle.state === 'imported' && imageBytes === undefined) {
|
|
45
|
+
return writeFailure('refusing to persist an "imported" ExternalReferenceArtifact without its image bytes');
|
|
46
|
+
}
|
|
47
|
+
const cwd = options.cwd ?? process.cwd();
|
|
48
|
+
const outputRoot = path.resolve(cwd, outputLocation);
|
|
49
|
+
const finalRoot = path.join(outputRoot, artifact.referenceId);
|
|
50
|
+
const tempRoot = path.join(outputRoot, `.tmp-${artifact.referenceId}`);
|
|
51
|
+
if (await pathExists(finalRoot)) {
|
|
52
|
+
return writeFailure(`an external-reference artifact already exists at "${artifact.referenceId}"; refusing to overwrite it`, {
|
|
53
|
+
artifactRoot: finalRoot,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await rm(tempRoot, { recursive: true, force: true });
|
|
58
|
+
await mkdir(tempRoot, { recursive: true });
|
|
59
|
+
if (isImportedExternalReferenceArtifact(artifact)) {
|
|
60
|
+
await writeFile(path.join(tempRoot, artifact.image.path), imageBytes);
|
|
61
|
+
}
|
|
62
|
+
await writeFile(path.join(tempRoot, EXTERNAL_REFERENCE_MANIFEST_FILENAME), JSON.stringify(artifact, null, 2), 'utf8');
|
|
63
|
+
await rename(tempRoot, finalRoot);
|
|
64
|
+
return {
|
|
65
|
+
ok: true,
|
|
66
|
+
artifactRoot: finalRoot,
|
|
67
|
+
manifestPath: path.join(finalRoot, EXTERNAL_REFERENCE_MANIFEST_FILENAME),
|
|
68
|
+
...(isImportedExternalReferenceArtifact(artifact) ? { imagePath: path.join(finalRoot, artifact.image.path) } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
await rm(tempRoot, { recursive: true, force: true }).catch(() => undefined);
|
|
73
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
74
|
+
return writeFailure(`failed to persist external-reference artifact: ${message}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=externalReferenceArtifactWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalReferenceArtifactWriter.js","sourceRoot":"","sources":["../../src/artifacts/externalReferenceArtifactWriter.ts"],"names":[],"mappings":"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"}
|