@deneb-ui/cli 2.0.88 → 2.0.90
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/bin/index.js +31 -5
- package/package.json +2 -2
- package/src/arc/__tests__/acceptance-gates.test.cjs +62 -0
- package/src/arc/__tests__/arc.test.cjs +922 -0
- package/src/arc/__tests__/canonical.test.cjs +57 -0
- package/src/arc/__tests__/classification.test.cjs +54 -0
- package/src/arc/__tests__/corpus.test.cjs +144 -0
- package/src/arc/__tests__/explain-blocked.test.cjs +192 -0
- package/src/arc/__tests__/fuzz.test.cjs +106 -0
- package/src/arc/__tests__/interaction.test.cjs +85 -0
- package/src/arc/__tests__/visual-regression.test.cjs +99 -0
- package/src/arc/acceptance-gates.cjs +119 -0
- package/src/arc/canonical-paths.cjs +142 -23
- package/src/arc/corpus-verifier.cjs +295 -0
- package/src/arc/data-classification.cjs +182 -0
- package/src/arc/data-flow.cjs +62 -2
- package/src/arc/explain-blocked.cjs +388 -0
- package/src/arc/fuzz-engine.cjs +604 -0
- package/src/arc/index.cjs +148 -2
- package/src/arc/interaction-verifier.cjs +185 -0
- package/src/arc/ir-builder.cjs +170 -12
- package/src/arc/planner.cjs +16 -1
- package/src/arc/residual.cjs +22 -0
- package/src/arc/rsc-boundary.cjs +105 -4
- package/src/arc/runtime-validator.cjs +65 -0
- package/src/arc/semantic.cjs +12 -1
- package/src/arc/transformer.cjs +14 -2745
- package/src/arc/transforms/assets/tailwind-bg.cjs +38 -0
- package/src/arc/transforms/collections/list.cjs +474 -0
- package/src/arc/transforms/components/child-card.cjs +268 -0
- package/src/arc/transforms/components/compound-content.cjs +49 -0
- package/src/arc/transforms/components/reusable-component.cjs +173 -0
- package/src/arc/transforms/element-transform.cjs +192 -0
- package/src/arc/transforms/healing/conditionals.cjs +295 -0
- package/src/arc/transforms/healing/sanitizer.cjs +401 -0
- package/src/arc/transforms/index.cjs +195 -0
- package/src/arc/transforms/primitives/action.cjs +76 -0
- package/src/arc/transforms/primitives/text.cjs +65 -0
- package/src/arc/transforms/routing/page-key.cjs +84 -0
- package/src/arc/transforms/routing/shared-layout.cjs +294 -0
- package/src/arc/transforms/runtime/provider.cjs +230 -0
- package/src/arc/transforms/transform-context.cjs +118 -0
- package/src/arc/types/acceptance.d.ts +50 -0
- package/src/arc/types/canonical.d.ts +50 -0
- package/src/arc/types/classification.d.ts +42 -0
- package/src/arc/types/corpus.d.ts +52 -0
- package/src/arc/types/explain-blocked.d.ts +41 -0
- package/src/arc/types/fuzz.d.ts +74 -0
- package/src/arc/types/interaction.d.ts +43 -0
- package/src/arc/types/ir.d.ts +114 -0
- package/src/arc/types/rsc.d.ts +39 -0
- package/src/arc/types/visual-regression.d.ts +49 -0
- package/src/arc/visual-regression.cjs +195 -0
- package/src/arc/workspace.cjs +233 -0
- package/src/common/template-visual-edit-contract.ts +4 -1
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 {
|
|
924
|
-
|
|
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.
|
|
3
|
+
"version": "2.0.90",
|
|
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.
|
|
52
|
+
"@deneb-ui/core": "^2.0.90",
|
|
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
|
+
});
|