@deeeed/metamask-harness 0.83.0 → 0.85.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.
Files changed (97) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +8 -1
  3. package/adapters/extension/console-tail.mjs +11 -7
  4. package/adapters/extension/ensure-browser.sh +17 -18
  5. package/adapters/manifest.json +14 -110
  6. package/adapters/mobile/start-console-forwarder.sh +8 -0
  7. package/adapters/shared/resolve-slot-ports-core.mjs +48 -6
  8. package/adapters/shared/session-lock.mjs +43 -0
  9. package/adapters/web-dapp/metamask-signer.mjs +212 -0
  10. package/dist/adapters/extension/actions.js +5 -0
  11. package/dist/adapters/extension/console-capture.js +18 -0
  12. package/dist/adapters/extension/fixtures.js +2 -0
  13. package/dist/adapters/extension/overlay.js +5 -4
  14. package/dist/adapters/extension/run.js +4 -2
  15. package/dist/adapters/extension/runtime.js +73 -18
  16. package/dist/adapters/mobile/devices.js +5 -1
  17. package/dist/adapters/mobile/launch.js +19 -2
  18. package/dist/adapters/mobile/provision.js +4 -2
  19. package/dist/adapters/mobile/run.js +3 -2
  20. package/dist/adapters/mobile/surface.js +1 -2
  21. package/dist/adapters/mobile/verify.js +15 -7
  22. package/dist/adapters/plugin-surface.js +14 -42
  23. package/dist/adapters/session-lock.js +23 -0
  24. package/dist/adapters/web-dapp/actions.js +7 -5
  25. package/dist/adapters/web-dapp/console-capture.js +2 -20
  26. package/dist/adapters/web-dapp/run.js +25 -24
  27. package/dist/adapters/web-dapp/surface.js +32 -108
  28. package/dist/adapters.js +5 -3
  29. package/dist/command-contract.js +1351 -643
  30. package/dist/commands/check.js +5 -7
  31. package/dist/commands/debug.js +2 -2
  32. package/dist/commands/doctor.js +3 -4
  33. package/dist/commands/domain.js +4 -3
  34. package/dist/commands/fixtures.js +3 -3
  35. package/dist/commands/help.js +6 -5
  36. package/dist/commands/launch/device.js +1 -1
  37. package/dist/commands/launch/extension.js +9 -7
  38. package/dist/commands/logs.js +2 -2
  39. package/dist/commands/prepare.js +4 -4
  40. package/dist/commands/provision.js +2 -2
  41. package/dist/commands/review.js +8 -10
  42. package/dist/commands/runtime-launch.js +2 -0
  43. package/dist/commands/status.js +4 -2
  44. package/dist/commands/task-init.js +2 -3
  45. package/dist/console-classifier.js +3 -2
  46. package/dist/doctor.js +11 -4
  47. package/dist/mm-harness-cli.js +241 -1210
  48. package/dist/paths.js +9 -4
  49. package/dist/recipe-security.js +1 -1
  50. package/dist/review/knowledge.js +10 -2
  51. package/dist/runner.js +18 -3
  52. package/docs/CONTRIBUTING.md +14 -4
  53. package/docs/RECIPES.md +14 -1
  54. package/docs/cli-contract.md +8 -7
  55. package/docs/feature-guard.md +1 -1
  56. package/library/actions/extension/app/assert_no_console_errors.mjs +95 -0
  57. package/library/actions/extension/platform/cdp.mjs +26 -0
  58. package/library/actions/mobile/app/assert_no_console_errors.mjs +129 -0
  59. package/library/actions/shared/console-assert.mjs +174 -0
  60. package/library/actions/shared/console-collector.mjs +11 -4
  61. package/library/actions/shared/console-findings.mjs +108 -7
  62. package/library/actions/web-dapp/app/assert_no_console_errors.mjs +10 -54
  63. package/library/actions/web-dapp/app/launch.mjs +1 -1
  64. package/library/actions/web-dapp/platform/adapter-web-lib.mjs +18 -0
  65. package/library/actions/web-dapp/platform/hud.mjs +3 -10
  66. package/library/actions/web-dapp/platform/page.mjs +63 -18
  67. package/library/actions/web-dapp/platform/runtime.mjs +30 -179
  68. package/library/diagnostics/console-allowlist.json +13 -0
  69. package/library/manifests/extension.action-manifest.json +36 -0
  70. package/library/manifests/mobile.action-manifest.json +36 -0
  71. package/library/manifests/web-dapp.action-manifest.json +1 -1
  72. package/library/recipes/core/health/check.recipe.json +40 -0
  73. package/library/recipes/extension/health/check.recipe.json +71 -0
  74. package/library/recipes/mobile/health/check.recipe.json +71 -0
  75. package/package.json +9 -9
  76. package/scripts/completions.sh +1 -1
  77. package/site/assets/help-recipes.json +2 -1
  78. package/adapters/web-dapp/cleanup.mjs +0 -69
  79. package/adapters/web-dapp/inject.mjs +0 -75
  80. package/adapters/web-dapp/launch.mjs +0 -631
  81. package/adapters/web-dapp/lib/blocked-hosts.mjs +0 -24
  82. package/adapters/web-dapp/lib/cdp-client.mjs +0 -84
  83. package/adapters/web-dapp/lib/display.mjs +0 -115
  84. package/adapters/web-dapp/lib/hud.mjs +0 -148
  85. package/adapters/web-dapp/lib/policy-fence.mjs +0 -119
  86. package/adapters/web-dapp/lib/policy.mjs +0 -84
  87. package/adapters/web-dapp/lib/processes.mjs +0 -187
  88. package/adapters/web-dapp/lib/readiness.mjs +0 -272
  89. package/adapters/web-dapp/stop.mjs +0 -38
  90. package/adapters/web-dapp/verify.mjs +0 -51
  91. package/adapters/web-dapp/wallet-host.mjs +0 -520
  92. package/dist/adapters/web-dapp/doctor-checks.js +0 -33
  93. package/dist/adapters/web-dapp/launch.js +0 -87
  94. package/dist/adapters/web-dapp/overlay.js +0 -21
  95. package/dist/adapters/web-dapp/readiness.js +0 -10
  96. package/dist/adapters/web-dapp/stop.js +0 -20
  97. package/dist/cli.js +0 -202
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deeeed/metamask-harness",
3
- "version": "0.83.0",
3
+ "version": "0.85.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mm-harness": "bin/mm-harness"
@@ -21,15 +21,15 @@
21
21
  "check:syntax": "find . -name '*.mjs' -print0 | xargs -0 -n1 node --check"
