@shapeshift-labs/frontier-lang-compiler 0.2.163 → 0.2.164

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.
@@ -1,5 +1,7 @@
1
1
  import { HtmlCssProjectMergeMissingSignals, htmlCssProjectMergeAdmissionMatrixRows, htmlCssProjectMergeMatrixProofStatus, htmlCssProjectMergeMissingEvidenceItems, htmlCssProjectMergeMissingEvidenceRoutes } from './js-ts-safe-project-merge-html-css-matrix.js';
2
+ import { sourceTextMergeMatrixProofStatus, sourceTextMergeMissingEvidenceItem } from './js-ts-safe-project-merge-source-text-candidate.js';
2
3
  const ProjectMergeMissingSignals = Object.freeze({
4
+ sourceTextMergeCandidate: 'source-text-merge-candidate-not-produced',
3
5
  outputDiagnosticsGate: 'output-diagnostics-gate-not-run',
4
6
  declarationGate: 'declaration-gate-not-run',
5
7
  qualityGates: 'quality-gates-not-run',
@@ -17,6 +19,7 @@ const ProjectMergeMissingSignals = Object.freeze({
17
19
  });
18
20
 
19
21
  const ProjectMergeMissingEvidenceRoutes = Object.freeze({
22
+ [ProjectMergeMissingSignals.sourceTextMergeCandidate]: route('produce-source-text-merge-candidate', 'source-files', 'run-conservative-three-way-source-merge'),
20
23
  [ProjectMergeMissingSignals.outputDiagnosticsGate]: route('run-output-diagnostics', 'project-output', 'supply-output-diagnostics'),
21
24
  [ProjectMergeMissingSignals.declarationGate]: route('emit-output-declarations', 'project-output', 'supply-declaration-output'),
22
25
  [ProjectMergeMissingSignals.qualityGates]: route('attach-quality-gates', 'quality-gates', 'attach-passing-quality-gates'),
@@ -34,6 +37,7 @@ const ProjectMergeMissingEvidenceRoutes = Object.freeze({
34
37
  });
35
38
 
36
39
  const ProjectMergeAdmissionMatrixRows = Object.freeze([
40
+ matrixRow('source-text-merge-candidate', 'baseline', ['source-text-merge-candidate'], [ProjectMergeMissingSignals.sourceTextMergeCandidate]),
37
41
  matrixRow('parser-source-span-trivia', 'partial', ['source-span-roundtrip'], [ProjectMergeMissingSignals.sourceSpanRoundtrip, ProjectMergeMissingSignals.semanticArtifacts]),
38
42
  matrixRow('scope-use-def-graph', 'partial', ['project-graph-delta'], [ProjectMergeMissingSignals.projectGraphEvidence, ProjectMergeMissingSignals.projectGraphDeltaEvidence]),
39
43
  matrixRow('module-export-import-graph', 'partial', ['project-graph-delta'], [ProjectMergeMissingSignals.projectGraphEvidence, ProjectMergeMissingSignals.projectGraphDeltaEvidence]),
@@ -54,6 +58,8 @@ const ProjectMergeAdmissionMatrixRows = Object.freeze([
54
58
 
55
59
  function missingEvidenceItems(summary, context = {}) {
56
60
  const items = [];
61
+ const sourceTextMissing = sourceTextMergeMissingEvidenceItem(summary, ProjectMergeMissingSignals.sourceTextMergeCandidate, missingEvidenceItem);
62
+ if (sourceTextMissing) items.push(sourceTextMissing);
57
63
  if (!context.hasProjectGraphEvidence) items.push(missingEvidenceItem({
58
64
  code: ProjectMergeMissingSignals.projectGraphEvidence,
59
65
  scope: 'project-graph',
@@ -254,6 +260,8 @@ function matrixProofStatus(level, summary, proofEvidence) {
254
260
  if (levelStatuses[level]) return levelStatuses[level];
255
261
  const htmlCssStatus = htmlCssProjectMergeMatrixProofStatus(level, summary);
256
262
  if (htmlCssStatus) return htmlCssStatus;
263
+ const sourceTextStatus = sourceTextMergeMatrixProofStatus(level, summary);
264
+ if (sourceTextStatus) return sourceTextStatus;
257
265
  if (level === 'project-graph-delta') return summary.projectGraphDeltaEvidenceIncluded ? (summary.projectGraphDeltaConflicts ? 'failed' : 'passed') : 'missing';
258
266
  if (level === 'project-graph-evidence') return summary.projectGraphConflicts ? 'failed' : summary.projectGraphEvidenceIncluded || summary.projectGraphDeltaEvidenceIncluded ? 'passed' : 'missing';
259
267
  if (level === 'css-module-use-site-graph') return summary.projectGraphCssModuleUseSiteConflicts ? 'failed' : summary.projectGraphCssModuleUseSiteGraphs ? 'passed' : summary.projectGraphEvidenceIncluded ? 'absent' : 'missing';
@@ -292,12 +300,10 @@ function countField(items, field) {
292
300
 
293
301
  function countRoute(items, field = 'id') {
294
302
  const counts = {};
295
- for (const item of items) {
296
- const key = field === 'lane' ? item?.routeLane ?? item?.route?.lane : item?.routeId ?? item?.route?.id;
297
- if (key) counts[key] = (counts[key] ?? 0) + 1;
298
- }
303
+ for (const item of items) countRouteItem(counts, item, field);
299
304
  return counts;
300
305
  }
306
+ function countRouteItem(counts, item, field) { const key = field === 'lane' ? item?.routeLane ?? item?.route?.lane : item?.routeId ?? item?.route?.id; if (key) counts[key] = (counts[key] ?? 0) + 1; }
301
307
 
302
308
  function route(id, lane, next) { return Object.freeze({ id, lane, next }); }
303
309
  function shouldRecommendRerun(missingEvidence = [], options = {}) {
@@ -307,13 +313,7 @@ function shouldRecommendRerun(missingEvidence = [], options = {}) {
307
313
  if (reasonCodes.length) return reasonCodes.every((code) => rerunReasonCodes.has(code));
308
314
  return missingEvidence[0]?.action === 'rerun-gate' && missingEvidence[0]?.kind === 'quality-gate';
309
315
  }
310
- function isSemanticEquivalenceMissing(item) {
311
- return item?.proofLevel === 'semantic-equivalence-unknown'
312
- || item?.code === ProjectMergeMissingSignals.semanticEquivalenceProof;
313
- }
314
-
315
- function compactRecord(record) {
316
- return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
317
- }
316
+ function isSemanticEquivalenceMissing(item) { return item?.proofLevel === 'semantic-equivalence-unknown' || item?.code === ProjectMergeMissingSignals.semanticEquivalenceProof; }
317
+ function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
318
318
 
319
319
  export { compactMissingEvidenceTelemetry, confidenceRecommendedAction, createProjectMergeAdmissionMatrixAudit, missingEvidenceItems, missingEvidenceRouteForSignal, missingEvidenceSignals, prioritizedMissingEvidence };
@@ -0,0 +1,68 @@
1
+ function sourceTextMergeSummary(files = []) {
2
+ const mergedFiles = files.filter((file) => file.status === 'merged');
3
+ const blockedFiles = files.filter((file) => file.status === 'blocked');
4
+ const outputFiles = files.filter((file) => typeof file.outputSourceText === 'string');
5
+ return {
6
+ mergedFiles: mergedFiles.length,
7
+ blockedFiles: blockedFiles.length,
8
+ outputFiles: outputFiles.length,
9
+ sourceTextMergeCandidateFiles: mergedFiles.length,
10
+ sourceTextMergeBlockedFiles: blockedFiles.length,
11
+ sourceTextMergeOutputFiles: outputFiles.length,
12
+ sourceTextMergeCandidateStatus: files.length ? (blockedFiles.length ? 'failed' : 'passed') : 'absent'
13
+ };
14
+ }
15
+
16
+ function sourceTextMergeCandidateEvidenceRecord(id, summary) {
17
+ const passed = summary.sourceTextMergeCandidateStatus === 'passed';
18
+ const failed = summary.sourceTextMergeCandidateStatus === 'failed';
19
+ return {
20
+ id: `${id}_source_text_merge_candidate`,
21
+ kind: 'js-ts-source-text-merge-candidate',
22
+ level: 'source-text-merge-candidate',
23
+ status: passed ? 'passed' : failed ? 'failed' : 'skipped',
24
+ scope: 'source-files',
25
+ summary: sourceTextMergeCandidateEvidenceSummary(summary, passed, failed),
26
+ metadata: compactRecord({
27
+ files: summary.files,
28
+ sourceTextMergeCandidateFiles: summary.sourceTextMergeCandidateFiles,
29
+ sourceTextMergeBlockedFiles: summary.sourceTextMergeBlockedFiles,
30
+ sourceTextMergeOutputFiles: summary.sourceTextMergeOutputFiles,
31
+ outputFiles: summary.outputFiles,
32
+ autoMergeClaim: false,
33
+ semanticEquivalenceClaim: false
34
+ })
35
+ };
36
+ }
37
+
38
+ function sourceTextMergeMissingEvidenceItem(summary, signal, missingEvidenceItem) {
39
+ if (!summary.files || summary.sourceTextMergeCandidateFiles || summary.sourceTextMergeBlockedFiles) return undefined;
40
+ return missingEvidenceItem({
41
+ code: signal,
42
+ scope: 'source-files',
43
+ kind: 'source-text-merge-candidate',
44
+ proofLevel: 'source-text-merge-candidate',
45
+ action: 'review',
46
+ summary: 'No concrete source text merge candidate was produced; run the conservative source merge substrate before semantic graph admission.',
47
+ suggestedInput: { baseFiles: {}, workerFiles: {}, headFiles: {} }
48
+ });
49
+ }
50
+
51
+ function sourceTextMergeMatrixProofStatus(level, summary) {
52
+ if (level !== 'source-text-merge-candidate') return undefined;
53
+ if (!summary.files) return 'absent';
54
+ if (summary.sourceTextMergeBlockedFiles) return 'failed';
55
+ return summary.sourceTextMergeCandidateFiles === summary.files ? 'passed' : 'missing';
56
+ }
57
+
58
+ function sourceTextMergeCandidateEvidenceSummary(summary, passed, failed) {
59
+ if (passed) return `Produced concrete source merge candidates for ${summary.sourceTextMergeCandidateFiles} file(s).`;
60
+ if (failed) return `Source merge candidate blocked for ${summary.sourceTextMergeBlockedFiles} file(s) before semantic admission.`;
61
+ return 'No source files were available for source text merge candidate production.';
62
+ }
63
+
64
+ function compactRecord(record) {
65
+ return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
66
+ }
67
+
68
+ export { sourceTextMergeCandidateEvidenceRecord, sourceTextMergeMatrixProofStatus, sourceTextMergeMissingEvidenceItem, sourceTextMergeSummary };
@@ -1,6 +1,7 @@
1
1
  import { compactMissingEvidenceTelemetry, confidenceRecommendedAction, createProjectMergeAdmissionMatrixAudit, missingEvidenceItems, missingEvidenceSignals, prioritizedMissingEvidence } from './js-ts-safe-project-merge-missing-evidence.js';
2
2
  import { failedEvidenceMissingItems, fileAdmissionEvidenceRecords } from './js-ts-safe-project-merge-evidence-routing.js'; import { compactProjectMergeRoutingCalibration } from './js-ts-safe-project-merge-routing-calibration.js';
3
3
  import { htmlCssProjectSummary } from './js-ts-safe-project-merge-html-css-summary.js';
4
+ import { sourceTextMergeCandidateEvidenceRecord, sourceTextMergeSummary } from './js-ts-safe-project-merge-source-text-candidate.js';
4
5
 
5
6
  function projectSummary(files, graphConflicts = [], hasProjectGraphDelta = false, outputDiagnosticsGate = undefined, outputDeclarationGate = undefined, outputQualityGate = undefined, moveRenameSummary = undefined, proofEvidence = undefined, symbolRenameSummary = undefined, splitMergeSummary = undefined, projectSymbolGraph = undefined) {
6
7
  const byOperation = {};
@@ -11,9 +12,7 @@ function projectSummary(files, graphConflicts = [], hasProjectGraphDelta = false
11
12
  const proofLevelStatuses = proofEvidence?.summary?.levelStatuses ?? {};
12
13
  return {
13
14
  files: files.length,
14
- mergedFiles: files.filter((file) => file.status === 'merged').length,
15
- blockedFiles: files.filter((file) => file.status === 'blocked').length,
16
- outputFiles: files.filter((file) => typeof file.outputSourceText === 'string').length,
15
+ ...sourceTextMergeSummary(files),
17
16
  ...htmlCssProjectSummary(files),
18
17
  projectGraphConflicts: graphConflicts.length,
19
18
  projectGraphDeltaEvidenceIncluded: hasProjectGraphDelta ? 1 : 0, projectGraphEvidenceIncluded: projectSymbolGraph || hasProjectGraphDelta ? 1 : 0,
@@ -113,6 +112,7 @@ function projectSummaryWithConfidenceEvidence(summary, evidence = [], confidence
113
112
 
114
113
  function projectEvidence(id, status, summary, context = {}) {
115
114
  return uniqueRecords([
115
+ sourceTextMergeCandidateEvidenceRecord(id, summary),
116
116
  projectMergeEvidenceRecord(id, status, summary, context),
117
117
  graphEvidenceRecord(id, summary, context),
118
118
  ...fileAdmissionEvidenceRecords(context.fileResults),
@@ -168,6 +168,9 @@ function projectConfidence(id, status, summary, evidence = [], reasonCodes = [],
168
168
  mergedFiles: summary.mergedFiles,
169
169
  blockedFiles: summary.blockedFiles,
170
170
  outputFiles: summary.outputFiles,
171
+ sourceTextMergeCandidateStatus: summary.sourceTextMergeCandidateStatus,
172
+ sourceTextMergeCandidateFiles: summary.sourceTextMergeCandidateFiles,
173
+ sourceTextMergeBlockedFiles: summary.sourceTextMergeBlockedFiles,
171
174
  projectGraphConflicts: summary.projectGraphConflicts,
172
175
  outputDiagnosticConflicts: summary.outputDiagnosticConflicts,
173
176
  outputDeclarationConflicts: summary.outputDeclarationConflicts,
@@ -293,6 +296,7 @@ function confidenceLevel(score, status) {
293
296
  function compactConfidenceDimensions(status, summary, context, routingCalibration = {}) {
294
297
  return compactRecord({
295
298
  merge: status === 'merged' ? 'merged' : 'blocked',
299
+ sourceText: summary.sourceTextMergeCandidateStatus ?? 'absent',
296
300
  graph: context.hasProjectGraphEvidence ? (summary.projectGraphConflicts ? 'failed' : 'passed') : 'missing',
297
301
  diagnostics: gateConfidenceDimension(context.outputDiagnosticsGate),
298
302
  declarations: gateConfidenceDimension(context.outputDeclarationGate),
@@ -303,14 +307,7 @@ function compactConfidenceDimensions(status, summary, context, routingCalibratio
303
307
 
304
308
  function gateConfidenceDimension(gate) { return !gate ? 'missing' : gate.status === 'passed' ? 'passed' : gate.status === 'skipped' ? 'missing' : 'failed'; }
305
309
 
306
- function uniqueRecords(records) {
307
- const seen = new Set();
308
- return records.filter((record) => {
309
- if (!record?.id || seen.has(record.id)) return false;
310
- seen.add(record.id);
311
- return true;
312
- });
313
- }
310
+ function uniqueRecords(records) { const seen = new Set(); return records.filter((record) => !record?.id || seen.has(record.id) ? false : (seen.add(record.id), true)); }
314
311
 
315
312
  function uniqueStrings(values) { return [...new Set(values.filter((value) => typeof value === 'string' && value.length > 0))]; }
316
313
  function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshift-labs/frontier-lang-compiler",
3
- "version": "0.2.163",
3
+ "version": "0.2.164",
4
4
  "description": "Compiler facade for Frontier Lang source documents and language projection adapters.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",