@deeeed/metamask-harness 0.92.8 → 0.92.10

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 CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.92.10 - 2026-10-16
6
+
7
+ ### Changed
8
+
9
+ - Pin adapter-web 0.10.7 so isolated browser launches disable macOS code-signing clones and retain live cleanup-lock owners.
10
+ - Use the shared Farmslot task and recipe-quality commands in task and advisor examples. Preserve existing task markers and tooling receipts.
11
+
12
+ ## 0.92.9 - 2026-10-16
13
+
14
+ ### Changed
15
+
16
+ - Use recipe-cli 0.20.0 for shared review commands while preserving MetaMask reference discovery, missing-reference diagnostics and parity rules through the existing resolver and checklist rule formatter.
17
+
5
18
  ## 0.92.8 - 2026-10-16
6
19
 
7
20
  ### Changed
package/README.md CHANGED
@@ -314,20 +314,22 @@ Mobile and Extension recipes can bracket explicit UI-smoothness windows with
314
314
  mm-harness execution-template list --package-templates <catalog> --json
315
315
 
316
316
  # Write the task directory the agent works from.
317
- mm-harness task init temp/tasks/fix/TAT-1 \
317
+ farmslot task init temp/tasks/fix/TAT-1 --project <project> \
318
318
  --flow fix-bug --template fix-bug/mobile \
319
319
  --package-templates <catalog> --title "Wrong total on the receipt" --ticket TAT-1
320
320
 
321
321
  # Bring the checkout to a proven-ready state before the first step.
322
322
  mm-harness prepare --artifacts-dir temp/tasks/fix/TAT-1/artifacts --json
323
323
 
324
- # Mark progress; the task's own ./mark shim routes here.
325
- mm-harness checklist mark temp/tasks/fix/TAT-1 start
326
- mm-harness checklist mark temp/tasks/fix/TAT-1 1
327
- mm-harness checklist mark temp/tasks/fix/TAT-1 complete --mark-last
324
+ # Use the generated marker, which verifies the task's retained tooling.
325
+ temp/tasks/fix/TAT-1/mark start
326
+ temp/tasks/fix/TAT-1/mark 1
327
+ temp/tasks/fix/TAT-1/mark complete --mark-last
328
328
  ```
329
329
 
330
- `task init` writes `TASK.md`, `CHECKLIST.md`, the `mark` shim, and `inputs/`.
330
+ `farmslot task init` writes `TASK.md`, `CHECKLIST.md`, the `mark` shim, and `inputs/`.
331
+ It retains the selected CLI, provider and libraries. Use `farmslot task verify <task-dir> --json`
332
+ to check their identities. Existing tasks keep their original marker and receipt.
331
333
  `CHECKLIST.md` is the only file whose boxes count as steps. It writes no
332
334
  `checklist-target.json`; absent means `CHECKLIST.md` + `SIGNAL.json`.
333
335
 
@@ -381,7 +383,7 @@ For optional model advice matching acceptance criteria to library flows and asse
381
383
  drafts or evidence, see [Optional recipe advisor](docs/RECIPES.md#optional-recipe-advisor).
382
384
  Select a provider with `--advisor typesafe` or save `advisor.enabled` and
383
385
  `advisor.provider` through `mm-harness config`. Inspect the effective policy with
384
- `mm-harness recipe-quality advisor-status --json`; use `--advisor off` per task.
386
+ `farmslot recipe quality advisor-status --project <project> --json`; use `--advisor off` per task.
385
387
  Ordinary recipe execution needs no advisor or API key.
386
388
 
387
389
  Exporting is not required: a library registered with `mm-harness config set
@@ -411,14 +413,14 @@ into markdown, so fences cannot break.
411
413
 
