@codyswann/lisa 4.9.3 → 4.10.0
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/all/copy-overwrite/scripts/lisa-gates.mjs +824 -3
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +21 -107
- package/dist/cli/{doctor-learnings-merge-driver.d.ts → doctor-merge-drivers.d.ts} +6 -6
- package/dist/cli/doctor-merge-drivers.d.ts.map +1 -0
- package/dist/cli/doctor-merge-drivers.js +163 -0
- package/dist/cli/doctor-merge-drivers.js.map +1 -0
- package/dist/cli/doctor.js +2 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/gitattributes-merge-drivers.d.ts +28 -0
- package/dist/core/gitattributes-merge-drivers.d.ts.map +1 -0
- package/dist/core/gitattributes-merge-drivers.js +62 -0
- package/dist/core/gitattributes-merge-drivers.js.map +1 -0
- package/dist/core/learnings-merge-driver-install.d.ts +0 -13
- package/dist/core/learnings-merge-driver-install.d.ts.map +1 -1
- package/dist/core/learnings-merge-driver-install.js +0 -16
- package/dist/core/learnings-merge-driver-install.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +7 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/merge-driver-registration.d.ts +26 -0
- package/dist/core/merge-driver-registration.d.ts.map +1 -0
- package/dist/core/merge-driver-registration.js +38 -0
- package/dist/core/merge-driver-registration.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +21 -4
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +3 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/scripts/check-merge-driver-registration.mjs +142 -0
- package/scripts/install-generated-artifact-merge-driver.mjs +200 -0
- package/scripts/lib/gitattributes-merge-drivers.mjs +52 -0
- package/scripts/merge-generated-artifact.mjs +519 -0
- package/dist/cli/doctor-learnings-merge-driver.d.ts.map +0 -1
- package/dist/cli/doctor-learnings-merge-driver.js +0 -73
- package/dist/cli/doctor-learnings-merge-driver.js.map +0 -1
|
@@ -41,7 +41,6 @@
|
|
|
41
41
|
* @module lisa-run-gates
|
|
42
42
|
*/
|
|
43
43
|
|
|
44
|
-
import { createHash } from "node:crypto";
|
|
45
44
|
import {
|
|
46
45
|
existsSync,
|
|
47
46
|
mkdirSync,
|
|
@@ -58,14 +57,23 @@ import { DIAGNOSIS, diagnoseFailure } from "./lib/gate-failure-diagnosis.mjs";
|
|
|
58
57
|
import { boundedSpawnSync } from "./lib/bounded-spawn.mjs";
|
|
59
58
|
import { invokedAsScript } from "./lib/invoked-as-script.mjs";
|
|
60
59
|
import {
|
|
60
|
+
compareCodeUnits,
|
|
61
61
|
configurationProblems,
|
|
62
62
|
declarationsAt,
|
|
63
|
+
digest,
|
|
63
64
|
momentsExecutedBy,
|
|
65
|
+
planDigest,
|
|
64
66
|
projectScripts,
|
|
65
67
|
readGates,
|
|
66
68
|
resolveMoment,
|
|
67
69
|
} from "./lisa-gates.mjs";
|
|
68
70
|
|
|
71
|
+
// Re-exported rather than dropped. `compareCodeUnits` was this module's public
|
|
72
|
+
// surface before the digest helpers moved to the registry (#3160 added it,
|
|
73
|
+
// #3013 moved its callers), and a consumer importing it from here must keep
|
|
74
|
+
// working. The definition lives beside `canonical`, which is its only caller.
|
|
75
|
+
export { compareCodeUnits };
|
|
76
|
+
|
|
69
77
|
/**
|
|
70
78
|
* What this process tells its caller. The hooks branch on every value.
|
|
71
79
|
*
|
|
@@ -1026,110 +1034,6 @@ const EVIDENCE_STATUS_FOR = Object.freeze({
|
|
|
1026
1034
|
[STATE.NOT_RUN]: "unknown",
|
|
1027
1035
|
});
|
|
1028
1036
|
|
|
1029
|
-
/**
|
|
1030
|
-
* Compare strings by UTF-16 code units, independent of the host locale.
|
|
1031
|
-
*
|
|
1032
|
-
* Evidence digests cross machines. `localeCompare` answers a human collation
|
|
1033
|
-
* question using the process locale and installed ICU data, so it can order
|
|
1034
|
-
* the same keys differently on two runners. Relational string comparison is
|
|
1035
|
-
* the ECMAScript code-unit order and is therefore the contract we can reuse.
|
|
1036
|
-
* @param {string} left Left value.
|
|
1037
|
-
* @param {string} right Right value.
|
|
1038
|
-
* @returns {number} Negative, zero, or positive.
|
|
1039
|
-
*/
|
|
1040
|
-
export function compareCodeUnits(left, right) {
|
|
1041
|
-
if (left === right) return 0;
|
|
1042
|
-
return left < right ? -1 : 1;
|
|
1043
|
-
}
|
|
1044
|
-
|
|
1045
|
-
/**
|
|
1046
|
-
* The same value with every object key in a stable order.
|
|
1047
|
-
*
|
|
1048
|
-
* A digest over `JSON.stringify` of the raw block would change when an editor
|
|
1049
|
-
* reordered two keys, which would make every prior observation read as
|
|
1050
|
-
* produced under a different contract. Ordering is normalised so the digest
|
|
1051
|
-
* answers "is this the same declaration?" and nothing else.
|
|
1052
|
-
* @param {unknown} value Any JSON value.
|
|
1053
|
-
* @returns {unknown} The same value, key-ordered.
|
|
1054
|
-
*/
|
|
1055
|
-
function canonical(value) {
|
|
1056
|
-
if (Array.isArray(value)) return value.map(canonical);
|
|
1057
|
-
if (value === null || typeof value !== "object") return value;
|
|
1058
|
-
return Object.fromEntries(
|
|
1059
|
-
Object.keys(value)
|
|
1060
|
-
.sort(compareCodeUnits)
|
|
1061
|
-
.map(key => [key, canonical(value[key])])
|
|
1062
|
-
);
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
/**
|
|
1066
|
-
* A sha256 over canonical JSON, spelled once.
|
|
1067
|
-
* @param {unknown} value Any JSON value.
|
|
1068
|
-
* @returns {string} `sha256:<hex>`.
|
|
1069
|
-
*/
|
|
1070
|
-
function digest(value) {
|
|
1071
|
-
const canonicalised = JSON.stringify(canonical(value));
|
|
1072
|
-
return `sha256:${createHash("sha256").update(canonicalised).digest("hex")}`;
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
/**
|
|
1076
|
-
* Digest of the RESOLVED PLAN at this moment — not the config file's bytes.
|
|
1077
|
-
*
|
|
1078
|
-
* Evidence is only reusable while the contract that produced it still holds,
|
|
1079
|
-
* and three things make the plan the right subject rather than the file:
|
|
1080
|
-
*
|
|
1081
|
-
* - an unrelated key elsewhere in `.lisa.config.json` being edited would force
|
|
1082
|
-
* spurious reruns against a file digest, while proving nothing changed here;
|
|
1083
|
-
* - the raw file does not capture `shippedAs` alias resolution, which reads
|
|
1084
|
-
* `package.json` scripts and genuinely changes WHICH COMMAND proved the
|
|
1085
|
-
* gate — a file digest would call two different provers the same contract;
|
|
1086
|
-
* - `includeOff: true` is what makes "this project declared the gate off" a
|
|
1087
|
-
* RECORDED fact rather than an absence indistinguishable from a registry
|
|
1088
|
-
* that never knew the gate existed.
|
|
1089
|
-
*
|
|
1090
|
-
* It is also what refuses a result recorded while a gate was `optional` from
|
|
1091
|
-
* satisfying a moment that now declares it `required` — a stale-evidence hole
|
|
1092
|
-
* no timestamp closes.
|
|
1093
|
-
* @param {object} options Inputs.
|
|
1094
|
-
* @param {object|null} options.gates The gates block.
|
|
1095
|
-
* @param {string} options.moment The moment being run.
|
|
1096
|
-
* @param {string} [options.runner] The task-runner prefix.
|
|
1097
|
-
* @param {Record<string,string>|null} [options.scripts] Project scripts.
|
|
1098
|
-
* @returns {string|null} `sha256:<hex>`, or null when no plan could resolve.
|
|
1099
|
-
*/
|
|
1100
|
-
function planDigest({ gates, moment, runner, scripts = null }) {
|
|
1101
|
-
if (!gates) return null;
|
|
1102
|
-
try {
|
|
1103
|
-
// The runner is forwarded verbatim when stated, INCLUDING a value
|
|
1104
|
-
// `resolveMoment` refuses. A truthiness guard here would let an invalid
|
|
1105
|
-
// runner fall through to the default, and the envelope would then record
|
|
1106
|
-
// `contract.runner` as one thing while digesting a plan built from
|
|
1107
|
-
// another — two facts about the same run, in one document.
|
|
1108
|
-
const options = { gates, includeOff: true, moment, scripts };
|
|
1109
|
-
const plan = resolveMoment(
|
|
1110
|
-
runner === undefined ? options : { ...options, runner }
|
|
1111
|
-
).map(gate => ({
|
|
1112
|
-
awaits: gate.awaits,
|
|
1113
|
-
command: gate.command,
|
|
1114
|
-
id: gate.id,
|
|
1115
|
-
level: gate.level,
|
|
1116
|
-
mode: gate.mode,
|
|
1117
|
-
task: gate.task,
|
|
1118
|
-
work: gate.work,
|
|
1119
|
-
}));
|
|
1120
|
-
return digest({
|
|
1121
|
-
gates: [...plan].sort((left, right) =>
|
|
1122
|
-
compareCodeUnits(left.id, right.id)
|
|
1123
|
-
),
|
|
1124
|
-
runner: runner ?? null,
|
|
1125
|
-
});
|
|
1126
|
-
} catch {
|
|
1127
|
-
// An unresolvable plan — an invalid runner, a refused configuration — has
|
|
1128
|
-
// no contract to digest. Null says so; it does not guess one.
|
|
1129
|
-
return null;
|
|
1130
|
-
}
|
|
1131
|
-
}
|
|
1132
|
-
|
|
1133
1037
|
/**
|
|
1134
1038
|
* The `@codyswann/lisa` version that owns the resolver behind this run.
|
|
1135
1039
|
*
|
|
@@ -1312,8 +1216,18 @@ function evidenceProducer() {
|
|
|
1312
1216
|
*
|
|
1313
1217
|
* `prover.version` is null rather than `"unknown"` when unresolvable. A string
|
|
1314
1218
|
* that looks like a version and is a placeholder is worse than an absent
|
|
1315
|
-
* field
|
|
1316
|
-
*
|
|
1219
|
+
* field, because a placeholder defeats the check that reads it.
|
|
1220
|
+
*
|
|
1221
|
+
* NARROWED for #3013, and the narrowing matters. This comment used to say
|
|
1222
|
+
* flatly that the verifier treats a null-version row as uncoverable. Read
|
|
1223
|
+
* literally that makes NOTHING reusable, because the pull-request producer
|
|
1224
|
+
* cannot resolve a version for every hand-written job. The rule is right for
|
|
1225
|
+
* the case it was written about and too broad for the rest, so `reusePlan` in
|
|
1226
|
+
* lisa-gates.mjs applies it by reuse class: for a TIME-SENSITIVE gate the
|
|
1227
|
+
* prover is an external scanner whose version decides what it can find, and a
|
|
1228
|
+
* null version is disqualifying; for a DETERMINISTIC gate the binding that
|
|
1229
|
+
* matters is `subject.tree` + `contract.gates_digest` + `contract.workflow_sha`,
|
|
1230
|
+
* all non-null by construction, and a null `prover.version` weakens nothing.
|
|
1317
1231
|
*
|
|
1318
1232
|
* `work` is null and stays null until a prover-output parser exists. That is
|
|
1319
1233
|
* not a shortcut: `readEvidence` demotes a `pass` with no work count to
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Name of the merge-driver check as doctor reports it. */
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const MERGE_DRIVERS_CHECK_NAME = "Merge drivers registered?";
|
|
3
3
|
/** Shape of one doctor check result (structurally identical to doctor's). */
|
|
4
4
|
interface MergeDriverCheckResult {
|
|
5
5
|
name: string;
|
|
@@ -7,17 +7,17 @@ interface MergeDriverCheckResult {
|
|
|
7
7
|
detail: string;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* Report whether this checkout can actually run the
|
|
10
|
+
* Report whether this checkout can actually run the merge drivers it maps.
|
|
11
11
|
*
|
|
12
12
|
* Warn, never fail: an unregistered driver degrades to a merge that conflicts
|
|
13
13
|
* loudly instead of one that loses content, so reddening a CI checkout over it
|
|
14
14
|
* would trade a real signal for noise. The states that are genuinely fine — a
|
|
15
15
|
* host that opted out, a directory that is not a git repository, a repository
|
|
16
|
-
* with nothing mapped
|
|
17
|
-
*
|
|
16
|
+
* with nothing mapped — report ok and say which one they are, rather than
|
|
17
|
+
* sharing one indistinguishable "skipped".
|
|
18
18
|
* @param targetPath - Project path to inspect
|
|
19
19
|
* @returns Doctor check result
|
|
20
20
|
*/
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function checkMergeDrivers(targetPath: string): Promise<MergeDriverCheckResult>;
|
|
22
22
|
export {};
|
|
23
|
-
//# sourceMappingURL=doctor-
|
|
23
|
+
//# sourceMappingURL=doctor-merge-drivers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-merge-drivers.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-merge-drivers.ts"],"names":[],"mappings":"AAwCA,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AAEpE,6EAA6E;AAC7E,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAkGD;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC,CA0CjC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `lisa doctor` check: are this checkout's merge drivers actually registered?
|
|
3
|
+
*
|
|
4
|
+
* A merge driver has two halves in two places. The `merge=<name>` mapping is
|
|
5
|
+
* committed in `.gitattributes`; the driver COMMAND is machine-local, because
|
|
6
|
+
* git refuses to run a command a repository supplied. So any clone that never
|
|
7
|
+
* ran the registration step silently falls back to git's built-in text merge —
|
|
8
|
+
* a fresh CI checkout, a teammate who cloned without installing, a worktree
|
|
9
|
+
* created before the migration ran.
|
|
10
|
+
*
|
|
11
|
+
* That degradation is far less catastrophic than it sounds: the text merge
|
|
12
|
+
* leaves conflict markers, which downstream gates diagnose, rather than
|
|
13
|
+
* resolving a file to empty. What it is not is visible. Nothing tells an
|
|
14
|
+
* operator that the driver they believe is protecting a path is not registered
|
|
15
|
+
* here — and invisibility is precisely what let one fleet project lose 19
|
|
16
|
+
* captured learnings. This check is the missing sentence.
|
|
17
|
+
*
|
|
18
|
+
* ## The roster is derived, not named
|
|
19
|
+
*
|
|
20
|
+
* This check used to name `lisa-learnings` and only `lisa-learnings`. That
|
|
21
|
+
* shape has a scheduled failure: Lisa's SECOND merge driver
|
|
22
|
+
* (`lisa-generated-artifact`, CodySwannGT/lisa#3084) would have been uncovered
|
|
23
|
+
* until somebody remembered to widen the check — which is the same
|
|
24
|
+
* "declared, and inert" defect family the driver itself exists to close.
|
|
25
|
+
* The roster now comes from `.gitattributes`, so a driver is covered the day
|
|
26
|
+
* its mapping lands rather than the day someone remembers.
|
|
27
|
+
*
|
|
28
|
+
* Per-driver knowledge is reduced to the one thing that genuinely differs: the
|
|
29
|
+
* remedy sentence, and the learnings driver's documented host opt-out.
|
|
30
|
+
* @module cli/doctor-merge-drivers
|
|
31
|
+
*/
|
|
32
|
+
import { readFile } from "node:fs/promises";
|
|
33
|
+
import * as path from "node:path";
|
|
34
|
+
import { mergeDriversInAttributes } from "../core/gitattributes-merge-drivers.js";
|
|
35
|
+
import { isLearningsMergeDriverEnabled } from "../core/learnings-merge-driver-config.js";
|
|
36
|
+
import { probeLearningsMergeDriverRegistration } from "../core/learnings-merge-driver-install.js";
|
|
37
|
+
import { LEARNINGS_MERGE_DRIVER_NAME } from "../core/learnings-merge-driver.js";
|
|
38
|
+
import { probeMergeDriverRegistration } from "../core/merge-driver-registration.js";
|
|
39
|
+
/** Name of the merge-driver check as doctor reports it. */
|
|
40
|
+
export const MERGE_DRIVERS_CHECK_NAME = "Merge drivers registered?";
|
|
41
|
+
/**
|
|
42
|
+
* Build one check result under this check's name.
|
|
43
|
+
* @param status - Reported status
|
|
44
|
+
* @param detail - Operator-readable explanation
|
|
45
|
+
* @returns Doctor check result
|
|
46
|
+
*/
|
|
47
|
+
function result(status, detail) {
|
|
48
|
+
return { name: MERGE_DRIVERS_CHECK_NAME, status, detail };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The remedy that registers one driver.
|
|
52
|
+
*
|
|
53
|
+
* Only the learnings driver rides on `lisa apply`; the generated-artifact
|
|
54
|
+
* driver is registered from Lisa's own `postinstall`, because apply is
|
|
55
|
+
* self-restricted in the source repository and would never reach it.
|
|
56
|
+
* @param driver - Merge-driver name
|
|
57
|
+
* @returns One-sentence repair instruction
|
|
58
|
+
*/
|
|
59
|
+
function remedyFor(driver) {
|
|
60
|
+
if (driver === LEARNINGS_MERGE_DRIVER_NAME) {
|
|
61
|
+
return "Fix it with `lisa install-merge-driver` (or any `lisa apply`) run here. Hosts that do not want the driver set learnings.mergeDriver: false in .lisa.config.json.";
|
|
62
|
+
}
|
|
63
|
+
return "Fix it by running your package manager's install here, which registers it from postinstall.";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The sentence naming one mapped-but-unregistered driver.
|
|
67
|
+
* @param driver - Merge-driver name
|
|
68
|
+
* @returns Operator-readable detail
|
|
69
|
+
*/
|
|
70
|
+
function unregisteredDetail(driver) {
|
|
71
|
+
return `.gitattributes maps a path to the ${driver} merge driver, but merge.${driver}.driver is not registered in this checkout — git silently falls back to its built-in text merge, so those paths conflict on every merge as if the mapping did not exist. ${remedyFor(driver)}`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read the merge drivers this checkout's `.gitattributes` asks for.
|
|
75
|
+
*
|
|
76
|
+
* The file is read directly rather than confirmed through `git check-attr`,
|
|
77
|
+
* and the imprecision runs in the safe direction: a pattern git would not
|
|
78
|
+
* actually apply yields one spurious warn, never a missed one, and this check
|
|
79
|
+
* warns rather than fails. The INSTALLER
|
|
80
|
+
* (`scripts/install-generated-artifact-merge-driver.mjs`) does confirm through
|
|
81
|
+
* git, because it writes config and must not act on a mapping git disagrees
|
|
82
|
+
* with.
|
|
83
|
+
* @param targetPath - Project path to inspect
|
|
84
|
+
* @returns Driver names, empty when there is no `.gitattributes`
|
|
85
|
+
*/
|
|
86
|
+
async function mappedDrivers(targetPath) {
|
|
87
|
+
try {
|
|
88
|
+
return mergeDriversInAttributes(await readFile(path.join(targetPath, ".gitattributes"), "utf8"));
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The drivers this checkout maps but cannot run.
|
|
96
|
+
*
|
|
97
|
+
* Probed in parallel: the roster is small, and one sequential `git config` per
|
|
98
|
+
* driver would put doctor's cost on a curve nobody expects it to be on.
|
|
99
|
+
* @param targetPath - Project path to inspect
|
|
100
|
+
* @param drivers - Driver names expected to be registered here
|
|
101
|
+
* @returns The subset with no resolvable command
|
|
102
|
+
*/
|
|
103
|
+
async function unregisteredAmong(targetPath, drivers) {
|
|
104
|
+
const states = await Promise.all(drivers.map(driver => probeMergeDriverRegistration(targetPath, driver)));
|
|
105
|
+
return drivers.filter((_, index) => states[index] !== "registered");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The "everything is fine" sentence, which says WHICH fine it is.
|
|
109
|
+
* @param expected - Drivers this checkout is expected to have registered
|
|
110
|
+
* @param optedOut - Drivers a host config has declined
|
|
111
|
+
* @returns Operator-readable detail
|
|
112
|
+
*/
|
|
113
|
+
function satisfiedDetail(expected, optedOut) {
|
|
114
|
+
const optOut = optedOut.length === 0
|
|
115
|
+
? ""
|
|
116
|
+
: ` (${optedOut.join(", ")} opted out via learnings.mergeDriver: false)`;
|
|
117
|
+
return expected.length === 0
|
|
118
|
+
? `No merge driver is expected in this checkout${optOut}`
|
|
119
|
+
: `Every mapped merge driver is registered here: ${expected.join(", ")}${optOut}`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Report whether this checkout can actually run the merge drivers it maps.
|
|
123
|
+
*
|
|
124
|
+
* Warn, never fail: an unregistered driver degrades to a merge that conflicts
|
|
125
|
+
* loudly instead of one that loses content, so reddening a CI checkout over it
|
|
126
|
+
* would trade a real signal for noise. The states that are genuinely fine — a
|
|
127
|
+
* host that opted out, a directory that is not a git repository, a repository
|
|
128
|
+
* with nothing mapped — report ok and say which one they are, rather than
|
|
129
|
+
* sharing one indistinguishable "skipped".
|
|
130
|
+
* @param targetPath - Project path to inspect
|
|
131
|
+
* @returns Doctor check result
|
|
132
|
+
*/
|
|
133
|
+
export async function checkMergeDrivers(targetPath) {
|
|
134
|
+
try {
|
|
135
|
+
// Any driver answers the repository/git question; the learnings probe is
|
|
136
|
+
// reused because it already distinguishes a missing git binary from a real
|
|
137
|
+
// non-repository, and reporting "not a git repository" about a directory
|
|
138
|
+
// that plainly is one is the failure that probe exists to prevent.
|
|
139
|
+
const repository = await probeLearningsMergeDriverRegistration(targetPath);
|
|
140
|
+
if (repository === "not-a-repository") {
|
|
141
|
+
return result("ok", "Not a git repository, so merge-driver registration does not apply");
|
|
142
|
+
}
|
|
143
|
+
if (repository === "git-unavailable") {
|
|
144
|
+
return result("warn", "git executable not found, so merge-driver registration could not be verified — install git, then re-run `lisa doctor`");
|
|
145
|
+
}
|
|
146
|
+
const drivers = await mappedDrivers(targetPath);
|
|
147
|
+
if (drivers.length === 0) {
|
|
148
|
+
return result("ok", "Nothing in .gitattributes maps a path to a custom merge driver, so there is nothing to register");
|
|
149
|
+
}
|
|
150
|
+
const optedOut = (await isLearningsMergeDriverEnabled(targetPath))
|
|
151
|
+
? []
|
|
152
|
+
: [LEARNINGS_MERGE_DRIVER_NAME];
|
|
153
|
+
const expected = drivers.filter(driver => !optedOut.includes(driver));
|
|
154
|
+
const unregistered = await unregisteredAmong(targetPath, expected);
|
|
155
|
+
return unregistered.length === 0
|
|
156
|
+
? result("ok", satisfiedDetail(expected, optedOut))
|
|
157
|
+
: result("warn", unregistered.map(unregisteredDetail).join(" "));
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return result("warn", `Could not inspect this checkout's merge drivers: ${error instanceof Error ? error.message : String(error)}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=doctor-merge-drivers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-merge-drivers.js","sourceRoot":"","sources":["../../src/cli/doctor-merge-drivers.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -10,7 +10,7 @@ import { createDetectorRegistry } from "../detection/index.js";
|
|
|
10
10
|
import { checkApplyFreshness, checkYamlRuntime, } from "./doctor-apply-freshness.js";
|
|
11
11
|
import { checkKaneProvider } from "./doctor-kane.js";
|
|
12
12
|
import { checkLearningsLedger } from "./doctor-learnings-ledger.js";
|
|
13
|
-
import {
|
|
13
|
+
import { checkMergeDrivers } from "./doctor-merge-drivers.js";
|
|
14
14
|
import { checkReadinessReportTracking } from "./doctor-readiness-tracking.js";
|
|
15
15
|
import { checkSonarProvider } from "./doctor-sonar.js";
|
|
16
16
|
import { checkLegacyCodexOverlay } from "./doctor-legacy-overlay.js";
|
|
@@ -304,7 +304,7 @@ export async function runDoctor(targetPath, options, dependencies = {}) {
|
|
|
304
304
|
// have just relocated. Reporting the merge arm second is also the order an
|
|
305
305
|
// operator can act in — which ledger is canonical, then whether this
|
|
306
306
|
// checkout can actually run the union merge that protects it.
|
|
307
|
-
await
|
|
307
|
+
await checkMergeDrivers(resolvedTarget),
|
|
308
308
|
// The readiness report's protection is a .gitignore line rather than a
|
|
309
309
|
// merge driver, because the report is derived and a blend of two
|
|
310
310
|
// assessments describes a tree that never existed. An ignore rule only
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAC7C,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;AACjE,MAAM,4BAA4B,GAAG,8BAA8B,CAAC;AAkDpE,MAAM,oBAAoB,GAAuB;IAC/C,SAAS,EAAE,KAAK;IAChB,cAAc;IACd,WAAW,EAAE,IAAI,CAAC,EAAE;QAClB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACtC,kBAAkB;IAClB,mBAAmB;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgD,EAChD,OAAgB;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,uCAAuC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,aAAa,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,MAAM,EAAE;SAClE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACnB,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,MAAM,EAAE;YAC3D,CAAC,CAAC,6BAA6B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;KAC9E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACjE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;SAChD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAEhD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,uDAAuD;SAChE,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAClC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE;aACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IAChD,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAClD,MAAM,aAAa,GAAG,gBAAgB,CAAC,mBAAmB,CACxD,MAAM,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,CAC7C,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,+BAA+B;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAwB,EACxB,OAAgB;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,+CAA+C;SACxD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;QAC1C,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CACnC,gCAAgC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAChE,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,GAAG,aAAa,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;YAClE,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC9B,OAAO,GAAG,aAAa,eAAe,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,aAAa,cAAc,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAE3E,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EACJ,QAAQ,CAAC,MAAM,KAAK,CAAC;YACnB,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,UAAkB;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,2BAA2B;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,uBAAuB;QACvB,6BAA6B;QAC7B,UAAU;KACX,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QACzC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC5C,MAAM,EACJ,OAAO,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,OAAO;QACL,mBAAmB;QACnB,yBAAyB;QACzB,kBAAkB;QAClB,kBAAkB;KACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IACrD,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,mCAAmC;SAC5C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,MAAM,CAAC,OAAO;gBACpB,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC1C,CAAC,CAAC,qEAAqE;SAC1E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,0CACN,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE;SACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,UAA8B,EAC9B,OAAsB,EACtB,eAA4C,EAAE;IAE9C,MAAM,IAAI,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG;QACb,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QAClD,4EAA4E;QAC5E,2EAA2E;QAC3E,wDAAwD;QACxD,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACzC,gBAAgB,EAAE;QAClB,MAAM,kBAAkB,CAAC,cAAc,CAAC;QACxC,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,2EAA2E;QAC3E,qCAAqC;QACrC,MAAM,qBAAqB,CAAC,cAAc,CAAC;QAC3C,mEAAmE;QACnE,yEAAyE;QACzE,mEAAmE;QACnE,uEAAuE;QACvE,MAAM,qBAAqB,CAAC,cAAc,CAAC;QAC3C,MAAM,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC;QAC7C,MAAM,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC;QAC9C,MAAM,4BAA4B,CAAC,cAAc,CAAC;QAClD,MAAM,uBAAuB,CAAC,cAAc,CAAC;QAC7C,MAAM,yBAAyB,CAAC,cAAc,CAAC;QAC/C,qEAAqE;QACrE,2EAA2E;QAC3E,wEAAwE;QACxE,4DAA4D;QAC5D,2BAA2B;QAC3B,MAAM,sBAAsB,CAAC,cAAc,CAAC;QAC5C,MAAM,iBAAiB,CAAC,cAAc,CAAC;QACvC,MAAM,gBAAgB,CAAC,cAAc,CAAC;QACtC,MAAM,qBAAqB,CAAC,cAAc,CAAC;QAC3C,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,eAAe;QACf,MAAM,oBAAoB,CAAC,cAAc,CAAC;QAC1C,wEAAwE;QACxE,4EAA4E;QAC5E,2EAA2E;QAC3E,qEAAqE;QACrE,8DAA8D;QAC9D,MAAM,iBAAiB,CAAC,cAAc,CAAC;QACvC,uEAAuE;QACvE,iEAAiE;QACjE,uEAAuE;QACvE,uEAAuE;QACvE,oDAAoD;QACpD,2BAA2B;QAC3B,MAAM,4BAA4B,CAAC,cAAc,CAAC;QAClD,MAAM,gBAAgB,CAAC,cAAc,CAAC;QACtC,uBAAuB,CAAC,cAAc,CAAC;QACvC,oEAAoE;QACpE,uEAAuE;QACvE,yEAAyE;QACzE,gCAAgC;QAChC,qEAAqE;QACrE,4EAA4E;QAC5E,MAAM,0BAA0B,CAAC,cAAc,CAAC;QAChD,oEAAoE;QACpE,2EAA2E;QAC3E,yEAAyE;QACzE,wCAAwC;QACxC,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACzC,MAAM,oBAAoB,CAAC,cAAc,CAAC;QAC1C,wEAAwE;QACxE,2EAA2E;QAC3E,yEAAyE;QACzE,uEAAuE;QACvE,MAAM,uBAAuB,CAAC,cAAc,CAAC;QAC7C,MAAM,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QACxD,SAAS,CAAC,cAAc,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI;YAC5B,CAAC,CAAC,CAAC,MAAM,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAClD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,MAAM,EACN,cAAc,EACd,OAAO,EACP,IAAI,CAAC,KAAK,CACX,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The roster of merge drivers a repository's `.gitattributes` asks for.
|
|
3
|
+
*
|
|
4
|
+
* A merge driver has two halves and only one of them is committed:
|
|
5
|
+
* `.gitattributes` names WHICH driver a path uses, while `merge.<name>.driver`
|
|
6
|
+
* — the command — is machine-local, because git refuses to run a command a
|
|
7
|
+
* repository supplies. A mapping whose driver is unregistered is an error
|
|
8
|
+
* nowhere: git falls back to its built-in text merge and says nothing.
|
|
9
|
+
*
|
|
10
|
+
* Deriving the roster rather than hardcoding it is the point. Lisa's first
|
|
11
|
+
* driver had a registration check that named it, so Lisa's second driver would
|
|
12
|
+
* have been uncovered until somebody widened it — the same "declared, and
|
|
13
|
+
* inert" shape the checks exist to catch.
|
|
14
|
+
*
|
|
15
|
+
* This is duplicated, deliberately, in
|
|
16
|
+
* `scripts/lib/gitattributes-merge-drivers.mjs`, which runs from `postinstall`
|
|
17
|
+
* before any TypeScript build exists and therefore cannot import this module. A
|
|
18
|
+
* unit test asserts the two agree on the repository's real `.gitattributes`, so
|
|
19
|
+
* they cannot drift.
|
|
20
|
+
* @module core/gitattributes-merge-drivers
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Custom driver names named by a `.gitattributes` file.
|
|
24
|
+
* @param contents - Whole `.gitattributes` file contents
|
|
25
|
+
* @returns Sorted, de-duplicated custom driver names
|
|
26
|
+
*/
|
|
27
|
+
export declare function mergeDriversInAttributes(contents: string): readonly string[];
|
|
28
|
+
//# sourceMappingURL=gitattributes-merge-drivers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitattributes-merge-drivers.d.ts","sourceRoot":"","sources":["../../src/core/gitattributes-merge-drivers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA4BH;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAW5E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The roster of merge drivers a repository's `.gitattributes` asks for.
|
|
3
|
+
*
|
|
4
|
+
* A merge driver has two halves and only one of them is committed:
|
|
5
|
+
* `.gitattributes` names WHICH driver a path uses, while `merge.<name>.driver`
|
|
6
|
+
* — the command — is machine-local, because git refuses to run a command a
|
|
7
|
+
* repository supplies. A mapping whose driver is unregistered is an error
|
|
8
|
+
* nowhere: git falls back to its built-in text merge and says nothing.
|
|
9
|
+
*
|
|
10
|
+
* Deriving the roster rather than hardcoding it is the point. Lisa's first
|
|
11
|
+
* driver had a registration check that named it, so Lisa's second driver would
|
|
12
|
+
* have been uncovered until somebody widened it — the same "declared, and
|
|
13
|
+
* inert" shape the checks exist to catch.
|
|
14
|
+
*
|
|
15
|
+
* This is duplicated, deliberately, in
|
|
16
|
+
* `scripts/lib/gitattributes-merge-drivers.mjs`, which runs from `postinstall`
|
|
17
|
+
* before any TypeScript build exists and therefore cannot import this module. A
|
|
18
|
+
* unit test asserts the two agree on the repository's real `.gitattributes`, so
|
|
19
|
+
* they cannot drift.
|
|
20
|
+
* @module core/gitattributes-merge-drivers
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Built-in merge strategies, which need no registration.
|
|
24
|
+
*
|
|
25
|
+
* Reporting one of these as unregistered would be noise, and noise is how a
|
|
26
|
+
* check teaches an operator to stop reading it.
|
|
27
|
+
*/
|
|
28
|
+
const BUILT_IN_STRATEGIES = new Set([
|
|
29
|
+
"text",
|
|
30
|
+
"binary",
|
|
31
|
+
"union",
|
|
32
|
+
"ours",
|
|
33
|
+
]);
|
|
34
|
+
/** Prefix of the attribute that names a driver. */
|
|
35
|
+
const MERGE_ATTRIBUTE = "merge=";
|
|
36
|
+
/**
|
|
37
|
+
* Compare driver names for a stable, locale-independent roster order.
|
|
38
|
+
* @param left - First driver name
|
|
39
|
+
* @param right - Second driver name
|
|
40
|
+
* @returns Negative, zero, or positive per the usual comparator contract
|
|
41
|
+
*/
|
|
42
|
+
function compareNames(left, right) {
|
|
43
|
+
return left.localeCompare(right, "en");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Custom driver names named by a `.gitattributes` file.
|
|
47
|
+
* @param contents - Whole `.gitattributes` file contents
|
|
48
|
+
* @returns Sorted, de-duplicated custom driver names
|
|
49
|
+
*/
|
|
50
|
+
export function mergeDriversInAttributes(contents) {
|
|
51
|
+
const named = contents
|
|
52
|
+
.split("\n")
|
|
53
|
+
.map(line => line.trim())
|
|
54
|
+
.filter(line => line !== "" && !line.startsWith("#"))
|
|
55
|
+
// The first field is the path pattern; every field after it is an attribute.
|
|
56
|
+
.flatMap(line => line.split(/\s+/u).slice(1))
|
|
57
|
+
.filter(attribute => attribute.startsWith(MERGE_ATTRIBUTE))
|
|
58
|
+
.map(attribute => attribute.slice(MERGE_ATTRIBUTE.length))
|
|
59
|
+
.filter(name => name !== "" && !BUILT_IN_STRATEGIES.has(name));
|
|
60
|
+
return [...new Set(named)].sort(compareNames);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=gitattributes-merge-drivers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitattributes-merge-drivers.js","sourceRoot":"","sources":["../../src/core/gitattributes-merge-drivers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;GAKG;AACH,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IACvD,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AAEH,mDAAmD;AACnD,MAAM,eAAe,GAAG,QAAQ,CAAC;AAEjC;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa;IAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,KAAK,GAAG,QAAQ;SACnB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrD,6EAA6E;SAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;SAC1D,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SACzD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -53,19 +53,6 @@ export type MergeDriverRegistration = "registered" | "unregistered" | "not-a-rep
|
|
|
53
53
|
* @returns Closed registration state
|
|
54
54
|
*/
|
|
55
55
|
export declare function probeLearningsMergeDriverRegistration(projectRoot: string): Promise<MergeDriverRegistration>;
|
|
56
|
-
/**
|
|
57
|
-
* Report whether git resolves one path's `merge` attribute to this driver.
|
|
58
|
-
*
|
|
59
|
-
* Asks git rather than parsing `.gitattributes`, because the answer depends on
|
|
60
|
-
* pattern precedence and on every attributes source git consults (the working
|
|
61
|
-
* tree file, `.git/info/attributes`, a configured `core.attributesFile`).
|
|
62
|
-
* Reading the root file alone would claim a mapping the repository may not
|
|
63
|
-
* actually have — or miss one it does.
|
|
64
|
-
* @param projectRoot - Project directory to inspect
|
|
65
|
-
* @param ledgerPath - Project-relative path to the learnings ledger
|
|
66
|
-
* @returns True when the path is mapped to the learnings merge driver
|
|
67
|
-
*/
|
|
68
|
-
export declare function isLearningsPathMappedToDriver(projectRoot: string, ledgerPath: string): Promise<boolean>;
|
|
69
56
|
/**
|
|
70
57
|
* Register the union merge driver in one project's local git config.
|
|
71
58
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-merge-driver-install.d.ts","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChE,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuFD;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB;;;;;;;;;GASG;AACH,wBAAsB,qCAAqC,CACzD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CASlC;AAED
|
|
1
|
+
{"version":3,"file":"learnings-merge-driver-install.d.ts","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChE,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuFD;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB;;;;;;;;;GASG;AACH,wBAAsB,qCAAqC,CACzD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CASlC;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,8BAAmC,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAkDnC"}
|
|
@@ -127,22 +127,6 @@ export async function probeLearningsMergeDriverRegistration(projectRoot) {
|
|
|
127
127
|
const current = await tryGit(["config", "--get", DRIVER_KEY], projectRoot);
|
|
128
128
|
return current.ok && current.stdout !== "" ? "registered" : "unregistered";
|
|
129
129
|
}
|
|
130
|
-
/**
|
|
131
|
-
* Report whether git resolves one path's `merge` attribute to this driver.
|
|
132
|
-
*
|
|
133
|
-
* Asks git rather than parsing `.gitattributes`, because the answer depends on
|
|
134
|
-
* pattern precedence and on every attributes source git consults (the working
|
|
135
|
-
* tree file, `.git/info/attributes`, a configured `core.attributesFile`).
|
|
136
|
-
* Reading the root file alone would claim a mapping the repository may not
|
|
137
|
-
* actually have — or miss one it does.
|
|
138
|
-
* @param projectRoot - Project directory to inspect
|
|
139
|
-
* @param ledgerPath - Project-relative path to the learnings ledger
|
|
140
|
-
* @returns True when the path is mapped to the learnings merge driver
|
|
141
|
-
*/
|
|
142
|
-
export async function isLearningsPathMappedToDriver(projectRoot, ledgerPath) {
|
|
143
|
-
const result = await tryGit(["check-attr", "merge", "--", ledgerPath], projectRoot);
|
|
144
|
-
return (result.ok && result.stdout.endsWith(`merge: ${LEARNINGS_MERGE_DRIVER_NAME}`));
|
|
145
|
-
}
|
|
146
130
|
/**
|
|
147
131
|
* Register the union merge driver in one project's local git config.
|
|
148
132
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-merge-driver-install.js","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"learnings-merge-driver-install.js","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAmoBjC,CAAC"}
|