@lannguyensi/harness 0.5.0 → 0.7.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/CHANGELOG.md +154 -0
- package/README.md +162 -120
- package/dist/cli/add/mutate.d.ts +4 -0
- package/dist/cli/add/mutate.js +30 -1
- package/dist/cli/add/mutate.js.map +1 -1
- package/dist/cli/adopt/derive.d.ts +23 -0
- package/dist/cli/adopt/derive.js +85 -0
- package/dist/cli/adopt/derive.js.map +1 -1
- package/dist/cli/adopt/index.d.ts +9 -1
- package/dist/cli/adopt/index.js +72 -4
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/apply.d.ts +45 -1
- package/dist/cli/apply/apply.js +237 -25
- package/dist/cli/apply/apply.js.map +1 -1
- package/dist/cli/apply/generate-settings.d.ts +13 -1
- package/dist/cli/apply/generate-settings.js +45 -0
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/apply/index.d.ts +1 -0
- package/dist/cli/apply/index.js +1 -0
- package/dist/cli/apply/index.js.map +1 -1
- package/dist/cli/apply/next-steps.d.ts +7 -0
- package/dist/cli/apply/next-steps.js +37 -0
- package/dist/cli/apply/next-steps.js.map +1 -0
- package/dist/cli/audit.js +2 -1
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/describe.d.ts +1 -1
- package/dist/cli/describe.js +2 -0
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/diff/since-apply.js +1 -1
- package/dist/cli/diff/since-apply.js.map +1 -1
- package/dist/cli/doctor/format.js +34 -3
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.js +39 -3
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +14 -2
- package/dist/cli/explain.d.ts +10 -1
- package/dist/cli/explain.js +44 -18
- package/dist/cli/explain.js.map +1 -1
- package/dist/cli/index.js +140 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/list.d.ts +1 -1
- package/dist/cli/list.js +17 -0
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/session-export/index.d.ts +46 -0
- package/dist/cli/session-export/index.js +169 -0
- package/dist/cli/session-export/index.js.map +1 -0
- package/dist/cli/session-export/redact.d.ts +22 -0
- package/dist/cli/session-export/redact.js +47 -0
- package/dist/cli/session-export/redact.js.map +1 -0
- package/dist/cli/session-export/transcript.d.ts +24 -0
- package/dist/cli/session-export/transcript.js +162 -0
- package/dist/cli/session-export/transcript.js.map +1 -0
- package/dist/cli/validate/index.d.ts +8 -0
- package/dist/cli/validate/index.js +37 -1
- package/dist/cli/validate/index.js.map +1 -1
- package/dist/io/harness-lock.d.ts +6 -1
- package/dist/io/harness-lock.js +2 -2
- package/dist/io/harness-lock.js.map +1 -1
- package/dist/io/merge-settings.d.ts +8 -0
- package/dist/io/merge-settings.js +47 -0
- package/dist/io/merge-settings.js.map +1 -0
- package/dist/policies/ledger-client.js +4 -2
- package/dist/policies/ledger-client.js.map +1 -1
- package/dist/policies/requires.js +3 -2
- package/dist/policies/requires.js.map +1 -1
- package/dist/probes/mcp.d.ts +13 -0
- package/dist/probes/mcp.js +27 -3
- package/dist/probes/mcp.js.map +1 -1
- package/dist/runtime/intercept.js +3 -2
- package/dist/runtime/intercept.js.map +1 -1
- package/dist/runtime/ledger-record.d.ts +8 -0
- package/dist/runtime/ledger-record.js +12 -3
- package/dist/runtime/ledger-record.js.map +1 -1
- package/dist/schema/audit.d.ts +71 -0
- package/dist/schema/audit.js +32 -0
- package/dist/schema/audit.js.map +1 -0
- package/dist/schema/index.d.ts +408 -0
- package/dist/schema/index.js +21 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/workflows.d.ts +519 -0
- package/dist/schema/workflows.js +81 -0
- package/dist/schema/workflows.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
package/dist/cli/adopt/derive.js
CHANGED
|
@@ -91,4 +91,89 @@ export function synthesizeName(d, taken) {
|
|
|
91
91
|
function isRecord(x) {
|
|
92
92
|
return typeof x === "object" && x !== null && !Array.isArray(x);
|
|
93
93
|
}
|
|
94
|
+
export function parseSettingsMcpServers(raw) {
|
|
95
|
+
if (!isRecord(raw))
|
|
96
|
+
return [];
|
|
97
|
+
const root = raw;
|
|
98
|
+
if (!isRecord(root.mcpServers))
|
|
99
|
+
return [];
|
|
100
|
+
const out = [];
|
|
101
|
+
for (const [name, specRaw] of Object.entries(root.mcpServers)) {
|
|
102
|
+
if (!isRecord(specRaw))
|
|
103
|
+
continue;
|
|
104
|
+
const spec = specRaw;
|
|
105
|
+
if (typeof spec.command !== "string" || spec.command.length === 0)
|
|
106
|
+
continue;
|
|
107
|
+
const args = Array.isArray(spec.args)
|
|
108
|
+
? spec.args.filter((a) => typeof a === "string")
|
|
109
|
+
: [];
|
|
110
|
+
const command = [spec.command, ...args];
|
|
111
|
+
const entry = { name, command };
|
|
112
|
+
if (isRecord(spec.env)) {
|
|
113
|
+
const env = {};
|
|
114
|
+
for (const [k, v] of Object.entries(spec.env)) {
|
|
115
|
+
if (typeof v === "string")
|
|
116
|
+
env[k] = v;
|
|
117
|
+
}
|
|
118
|
+
if (Object.keys(env).length > 0)
|
|
119
|
+
entry.env = env;
|
|
120
|
+
}
|
|
121
|
+
out.push(entry);
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
export function manifestMcpProjection(manifest) {
|
|
126
|
+
return manifest.tools.mcp.map(toDerivedMcp);
|
|
127
|
+
}
|
|
128
|
+
function toDerivedMcp(m) {
|
|
129
|
+
const command = Array.isArray(m.command)
|
|
130
|
+
? [...m.command]
|
|
131
|
+
: m.command
|
|
132
|
+
.trim()
|
|
133
|
+
.split(/\s+/)
|
|
134
|
+
.filter((t) => t.length > 0);
|
|
135
|
+
const out = { name: m.name, command };
|
|
136
|
+
if (m.env && Object.keys(m.env).length > 0)
|
|
137
|
+
out.env = { ...m.env };
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
export function computeMcpDrift(settingsMcp, manifestMcp) {
|
|
141
|
+
const byName = new Map(manifestMcp.map((m) => [m.name, m]));
|
|
142
|
+
const out = [];
|
|
143
|
+
for (const s of settingsMcp) {
|
|
144
|
+
const existing = byName.get(s.name);
|
|
145
|
+
if (!existing) {
|
|
146
|
+
out.push({ entry: s, reason: "new" });
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (mcpEqual(existing, s))
|
|
150
|
+
continue;
|
|
151
|
+
out.push({ entry: s, reason: "modified" });
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
export { mcpEqual };
|
|
156
|
+
function mcpEqual(a, b) {
|
|
157
|
+
if (a.command.length !== b.command.length)
|
|
158
|
+
return false;
|
|
159
|
+
for (let i = 0; i < a.command.length; i++) {
|
|
160
|
+
if (a.command[i] !== b.command[i])
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const aEnv = a.env ?? {};
|
|
164
|
+
const bEnv = b.env ?? {};
|
|
165
|
+
const ak = Object.keys(aEnv).sort();
|
|
166
|
+
const bk = Object.keys(bEnv).sort();
|
|
167
|
+
if (ak.length !== bk.length)
|
|
168
|
+
return false;
|
|
169
|
+
for (let i = 0; i < ak.length; i++) {
|
|
170
|
+
const ka = ak[i];
|
|
171
|
+
const kb = bk[i];
|
|
172
|
+
if (ka !== kb)
|
|
173
|
+
return false;
|
|
174
|
+
if (aEnv[ka] !== bEnv[kb])
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
94
179
|
//# sourceMappingURL=derive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../../src/cli/adopt/derive.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../../src/cli/adopt/derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,19 @@ export interface AdoptResult {
|
|
|
9
9
|
manifestPath: string;
|
|
10
10
|
settingsPath: string;
|
|
11
11
|
driftCount: number;
|
|
12
|
+
/** Hook entries adopted (subset of driftCount). */
|
|
13
|
+
hookDriftCount: number;
|
|
14
|
+
/** MCP entries adopted (subset of driftCount). */
|
|
15
|
+
mcpDriftCount: number;
|
|
12
16
|
/** The unified diff of the proposed change. Empty when nothing to adopt. */
|
|
13
17
|
diff: string;
|
|
14
18
|
applied: boolean;
|
|
15
|
-
/** Names synthesised for the new
|
|
19
|
+
/** Names synthesised for the new hook entries. */
|
|
16
20
|
adoptedNames: string[];
|
|
21
|
+
/** Names of MCP entries adopted (new) or replaced (modified). */
|
|
22
|
+
adoptedMcpNames: string[];
|
|
23
|
+
/** Names of MCP entries replaced (existed in manifest, content differed). */
|
|
24
|
+
replacedMcpNames: string[];
|
|
17
25
|
/** Human-readable status: "no-drift" | "declined" | "applied". */
|
|
18
26
|
outcome: "no-drift" | "declined" | "applied";
|
|
19
27
|
}
|
package/dist/cli/adopt/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import { formatValidationErrors, validateBeforeWrite, } from "../../io/validate-
|
|
|
10
10
|
import { parseManifest } from "../../schema/index.js";
|
|
11
11
|
import { applyAdd } from "../add/mutate.js";
|
|
12
12
|
import { EX_FAIL, EX_NOINPUT, HarnessExitError } from "../exit-codes.js";
|
|
13
|
-
import { computeDrift, manifestProjection, parseSettingsHooks, synthesizeName, } from "./derive.js";
|
|
13
|
+
import { computeDrift, computeMcpDrift, manifestMcpProjection, manifestProjection, parseSettingsHooks, parseSettingsMcpServers, synthesizeName, } from "./derive.js";
|
|
14
14
|
const DEFAULT_BASENAME = "harness.yaml";
|
|
15
15
|
const LOCK_BASENAME = ".harness.lock";
|
|
16
16
|
function resolveManifestPath(opts) {
|
|
@@ -47,14 +47,21 @@ export async function adopt(settingsPath, opts = {}) {
|
|
|
47
47
|
}
|
|
48
48
|
const settingsHooks = parseSettingsHooks(settingsRaw);
|
|
49
49
|
const drift = computeDrift(settingsHooks, projection);
|
|
50
|
-
|
|
50
|
+
const settingsMcp = parseSettingsMcpServers(settingsRaw);
|
|
51
|
+
const mcpProjection = manifestMcpProjection(manifest);
|
|
52
|
+
const mcpDrift = computeMcpDrift(settingsMcp, mcpProjection);
|
|
53
|
+
if (drift.length === 0 && mcpDrift.length === 0) {
|
|
51
54
|
return {
|
|
52
55
|
manifestPath,
|
|
53
56
|
settingsPath,
|
|
54
57
|
driftCount: 0,
|
|
58
|
+
hookDriftCount: 0,
|
|
59
|
+
mcpDriftCount: 0,
|
|
55
60
|
diff: "",
|
|
56
61
|
applied: false,
|
|
57
62
|
adoptedNames: [],
|
|
63
|
+
adoptedMcpNames: [],
|
|
64
|
+
replacedMcpNames: [],
|
|
58
65
|
outcome: "no-drift",
|
|
59
66
|
};
|
|
60
67
|
}
|
|
@@ -70,6 +77,25 @@ export async function adopt(settingsPath, opts = {}) {
|
|
|
70
77
|
entry: buildHookEntry(name, d),
|
|
71
78
|
});
|
|
72
79
|
}
|
|
80
|
+
const adoptedMcpNames = [];
|
|
81
|
+
const replacedMcpNames = [];
|
|
82
|
+
// Preserve manifest-only fields (`health`, `enabled: false`) when
|
|
83
|
+
// replacing an existing entry. The settings.json projection only
|
|
84
|
+
// carries `command` + `env`; without this merge, hand-edits to those
|
|
85
|
+
// fields would silently wipe `health` (load-bearing for the audit /
|
|
86
|
+
// doctor / probe paths) and `enabled: false` (which would re-enable a
|
|
87
|
+
// server the user explicitly turned off).
|
|
88
|
+
const manifestByName = new Map(manifest.tools.mcp.map((m) => [m.name, m]));
|
|
89
|
+
for (const m of mcpDrift) {
|
|
90
|
+
if (m.reason === "modified")
|
|
91
|
+
replacedMcpNames.push(m.entry.name);
|
|
92
|
+
adoptedMcpNames.push(m.entry.name);
|
|
93
|
+
proposedYaml = applyAdd(proposedYaml, {
|
|
94
|
+
type: "mcp_replace",
|
|
95
|
+
name: m.entry.name,
|
|
96
|
+
entry: buildMcpEntry(m.entry, manifestByName.get(m.entry.name)),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
73
99
|
const diff = unifiedDiff({
|
|
74
100
|
fileName: path.basename(manifestPath),
|
|
75
101
|
oldText: originalYaml,
|
|
@@ -93,10 +119,14 @@ export async function adopt(settingsPath, opts = {}) {
|
|
|
93
119
|
return {
|
|
94
120
|
manifestPath,
|
|
95
121
|
settingsPath,
|
|
96
|
-
driftCount: drift.length,
|
|
122
|
+
driftCount: drift.length + mcpDrift.length,
|
|
123
|
+
hookDriftCount: drift.length,
|
|
124
|
+
mcpDriftCount: mcpDrift.length,
|
|
97
125
|
diff,
|
|
98
126
|
applied: false,
|
|
99
127
|
adoptedNames,
|
|
128
|
+
adoptedMcpNames,
|
|
129
|
+
replacedMcpNames,
|
|
100
130
|
outcome: "declined",
|
|
101
131
|
};
|
|
102
132
|
}
|
|
@@ -123,6 +153,19 @@ export async function adopt(settingsPath, opts = {}) {
|
|
|
123
153
|
next = applyAdd(next, { type: "hook", entry: buildHookEntry(name, d) });
|
|
124
154
|
lockTaken.add(name);
|
|
125
155
|
}
|
|
156
|
+
// MCP entries adopt as replace-or-append (keyed by name), so re-applying
|
|
157
|
+
// the same drift under the lock is naturally idempotent: the same name
|
|
158
|
+
// gets the same replacement. Use the freshly-read manifest's entries
|
|
159
|
+
// for the field-preservation merge, in case a concurrent adopt added
|
|
160
|
+
// health/enabled to the same name in between.
|
|
161
|
+
const lockedMcpByName = new Map(currentManifest.tools.mcp.map((m) => [m.name, m]));
|
|
162
|
+
for (const m of mcpDrift) {
|
|
163
|
+
next = applyAdd(next, {
|
|
164
|
+
type: "mcp_replace",
|
|
165
|
+
name: m.entry.name,
|
|
166
|
+
entry: buildMcpEntry(m.entry, lockedMcpByName.get(m.entry.name)),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
126
169
|
const recheck = validateBeforeWrite(parseYaml(next));
|
|
127
170
|
if (!recheck.ok) {
|
|
128
171
|
throw new HarnessExitError(`proposed manifest fails schema validation after lock acquisition:\n${formatValidationErrors(recheck.errors)}`, EX_FAIL);
|
|
@@ -132,13 +175,38 @@ export async function adopt(settingsPath, opts = {}) {
|
|
|
132
175
|
return {
|
|
133
176
|
manifestPath,
|
|
134
177
|
settingsPath,
|
|
135
|
-
driftCount: drift.length,
|
|
178
|
+
driftCount: drift.length + mcpDrift.length,
|
|
179
|
+
hookDriftCount: drift.length,
|
|
180
|
+
mcpDriftCount: mcpDrift.length,
|
|
136
181
|
diff,
|
|
137
182
|
applied: true,
|
|
138
183
|
adoptedNames,
|
|
184
|
+
adoptedMcpNames,
|
|
185
|
+
replacedMcpNames,
|
|
139
186
|
outcome: "applied",
|
|
140
187
|
};
|
|
141
188
|
}
|
|
189
|
+
function buildMcpEntry(d, existing) {
|
|
190
|
+
const entry = {
|
|
191
|
+
name: d.name,
|
|
192
|
+
command: [...d.command],
|
|
193
|
+
};
|
|
194
|
+
if (d.env && Object.keys(d.env).length > 0)
|
|
195
|
+
entry.env = { ...d.env };
|
|
196
|
+
// Carry forward manifest-only fields. settings.json's mcpServers shape
|
|
197
|
+
// has no projection for `health` (used by doctor / probe / policy paths)
|
|
198
|
+
// or `enabled: false` (explicit opt-out the user chose to keep), so a
|
|
199
|
+
// pure replace from the projected drift would silently wipe them.
|
|
200
|
+
// `enabled: true` is the schema default and is omitted to keep the
|
|
201
|
+
// re-emitted YAML clean.
|
|
202
|
+
if (existing) {
|
|
203
|
+
if (existing.health)
|
|
204
|
+
entry.health = { ...existing.health };
|
|
205
|
+
if (existing.enabled === false)
|
|
206
|
+
entry.enabled = false;
|
|
207
|
+
}
|
|
208
|
+
return entry;
|
|
209
|
+
}
|
|
142
210
|
function buildHookEntry(name, d) {
|
|
143
211
|
// Adopted hooks default to non-blocking so the captured entry doesn't
|
|
144
212
|
// unexpectedly start gating tool calls. The user can promote to soft/hard
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/adopt/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/adopt/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,40 @@ export interface ApplyOptions {
|
|
|
10
10
|
project?: string;
|
|
11
11
|
dryRun?: boolean;
|
|
12
12
|
overwriteDrift?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Phase 3 follow-up: when set, any non-empty `lockDrift` causes apply
|
|
15
|
+
* to refuse with the `lock-drift-refuse` outcome before writing,
|
|
16
|
+
* prompting, or regenerating the lock (no on-disk side effects). The
|
|
17
|
+
* user must either re-run without `--strict-lock` to acknowledge and
|
|
18
|
+
* refresh the lock, or revert the upstream asset edit.
|
|
19
|
+
*
|
|
20
|
+
* Dry-run wins: `--strict-lock --dry-run` reports the would-be drift
|
|
21
|
+
* and exits 0, leaving the existing dry-run scope intact.
|
|
22
|
+
*/
|
|
23
|
+
strictLock?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* `--target <path>`: also write the generated settings.json to <path>
|
|
26
|
+
* (in addition to harness.generated/). Resolved relative to cwd if not
|
|
27
|
+
* absolute; `~` is expanded. Pairs with `--merge` (3-way merge into an
|
|
28
|
+
* existing target file) or `--force` (overwrite existing target).
|
|
29
|
+
*/
|
|
30
|
+
target?: string;
|
|
31
|
+
/**
|
|
32
|
+
* `--merge`: when --target points at a file that already exists, do a
|
|
33
|
+
* 3-way merge: replace the keys harness owns (whichever appear in the
|
|
34
|
+
* generated output, today: `hooks`); preserve every other top-level
|
|
35
|
+
* key in the existing file verbatim.
|
|
36
|
+
*/
|
|
37
|
+
merge?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* `--force`: overwrite an existing target file with the generated
|
|
40
|
+
* settings as-is. Mutually exclusive with --merge.
|
|
41
|
+
*/
|
|
42
|
+
force?: boolean;
|
|
13
43
|
/** Test-injectable confirmation prompt; defaults to a stdin readline. */
|
|
14
44
|
prompt?: (message: string) => Promise<string>;
|
|
15
45
|
}
|
|
16
|
-
export type ApplyOutcome = "no-changes" | "applied" | "drift-refuse" | "drift-discarded" | "would-apply";
|
|
46
|
+
export type ApplyOutcome = "no-changes" | "applied" | "drift-refuse" | "drift-discarded" | "would-apply" | "lock-drift-refuse" | "target-exists-refuse";
|
|
17
47
|
export interface FileApplyOutcome {
|
|
18
48
|
basename: string;
|
|
19
49
|
path: string;
|
|
@@ -43,6 +73,20 @@ export interface ApplyResult {
|
|
|
43
73
|
dryRun: boolean;
|
|
44
74
|
/** Path of the harness.lock that was (or would be) written. */
|
|
45
75
|
lockPath: string;
|
|
76
|
+
/**
|
|
77
|
+
* Set when --target was passed: the absolute resolved target path.
|
|
78
|
+
* Present on every outcome (including target-exists-refuse and dry-run)
|
|
79
|
+
* so the CLI layer can include it in user-facing messages.
|
|
80
|
+
*/
|
|
81
|
+
targetPath?: string;
|
|
82
|
+
/** Whether the target file was written this run. */
|
|
83
|
+
targetWritten?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Human-readable one-liner describing the merge outcome, e.g.
|
|
86
|
+
* `merged into /path: replaced 1 owned key (hooks), preserved 4 other keys`.
|
|
87
|
+
* Present when --merge succeeded against an existing target.
|
|
88
|
+
*/
|
|
89
|
+
targetMergeSummary?: string;
|
|
46
90
|
}
|
|
47
91
|
declare const DRIFT_HINT_MESSAGE = "run \"harness adopt <file>\" to capture changes, or re-run with --overwrite-drift to discard them";
|
|
48
92
|
export declare function apply(opts?: ApplyOptions): Promise<ApplyResult>;
|