22
22
  },
23
23
  "dependencies": {
24
- "@farmslot/adapter-node": "0.1.2",
25
- "@farmslot/adapter-rn": "0.18.0",
26
- "@farmslot/adapter-sdk": "0.6.0",
27
- "@farmslot/adapter-web": "0.4.1",
28
- "@farmslot/agent-runtime": "0.17.0",
24
+ "@farmslot/adapter-node": "0.1.6",
25
+ "@farmslot/adapter-rn": "0.19.3",
26
+ "@farmslot/adapter-sdk": "0.8.0",
27
+ "@farmslot/adapter-web": "0.6.4",
28
+ "@farmslot/agent-runtime": "0.17.1",
29
29
  "@farmslot/handoff": "^0.3.1",
30
- "@farmslot/protocol": "0.34.0",
31
- "@farmslot/recipe-cli": "0.8.0",
32
- "@farmslot/recipe-runner": "0.26.0",
30
+ "@farmslot/protocol": "0.35.0",
31
+ "@farmslot/recipe-cli": "0.11.0",
32
+ "@farmslot/recipe-runner": "0.28.0",
33
33
  "agent-device": "0.19.3",
34
34
  "commander": "^12.0.0",
35
35
  "esbuild": "0.28.1",
@@ -45,7 +45,7 @@ _mmh_flags_for() {
45
45
  execution-template) printf '%s' "--dir --domain-dir --project-worker --project-name --package-templates --package-id --flow --run-mode --platform --domain --id --provenance --include-shadowed --no-include-shadowed --title --force --json" ;;
46
46
  recipe-quality) printf '%s' "--input --output --recipe --task --evidence --params --adapter --library --advisor --advisor-model --advisor-stages --json" ;;
47
47
  actions) printf '%s' "--adapter --action --kind --raw --action-manifest --target --json" ;;
