@deneb-ui/cli 2.0.50 → 2.0.52

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.
@@ -6,6 +6,7 @@ const { parseSource } = require('./ast.cjs');
6
6
  const { collectDesignSnapshot } = require('./semantic.cjs');
7
7
  const { getDeep } = require('./manifest.cjs');
8
8
  const { walkFiles, isJsxFile, rel } = require('./fs-utils.cjs');
9
+ const { enumerateContentPaths, isControlOnly, wildcardPath } = require('./fivora-contract.cjs');
9
10
 
10
11
  function validateAstFiles(files) {
11
12
  const results = [];
@@ -143,18 +144,57 @@ function countOverlap(a, b) {
143
144
  return n;
144
145
  }
145
146
 
146
- function coverageMetrics({ analyses, plan, appliedCount, skippedDynamic, alreadyEditable }) {
147
+ function coverageMetrics({
148
+ analyses,
149
+ plan,
150
+ appliedCount,
151
+ skippedDynamic,
152
+ alreadyEditable,
153
+ content,
154
+ controlOnlyPaths,
155
+ pathCoverage,
156
+ uncoveredVisibleText,
157
+ }) {
147
158
  const detected = analyses.reduce((n, a) => n + (a.candidates || []).filter((c) => c.kind !== 'decoration' && c.kind !== 'already-editable').length, 0);
148
159
  const skippedLow = plan.skipped.filter((s) => s.reason === 'low-confidence' || (s.confidence || 0) < 0.6).length;
149
160
  const transformed = appliedCount;
150
- const coverage = detected === 0 ? 100 : Math.round((transformed / detected) * 1000) / 10;
161
+ const transformCoverage = detected === 0 ? 100 : Math.round((transformed / detected) * 1000) / 10;
162
+
163
+ const inventory = content ? enumerateContentPaths(content) : { concreteFields: new Set() };
164
+ const fieldMarkers = pathCoverage?.fieldMarkers || new Set();
165
+ const covers = (markerSet, path) =>
166
+ markerSet.has(path) || [...markerSet].some((marker) => wildcardPath(marker) === wildcardPath(path));
167
+
168
+ let visualRequired = 0;
169
+ let visualCovered = 0;
170
+ for (const path of inventory.concreteFields) {
171
+ if (isControlOnly(path, controlOnlyPaths || [])) continue;
172
+ visualRequired += 1;
173
+ if (covers(fieldMarkers, path)) visualCovered += 1;
174
+ }
175
+ const uncovered = Array.isArray(uncoveredVisibleText) ? uncoveredVisibleText.length : Number(uncoveredVisibleText) || 0;
176
+ let visualCoverage = 100;
177
+ if (visualRequired === 0) {
178
+ visualCoverage = uncovered === 0 ? 100 : Math.max(0, Math.round((1 / (1 + uncovered)) * 1000) / 10);
179
+ } else {
180
+ visualCoverage = Math.round((visualCovered / visualRequired) * 1000) / 10;
181
+ if (uncovered > 0) {
182
+ visualCoverage = Math.min(visualCoverage, Math.round((visualCovered / (visualRequired + uncovered)) * 1000) / 10);
183
+ }
184
+ }
185
+
151
186
  return {
152
187
  detectedEditableCandidates: detected,
153
188
  safelyTransformed: transformed,
154
189
  alreadyEditable,
155
190
  skippedDynamic,
156
191
  skippedLowConfidence: skippedLow,
157
- editableCoverage: Math.min(100, coverage),
192
+ transformCoverage: Math.min(100, transformCoverage),
193
+ visualCovered,
194
+ visualRequired,
195
+ uncoveredVisibleText: uncovered,
196
+ visualCoverage: Math.min(100, visualCoverage),
197
+ editableCoverage: Math.min(100, visualCoverage),
158
198
  };
159
199
  }
160
200
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  const ARC_NAME = 'Deneb ARC';
4
4
  const ARC_FULL_NAME = 'Deneb Adaptive Refactoring Compiler — AI-Augmented';
5
- const ARC_VERSION = '2.0.0';
5
+ const ARC_VERSION = '2.1.0';
6
6
  const SCHEMA_VERSION = 2;
7
7
  const ENGINE_ID = 'deneb-arc';
8
8