412
414
  ```bash
413
415
  # Which team library owns the change (declared --domain wins, else owned-paths.json).
414
- mm-harness domain
416
+ farmslot review domain --project <project>
415
417
 
416
418
  # The review guide: base review + the library's anti-pattern families and parity rule.
417
- mm-harness help review --domain perps
419
+ farmslot review checklist --project <project> --domain perps
418
420
 
419
421
  # A checklist the mark shim can track: Setup, Base review, Domain patterns, Parity, Verdict.
420
- mm-harness review checklist --domain perps --out temp/tasks/review/TAT-1/CHECKLIST.md
421
- mm-harness review checklist --domain perps --since <last-reviewed-sha> # incremental re-review
422
+ farmslot review checklist --project <project> --domain perps --out temp/tasks/review/TAT-1/CHECKLIST.md
423
+ farmslot review checklist --project <project> --domain perps --since <last-reviewed-sha> # incremental re-review
422
424
 
423
425
  # Where this machine keeps libraries and the other platform's checkout (outside any repo).
424
426
  mm-harness config set references.extension ~/dev/metamask-extension
@@ -1,5 +1,14 @@
1
1
  import { checkDiffSummaryReady, runCloseout, teachRecipeCompletion } from "./commands/checklist.js";
2
- import { BASE_REVIEW_STEPS, REVIEW_ADAPTERS } from "./review/knowledge.js";
2
+ import {
3
+ BASE_REVIEW_STEPS,
4
+ REVIEW_ADAPTERS,
5
+ configPath,
6
+ parityAdapter,
7
+ parityReviewSteps,
8
+ readConfig,
9
+ referenceHint,
10
+ resolveReference
11
+ } from "./review/knowledge.js";
3
12
  const task = {
4
13
  stepGates: [{ label: /mm-harness check diff/u, ready: checkDiffSummaryReady }],
5
14
  closeout: runCloseout,
@@ -7,8 +16,19 @@ const task = {
7
16
  };
8
17
  const review = {
9
18
  baseRules: BASE_REVIEW_STEPS.join("\n"),
10
- runtimeIds: REVIEW_ADAPTERS,
11
- parityRuntimeIds: { mobile: "extension", extension: "mobile" }
19
+ runtimeIds: [...REVIEW_ADAPTERS, "unscoped"],
20
+ parityRuntimeIds: { mobile: "extension", extension: "mobile" },
21
+ parity: ({ runtime, target, hasParityGuide }) => {
22
+ const adapter = REVIEW_ADAPTERS.find((id) => id === runtime) ?? "unscoped";
23
+ const parity = parityAdapter(adapter);
24
+ const reference = parity ? resolveReference(parity, { target, config: readConfig(configPath()) }) : void 0;
25
+ const referenceMissing = parity && !reference ? `no ${parity} checkout found (${referenceHint(parity)})` : void 0;
26
+ return {
27
+ ...reference ? { reference } : {},
28
+ ...referenceMissing ? { referenceMissing } : {},
29
+ steps: parityReviewSteps({ adapter, reference, referenceMissing, hasParityGuide })
30
+ };
31
+ }
12
32
  };
13
33
  async function recipeAdvice(options, mode) {
14
34
  const { handleRecipeAdvice } = await import("./commands/recipe-advice.js");
@@ -445,6 +445,18 @@ function parityAdapter(adapter) {
445
445
  if (adapter === "extension") return "mobile";
446
446
  return void 0;
447
447
  }
448
+ function parityReviewSteps(input) {
449
+ const parity = parityAdapter(input.adapter);
450
+ if (input.reference && parity) {
451
+ return [
452
+ `For each touched screen, hook, or formatter, compare it with its ${parity} counterpart at ${input.reference.root}` + (input.hasParityGuide ? " using review/parity.md" : "") + `; record every divergence, and apply the library's parity rule to decide which platform must change (the reference platform is never changed to match the other).`
453
+ ];
454
+ }
455
+ if (parity) {
456
+ return [`Parity with ${parity}: not checked \u2014 ${input.referenceMissing ?? "no reference checkout"}. Record this in the verdict.`];
457
+ }
458
+ return ["Parity: core changes are consumed by both mobile and extension; confirm both consumers still compile against the public surface."];
459
+ }
448
460
  function renderReviewChecklist(input) {
449
461
  const diffRange = input.since ? `${input.since}..HEAD` : `${input.base}...HEAD`;
450
462
  const lines = [];
@@ -484,16 +496,7 @@ function renderReviewChecklist(input) {
484
496
  }
485
497
  }
