@deneb-ui/cli 2.0.88 → 2.0.89

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.
Files changed (54) hide show
  1. package/bin/index.js +31 -5
  2. package/package.json +2 -2
  3. package/src/arc/__tests__/acceptance-gates.test.cjs +62 -0
  4. package/src/arc/__tests__/arc.test.cjs +922 -0
  5. package/src/arc/__tests__/canonical.test.cjs +57 -0
  6. package/src/arc/__tests__/classification.test.cjs +54 -0
  7. package/src/arc/__tests__/corpus.test.cjs +144 -0
  8. package/src/arc/__tests__/explain-blocked.test.cjs +192 -0
  9. package/src/arc/__tests__/fuzz.test.cjs +106 -0
  10. package/src/arc/__tests__/interaction.test.cjs +85 -0
  11. package/src/arc/__tests__/visual-regression.test.cjs +99 -0
  12. package/src/arc/acceptance-gates.cjs +119 -0
  13. package/src/arc/canonical-paths.cjs +142 -23
  14. package/src/arc/corpus-verifier.cjs +295 -0
  15. package/src/arc/data-classification.cjs +182 -0
  16. package/src/arc/data-flow.cjs +62 -2
  17. package/src/arc/explain-blocked.cjs +388 -0
  18. package/src/arc/fuzz-engine.cjs +604 -0
  19. package/src/arc/index.cjs +148 -2
  20. package/src/arc/interaction-verifier.cjs +185 -0
  21. package/src/arc/ir-builder.cjs +170 -12
  22. package/src/arc/planner.cjs +16 -1
  23. package/src/arc/residual.cjs +22 -0
  24. package/src/arc/rsc-boundary.cjs +105 -4
  25. package/src/arc/runtime-validator.cjs +65 -0
  26. package/src/arc/semantic.cjs +12 -1
  27. package/src/arc/transformer.cjs +14 -2745
  28. package/src/arc/transforms/assets/tailwind-bg.cjs +38 -0
  29. package/src/arc/transforms/collections/list.cjs +474 -0
  30. package/src/arc/transforms/components/child-card.cjs +268 -0
  31. package/src/arc/transforms/components/compound-content.cjs +49 -0
  32. package/src/arc/transforms/components/reusable-component.cjs +173 -0
  33. package/src/arc/transforms/element-transform.cjs +192 -0
  34. package/src/arc/transforms/healing/conditionals.cjs +295 -0
  35. package/src/arc/transforms/healing/sanitizer.cjs +401 -0
  36. package/src/arc/transforms/index.cjs +195 -0
  37. package/src/arc/transforms/primitives/action.cjs +76 -0
  38. package/src/arc/transforms/primitives/text.cjs +65 -0
  39. package/src/arc/transforms/routing/page-key.cjs +84 -0
  40. package/src/arc/transforms/routing/shared-layout.cjs +294 -0
  41. package/src/arc/transforms/runtime/provider.cjs +230 -0
  42. package/src/arc/transforms/transform-context.cjs +118 -0
  43. package/src/arc/types/acceptance.d.ts +50 -0
  44. package/src/arc/types/canonical.d.ts +50 -0
  45. package/src/arc/types/classification.d.ts +42 -0
  46. package/src/arc/types/corpus.d.ts +52 -0
  47. package/src/arc/types/explain-blocked.d.ts +41 -0
  48. package/src/arc/types/fuzz.d.ts +74 -0
  49. package/src/arc/types/interaction.d.ts +43 -0
  50. package/src/arc/types/ir.d.ts +114 -0
  51. package/src/arc/types/rsc.d.ts +39 -0
  52. package/src/arc/types/visual-regression.d.ts +49 -0
  53. package/src/arc/visual-regression.cjs +195 -0
  54. package/src/arc/workspace.cjs +233 -0
