sela-core 1.0.7 → 1.0.9
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/README.md +27 -17
- package/dist/cli/ErrorHandler.d.ts +1 -1
- package/dist/cli/ErrorHandler.js +14 -14
- package/dist/cli/commands/bulk.d.ts +1 -1
- package/dist/cli/commands/bulk.d.ts.map +1 -1
- package/dist/cli/commands/bulk.js +51 -33
- package/dist/cli/commands/init.d.ts +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +26 -18
- package/dist/cli/commands/merge.d.ts +13 -0
- package/dist/cli/commands/merge.d.ts.map +1 -0
- package/dist/cli/commands/merge.js +119 -0
- package/dist/cli/commands/showReport.d.ts +1 -1
- package/dist/cli/commands/showReport.d.ts.map +1 -1
- package/dist/cli/commands/showReport.js +12 -10
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +8 -8
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +38 -30
- package/dist/cli/index.js +12 -9
- package/dist/cli/ui/DnaTable.d.ts +1 -1
- package/dist/cli/ui/DnaTable.d.ts.map +1 -1
- package/dist/cli/ui/DnaTable.js +23 -16
- package/dist/cli/ui/RefactorWizard.d.ts +3 -3
- package/dist/cli/ui/RefactorWizard.d.ts.map +1 -1
- package/dist/cli/ui/RefactorWizard.js +108 -82
- package/dist/config/ConfigLoader.d.ts +2 -2
- package/dist/config/ConfigLoader.d.ts.map +1 -1
- package/dist/config/ConfigLoader.js +15 -15
- package/dist/config/DryRunGuard.d.ts +1 -1
- package/dist/config/DryRunGuard.js +7 -7
- package/dist/config/SelaConfig.d.ts +13 -17
- package/dist/config/SelaConfig.d.ts.map +1 -1
- package/dist/config/SelaConfig.js +32 -26
- package/dist/engine/HealingRegistry.d.ts +1 -1
- package/dist/engine/HealingRegistry.js +3 -3
- package/dist/engine/SelaEngine.d.ts +1 -1
- package/dist/engine/SelaEngine.d.ts.map +1 -1
- package/dist/engine/SelaEngine.js +117 -51
- package/dist/errors/SelaError.d.ts +8 -1
- package/dist/errors/SelaError.d.ts.map +1 -1
- package/dist/errors/SelaError.js +14 -7
- package/dist/fixtures/expectProxy.d.ts +2 -2
- package/dist/fixtures/expectProxy.js +16 -16
- package/dist/fixtures/index.d.ts +18 -2
- package/dist/fixtures/index.d.ts.map +1 -1
- package/dist/fixtures/index.js +47 -27
- package/dist/fixtures/moduleExpect.js +7 -7
- package/dist/fixtures/proxyTag.d.ts +1 -1
- package/dist/fixtures/proxyTag.js +4 -4
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/reporter/SelaReporter.d.ts +45 -12
- package/dist/reporter/SelaReporter.d.ts.map +1 -1
- package/dist/reporter/SelaReporter.js +139 -39
- package/dist/services/ASTSourceUpdater.d.ts +48 -3
- package/dist/services/ASTSourceUpdater.d.ts.map +1 -1
- package/dist/services/ASTSourceUpdater.js +283 -105
- package/dist/services/AnchorResolver.d.ts +157 -0
- package/dist/services/AnchorResolver.d.ts.map +1 -0
- package/dist/services/AnchorResolver.js +289 -0
- package/dist/services/ArgumentTypeAnalyzer.js +7 -7
- package/dist/services/BlastRadiusAnalyzer.d.ts.map +1 -1
- package/dist/services/BlastRadiusAnalyzer.js +5 -2
- package/dist/services/ChainValidator.js +22 -22
- package/dist/services/CrossFileHealer.js +7 -7
- package/dist/services/DecisionEngine.d.ts +51 -0
- package/dist/services/DecisionEngine.d.ts.map +1 -0
- package/dist/services/DecisionEngine.js +260 -0
- package/dist/services/DefinitionTracer.d.ts +1 -1
- package/dist/services/DefinitionTracer.d.ts.map +1 -1
- package/dist/services/DefinitionTracer.js +28 -13
- package/dist/services/DnaEditorService.d.ts +2 -2
- package/dist/services/DnaEditorService.d.ts.map +1 -1
- package/dist/services/DnaEditorService.js +81 -62
- package/dist/services/DnaIndexService.d.ts +1 -1
- package/dist/services/DnaIndexService.d.ts.map +1 -1
- package/dist/services/DnaIndexService.js +14 -14
- package/dist/services/HealReportService.d.ts +31 -55
- package/dist/services/HealReportService.d.ts.map +1 -1
- package/dist/services/HealReportService.js +864 -1240
- package/dist/services/HealingAdvisory.d.ts +9 -1
- package/dist/services/HealingAdvisory.d.ts.map +1 -1
- package/dist/services/HealingAdvisory.js +9 -1
- package/dist/services/HealingCacheService.d.ts +8 -8
- package/dist/services/HealingCacheService.d.ts.map +1 -1
- package/dist/services/HealingCacheService.js +24 -24
- package/dist/services/HealthReportService.d.ts +1 -1
- package/dist/services/HealthReportService.d.ts.map +1 -1
- package/dist/services/HealthReportService.js +25 -25
- package/dist/services/InitializerUpdater.d.ts.map +1 -1
- package/dist/services/InitializerUpdater.js +12 -2
- package/dist/services/IntentAuditor.d.ts.map +1 -1
- package/dist/services/IntentAuditor.js +32 -21
- package/dist/services/InteractiveReview.d.ts +8 -17
- package/dist/services/InteractiveReview.d.ts.map +1 -1
- package/dist/services/InteractiveReview.js +34 -124
- package/dist/services/LLMService.d.ts +1 -1
- package/dist/services/LLMService.js +16 -16
- package/dist/services/MutationApplier.d.ts +55 -0
- package/dist/services/MutationApplier.d.ts.map +1 -0
- package/dist/services/MutationApplier.js +322 -0
- package/dist/services/PRAutomationService.d.ts +2 -2
- package/dist/services/PRAutomationService.d.ts.map +1 -1
- package/dist/services/PRAutomationService.js +43 -39
- package/dist/services/PendingPromptLedger.d.ts +9 -2
- package/dist/services/PendingPromptLedger.d.ts.map +1 -1
- package/dist/services/PendingPromptLedger.js +31 -6
- package/dist/services/ReportGenerator.d.ts +116 -30
- package/dist/services/ReportGenerator.d.ts.map +1 -1
- package/dist/services/ReportGenerator.js +149 -62
- package/dist/services/ReportMergeService.d.ts +95 -0
- package/dist/services/ReportMergeService.d.ts.map +1 -0
- package/dist/services/ReportMergeService.js +0 -0
- package/dist/services/SafetyGuard.d.ts +4 -7
- package/dist/services/SafetyGuard.d.ts.map +1 -1
- package/dist/services/SafetyGuard.js +29 -106
- package/dist/services/SelectorSanitizer.d.ts +52 -0
- package/dist/services/SelectorSanitizer.d.ts.map +1 -0
- package/dist/services/SelectorSanitizer.js +318 -0
- package/dist/services/SnapshotService.js +6 -6
- package/dist/services/SourceLinkService.d.ts +2 -2
- package/dist/services/SourceLinkService.d.ts.map +1 -1
- package/dist/services/SourceLinkService.js +31 -22
- package/dist/services/SourceUpdater.d.ts +1 -1
- package/dist/services/SourceUpdater.d.ts.map +1 -1
- package/dist/services/SourceUpdater.js +44 -26
- package/dist/services/TemplateDiffService.d.ts.map +1 -1
- package/dist/services/TemplateDiffService.js +18 -15
- package/dist/services/TraceBackEngine.d.ts +67 -0
- package/dist/services/TraceBackEngine.d.ts.map +1 -0
- package/dist/services/TraceBackEngine.js +672 -0
- package/dist/services/WorkspaceSnapshotService.d.ts +6 -6
- package/dist/services/WorkspaceSnapshotService.d.ts.map +1 -1
- package/dist/services/WorkspaceSnapshotService.js +10 -12
- package/dist/types/index.d.ts +1 -1
- package/dist/utils/DOMUtils.d.ts +18 -2
- package/dist/utils/DOMUtils.d.ts.map +1 -1
- package/dist/utils/DOMUtils.js +335 -49
- package/dist/utils/IsolatedDiff.d.ts +2 -2
- package/dist/utils/IsolatedDiff.d.ts.map +1 -1
- package/dist/utils/IsolatedDiff.js +13 -10
- package/package.json +2 -2
|
@@ -40,9 +40,9 @@ const child_process_1 = require("child_process");
|
|
|
40
40
|
function openInBrowser(absPath) {
|
|
41
41
|
return new Promise((resolve, reject) => {
|
|
42
42
|
const platform = process.platform;
|
|
43
|
-
const cmd = platform ===
|
|
43
|
+
const cmd = platform === "win32"
|
|
44
44
|
? `start "" "${absPath}"`
|
|
45
|
-
: platform ===
|
|
45
|
+
: platform === "darwin"
|
|
46
46
|
? `open "${absPath}"`
|
|
47
47
|
: `xdg-open "${absPath}"`;
|
|
48
48
|
(0, child_process_1.exec)(cmd, (err) => (err ? reject(err) : resolve()));
|
|
@@ -50,21 +50,23 @@ function openInBrowser(absPath) {
|
|
|
50
50
|
}
|
|
51
51
|
function registerShowReport(program) {
|
|
52
52
|
program
|
|
53
|
-
.command(
|
|
54
|
-
.description(
|
|
55
|
-
.option(
|
|
56
|
-
.option(
|
|
53
|
+
.command("show-report")
|
|
54
|
+
.description("Open the latest Sela Insights healing report (sela-report.html) in the default browser")
|
|
55
|
+
.option("--file <path>", "Override path to the report file", "sela-report.html")
|
|
56
|
+
.option("--print", "Print the resolved path instead of opening the browser")
|
|
57
57
|
.action(async (opts) => {
|
|
58
|
-
const requested = opts.file ??
|
|
59
|
-
const abs = path.isAbsolute(requested)
|
|
58
|
+
const requested = opts.file ?? "sela-report.html";
|
|
59
|
+
const abs = path.isAbsolute(requested)
|
|
60
|
+
? requested
|
|
61
|
+
: path.resolve(process.cwd(), requested);
|
|
60
62
|
if (!fs.existsSync(abs)) {
|
|
61
63
|
process.stderr.write(`[sela] No report found at ${abs}\n` +
|
|
62
|
-
` Run your test suite first
|
|
64
|
+
` Run your test suite first - the report is generated automatically when Sela performs at least one heal attempt.\n`);
|
|
63
65
|
process.exit(1);
|
|
64
66
|
return;
|
|
65
67
|
}
|
|
66
68
|
if (opts.print) {
|
|
67
|
-
process.stdout.write(abs +
|
|
69
|
+
process.stdout.write(abs + "\n");
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
70
72
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6BrD"}
|
|
@@ -5,7 +5,7 @@ const ConfigLoader_js_1 = require("../../config/ConfigLoader.js");
|
|
|
5
5
|
const DnaIndexService_js_1 = require("../../services/DnaIndexService.js");
|
|
6
6
|
const HealthReportService_js_1 = require("../../services/HealthReportService.js");
|
|
7
7
|
const ProgressReporter_js_1 = require("../ui/ProgressReporter.js");
|
|
8
|
-
// Compact JSON shape for CI/CD consumers
|
|
8
|
+
// Compact JSON shape for CI/CD consumers - avoids serialising full DnaRecord arrays.
|
|
9
9
|
function toJsonOutput(report) {
|
|
10
10
|
const { total, orphaned, recentlyHealed, neverHealed, topHealedFiles } = report;
|
|
11
11
|
const brokenTotal = orphaned.length + report.unverifiedHeals.length;
|
|
@@ -29,20 +29,20 @@ function toJsonOutput(report) {
|
|
|
29
29
|
}
|
|
30
30
|
function registerStatus(program) {
|
|
31
31
|
program
|
|
32
|
-
.command(
|
|
33
|
-
.description(
|
|
34
|
-
.option(
|
|
35
|
-
.option(
|
|
32
|
+
.command("status")
|
|
33
|
+
.description("Show ecosystem health report")
|
|
34
|
+
.option("--json", "Emit raw JSON instead of formatted output")
|
|
35
|
+
.option("--dir <path>", "Override snapshot directory")
|
|
36
36
|
.action(async (opts) => {
|
|
37
37
|
const config = ConfigLoader_js_1.ConfigLoader.getInstance();
|
|
38
38
|
const snapshotDir = opts.dir ?? config.dnaStoragePath;
|
|
39
39
|
const progress = new ProgressReporter_js_1.ProgressReporter(opts.json);
|
|
40
40
|
const dnaIndex = new DnaIndexService_js_1.DnaIndexService();
|
|
41
|
-
const index = await progress.run(
|
|
41
|
+
const index = await progress.run("Scanning DNA snapshots…", () => dnaIndex.buildIndex(snapshotDir));
|
|
42
42
|
const healthSvc = new HealthReportService_js_1.HealthReportService();
|
|
43
|
-
const report = await progress.run(
|
|
43
|
+
const report = await progress.run("Generating health report…", async () => healthSvc.generate(index));
|
|
44
44
|
if (opts.json) {
|
|
45
|
-
process.stdout.write(JSON.stringify(toJsonOutput(report), null, 2) +
|
|
45
|
+
process.stdout.write(JSON.stringify(toJsonOutput(report), null, 2) + "\n");
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
48
|
process.stdout.write(healthSvc.format(report));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA+
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA+LrD"}
|
|
@@ -12,50 +12,56 @@ const SourceLinkService_js_1 = require("../../services/SourceLinkService.js");
|
|
|
12
12
|
const ProgressReporter_js_1 = require("../ui/ProgressReporter.js");
|
|
13
13
|
function registerSyncSource(dna) {
|
|
14
14
|
dna
|
|
15
|
-
.command(
|
|
16
|
-
.description(
|
|
17
|
-
.option(
|
|
18
|
-
.option(
|
|
19
|
-
.option(
|
|
20
|
-
.option(
|
|
15
|
+
.command("sync-source <key>")
|
|
16
|
+
.description("Write current DNA selector back to .spec.ts via AST")
|
|
17
|
+
.option("--locator-index <n>", "Which locator on the line (0-based)", "0")
|
|
18
|
+
.option("--dry-run", "Preview without writing")
|
|
19
|
+
.option("--json", "Emit JSON result")
|
|
20
|
+
.option("--dir <path>", "Override snapshot directory")
|
|
21
21
|
.action(async (key, opts) => {
|
|
22
22
|
const config = ConfigLoader_js_1.ConfigLoader.getInstance();
|
|
23
23
|
const snapshotDir = opts.dir ?? config.dnaStoragePath;
|
|
24
24
|
const locatorIndex = Math.max(0, parseInt(opts.locatorIndex, 10) || 0);
|
|
25
25
|
const progress = new ProgressReporter_js_1.ProgressReporter(opts.json);
|
|
26
26
|
const dnaIndex = new DnaIndexService_js_1.DnaIndexService();
|
|
27
|
-
await progress.run(
|
|
27
|
+
await progress.run("Scanning DNA snapshots…", () => dnaIndex.buildIndex(snapshotDir));
|
|
28
28
|
const record = dnaIndex.getByKey(key);
|
|
29
29
|
if (!record) {
|
|
30
30
|
if (opts.json) {
|
|
31
|
-
process.stdout.write(JSON.stringify({ success: false, reason: `DNA not found: ${key}` }, null, 2) +
|
|
31
|
+
process.stdout.write(JSON.stringify({ success: false, reason: `DNA not found: ${key}` }, null, 2) + "\n");
|
|
32
32
|
process.exit(3);
|
|
33
33
|
}
|
|
34
34
|
const err = new Error(`DNA not found: ${key}`);
|
|
35
|
-
err.code =
|
|
35
|
+
err.code = "DNA_NOT_FOUND";
|
|
36
36
|
throw err;
|
|
37
37
|
}
|
|
38
38
|
if (!record.sourceFile || record.sourceLine <= 0) {
|
|
39
39
|
if (opts.json) {
|
|
40
|
-
process.stdout.write(JSON.stringify({
|
|
40
|
+
process.stdout.write(JSON.stringify({
|
|
41
|
+
success: false,
|
|
42
|
+
reason: `DNA "${key}" has no sourceFile/sourceLine`,
|
|
43
|
+
}, null, 2) + "\n");
|
|
41
44
|
}
|
|
42
45
|
else {
|
|
43
|
-
process.stdout.write(chalk_1.default.yellow(` ⚠ DNA "${key}" has no sourceFile/sourceLine
|
|
46
|
+
process.stdout.write(chalk_1.default.yellow(` ⚠ DNA "${key}" has no sourceFile/sourceLine - cannot sync.\n`));
|
|
44
47
|
}
|
|
45
48
|
return;
|
|
46
49
|
}
|
|
47
50
|
const sourceLink = new SourceLinkService_js_1.SourceLinkService();
|
|
48
|
-
const locators = await progress.run(
|
|
51
|
+
const locators = await progress.run("Analyzing AST for locator update…", async () => sourceLink.enumerateLocatorsOnLine(record.sourceFile, record.sourceLine));
|
|
49
52
|
const target = locators[locatorIndex] ?? locators[0];
|
|
50
53
|
const relPath = path_1.default.relative(process.cwd(), record.sourceFile);
|
|
51
54
|
if (!opts.json) {
|
|
52
|
-
process.stdout.write(
|
|
53
|
-
process.stdout.write(` ${chalk_1.default.bold(
|
|
54
|
-
process.stdout.write(` ${chalk_1.default.bold(
|
|
55
|
+
process.stdout.write("\n");
|
|
56
|
+
process.stdout.write(` ${chalk_1.default.bold("DNA selector:")} ${chalk_1.default.green(record.selector)}\n`);
|
|
57
|
+
process.stdout.write(` ${chalk_1.default.bold("Source file:")} ${relPath}:${record.sourceLine}\n`);
|
|
55
58
|
}
|
|
56
59
|
if (!target) {
|
|
57
60
|
if (opts.json) {
|
|
58
|
-
process.stdout.write(JSON.stringify({
|
|
61
|
+
process.stdout.write(JSON.stringify({
|
|
62
|
+
success: false,
|
|
63
|
+
reason: `No locator at index ${locatorIndex} on line ${record.sourceLine}`,
|
|
64
|
+
}, null, 2) + "\n");
|
|
59
65
|
}
|
|
60
66
|
else {
|
|
61
67
|
process.stdout.write(chalk_1.default.yellow(` ⚠ No locator found at index ${locatorIndex} on line ${record.sourceLine}.\n\n`));
|
|
@@ -63,16 +69,16 @@ function registerSyncSource(dna) {
|
|
|
63
69
|
return;
|
|
64
70
|
}
|
|
65
71
|
if (!opts.json) {
|
|
66
|
-
process.stdout.write(` ${chalk_1.default.bold(
|
|
67
|
-
process.stdout.write(` ${chalk_1.default.bold(
|
|
68
|
-
process.stdout.write(` ${chalk_1.default.bold(
|
|
72
|
+
process.stdout.write(` ${chalk_1.default.bold("Locator found:")} [${locatorIndex}] ${chalk_1.default.yellow(target.preview)}\n`);
|
|
73
|
+
process.stdout.write(` ${chalk_1.default.bold("Current value:")} ${chalk_1.default.red(target.selector)}\n`);
|
|
74
|
+
process.stdout.write(` ${chalk_1.default.bold("Will become:")} ${chalk_1.default.green(record.selector)}\n\n`);
|
|
69
75
|
}
|
|
70
76
|
if (target.selector === record.selector) {
|
|
71
77
|
if (opts.json) {
|
|
72
|
-
process.stdout.write(JSON.stringify({ success: true, reason:
|
|
78
|
+
process.stdout.write(JSON.stringify({ success: true, reason: "Already in sync - nothing to do" }, null, 2) + "\n");
|
|
73
79
|
}
|
|
74
80
|
else {
|
|
75
|
-
process.stdout.write(chalk_1.default.dim(
|
|
81
|
+
process.stdout.write(chalk_1.default.dim(" Source already matches DNA selector. Nothing to do.\n\n"));
|
|
76
82
|
}
|
|
77
83
|
return;
|
|
78
84
|
}
|
|
@@ -86,36 +92,38 @@ function registerSyncSource(dna) {
|
|
|
86
92
|
locatorIndex,
|
|
87
93
|
oldSelector: target.selector,
|
|
88
94
|
newSelector: record.selector,
|
|
89
|
-
}, null, 2) +
|
|
95
|
+
}, null, 2) + "\n");
|
|
90
96
|
}
|
|
91
97
|
else {
|
|
92
|
-
process.stdout.write(chalk_1.default.dim(
|
|
98
|
+
process.stdout.write(chalk_1.default.dim(" [dry-run] No files written.\n\n"));
|
|
93
99
|
}
|
|
94
100
|
return;
|
|
95
101
|
}
|
|
96
102
|
const patch = {
|
|
97
103
|
key,
|
|
98
|
-
field:
|
|
104
|
+
field: "selector",
|
|
99
105
|
oldValue: target.selector,
|
|
100
106
|
newValue: record.selector,
|
|
101
107
|
applySourceUpdate: true,
|
|
102
108
|
locatorIndex,
|
|
103
109
|
};
|
|
104
|
-
const result = await progress.run(
|
|
110
|
+
const result = await progress.run("Applying AST source update…", () => sourceLink.applySourceUpdate(record, patch));
|
|
105
111
|
if (opts.json) {
|
|
106
|
-
process.stdout.write(JSON.stringify(result, null, 2) +
|
|
112
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
107
113
|
if (!result.success)
|
|
108
114
|
process.exit(5);
|
|
109
115
|
}
|
|
110
116
|
else {
|
|
111
117
|
if (result.success) {
|
|
112
|
-
const lineInfo = result.lineUpdated
|
|
113
|
-
|
|
118
|
+
const lineInfo = result.lineUpdated
|
|
119
|
+
? ` (line ${result.lineUpdated})`
|
|
120
|
+
: "";
|
|
121
|
+
process.stdout.write(` ${chalk_1.default.green("✓")} Source updated${lineInfo}\n\n`);
|
|
114
122
|
}
|
|
115
123
|
else {
|
|
116
|
-
process.stdout.write(` ${chalk_1.default.red(
|
|
124
|
+
process.stdout.write(` ${chalk_1.default.red("✗")} Source update failed: ${result.reason}\n\n`);
|
|
117
125
|
const err = new Error(result.reason);
|
|
118
|
-
err.code =
|
|
126
|
+
err.code = "AST_ERROR";
|
|
119
127
|
throw err;
|
|
120
128
|
}
|
|
121
129
|
}
|
package/dist/cli/index.js
CHANGED
|
@@ -37,10 +37,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
38
|
try {
|
|
39
39
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
40
|
-
require(
|
|
40
|
+
require("dotenv").config({ path: path.join(process.cwd(), ".env") });
|
|
41
41
|
}
|
|
42
42
|
catch {
|
|
43
|
-
// dotenv missing or .env absent
|
|
43
|
+
// dotenv missing or .env absent - continue silently
|
|
44
44
|
}
|
|
45
45
|
const commander_1 = require("commander");
|
|
46
46
|
const ErrorHandler_js_1 = require("./ErrorHandler.js");
|
|
@@ -52,14 +52,15 @@ const refactor_js_1 = require("./commands/refactor.js");
|
|
|
52
52
|
const bulk_js_1 = require("./commands/bulk.js");
|
|
53
53
|
const sync_js_1 = require("./commands/sync.js");
|
|
54
54
|
const showReport_js_1 = require("./commands/showReport.js");
|
|
55
|
+
const merge_js_1 = require("./commands/merge.js");
|
|
55
56
|
(0, ErrorHandler_js_1.registerGlobalHandlers)();
|
|
56
57
|
// Diagnostic console.log from services (ConfigLoader etc.) → stderr so stdout stays pipe-clean
|
|
57
|
-
console.log = (...args) => process.stderr.write(args.map(String).join(
|
|
58
|
+
console.log = (...args) => process.stderr.write(args.map(String).join(" ") + "\n");
|
|
58
59
|
const program = new commander_1.Command();
|
|
59
60
|
program
|
|
60
|
-
.name(
|
|
61
|
-
.description(
|
|
62
|
-
.version(
|
|
61
|
+
.name("sela")
|
|
62
|
+
.description("Sela CLI - proactive DNA management for Sela")
|
|
63
|
+
.version("1.0.3")
|
|
63
64
|
.exitOverride(ErrorHandler_js_1.handleError)
|
|
64
65
|
.configureOutput({ outputError: () => { } });
|
|
65
66
|
// ── sela init ────────────────────────────────────────────────────────────────
|
|
@@ -68,11 +69,13 @@ program
|
|
|
68
69
|
(0, status_js_1.registerStatus)(program);
|
|
69
70
|
// ── sela list (T-07) ─────────────────────────────────────────────────────────
|
|
70
71
|
(0, list_js_1.registerList)(program);
|
|
71
|
-
// ── sela show-report
|
|
72
|
+
// ── sela show-report - open Sela Insights HTML ───────────────────────────────
|
|
72
73
|
(0, showReport_js_1.registerShowReport)(program);
|
|
74
|
+
// ── sela merge - CI fan-in: aggregate sharded reports into one ────────────────
|
|
75
|
+
(0, merge_js_1.registerMerge)(program);
|
|
73
76
|
// ── sela dna <subcommand> ─────────────────────────────────────────────────────
|
|
74
|
-
const dna = new commander_1.Command(
|
|
75
|
-
.description(
|
|
77
|
+
const dna = new commander_1.Command("dna")
|
|
78
|
+
.description("DNA management commands")
|
|
76
79
|
.exitOverride(ErrorHandler_js_1.handleError)
|
|
77
80
|
.configureOutput({ outputError: () => { } });
|
|
78
81
|
// ── sela dna find (T-08) ─────────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DnaTable.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/DnaTable.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"DnaTable.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/DnaTable.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAkDzD,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAoBxD"}
|
package/dist/cli/ui/DnaTable.js
CHANGED
|
@@ -8,17 +8,17 @@ const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
|
8
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
10
|
// Truncate before chalk so ANSI codes don't corrupt visual width calculations.
|
|
11
|
-
function trunc(s, maxLen, fallback =
|
|
12
|
-
if (s == null || s.trim() ===
|
|
11
|
+
function trunc(s, maxLen, fallback = "-") {
|
|
12
|
+
if (s == null || s.trim() === "")
|
|
13
13
|
return chalk_1.default.dim(fallback);
|
|
14
|
-
return s.length <= maxLen ? s : s.slice(0, maxLen - 1) +
|
|
14
|
+
return s.length <= maxLen ? s : s.slice(0, maxLen - 1) + "…";
|
|
15
15
|
}
|
|
16
16
|
function relativeTime(iso) {
|
|
17
17
|
if (!iso)
|
|
18
|
-
return chalk_1.default.dim(
|
|
18
|
+
return chalk_1.default.dim("never");
|
|
19
19
|
const d = Math.floor((Date.now() - new Date(iso).getTime()) / 86_400_000);
|
|
20
20
|
if (d === 0)
|
|
21
|
-
return chalk_1.default.green(
|
|
21
|
+
return chalk_1.default.green("today");
|
|
22
22
|
if (d < 7)
|
|
23
23
|
return `${d}d ago`;
|
|
24
24
|
if (d < 30)
|
|
@@ -27,26 +27,33 @@ function relativeTime(iso) {
|
|
|
27
27
|
}
|
|
28
28
|
function statusBadge(r) {
|
|
29
29
|
if (r.isOrphaned)
|
|
30
|
-
return chalk_1.default.red(
|
|
31
|
-
if (r.status ===
|
|
32
|
-
return chalk_1.default.yellow(
|
|
33
|
-
if (r.status ===
|
|
34
|
-
return chalk_1.default.red(
|
|
30
|
+
return chalk_1.default.red("orphaned");
|
|
31
|
+
if (r.status === "healed")
|
|
32
|
+
return chalk_1.default.yellow("⚠ unverified");
|
|
33
|
+
if (r.status === "broken")
|
|
34
|
+
return chalk_1.default.red("broken");
|
|
35
35
|
if (r.lastHealed !== null)
|
|
36
|
-
return chalk_1.default.green(
|
|
37
|
-
return chalk_1.default.cyan(
|
|
36
|
+
return chalk_1.default.green("healed");
|
|
37
|
+
return chalk_1.default.cyan("active");
|
|
38
38
|
}
|
|
39
39
|
function sourceCell(r) {
|
|
40
40
|
if (!r.sourceFile)
|
|
41
|
-
return chalk_1.default.dim(
|
|
41
|
+
return chalk_1.default.dim("-");
|
|
42
42
|
const rel = path_1.default.relative(process.cwd(), r.sourceFile);
|
|
43
43
|
const display = rel.length < r.sourceFile.length ? rel : r.sourceFile;
|
|
44
|
-
const suffix = r.sourceLine > 0 ? `:${r.sourceLine}` :
|
|
44
|
+
const suffix = r.sourceLine > 0 ? `:${r.sourceLine}` : "";
|
|
45
45
|
return trunc(display + suffix, 32);
|
|
46
46
|
}
|
|
47
47
|
// colWidths = content + 2 (1-space padding each side)
|
|
48
48
|
const COLS = {
|
|
49
|
-
head: [
|
|
49
|
+
head: [
|
|
50
|
+
"Key",
|
|
51
|
+
"Test Title",
|
|
52
|
+
"Source : Line",
|
|
53
|
+
"Selector",
|
|
54
|
+
"Last Healed",
|
|
55
|
+
"Status",
|
|
56
|
+
],
|
|
50
57
|
colWidths: [11, 24, 36, 44, 13, 11],
|
|
51
58
|
};
|
|
52
59
|
function renderTable(records) {
|
|
@@ -54,7 +61,7 @@ function renderTable(records) {
|
|
|
54
61
|
head: COLS.head.map((h) => chalk_1.default.bold(h)),
|
|
55
62
|
colWidths: COLS.colWidths,
|
|
56
63
|
wordWrap: false,
|
|
57
|
-
style: { head: [], border: [
|
|
64
|
+
style: { head: [], border: ["dim"] },
|
|
58
65
|
});
|
|
59
66
|
for (const r of records) {
|
|
60
67
|
table.push([
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { IDnaIndexService } from
|
|
2
|
-
import type { IDnaEditorService } from
|
|
3
|
-
import type { ISourceLinkService } from
|
|
1
|
+
import type { IDnaIndexService } from "../../services/DnaIndexService.js";
|
|
2
|
+
import type { IDnaEditorService } from "../../services/DnaEditorService.js";
|
|
3
|
+
import type { ISourceLinkService } from "../../services/SourceLinkService.js";
|
|
4
4
|
export interface WizardOptions {
|
|
5
5
|
noSource?: boolean;
|
|
6
6
|
dryRun?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefactorWizard.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/RefactorWizard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"RefactorWizard.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/RefactorWizard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAM9E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AA6HD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,GAAG,EAAE,cAAc,EACnB,IAAI,GAAE,aAAkB;IAGrC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwH7C,OAAO,CAAC,UAAU;YAUJ,SAAS;YAwBT,WAAW;YA+BX,SAAS;YA4BT,OAAO;IAKrB,OAAO,CAAC,aAAa;CAMtB"}
|