486
498
  lines.push("", "## Parity");
487
- const parity = parityAdapter(input.adapter);
488
- if (input.reference && parity) {
489
- item(
490
- `For each touched screen, hook, or formatter, compare it with its ${parity} counterpart at ${input.reference.root}` + (input.knowledge?.parity ? " using review/parity.md" : "") + `; record every divergence, and apply the library's parity rule to decide which platform must change (the reference platform is never changed to match the other).`
491
- );
492
- } else if (parity) {
493
- item(`Parity with ${parity}: not checked \u2014 ${input.referenceMissing ?? "no reference checkout"}. Record this in the verdict.`);
494
- } else {
495
- item("Parity: core changes are consumed by both mobile and extension; confirm both consumers still compile against the public surface.");
496
- }
499
+ for (const step2 of parityReviewSteps({ ...input, hasParityGuide: Boolean(input.knowledge?.parity) })) item(step2);
497
500
  lines.push("", "## Verdict");
498
501
  item(VERDICT_STEP);
499
502
  return `${lines.join("\n")}
@@ -555,6 +558,7 @@ export {
555
558
  loadOwnedPaths,
556
559
  matchOwnedFiles,
557
560
  parityAdapter,
561
+ parityReviewSteps,
558
562
  parseAdvisorSettings,
559
563
  parseLibraryPathEnv,
560
564
  parseSections,
package/docs/RECIPES.md CHANGED
@@ -42,8 +42,8 @@ for more discovery or manual review. A shortlist is not the complete catalog,
42
42
  and a matching description does not establish runtime proof.
43
43
 
44
44
  ```bash
45
- mm-harness recipe-quality plan --task task.json --adapter extension --advisor typesafe --output artifacts/recipe-plan.json --json
46
- mm-harness recipe-quality advise --recipe artifacts/recipe.json --task TASK.md --adapter extension --advisor typesafe --output artifacts/recipe-advice.json --json
45
+ farmslot recipe quality plan --project <project> --task task.json --adapter extension --advisor typesafe --output artifacts/recipe-plan.json --json
46
+ farmslot recipe quality advise --project <project> --recipe artifacts/recipe.json --task TASK.md --adapter extension --advisor typesafe --output artifacts/recipe-advice.json --json
47
47
  ```
48
48
 
49
49
  Advice is disabled by default. Enable it for one call with `--advisor <provider>`,
@@ -53,7 +53,7 @@ or save an engineer preference in the existing `~/.mm-harness/config.json`:
53
53
  mm-harness config set advisor.provider typesafe
54
54
  mm-harness config set advisor.stages plan
55
55
  mm-harness config set advisor.enabled true
56
- mm-harness recipe-quality advisor-status --json
56
+ farmslot recipe quality advisor-status --project <project> --json
57
57
  ```
58
58
 
59
59
  TypeSafe is the first provider and reads `TYPESAFE_API_KEY` from the execution
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deeeed/metamask-harness",
3
- "version": "0.92.8",
3
+ "version": "0.92.10",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mm-harness": "bin/mm-harness"
@@ -24,11 +24,11 @@
24
24
  "@farmslot/adapter-node": "0.1.27",
25
25
  "@farmslot/adapter-rn": "0.22.16",
26
26
  "@farmslot/adapter-sdk": "0.15.1",
27
- "@farmslot/adapter-web": "0.10.6",
27
+ "@farmslot/adapter-web": "0.10.7",
28
28
  "@farmslot/agent-runtime": "0.25.1",
29
29
  "@farmslot/handoff": "^0.3.1",
30
30
  "@farmslot/protocol": "0.48.0",
31
- "@farmslot/recipe-cli": "0.19.1",
31
+ "@farmslot/recipe-cli": "0.20.0",
32
32
  "@farmslot/recipe-runner": "0.37.1",
33
33
  "agent-device": "0.19.3",
34
34
  "commander": "^12.0.0",