@deeeed/metamask-harness 0.92.9 → 0.92.11
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 +13 -0
- package/README.md +9 -7
- package/dist/commands/help.js +13 -5
- package/dist/provider.js +15 -1
- package/docs/RECIPES.md +3 -3
- package/package.json +2 -2
- package/site/assets/help-recipes.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.92.11 - 2026-10-16
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Supply the existing platform-specific recipe quality guide to Farmslot quality help, with canonical recipe commands and unchanged opt-in advice.
|
|
10
|
+
|
|
11
|
+
## 0.92.10 - 2026-10-16
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Pin adapter-web 0.10.7 so isolated browser launches disable macOS code-signing clones and retain live cleanup-lock owners.
|
|
16
|
+
- Use the shared Farmslot task and recipe-quality commands in task and advisor examples. Preserve existing task markers and tooling receipts.
|
|
17
|
+
|
|
5
18
|
## 0.92.9 - 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
|
-
|
|
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
|
-
#
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
-
`
|
|
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
|
package/dist/commands/help.js
CHANGED
|
@@ -49,6 +49,17 @@ function recipeHelpPayload(topic, harnessVersion, adapter, target) {
|
|
|
49
49
|
safety: topic.safety
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
+
function recipeHelpSectionLines(topic, adapter, sectionId) {
|
|
53
|
+
const paint = (style, text) => color(style, text, { stream: process.stdout });
|
|
54
|
+
const lines = [];
|
|
55
|
+
for (const [index, section] of scopedSections(topic, adapter).entries()) {
|
|
56
|
+
if (sectionId && section.id !== sectionId) continue;
|
|
57
|
+
lines.push("", paint("label", `${index + 1}. ${section.title}`), ` ${section.instruction}`);
|
|
58
|
+
for (const detail of section.details) lines.push(` - ${detail}`);
|
|
59
|
+
for (const command of section.commands) lines.push(` $ ${paint("cmd", command)}`);
|
|
60
|
+
}
|
|
61
|
+
return lines;
|
|
62
|
+
}
|
|
52
63
|
function renderRecipeHelp(topic, harnessVersion, adapter) {
|
|
53
64
|
const paint = (style, text) => color(style, text, { stream: process.stdout });
|
|
54
65
|
const lines = [
|
|
@@ -60,11 +71,7 @@ function renderRecipeHelp(topic, harnessVersion, adapter) {
|
|
|
60
71
|
`Visual tutorial: ${paint("cmd", "mm-harness tutorial")}`
|
|
61
72
|
];
|
|
62
73
|
if (adapter === "unscoped") lines.push(paint("warn", `No MetaMask checkout detected. Next: ${unscopedNext()}.`));
|
|
63
|
-
|
|
64
|
-
lines.push("", paint("label", `${index + 1}. ${section.title}`), ` ${section.instruction}`);
|
|
65
|
-
for (const detail of section.details) lines.push(` - ${detail}`);
|
|
66
|
-
for (const command of section.commands) lines.push(` $ ${paint("cmd", command)}`);
|
|
67
|
-
}
|
|
74
|
+
lines.push(...recipeHelpSectionLines(topic, adapter));
|
|
68
75
|
lines.push("", `${paint("warn", "Safety:")} ${topic.safety}`);
|
|
69
76
|
return `${lines.join("\n")}
|
|
70
77
|
`;
|
|
@@ -88,5 +95,6 @@ export {
|
|
|
88
95
|
handleHelp,
|
|
89
96
|
loadRecipeHelp,
|
|
90
97
|
recipeHelpPayload,
|
|
98
|
+
recipeHelpSectionLines,
|
|
91
99
|
renderRecipeHelp
|
|
92
100
|
};
|
package/dist/provider.js
CHANGED
|
@@ -16,6 +16,8 @@ import { abortRunMainnetOrders, cancelRunMainnetOrders } from "./adapters/perps-
|
|
|
16
16
|
import { adapterRegistry } from "./adapters/registry.js";
|
|
17
17
|
import { getAdapterSurface } from "./adapters/surface.js";
|
|
18
18
|
import { applyDeviceTargeting } from "./commands/device-target.js";
|
|
19
|
+
import { loadRecipeHelp, recipeHelpSectionLines } from "./commands/help.js";
|
|
20
|
+
import { runnerDir } from "./paths.js";
|
|
19
21
|
import { metaMaskEngine } from "./engine.js";
|
|
20
22
|
import { providerHost } from "./host.js";
|
|
21
23
|
import { configureProviderReadiness, doctorOptions } from "./provider-doctor.js";
|
|
@@ -70,7 +72,19 @@ async function createProvider(context) {
|
|
|
70
72
|
return {
|
|
71
73
|
runtime,
|
|
72
74
|
engine: metaMaskEngine,
|
|
73
|
-
commandOptions: {
|
|
75
|
+
commandOptions: {
|
|
76
|
+
...helperCommandOptions,
|
|
77
|
+
recipeQuality: {
|
|
78
|
+
...helperCommandOptions.recipeQuality,
|
|
79
|
+
get guidance() {
|
|
80
|
+
return recipeHelpSectionLines(loadRecipeHelp(runnerDir), adapter, "quality").join("\n");
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
status: statusOptions,
|
|
84
|
+
stop: stopOptions,
|
|
85
|
+
doctor: doctorOptions,
|
|
86
|
+
logs: createLogsOptions(runtime)
|
|
87
|
+
},
|
|
74
88
|
...executes ? {
|
|
75
89
|
async cancel() {
|
|
76
90
|
await abortRunMainnetOrders(context.target.value);
|
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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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.
|
|
3
|
+
"version": "0.92.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"mm-harness": "bin/mm-harness"
|
|
@@ -24,7 +24,7 @@
|
|
|
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.
|
|
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",
|
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
"extension"
|
|
217
217
|
]
|
|
218
218
|
},
|
|
219
|
-
"Verdict: pass when every named claim ran an executable path with an assertion and consistent evidence; warn when the supported claims pass but non-blocking gaps remain; fail when a named claim has no executable path or assertion, the graph can pass unconditionally, required evidence is missing or contradictory, or the relevant path did not run. A visual claim cannot pass without a settled capture. Write only the compact {verdict, reasons} to artifacts/recipe-quality-input.json and build the artifact with
|
|
219
|
+
"Verdict: pass when every named claim ran an executable path with an assertion and consistent evidence; warn when the supported claims pass but non-blocking gaps remain; fail when a named claim has no executable path or assertion, the graph can pass unconditionally, required evidence is missing or contradictory, or the relevant path did not run. A visual claim cannot pass without a settled capture. Write only the compact {verdict, reasons} to artifacts/recipe-quality-input.json and build the artifact with farmslot recipe quality build; never hand-author it.",
|
|
220
220
|
"Independent critique, when one is requested: the verdict with one evidence-backed sentence, uncovered or weak proof targets, graph, composition, adapter and reuse findings, evidence mismatches and flake risks, and the three highest-value concrete edits.",
|
|
221
221
|
{
|
|
222
222
|
"text": "State the simulator or device, build type and app state. Unlock through a fixture or a documented primitive; keep account, balance, network, permissions and feature flags deterministic; use existing page objects, test ids and fixtures; capture only after ui.wait_for, a route assertion or a state assertion; teardown must not leak balances, pending transactions, selected network, permissions or onboarding state into the next run.",
|
|
@@ -239,9 +239,9 @@
|
|
|
239
239
|
"Use fixtures that make the intended and incorrect outcomes differ. For changing geometry or values, declare the observation window and compare the same entity and inputs; do not select only favorable samples. Promote trace, screenshots, video and provenance as one immutable package, and inspect replacement image bytes again."
|
|
240
240
|
],
|
|
241
241
|
"commands": [
|
|
242
|
-
"
|
|
243
|
-
"
|
|
244
|
-
"
|
|
242
|
+
"farmslot recipe run ./proof.recipe.json --artifacts-dir temp/recipe-proof --json",
|
|
243
|
+
"farmslot recipe status --json",
|
|
244
|
+
"farmslot recipe quality build --input recipe-quality-input.json --output recipe-quality.json --json"
|
|
245
245
|
]
|
|
246
246
|
},
|
|
247
247
|
{
|