package/bin/index.js CHANGED
@@ -920,11 +920,19 @@ async function initProject(targetInput, options = {}) {
920
920
  const { runUniversalTemplateConversion } = require('../src/tools/template-converter.cjs');
921
921
  conversionRes = runUniversalTemplateConversion(targetDir, projectName, detectedPages, options);
922
922
  } else {
923
- const { runDenebArc } = require('../src/arc/index.cjs');
924
- conversionRes = await runDenebArc(targetDir, projectName, {
923
+ const { runTransactionalPipeline } = require('../src/arc/index.cjs');
924
+ const pipelineRes = runTransactionalPipeline(targetDir, {
925
925
  ...options,
926
+ projectName,
926
927
  detectedPages,
927
928
  });
929
+ conversionRes = pipelineRes.result || pipelineRes;
930
+ if (pipelineRes.rolledBack) {
931
+ console.log('\n\x1b[31m✖ DENEB CONVERSION BLOCKED — Original project files preserved intact.\x1b[0m');
932
+ console.log(`\x1b[33m Reason:\x1b[0m ${pipelineRes.reasons?.[0] || '100% Fivora Contract / Acceptance Gate validation failed'}`);
933
+ console.log(`\n Run \x1b[36m\x1b[1mnpx @deneb-ui/cli explain --blocked\x1b[0m for exact file locations, line numbers, and fixes.\n`);
934
+ process.exit(1);
935
+ }
928
936
  }
929
937
  } catch (err) {
930
938
  console.error(`\x1b[33m⚠ Note:\x1b[0m Automated conversion encountered an issue: ${err.message}. Falling back to default generation.`);
@@ -1543,13 +1551,28 @@ if (command === 'init' || command === 'arc') {
1543
1551
  console.error(`\x1b[31mError:\x1b[0m ${err.message}`);
1544
1552
  process.exit(1);
1545
1553
  });
1546
- } else if (command === 'explain') {
1554
+ } else if (command === 'explain' || command === 'explain-blocked') {
1555
+ const isBlocked = command === 'explain-blocked' || commandArgs.includes('--blocked') || commandArgs.includes('-b');
1556
+ const isJson = commandArgs.includes('--json');
1557
+ const targetInput = commandArgs.find((a) => !a.startsWith('-')) || '.';
1558
+
1559
+ if (isBlocked) {
1560
+ try {
1561
+ const { analyzeBlockedProject, printBlockedExplanation } = require('../src/arc/explain-blocked.cjs');
1562
+ const report = analyzeBlockedProject(targetInput);
1563
+ printBlockedExplanation(report, { json: isJson });
1564
+ process.exit(report.blocked ? 1 : 0);
1565
+ } catch (err) {
1566
+ console.error(`\x1b[31mError:\x1b[0m ${err.message}`);
1567
+ process.exit(1);
1568
+ }
1569
+ }
1570
+
1547
1571
  const fileInput = commandArgs.find((a) => !a.startsWith('-'));
1548
1572
  if (!fileInput) {
1549
- console.error('\x1b[31mError:\x1b[0m Please specify a component file to explain (e.g. deneb explain src/components/Hero.tsx)');
1573
+ console.error('\x1b[31mError:\x1b[0m Please specify a component file to explain (e.g. deneb explain src/components/Hero.tsx) or use --blocked to diagnose conversion failures (e.g. deneb explain --blocked)');
1550
1574
  process.exit(1);
1551
1575
  }
1552
- const isJson = commandArgs.includes('--json');
1553
1576
  try {
1554
1577
  const { explainFile, printExplanation } = require('../src/arc/explain.cjs');
1555
1578
  const explanation = explainFile(fileInput, { root: '.' });
@@ -1644,6 +1667,9 @@ if (command === 'init' || command === 'arc') {
1644
1667
  Core Commands:
1645
1668
  init Deneb ARC: convert an existing React/Next.js app into a Fivora-editable storefront
1646
1669
  flags: --dry-run --explain --recipe <name> --legacy --ai --ai-dry-run --telemetry off|anonymous|enhanced
1670
+ explain Explain ARC refactoring decisions for a file, or diagnose blocked conversions
1671
+ e.g. deneb explain src/components/Hero.tsx
1672
+ e.g. deneb explain --blocked [dir] (shows exact file locations, line numbers, and fixes)
1647
1673
  doctor Run comprehensive environment, manifest, visual editing AST & asset diagnostic checks (flags: --fix, --json)
1648
1674
  save-recipe Learn and save calibrated fixes & schemas into reusable recipe bank (e.g. deneb save-recipe . shoes-store)
1649
1675
  learn Alias for save-recipe
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deneb-ui/cli",
3
- "version": "2.0.88",
3
+ "version": "2.0.89",
4
4
  "description": "Official DENEB CLI — scaffold, convert, validate, and package Fivora-ready storefront templates.",
5
5
  "bin": {
6
6
  "deneb": "bin/index.js",
@@ -49,7 +49,7 @@
49
49
  "license": "MIT",
50
50
  "dependencies": {
51
51
  "@babel/parser": "^7.28.0",
52
- "@deneb-ui/core": "^2.0.88",
52
+ "@deneb-ui/core": "^2.0.89",
53
53
  "@octokit/rest": "^22.0.1",
54
54
  "adm-zip": "^0.6.0",
55
55
  "dotenv": "^17.4.2",
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ const test = require('node:test');
4
+ const assert = require('node:assert/strict');
5
+ const { evaluateAcceptanceGates, ACCEPTANCE_GATES } = require('../acceptance-gates.cjs');
6
+
7
+ test('Acceptance Gates: all critical gates passing with >= 98% coverage yields CONVERSION_PASSED', () => {
8
+ const result = evaluateAcceptanceGates({
9
+ sourceAnalysis: { passed: true },
10
+ astTransformation: { passed: true },
11
+ typescriptValidation: { passed: true },
12
+ buildSuccess: { passed: true },
13
+ fivoraAudit: { passed: true },
14
+ manifestValid: true,
15
+ runtimeEditabilityScore: 99.2,
16
+ collectionOpsPassed: true,
17
+ imageEditingPassed: true,
18
+ routeCoveragePassed: true,
19
+ designPreservationScore: 99.0,
20
+ controlOnlyValid: true,
21
+ editabilityCoverage: 98.8,
22
+ });
23
+
24
+ assert.equal(result.passed, true);
25
+ assert.equal(result.status, 'CONVERSION_PASSED');
26
+ assert.equal(result.allCriticalPassed, true);
27
+ assert.equal(Object.keys(result.gates).length, 12);
28
+ });
29
+
30
+ test('Acceptance Gates: critical gate failure yields CONVERSION_FAILED', () => {
31
+ const result = evaluateAcceptanceGates({
32
+ fivoraAudit: { passed: false }, // Critical gate failed
33
+ runtimeEditabilityScore: 100,
34
+ editabilityCoverage: 100,
35
+ });
36
+
37
+ assert.equal(result.passed, false);
38
+ assert.equal(result.status, 'CONVERSION_FAILED');
39
+ assert.equal(result.allCriticalPassed, false);
40
+ });
41
+
42
+ test('Acceptance Gates: sub-threshold coverage (< 98%) yields CONVERSION_INCOMPLETE', () => {
43
+ const result = evaluateAcceptanceGates({
44
+ sourceAnalysis: { passed: true },
45
+ astTransformation: { passed: true },
46
+ typescriptValidation: { passed: true },
47
+ buildSuccess: { passed: true },
48
+ fivoraAudit: { passed: true },
49
+ manifestValid: true,
50
+ runtimeEditabilityScore: 99.0,
51
+ collectionOpsPassed: true,
52
+ imageEditingPassed: true,
53
+ routeCoveragePassed: true,
54
+ designPreservationScore: 98.5,
55
+ controlOnlyValid: true,
56
+ editabilityCoverage: 95.5, // Sub-threshold
57
+ });
58
+
59
+ assert.equal(result.passed, false);
60
+ assert.equal(result.status, 'CONVERSION_INCOMPLETE');
61
+ assert.equal(result.allCriticalPassed, true);
62
+ });