@getmarrow/install 0.1.44 → 0.1.46
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 +23 -1
- package/package.json +1 -1
- package/src/governed-runner.js +9 -1
- package/src/installer.js +57 -14
package/README.md
CHANGED
|
@@ -91,7 +91,29 @@ 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.46
|
|
95
|
+
|
|
96
|
+
v0.1.46 makes default install cover every workspace honestly:
|
|
97
|
+
|
|
98
|
+
- auto mode now writes MCP plus agent instructions in every project, and the SDK passive runtime whenever Node is present;
|
|
99
|
+
- Claude native hooks still install only when `.claude` is present; detected Cursor workspaces also get `.cursor/mcp.json`;
|
|
100
|
+
- Hermes, OpenClaw, and custom hosts stay event-contract only and are not claimed as native interception;
|
|
101
|
+
- generated MCP setup, launch, and certified hook commands pin current MCP `3.9.64` from source `ed8293165247e89161045c7fbf68aeee4d51c6da`;
|
|
102
|
+
- SDK detection and operator-approved upgrade rules pin exact public `3.7.59`;
|
|
103
|
+
- empty token savings stay zero until observed model usage lands.
|
|
104
|
+
|
|
105
|
+
## Previous: v0.1.45
|
|
106
|
+
|
|
107
|
+
v0.1.45 pins the one-command setup path to the published receipt-safe MCP release:
|
|
108
|
+
|
|
109
|
+
- generated MCP setup, launch, and certified hook commands pin current MCP `3.9.62`;
|
|
110
|
+
- adapter provenance records exact MCP source `c025d720af8fe9b16702ba764ff85c822adc2a26` and the live public registry integrity;
|
|
111
|
+
- MCP versions older than `3.9.62` are treated as stale so new installs receive the fail-closed runtime authorization contract;
|
|
112
|
+
- `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;
|
|
113
|
+
- self-test and governed-runner requests report install, SDK, and MCP versions together so the API can notify on any stale package;
|
|
114
|
+
- SDK `3.7.56` detection and operator-approved upgrade rules are unchanged.
|
|
115
|
+
|
|
116
|
+
## Previous: v0.1.44
|
|
95
117
|
|
|
96
118
|
v0.1.44 restores exact package-chain detection and current MCP setup truth:
|
|
97
119
|
|
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,11 @@ 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.
|
|
12
|
-
const MCP_ADAPTER_SOURCE_SHA = '
|
|
13
|
-
const MCP_ADAPTER_INTEGRITY = 'sha512-
|
|
14
|
-
const SDK_ADAPTER_VERSION = '3.7.
|
|
15
|
-
const SDK_ADAPTER_INTEGRITY = 'sha512-
|
|
11
|
+
const MCP_ADAPTER_VERSION = '3.9.64';
|
|
12
|
+
const MCP_ADAPTER_SOURCE_SHA = 'ed8293165247e89161045c7fbf68aeee4d51c6da';
|
|
13
|
+
const MCP_ADAPTER_INTEGRITY = 'sha512-D654txYXhEciNl3xqm3o5TdH8S3rkPfuVcnoQqSjc1dqAGKbq90BuyZqcUVMxO6dkSbQ3QS++Sg++zhySqSN/w==';
|
|
14
|
+
const SDK_ADAPTER_VERSION = '3.7.59';
|
|
15
|
+
const SDK_ADAPTER_INTEGRITY = 'sha512-Ba4kqOYP1tEfMoiz4ddrOP86Q5Q1ANDQpZ8rvDJwh5BLaSVKamSbyOUAQ9lNSt7S5IzlhhTHO5HrOQq35xahDg==';
|
|
16
16
|
const SDK_ADAPTER_TARBALL = `https://registry.npmjs.org/@getmarrow/sdk/-/sdk-${SDK_ADAPTER_VERSION}.tgz`;
|
|
17
17
|
const MCP_PACKAGE_SPEC = `@getmarrow/mcp@${MCP_ADAPTER_VERSION}`;
|
|
18
18
|
const ADAPTER_PROVENANCE = Object.freeze({
|
|
@@ -277,9 +277,10 @@ function parseArgs(argv) {
|
|
|
277
277
|
options.selfTest = true;
|
|
278
278
|
}
|
|
279
279
|
else if (arg === '--yes' || arg === '-y') options.yes = true;
|
|
280
|
-
else if (arg === '--repair' || arg === 'repair') {
|
|
280
|
+
else if (arg === '--repair' || arg === 'repair' || arg === 'update' || arg === '--update') {
|
|
281
281
|
options.repair = true;
|
|
282
282
|
options.yes = true;
|
|
283
|
+
options.update = true;
|
|
283
284
|
}
|
|
284
285
|
else if (arg === '--dry-run') options.dryRun = true;
|
|
285
286
|
else if (arg === '--doctor' || arg === 'doctor' || arg === 'check') options.doctor = true;
|
|
@@ -328,6 +329,7 @@ function usage() {
|
|
|
328
329
|
npx @getmarrow/install activate
|
|
329
330
|
npx @getmarrow/install --yes
|
|
330
331
|
npx @getmarrow/install --repair
|
|
332
|
+
npx @getmarrow/install update
|
|
331
333
|
npx @getmarrow/install doctor
|
|
332
334
|
npx @getmarrow/install --mcp --yes
|
|
333
335
|
npx @getmarrow/install --sdk --yes
|
|
@@ -337,6 +339,7 @@ Options:
|
|
|
337
339
|
--dry-run Print planned changes without writing
|
|
338
340
|
--doctor Check install health without writing
|
|
339
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
|
|
340
343
|
--yes, -y Write detected config files
|
|
341
344
|
--mode <mode> auto, mcp, sdk, both, or md
|
|
342
345
|
--key <key> Marrow API key for self-test. Prefer MARROW_API_KEY because CLI args can appear in process listings.
|
|
@@ -616,9 +619,10 @@ function passiveInstructions() {
|
|
|
616
619
|
|
|
617
620
|
Marrow should run passively after install:
|
|
618
621
|
|
|
619
|
-
- Use MCP
|
|
622
|
+
- Use MCP plus these instructions in every workspace: \`npx -y --package=@getmarrow/mcp@latest marrow-mcp setup\`.
|
|
620
623
|
- Use SDK passive runtime in owned Node processes: \`createPassiveRuntime().install()\`.
|
|
621
|
-
-
|
|
624
|
+
- Native Claude hooks install only when \`.claude\` is present. Cursor, Composer, Cline, and Windsurf get MCP tools on demand. Codex, Grok, Gemini, and similar CLI harnesses use the governed wrapper. Hermes, OpenClaw, and custom hosts need a bounded event adapter.
|
|
625
|
+
- Keep passive token/model usage proof enabled. Empty savings stay zero until observed model usage lands. Do not invent token, cost, or time savings.
|
|
622
626
|
- Before risky work, use Marrow's decision brief or passive prompt hook.
|
|
623
627
|
- After meaningful work, record the outcome so future agents learn from it.
|
|
624
628
|
- After Marrow blocks, warns, or requires review, use the decision trace receipt to tell the operator what changed and which recorded workflow or proof is required. Stay quiet for routine low-risk work.
|
|
@@ -1048,13 +1052,36 @@ function inspectSdkDependency(detection) {
|
|
|
1048
1052
|
};
|
|
1049
1053
|
}
|
|
1050
1054
|
|
|
1055
|
+
function defaultHarnessInstallMatrix(detection = detectEnvironment(process.cwd())) {
|
|
1056
|
+
const node = Boolean(detection.node);
|
|
1057
|
+
return HARNESS_CAPABILITY_REGISTRY.map((entry) => {
|
|
1058
|
+
const detected = detectedClient(detection) === entry.client
|
|
1059
|
+
|| (entry.client === 'claude-code' && detection.claudeCode)
|
|
1060
|
+
|| (entry.client === 'cursor' && detection.cursor)
|
|
1061
|
+
|| (entry.client === 'codex' && detection.codex);
|
|
1062
|
+
return {
|
|
1063
|
+
client: entry.client,
|
|
1064
|
+
capability_level: entry.capability_level,
|
|
1065
|
+
automatic: entry.automatic,
|
|
1066
|
+
install_surface: entry.install_surface,
|
|
1067
|
+
default_install: {
|
|
1068
|
+
mcp: true,
|
|
1069
|
+
instructions: true,
|
|
1070
|
+
sdk_passive_runtime: node,
|
|
1071
|
+
native_hooks: entry.capability_level === 'native_hooks' && Boolean(detection.claudeCode),
|
|
1072
|
+
governed_wrapper: entry.capability_level === 'governed_wrapper',
|
|
1073
|
+
},
|
|
1074
|
+
verified_passive: detected && entry.automatic.length > 0,
|
|
1075
|
+
unsupported_claim: entry.capability_level === 'event_contract'
|
|
1076
|
+
? 'Needs a bounded event adapter. MCP tools remain on demand.'
|
|
1077
|
+
: null,
|
|
1078
|
+
};
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1051
1082
|
function buildPlan(detection, options) {
|
|
1052
1083
|
const mode = options.mode === 'auto'
|
|
1053
|
-
? detection.node
|
|
1054
|
-
? 'both'
|
|
1055
|
-
: detection.node
|
|
1056
|
-
? 'sdk'
|
|
1057
|
-
: 'mcp'
|
|
1084
|
+
? detection.node ? 'both' : 'mcp'
|
|
1058
1085
|
: options.mode;
|
|
1059
1086
|
const writes = [];
|
|
1060
1087
|
|
|
@@ -1089,6 +1116,14 @@ function buildPlan(detection, options) {
|
|
|
1089
1116
|
label: 'Project MCP server config',
|
|
1090
1117
|
transform: upsertMcpServerConfig,
|
|
1091
1118
|
});
|
|
1119
|
+
if (detection.cursor) {
|
|
1120
|
+
writes.push({
|
|
1121
|
+
type: 'json-transform',
|
|
1122
|
+
path: detection.paths.cursorMcp,
|
|
1123
|
+
label: 'Cursor MCP server config',
|
|
1124
|
+
transform: upsertMcpServerConfig,
|
|
1125
|
+
});
|
|
1126
|
+
}
|
|
1092
1127
|
}
|
|
1093
1128
|
|
|
1094
1129
|
if (mode === 'md' || mode === 'both' || mode === 'mcp') {
|
|
@@ -1258,6 +1293,9 @@ async function runSelfTest(options) {
|
|
|
1258
1293
|
'x-marrow-client': options.client || sourceClient(),
|
|
1259
1294
|
'x-marrow-package': '@getmarrow/install',
|
|
1260
1295
|
'x-marrow-package-version': INSTALLER_ADAPTER_VERSION,
|
|
1296
|
+
'x-marrow-install-version': INSTALLER_ADAPTER_VERSION,
|
|
1297
|
+
'x-marrow-sdk-version': SDK_ADAPTER_VERSION,
|
|
1298
|
+
'x-marrow-mcp-version': MCP_ADAPTER_VERSION,
|
|
1261
1299
|
};
|
|
1262
1300
|
if (options.agentId) headers['x-marrow-agent-id'] = options.agentId;
|
|
1263
1301
|
|
|
@@ -1627,7 +1665,11 @@ function printReport(report) {
|
|
|
1627
1665
|
process.stdout.write(`- latest: ${update.latest_version || 'unknown'}\n`);
|
|
1628
1666
|
process.stdout.write('- automatic notification: yes\n');
|
|
1629
1667
|
process.stdout.write('- automatic local mutation: no; operator policy applies\n');
|
|
1630
|
-
if (update.
|
|
1668
|
+
if (update.owner_notice) process.stdout.write(`- tell owner: ${update.owner_notice}\n`);
|
|
1669
|
+
if (update.agent_instruction) process.stdout.write(`- agent instruction: ${update.agent_instruction}\n`);
|
|
1670
|
+
if (update.update_command || update.exact_update_command || update.auto_update_command) {
|
|
1671
|
+
process.stdout.write(`- update: ${update.auto_update_command || update.update_command || update.exact_update_command}\n`);
|
|
1672
|
+
}
|
|
1631
1673
|
if (update.verification_command || update.exact_verification_command) process.stdout.write(`- verify: ${update.verification_command || update.exact_verification_command}\n`);
|
|
1632
1674
|
}
|
|
1633
1675
|
if (report.selfTest.first_value_signal) {
|
|
@@ -1937,4 +1979,5 @@ module.exports = {
|
|
|
1937
1979
|
printReport,
|
|
1938
1980
|
ADAPTER_PROVENANCE,
|
|
1939
1981
|
HARNESS_CAPABILITY_REGISTRY,
|
|
1982
|
+
defaultHarnessInstallMatrix,
|
|
1940
1983
|
};
|