48
- call) printf '%s' "--list --domain --source --sort --arg --adapter --target --artifacts-dir --action-manifest --heal --json" ;;
48
+ call) printf '%s' "--list --domain --source --sort --adapter --target --artifacts-dir --action-manifest --heal --json" ;;
49
49
  run) printf '%s' "--list --domain --source --sort --describe --plan --adapter --artifacts-dir --target --library --cdp-port --heal --record-video --json" ;;
50
50
  doctor) printf '%s' "--adapter --target --fix --json" ;;
51
51
  install|verify|cleanup) printf '%s' "--adapter --target --json" ;;
@@ -30,7 +30,8 @@
30
30
  ],
31
31
  "commands": [
32
32
  "mm-harness doctor --fix",
33
- "mm-harness status --json"
33
+ "mm-harness status --json",
34
+ "mm-harness run health.check"
34
35
  ]
35
36
  },
36
37
  {
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env node
2
- // cleanup.mjs — `mm-harness cleanup --adapter <web-dapp adapter>`: stop the slot
3
- // browser and wallet host, then remove the slot's runtime state and the installed
4
- // wallet fixture. Browser profiles are kept unless --reset-profile.
5
- //
6
- // Inputs: --target <checkout> [--cdp-port <port>] [--reset-profile]
7
- // Outputs: JSON summary on stdout. Exit 0 cleaned; 1 the CDP port stayed busy.
8
- // Never touches: product source files, the Next.js dev server.
9
-
10
- import { existsSync, readdirSync, rmSync } from 'node:fs';
11
- import path from 'node:path';
12
- import { fileURLToPath } from 'node:url';
13
-
14
- import { recipeHarnessPath } from '@farmslot/recipe-cli/harness';
15
- import { walletFixturePath } from '../../library/actions/harness-exports.mjs';
16
- import { webDappPolicy, webDappRuntimeDir } from '../../library/actions/web-dapp/platform/runtime.mjs';
17
- import { stopConsoleCollector, stopWebDappBrowser } from './lib/processes.mjs';
18
-
19
- const usage = 'Usage: cleanup.mjs --target <checkout> [--cdp-port <port>] [--reset-profile]';
20
-
21
- export async function cleanupWebDappRuntime({ target, cdpPort, resetProfile = false }) {
22
- const root = path.resolve(target);
23
- const stop = await stopWebDappBrowser(root, { cdpPort });
24
- await stopConsoleCollector(root);
25
- const runtime = webDappRuntimeDir(root);
26
- const removed = [];
27
- if (existsSync(runtime)) {
28
- for (const entry of readdirSync(runtime)) {
29
- if (entry.startsWith('profile-') && !resetProfile) continue;
30
- rmSync(path.join(runtime, entry), { recursive: true, force: true });
31
- removed.push(entry);
32
- }
33
- }
34
- const overlay = recipeHarnessPath(root, webDappPolicy().adapterId);
35
- if (existsSync(overlay)) {
36
- rmSync(overlay, { recursive: true, force: true });
37
- removed.push(path.relative(root, overlay));
38
- }
39
- const fixture = walletFixturePath(root);
40
- if (existsSync(fixture)) {
41
- rmSync(fixture, { force: true });
42
- removed.push(path.relative(root, fixture));
43
- }
44
- return { status: 'pass', target: root, stopped: stop.stopped, cdpPortFree: stop.cdpPortFree, removed };
45
- }
46
-
47
- if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
48
- const argv = process.argv.slice(2);
49
- if (argv.includes('--help') || argv.includes('-h')) {
50
- process.stdout.write(`${usage}\n`);
51
- process.exit(0);
52
- }
53
- const value = (flag) => {
54
- const index = argv.indexOf(flag);
55
- return index >= 0 ? argv[index + 1] : undefined;
56
- };
57
- const rawPort = value('--cdp-port') ?? process.env.RECIPE_CDP_PORT ?? process.env.CDP_PORT;
58
- try {
59
- const result = await cleanupWebDappRuntime({
60
- target: value('--target') ?? process.cwd(),
61
- cdpPort: rawPort ? Number(rawPort) : undefined,
62
- resetProfile: argv.includes('--reset-profile'),
63
- });
64
- process.stdout.write(`${JSON.stringify(result)}\n`);
65
- } catch (error) {
66
- process.stdout.write(`${JSON.stringify({ status: 'fail', error: error.message })}\n`);
67
- process.exit(1);
68
- }
69
- }
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env node
2
- // inject.mjs — `mm-harness install --adapter <web-dapp adapter>`: prepare the slot
3
- // runtime directory and install the wallet fixture the web-dapp actions read.
4
- //
5
- // Inputs: --target <checkout> [--fixture <wallet-fixture.json>] [--force]
6
- // env RECIPE_WALLET_FIXTURE (fixture source when --fixture is absent)
7
- // Outputs: <target>/<harness root>/<adapter id>/install.json (overlay marker),
8
- // <target>/<runtime>/<adapter id>/ (0700), <runtime>/wallet-fixture.json (0600);
9
- // JSON summary on stdout (account names only). Exit 0 installed; 1 failure; 2 usage.
10
- // Never touches: product source files; never prints key material.
11
-
12
- import { copyFileSync, chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
13
- import path from 'node:path';
14
- import { fileURLToPath } from 'node:url';
15
-
16
- import { recipeHarnessPath, recipeRuntimeDir } from '@farmslot/recipe-cli/harness';
17
- import { walletFixturePath } from '../../library/actions/harness-exports.mjs';
18
- import { webDappPolicy, webDappRuntimeDir } from '../../library/actions/web-dapp/platform/runtime.mjs';
19
-
20
- const usage = 'Usage: inject.mjs --target <checkout> [--fixture <wallet-fixture.json>] [--force]';
21
-
22
- export function installWebDappRuntime({ target, fixture, force = false }) {
23
- const root = path.resolve(target);
24
- const { adapterId, checkout } = webDappPolicy();
25
- if (!checkout.matches(root)) throw new Error(`${root} is not a ${checkout.name} checkout (needs ${checkout.needs}).`);
26
- mkdirSync(path.join(root, recipeRuntimeDir()), { recursive: true, mode: 0o700 });
27
- mkdirSync(webDappRuntimeDir(root), { recursive: true, mode: 0o700 });
28
- const destination = walletFixturePath(root);
29
- let fixtureAction = 'kept';
30
- if (fixture && (force || !existsSync(destination))) {
31
- const parsed = JSON.parse(readFileSync(fixture, 'utf8'));
32
- if (!Array.isArray(parsed.accounts) || parsed.accounts.length === 0) throw new Error(`${fixture} has no accounts.`);
33
- copyFileSync(fixture, destination);
34
- chmodSync(destination, 0o600);
35
- fixtureAction = 'installed';
36
- } else if (!existsSync(destination)) {
37
- fixtureAction = 'missing';
38
- }
39
- const accounts = existsSync(destination)
40
- ? JSON.parse(readFileSync(destination, 'utf8')).accounts.map((account) => account?.name).filter(Boolean)
41
- : [];
42
- const marker = { schemaVersion: 1, adapter: adapterId, installedAt: new Date().toISOString(), fixture: fixtureAction };
43
- // The overlay directory is the install marker run/call auto-ensure checks.
44
- const overlay = recipeHarnessPath(root, adapterId);
45
- mkdirSync(overlay, { recursive: true, mode: 0o700 });
46
- writeFileSync(path.join(overlay, 'install.json'), `${JSON.stringify(marker, null, 2)}\n`, { mode: 0o600 });
47
- return { status: fixtureAction === 'missing' ? 'fail' : 'pass', target: root, fixture: fixtureAction, fixturePath: destination, accounts };
48
- }
49
-
50
- if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
51
- const argv = process.argv.slice(2);
52
- if (argv.includes('--help') || argv.includes('-h')) {
53
- process.stdout.write(`${usage}\n`);
54
- process.exit(0);
55
- }
56
- const value = (flag) => {
57
- const index = argv.indexOf(flag);
58
- return index >= 0 ? argv[index + 1] : undefined;
59
- };
60
- try {
61
- const result = installWebDappRuntime({
62
- target: value('--target') ?? process.cwd(),
63
- fixture: value('--fixture') ?? process.env.RECIPE_WALLET_FIXTURE,
64
- force: argv.includes('--force'),
65
- });
66
- process.stdout.write(`${JSON.stringify(result)}\n`);
67
- if (result.status !== 'pass') {
68
- process.stderr.write('No wallet fixture installed. Next: set RECIPE_WALLET_FIXTURE or pass --fixture <wallet-fixture.json>.\n');
69
- process.exit(1);
70
- }
71
- } catch (error) {
72
- process.stderr.write(`${error.message}\n`);
73
- process.exit(1);
74
- }
75
- }