sela-core 1.0.7 → 1.0.8
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/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/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 +9 -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 +12 -16
- 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 +63 -49
- package/dist/errors/SelaError.d.ts +0 -1
- package/dist/errors/SelaError.d.ts.map +1 -1
- package/dist/errors/SelaError.js +6 -7
- package/dist/fixtures/expectProxy.d.ts +1 -1
- package/dist/fixtures/expectProxy.js +11 -11
- package/dist/fixtures/index.js +14 -14
- package/dist/fixtures/proxyTag.d.ts +1 -1
- package/dist/fixtures/proxyTag.js +3 -3
- 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 +3 -3
- package/dist/services/ASTSourceUpdater.d.ts.map +1 -1
- package/dist/services/ASTSourceUpdater.js +92 -68
- 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/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 +6 -6
- package/dist/services/HealReportService.d.ts.map +1 -1
- package/dist/services/HealReportService.js +33 -29
- package/dist/services/HealingAdvisory.js +1 -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.js +2 -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 +31 -124
- package/dist/services/LLMService.d.ts +1 -1
- package/dist/services/LLMService.js +16 -16
- 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 +2 -2
- package/dist/services/PendingPromptLedger.js +6 -6
- package/dist/services/ReportGenerator.d.ts +2 -2
- package/dist/services/ReportGenerator.d.ts.map +1 -1
- package/dist/services/ReportGenerator.js +5 -5
- package/dist/services/SafetyGuard.d.ts +3 -6
- package/dist/services/SafetyGuard.d.ts.map +1 -1
- package/dist/services/SafetyGuard.js +29 -106
- package/dist/services/SnapshotService.js +5 -5
- 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 +27 -26
- package/dist/services/TemplateDiffService.d.ts.map +1 -1
- package/dist/services/TemplateDiffService.js +18 -15
- 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/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
|
@@ -4,18 +4,18 @@
|
|
|
4
4
|
// Single source of truth for the "dry run" runtime gate.
|
|
5
5
|
//
|
|
6
6
|
// The flag is sourced from the `SELA_DRY_RUN` environment variable using the
|
|
7
|
-
// strict parser in SelaConfig.parseEnvBoolean (no silent coercion
|
|
7
|
+
// strict parser in SelaConfig.parseEnvBoolean (no silent coercion - bad
|
|
8
8
|
// values throw). The variable is re-read on every call so tests and
|
|
9
9
|
// long-running processes can toggle it without restarting the engine.
|
|
10
10
|
//
|
|
11
11
|
// Two writer paths route through this guard:
|
|
12
12
|
//
|
|
13
|
-
// 1. SourceUpdater._coreUpdate
|
|
13
|
+
// 1. SourceUpdater._coreUpdate - every `fs.writeFileSync` to a spec/source
|
|
14
14
|
// file. When dry-run is active the write is skipped and a console
|
|
15
15
|
// breadcrumb is emitted with the absolute path that *would have* been
|
|
16
16
|
// written.
|
|
17
17
|
//
|
|
18
|
-
// 2. ASTSourceUpdater._persistChanges
|
|
18
|
+
// 2. ASTSourceUpdater._persistChanges - wraps ts-morph `SourceFile.saveSync`.
|
|
19
19
|
// When dry-run is active the in-memory AST mutation stays, but the
|
|
20
20
|
// `saveSync` call (which forwards to fs.writeFileSync inside ts-morph)
|
|
21
21
|
// is skipped so the spec on disk is identical pre/post heal.
|
|
@@ -63,17 +63,17 @@ exports.DryRunGuard = {
|
|
|
63
63
|
/**
|
|
64
64
|
* Returns true when `SELA_DRY_RUN` is set to a truthy value in the current
|
|
65
65
|
* process environment. Throws via `parseEnvBoolean` when the value is not
|
|
66
|
-
* one of the accepted tokens
|
|
66
|
+
* one of the accepted tokens - fail-fast keeps misconfigured CI loud.
|
|
67
67
|
*/
|
|
68
68
|
active(env = process.env) {
|
|
69
|
-
return (0, SelaConfig_1.parseEnvBoolean)(
|
|
69
|
+
return (0, SelaConfig_1.parseEnvBoolean)("SELA_DRY_RUN", env.SELA_DRY_RUN);
|
|
70
70
|
},
|
|
71
71
|
/**
|
|
72
72
|
* Centralised log line for skipped writes so the diff between a dry run
|
|
73
73
|
* and a real run is auditable in test output and CI logs.
|
|
74
74
|
*/
|
|
75
75
|
logSkippedWrite(label, target) {
|
|
76
|
-
const display = target ? path.basename(target) :
|
|
77
|
-
console.log(`[Sela] 🌵 Dry Run
|
|
76
|
+
const display = target ? path.basename(target) : "<no-path>";
|
|
77
|
+
console.log(`[Sela] 🌵 Dry Run - skip ${label} → ${display}`);
|
|
78
78
|
},
|
|
79
79
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export type PRStrategy =
|
|
2
|
-
export type BugAction =
|
|
1
|
+
export type PRStrategy = "directCommit" | "pr" | "draftPR" | "readOnly";
|
|
2
|
+
export type BugAction = "failCI" | "createIssue" | "labelOnly";
|
|
3
3
|
export interface SelaPRAutomationConfig {
|
|
4
4
|
/** Master switch. Default: false (fully backward-compatible). */
|
|
5
5
|
enabled?: boolean;
|
|
6
6
|
/** Git-flow strategy. Default: 'readOnly' (safest). */
|
|
7
7
|
strategy?: PRStrategy;
|
|
8
|
-
/** Branches on which directCommit is FORBIDDEN
|
|
8
|
+
/** Branches on which directCommit is FORBIDDEN - auto-downgraded. */
|
|
9
9
|
protectedBranches?: string[];
|
|
10
10
|
/** Trust-aware downgrade thresholds (0–100). 0 = never downgrade by that metric. */
|
|
11
11
|
reviewThresholds?: {
|
|
@@ -14,7 +14,7 @@ export interface SelaPRAutomationConfig {
|
|
|
14
14
|
/** Min auditor adjusted confidence required for directCommit. Below → downgrade. */
|
|
15
15
|
minAuditorScoreForDirectCommit?: number;
|
|
16
16
|
/** Strategy to downgrade TO. Default: 'draftPR'. */
|
|
17
|
-
downgradeTo?: Exclude<PRStrategy,
|
|
17
|
+
downgradeTo?: Exclude<PRStrategy, "directCommit">;
|
|
18
18
|
};
|
|
19
19
|
/** Behavior when SafetyGuard blocks a heal (PROTECTED events). Default: 'failCI'. */
|
|
20
20
|
onBugDetected?: BugAction;
|
|
@@ -31,15 +31,13 @@ export interface SelaPRAutomationConfig {
|
|
|
31
31
|
}
|
|
32
32
|
export interface SelaConfig {
|
|
33
33
|
/** Shorthand preset that expands to concrete threshold values. */
|
|
34
|
-
healingPolicy?:
|
|
34
|
+
healingPolicy?: "conservative" | "balanced" | "aggressive";
|
|
35
35
|
/** Fine-grained threshold overrides. Explicit values always win over preset expansion. */
|
|
36
36
|
thresholds?: {
|
|
37
37
|
/** Minimum AI confidence to attempt a heal. Default: 85. Maps to CONFIDENCE_HARD_STOP. */
|
|
38
38
|
minHealerConfidence?: number;
|
|
39
39
|
/** How strictly the Intent Auditor treats SUSPICIOUS verdicts. Default: 'balanced'. */
|
|
40
|
-
auditorStrictness?:
|
|
41
|
-
/** Similarity floor for UNKNOWN-role assertion text changes. Default: 0.70. */
|
|
42
|
-
assertionSimilarityFloor?: number;
|
|
40
|
+
auditorStrictness?: "strict" | "balanced" | "loose";
|
|
43
41
|
};
|
|
44
42
|
agenticDiscovery?: {
|
|
45
43
|
enabled?: boolean;
|
|
@@ -47,7 +45,7 @@ export interface SelaConfig {
|
|
|
47
45
|
forbiddenSelectors?: string[];
|
|
48
46
|
};
|
|
49
47
|
/** How healed selectors are persisted. Default: 'inPlace'. */
|
|
50
|
-
updateStrategy?:
|
|
48
|
+
updateStrategy?: "inPlace" | "commentOnly" | "branch";
|
|
51
49
|
/**
|
|
52
50
|
* @deprecated Use `prAutomation.strategy = 'directCommit'` instead.
|
|
53
51
|
* When `prAutomation.enabled` is true this flag is forced to false and
|
|
@@ -71,14 +69,12 @@ export interface ResolvedThresholds {
|
|
|
71
69
|
confidenceHardStop: number;
|
|
72
70
|
/** Confidence below which a heal is tagged REQUIRES_REVIEW instead of SAFE. */
|
|
73
71
|
confidenceReviewThreshold: number;
|
|
74
|
-
/** Similarity floor for UNKNOWN→UNKNOWN assertion text changes. */
|
|
75
|
-
assertionSimilarityFloor: number;
|
|
76
72
|
/** Minimum auditor confidence to treat a verdict as CONSISTENT. */
|
|
77
73
|
auditorConfidenceMin: number;
|
|
78
74
|
/** When true, SUSPICIOUS in assertion mode yields REQUIRES_REVIEW instead of BLOCKED. */
|
|
79
75
|
allowSuspicious: boolean;
|
|
80
|
-
/** The resolved strictness name
|
|
81
|
-
auditorStrictness:
|
|
76
|
+
/** The resolved strictness name - used for policy-aware log messages. */
|
|
77
|
+
auditorStrictness: "strict" | "balanced" | "loose";
|
|
82
78
|
}
|
|
83
79
|
export interface ResolvedPRAutomation {
|
|
84
80
|
enabled: boolean;
|
|
@@ -87,7 +83,7 @@ export interface ResolvedPRAutomation {
|
|
|
87
83
|
reviewThresholds: {
|
|
88
84
|
minConfidenceForDirectCommit: number;
|
|
89
85
|
minAuditorScoreForDirectCommit: number;
|
|
90
|
-
downgradeTo: Exclude<PRStrategy,
|
|
86
|
+
downgradeTo: Exclude<PRStrategy, "directCommit">;
|
|
91
87
|
};
|
|
92
88
|
onBugDetected: BugAction;
|
|
93
89
|
branchNameTemplate: string;
|
|
@@ -98,7 +94,7 @@ export interface ResolvedPRAutomation {
|
|
|
98
94
|
}
|
|
99
95
|
export interface ResolvedConfig {
|
|
100
96
|
thresholds: ResolvedThresholds;
|
|
101
|
-
updateStrategy:
|
|
97
|
+
updateStrategy: "inPlace" | "commentOnly" | "branch";
|
|
102
98
|
autoCommit: boolean;
|
|
103
99
|
dnaStoragePath: string;
|
|
104
100
|
prAutomation: ResolvedPRAutomation;
|
|
@@ -116,7 +112,7 @@ export interface ResolvedConfig {
|
|
|
116
112
|
*/
|
|
117
113
|
dryRun: boolean;
|
|
118
114
|
/**
|
|
119
|
-
* When true, the healing cache layer is bypassed
|
|
115
|
+
* When true, the healing cache layer is bypassed - every heal request
|
|
120
116
|
* goes straight to the LLM. Sourced from `SELA_NO_CACHE` env var.
|
|
121
117
|
*/
|
|
122
118
|
noCache: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelaConfig.d.ts","sourceRoot":"","sources":["../../src/config/SelaConfig.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC;AACxE,MAAM,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"SelaConfig.d.ts","sourceRoot":"","sources":["../../src/config/SelaConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,18 @@ exports.resolveThresholds = resolveThresholds;
|
|
|
6
6
|
exports.parseEnvBoolean = parseEnvBoolean;
|
|
7
7
|
exports.resolveConfig = resolveConfig;
|
|
8
8
|
const PRESET_MAP = {
|
|
9
|
-
conservative: {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
conservative: {
|
|
10
|
+
minHealerConfidence: 92,
|
|
11
|
+
auditorStrictness: "strict",
|
|
12
|
+
},
|
|
13
|
+
balanced: {
|
|
14
|
+
minHealerConfidence: 85,
|
|
15
|
+
auditorStrictness: "balanced",
|
|
16
|
+
},
|
|
17
|
+
aggressive: {
|
|
18
|
+
minHealerConfidence: 75,
|
|
19
|
+
auditorStrictness: "loose",
|
|
20
|
+
},
|
|
12
21
|
};
|
|
13
22
|
const STRICTNESS_CONFIDENCE = {
|
|
14
23
|
strict: 90,
|
|
@@ -26,15 +35,13 @@ function resolveThresholds(config) {
|
|
|
26
35
|
// Explicit thresholds always win over preset expansion
|
|
27
36
|
const merged = { ...fromPreset, ...config.thresholds };
|
|
28
37
|
const minHealerConfidence = merged.minHealerConfidence ?? 85;
|
|
29
|
-
const auditorStrictness = merged.auditorStrictness ??
|
|
30
|
-
const assertionSimilarityFloor = merged.assertionSimilarityFloor ?? 0.7;
|
|
38
|
+
const auditorStrictness = merged.auditorStrictness ?? "balanced";
|
|
31
39
|
return {
|
|
32
40
|
confidenceHardStop: minHealerConfidence,
|
|
33
41
|
confidenceReviewThreshold: 95,
|
|
34
|
-
assertionSimilarityFloor,
|
|
35
42
|
auditorConfidenceMin: STRICTNESS_CONFIDENCE[auditorStrictness],
|
|
36
|
-
// allowSuspicious is derived
|
|
37
|
-
allowSuspicious: auditorStrictness ===
|
|
43
|
+
// allowSuspicious is derived - never independently settable to avoid footguns
|
|
44
|
+
allowSuspicious: auditorStrictness === "loose",
|
|
38
45
|
auditorStrictness,
|
|
39
46
|
};
|
|
40
47
|
}
|
|
@@ -42,37 +49,36 @@ function resolvePRAutomation(config) {
|
|
|
42
49
|
const pr = config.prAutomation ?? {};
|
|
43
50
|
// Legacy bridge: autoCommit:true with no explicit prAutomation block
|
|
44
51
|
// → enable prAutomation in directCommit mode. Explicit prAutomation always wins.
|
|
45
|
-
const legacyEnabled = config.autoCommit === true &&
|
|
46
|
-
config.prAutomation === undefined;
|
|
52
|
+
const legacyEnabled = config.autoCommit === true && config.prAutomation === undefined;
|
|
47
53
|
const enabled = pr.enabled ?? legacyEnabled;
|
|
48
|
-
const strategy = pr.strategy ?? (legacyEnabled ?
|
|
54
|
+
const strategy = pr.strategy ?? (legacyEnabled ? "directCommit" : "readOnly");
|
|
49
55
|
return {
|
|
50
56
|
enabled,
|
|
51
57
|
strategy,
|
|
52
|
-
protectedBranches: pr.protectedBranches ?? [
|
|
58
|
+
protectedBranches: pr.protectedBranches ?? ["main", "master", "release"],
|
|
53
59
|
reviewThresholds: {
|
|
54
60
|
minConfidenceForDirectCommit: pr.reviewThresholds?.minConfidenceForDirectCommit ?? 0,
|
|
55
61
|
minAuditorScoreForDirectCommit: pr.reviewThresholds?.minAuditorScoreForDirectCommit ?? 0,
|
|
56
|
-
downgradeTo: pr.reviewThresholds?.downgradeTo ??
|
|
62
|
+
downgradeTo: pr.reviewThresholds?.downgradeTo ?? "draftPR",
|
|
57
63
|
},
|
|
58
|
-
onBugDetected: pr.onBugDetected ??
|
|
59
|
-
branchNameTemplate: pr.branchNameTemplate ??
|
|
60
|
-
titleTemplate: pr.titleTemplate ??
|
|
64
|
+
onBugDetected: pr.onBugDetected ?? "failCI",
|
|
65
|
+
branchNameTemplate: pr.branchNameTemplate ?? "sela/heal-${id}",
|
|
66
|
+
titleTemplate: pr.titleTemplate ?? "fix(sela): heal selector in ${fileName}",
|
|
61
67
|
bodyTemplate: pr.bodyTemplate ?? null,
|
|
62
68
|
labels: pr.labels ?? [],
|
|
63
|
-
reportArtifactPath: pr.reportArtifactPath ??
|
|
69
|
+
reportArtifactPath: pr.reportArtifactPath ?? "sela-report.html",
|
|
64
70
|
};
|
|
65
71
|
}
|
|
66
72
|
// ═══════════════════════════════════════════════════════════════════
|
|
67
|
-
// ENV FLAG PARSING
|
|
73
|
+
// ENV FLAG PARSING - strict, fail-fast
|
|
68
74
|
//
|
|
69
75
|
// Accepted truthy values (case-insensitive): "1", "true", "yes", "on".
|
|
70
76
|
// Accepted falsy values (case-insensitive): "0", "false", "no", "off", "".
|
|
71
77
|
// Anything else → throws so misconfigured CI environments fail loudly
|
|
72
78
|
// instead of silently running the wrong mode.
|
|
73
79
|
// ═══════════════════════════════════════════════════════════════════
|
|
74
|
-
const ENV_TRUTHY = new Set([
|
|
75
|
-
const ENV_FALSY = new Set([
|
|
80
|
+
const ENV_TRUTHY = new Set(["1", "true", "yes", "on"]);
|
|
81
|
+
const ENV_FALSY = new Set(["0", "false", "no", "off", ""]);
|
|
76
82
|
function parseEnvBoolean(varName, rawValue) {
|
|
77
83
|
if (rawValue === undefined)
|
|
78
84
|
return false;
|
|
@@ -89,18 +95,18 @@ function resolveConfig(config, env = process.env) {
|
|
|
89
95
|
// When prAutomation owns the git pipeline, suppress per-heal git side-effects
|
|
90
96
|
// in SourceUpdater (autoCommit + updateStrategy:'branch') to avoid double-commits.
|
|
91
97
|
const suppressLegacyGit = prAutomation.enabled;
|
|
92
|
-
const requestedUpdateStrategy = config.updateStrategy ??
|
|
93
|
-
const updateStrategy = suppressLegacyGit && requestedUpdateStrategy ===
|
|
94
|
-
?
|
|
98
|
+
const requestedUpdateStrategy = config.updateStrategy ?? "inPlace";
|
|
99
|
+
const updateStrategy = suppressLegacyGit && requestedUpdateStrategy === "branch"
|
|
100
|
+
? "inPlace"
|
|
95
101
|
: requestedUpdateStrategy;
|
|
96
102
|
const autoCommit = suppressLegacyGit ? false : (config.autoCommit ?? false);
|
|
97
|
-
const dryRun = parseEnvBoolean(
|
|
98
|
-
const noCache = parseEnvBoolean(
|
|
103
|
+
const dryRun = parseEnvBoolean("SELA_DRY_RUN", env.SELA_DRY_RUN);
|
|
104
|
+
const noCache = parseEnvBoolean("SELA_NO_CACHE", env.SELA_NO_CACHE);
|
|
99
105
|
return {
|
|
100
106
|
thresholds: resolveThresholds(config),
|
|
101
107
|
updateStrategy,
|
|
102
108
|
autoCommit,
|
|
103
|
-
dnaStoragePath: config.dnaStoragePath ??
|
|
109
|
+
dnaStoragePath: config.dnaStoragePath ?? "fixwright-snapshots",
|
|
104
110
|
prAutomation,
|
|
105
111
|
agenticDiscovery: {
|
|
106
112
|
enabled: config.agenticDiscovery?.enabled ?? false,
|
|
@@ -29,7 +29,7 @@ export declare class HealingRegistry {
|
|
|
29
29
|
/**
|
|
30
30
|
* Resolve a selector within a specific call-site context.
|
|
31
31
|
* Falls back to a context-free lookup ONLY when the fingerprint
|
|
32
|
-
* has no entry
|
|
32
|
+
* has no entry - prevents poisoning while still enabling same-file reuse.
|
|
33
33
|
*/
|
|
34
34
|
resolveSelector(selector: string, ctx?: SelectorContext): string;
|
|
35
35
|
private walkChain;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// src/engine/HealingRegistry.ts
|
|
2
|
+
// src/engine/HealingRegistry.ts - full replacement
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.HealingRegistry = void 0;
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
@@ -60,7 +60,7 @@ class HealingRegistry {
|
|
|
60
60
|
/**
|
|
61
61
|
* Resolve a selector within a specific call-site context.
|
|
62
62
|
* Falls back to a context-free lookup ONLY when the fingerprint
|
|
63
|
-
* has no entry
|
|
63
|
+
* has no entry - prevents poisoning while still enabling same-file reuse.
|
|
64
64
|
*/
|
|
65
65
|
resolveSelector(selector, ctx) {
|
|
66
66
|
if (ctx) {
|
|
@@ -72,7 +72,7 @@ class HealingRegistry {
|
|
|
72
72
|
return resolved;
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
return selector; // No global fallback
|
|
75
|
+
return selector; // No global fallback - intentional
|
|
76
76
|
}
|
|
77
77
|
walkChain(selector, store) {
|
|
78
78
|
let current = selector;
|
|
@@ -36,7 +36,7 @@ export declare class SelaEngine {
|
|
|
36
36
|
* `gitUnifiedDiff` payload yet.
|
|
37
37
|
*
|
|
38
38
|
* Carefully skips the diff preamble (--- a/file, +++ b/file, "diff ",
|
|
39
|
-
* "index ", rename headers)
|
|
39
|
+
* "index ", rename headers) - those lines would otherwise be mistaken for
|
|
40
40
|
* a -/+ change pair and produce nonsense like the original "line replaced
|
|
41
41
|
* by itself" output. Real change lines only count once the parser has seen
|
|
42
42
|
* a "@@" hunk header.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelaEngine.d.ts","sourceRoot":"","sources":["../../src/engine/SelaEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"SelaEngine.d.ts","sourceRoot":"","sources":["../../src/engine/SelaEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAaxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAe,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAmEhE,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,mBAAmB,CAAmB;IAC9C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,eAAe,CAAkC;;IAqBnD,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiDnB,IAAI,CACR,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,QAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAilBlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAerB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2BAA2B;IA4BnC,OAAO,CAAC,yBAAyB;IAmCjC,OAAO,CAAC,kBAAkB;IA8D1B,OAAO,CAAC,oBAAoB;IAyD5B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAqItB,aAAa;IAsB3B,OAAO,CAAC,0BAA0B;IAiClC,OAAO,CAAC,WAAW;IA6Bb,wBAAwB,CAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;CAqBnB;AAED,OAAO,EAAE,CAAC"}
|