@getmarrow/install 0.1.43 → 0.1.45
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 +22 -2
- package/package.json +1 -1
- package/src/governed-runner.js +9 -1
- package/src/installer.js +31 -4
package/README.md
CHANGED
|
@@ -91,14 +91,34 @@ npx @getmarrow/install controller stop
|
|
|
91
91
|
|
|
92
92
|
Persistent controller lifecycle is currently Linux-only. On macOS or Windows, activation still installs and verifies the supported hooks without starting or signaling a background process; run `npx @getmarrow/install sidecar` under an owner-managed service and pass `--no-controller`. The controller does not silently upgrade packages, change governance policy, rotate credentials, or modify unrelated project configuration.
|
|
93
93
|
|
|
94
|
-
## What's New in v0.1.
|
|
94
|
+
## What's New in v0.1.45
|
|
95
|
+
|
|
96
|
+
v0.1.45 pins the one-command setup path to the published receipt-safe MCP release:
|
|
97
|
+
|
|
98
|
+
- generated MCP setup, launch, and certified hook commands pin current MCP `3.9.62`;
|
|
99
|
+
- adapter provenance records exact MCP source `c025d720af8fe9b16702ba764ff85c822adc2a26` and the live public registry integrity;
|
|
100
|
+
- MCP versions older than `3.9.62` are treated as stale so new installs receive the fail-closed runtime authorization contract;
|
|
101
|
+
- `npx @getmarrow/install@latest update` is the owner-approved one-command refresh of certified install/SDK/MCP pins; doctor and status print an owner notice so agents can tell the user to update;
|
|
102
|
+
- self-test and governed-runner requests report install, SDK, and MCP versions together so the API can notify on any stale package;
|
|
103
|
+
- SDK `3.7.56` detection and operator-approved upgrade rules are unchanged.
|
|
104
|
+
|
|
105
|
+
## Previous: v0.1.44
|
|
106
|
+
|
|
107
|
+
v0.1.44 restores exact package-chain detection and current MCP setup truth:
|
|
108
|
+
|
|
109
|
+
- exact declared, locked, and installed SDK `3.7.56` dependencies are recognized using the live public registry integrity;
|
|
110
|
+
- generated MCP setup, launch, and certified hook commands pin current MCP `3.9.61`;
|
|
111
|
+
- the installer exposes the certified MCP source SHA and public registry integrity in its programmatic adapter provenance without changing credentials, policy, or unrelated configuration;
|
|
112
|
+
- regression coverage rejects stale SDK lock integrity and treats MCP versions older than `3.9.61` as stale.
|
|
113
|
+
|
|
114
|
+
## Previous: v0.1.43
|
|
95
115
|
|
|
96
116
|
v0.1.43 hardens the MCP control path and makes stale client recovery explicit:
|
|
97
117
|
|
|
98
118
|
- `doctor` detects active and configured stale, mixed, or version-unknown Marrow MCP clients without exposing command lines, file paths, configuration contents, or credentials;
|
|
99
119
|
- every generated MCP launch and hook uses the package-explicit `npx --package ... marrow-mcp` form so npm can resolve the executable reliably;
|
|
100
120
|
- when repair is needed, `doctor` reports the pinned setup command, the separate owning-harness restart requirement, and a self-test verification command; it does not terminate harness processes itself;
|
|
101
|
-
- certified hooks
|
|
121
|
+
- certified hooks pinned MCP `3.9.59` and SDK `3.7.56` so the installed runtime matched that release's advertised control contract;
|
|
102
122
|
- existing harnesses retain their honest coverage level: native hooks where supported, MCP calls where available, and governed wrappers or event contracts elsewhere;
|
|
103
123
|
- package upgrades remain operator-approved and never rotate keys or rewrite unrelated configuration.
|
|
104
124
|
|
package/package.json
CHANGED
package/src/governed-runner.js
CHANGED
|
@@ -21,6 +21,7 @@ const {
|
|
|
21
21
|
stopGovernanceController,
|
|
22
22
|
} = require('./controller-manager');
|
|
23
23
|
const {
|
|
24
|
+
ADAPTER_PROVENANCE,
|
|
24
25
|
HARNESS_CAPABILITY_REGISTRY,
|
|
25
26
|
applyPlan,
|
|
26
27
|
buildPlan,
|
|
@@ -482,6 +483,9 @@ function headers(options) {
|
|
|
482
483
|
'X-Marrow-Client': sourceClient(options.client),
|
|
483
484
|
'X-Marrow-Package': '@getmarrow/install',
|
|
484
485
|
'X-Marrow-Package-Version': INSTALLER_PACKAGE_VERSION,
|
|
486
|
+
'X-Marrow-Install-Version': INSTALLER_PACKAGE_VERSION,
|
|
487
|
+
'X-Marrow-SDK-Version': ADAPTER_PROVENANCE.sdk.version,
|
|
488
|
+
'X-Marrow-MCP-Version': ADAPTER_PROVENANCE.mcp.version,
|
|
485
489
|
'User-Agent': '@getmarrow/install governed-runner',
|
|
486
490
|
};
|
|
487
491
|
return h;
|
|
@@ -1006,7 +1010,11 @@ function statusPanel(status = {}) {
|
|
|
1006
1010
|
if (update && (update.update_available === true || update.version_status === 'unknown' || notification === 'unknown' || notification === 'version_unknown' || priority === 'security_required')) {
|
|
1007
1011
|
lines.push(`Client update: ${displayText(priority, 32)}; installed=${displayText(update.installed_version || update.current_version || 'unknown', 32)}; latest=${displayText(update.latest_version || 'unknown', 32)}`);
|
|
1008
1012
|
lines.push('Automatic notification: yes; automatic local mutation: no; operator policy applies.');
|
|
1009
|
-
if (update.
|
|
1013
|
+
if (update.owner_notice) lines.push(`Tell owner: ${displayText(update.owner_notice, 240)}`);
|
|
1014
|
+
if (update.agent_instruction) lines.push(`Agent instruction: ${displayText(update.agent_instruction, 240)}`);
|
|
1015
|
+
if (update.auto_update_command || update.update_command || update.exact_update_command) {
|
|
1016
|
+
lines.push(`Update: ${displayText(update.auto_update_command || update.update_command || update.exact_update_command, 240)}`);
|
|
1017
|
+
}
|
|
1010
1018
|
if (update.verification_command || update.exact_verification_command) lines.push(`Verify: ${displayText(update.verification_command || update.exact_verification_command, 240)}`);
|
|
1011
1019
|
} else {
|
|
1012
1020
|
lines.push('Client update: current or unavailable.');
|
package/src/installer.js
CHANGED
|
@@ -8,11 +8,26 @@ const { controllerStatus, controllerSupportedPlatform, ensureGovernanceControlle
|
|
|
8
8
|
const DEFAULT_BASE_URL = 'https://api.getmarrow.ai';
|
|
9
9
|
const MARROW_BLOCK_START = '<!-- marrow:passive-start -->';
|
|
10
10
|
const MARROW_BLOCK_END = '<!-- marrow:passive-end -->';
|
|
11
|
-
const MCP_ADAPTER_VERSION = '3.9.
|
|
11
|
+
const MCP_ADAPTER_VERSION = '3.9.62';
|
|
12
|
+
const MCP_ADAPTER_SOURCE_SHA = 'c025d720af8fe9b16702ba764ff85c822adc2a26';
|
|
13
|
+
const MCP_ADAPTER_INTEGRITY = 'sha512-XwvwptwMHnH2cchrt242iQGng8t8OVDHGYORHmD04cfSn2NQoH1Y3bPoxkvlf/j/ujPtqSPpT+uZGEFNRpecZQ==';
|
|
12
14
|
const SDK_ADAPTER_VERSION = '3.7.56';
|
|
13
|
-
const SDK_ADAPTER_INTEGRITY = 'sha512-
|
|
15
|
+
const SDK_ADAPTER_INTEGRITY = 'sha512-mllohsI4DHpcVuEL58303kpGwS/pl/HMZ99mGNo3swYLomZwwfVzcner9Bn+p0b72989NOpS1l2frY/vra1gfQ==';
|
|
14
16
|
const SDK_ADAPTER_TARBALL = `https://registry.npmjs.org/@getmarrow/sdk/-/sdk-${SDK_ADAPTER_VERSION}.tgz`;
|
|
15
17
|
const MCP_PACKAGE_SPEC = `@getmarrow/mcp@${MCP_ADAPTER_VERSION}`;
|
|
18
|
+
const ADAPTER_PROVENANCE = Object.freeze({
|
|
19
|
+
mcp: Object.freeze({
|
|
20
|
+
package: '@getmarrow/mcp',
|
|
21
|
+
version: MCP_ADAPTER_VERSION,
|
|
22
|
+
source_sha: MCP_ADAPTER_SOURCE_SHA,
|
|
23
|
+
integrity: MCP_ADAPTER_INTEGRITY,
|
|
24
|
+
}),
|
|
25
|
+
sdk: Object.freeze({
|
|
26
|
+
package: '@getmarrow/sdk',
|
|
27
|
+
version: SDK_ADAPTER_VERSION,
|
|
28
|
+
integrity: SDK_ADAPTER_INTEGRITY,
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
16
31
|
const MCP_CONTEXT_HOOK_COMMAND = `npx -y --package=${MCP_PACKAGE_SPEC} marrow-mcp context-hook`;
|
|
17
32
|
const MCP_PRE_ACTION_HOOK_COMMAND = `npx -y --package=${MCP_PACKAGE_SPEC} marrow-mcp pre-action-hook`;
|
|
18
33
|
const MCP_ACTION_RESULT_HOOK_COMMAND = `npx -y --package=${MCP_PACKAGE_SPEC} marrow-mcp hook`;
|
|
@@ -262,9 +277,10 @@ function parseArgs(argv) {
|
|
|
262
277
|
options.selfTest = true;
|
|
263
278
|
}
|
|
264
279
|
else if (arg === '--yes' || arg === '-y') options.yes = true;
|
|
265
|
-
else if (arg === '--repair' || arg === 'repair') {
|
|
280
|
+
else if (arg === '--repair' || arg === 'repair' || arg === 'update' || arg === '--update') {
|
|
266
281
|
options.repair = true;
|
|
267
282
|
options.yes = true;
|
|
283
|
+
options.update = true;
|
|
268
284
|
}
|
|
269
285
|
else if (arg === '--dry-run') options.dryRun = true;
|
|
270
286
|
else if (arg === '--doctor' || arg === 'doctor' || arg === 'check') options.doctor = true;
|
|
@@ -313,6 +329,7 @@ function usage() {
|
|
|
313
329
|
npx @getmarrow/install activate
|
|
314
330
|
npx @getmarrow/install --yes
|
|
315
331
|
npx @getmarrow/install --repair
|
|
332
|
+
npx @getmarrow/install update
|
|
316
333
|
npx @getmarrow/install doctor
|
|
317
334
|
npx @getmarrow/install --mcp --yes
|
|
318
335
|
npx @getmarrow/install --sdk --yes
|
|
@@ -322,6 +339,7 @@ Options:
|
|
|
322
339
|
--dry-run Print planned changes without writing
|
|
323
340
|
--doctor Check install health without writing
|
|
324
341
|
--repair Write missing hooks/config, then run self-test and status check
|
|
342
|
+
update Same as --repair: refresh certified MCP/SDK/install pins after owner approval
|
|
325
343
|
--yes, -y Write detected config files
|
|
326
344
|
--mode <mode> auto, mcp, sdk, both, or md
|
|
327
345
|
--key <key> Marrow API key for self-test. Prefer MARROW_API_KEY because CLI args can appear in process listings.
|
|
@@ -1243,6 +1261,9 @@ async function runSelfTest(options) {
|
|
|
1243
1261
|
'x-marrow-client': options.client || sourceClient(),
|
|
1244
1262
|
'x-marrow-package': '@getmarrow/install',
|
|
1245
1263
|
'x-marrow-package-version': INSTALLER_ADAPTER_VERSION,
|
|
1264
|
+
'x-marrow-install-version': INSTALLER_ADAPTER_VERSION,
|
|
1265
|
+
'x-marrow-sdk-version': SDK_ADAPTER_VERSION,
|
|
1266
|
+
'x-marrow-mcp-version': MCP_ADAPTER_VERSION,
|
|
1246
1267
|
};
|
|
1247
1268
|
if (options.agentId) headers['x-marrow-agent-id'] = options.agentId;
|
|
1248
1269
|
|
|
@@ -1612,7 +1633,11 @@ function printReport(report) {
|
|
|
1612
1633
|
process.stdout.write(`- latest: ${update.latest_version || 'unknown'}\n`);
|
|
1613
1634
|
process.stdout.write('- automatic notification: yes\n');
|
|
1614
1635
|
process.stdout.write('- automatic local mutation: no; operator policy applies\n');
|
|
1615
|
-
if (update.
|
|
1636
|
+
if (update.owner_notice) process.stdout.write(`- tell owner: ${update.owner_notice}\n`);
|
|
1637
|
+
if (update.agent_instruction) process.stdout.write(`- agent instruction: ${update.agent_instruction}\n`);
|
|
1638
|
+
if (update.update_command || update.exact_update_command || update.auto_update_command) {
|
|
1639
|
+
process.stdout.write(`- update: ${update.auto_update_command || update.update_command || update.exact_update_command}\n`);
|
|
1640
|
+
}
|
|
1616
1641
|
if (update.verification_command || update.exact_verification_command) process.stdout.write(`- verify: ${update.verification_command || update.exact_verification_command}\n`);
|
|
1617
1642
|
}
|
|
1618
1643
|
if (report.selfTest.first_value_signal) {
|
|
@@ -1833,6 +1858,7 @@ async function install(options) {
|
|
|
1833
1858
|
|
|
1834
1859
|
return {
|
|
1835
1860
|
root: detection.root,
|
|
1861
|
+
adapterProvenance: ADAPTER_PROVENANCE,
|
|
1836
1862
|
mode: plan.mode,
|
|
1837
1863
|
writeMode,
|
|
1838
1864
|
detected: {
|
|
@@ -1919,5 +1945,6 @@ module.exports = {
|
|
|
1919
1945
|
activationProfile,
|
|
1920
1946
|
claudeNativeHookFingerprint,
|
|
1921
1947
|
printReport,
|
|
1948
|
+
ADAPTER_PROVENANCE,
|
|
1922
1949
|
HARNESS_CAPABILITY_REGISTRY,
|
|
1923
1950
|
};
|