@deeeed/metamask-harness 0.34.3 → 0.35.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.
- package/CHANGELOG.md +21 -0
- package/adapters/core/inject.sh +3 -3
- package/adapters/extension/inject.mjs +3 -4
- package/adapters/mobile/inject.sh +4 -3
- package/adapters/mobile/verify.sh +37 -0
- package/dist/adapters/extension/runtime.js +60 -15
- package/dist/adapters/extension/surface.js +6 -1
- package/dist/adapters/mobile/source-freshness.js +51 -14
- package/dist/adapters/mobile/surface.js +6 -1
- package/dist/doctor.js +30 -1
- package/package.json +1 -1
- package/scripts/site-contrast.mjs +38 -11
- package/site/architecture.html +14 -7
- package/site/assets/metamask-fox.svg +24 -0
- package/site/assets/progress.mjs +52 -1
- package/site/assets/style.css +152 -25
- package/site/cheatsheet.html +5 -6
- package/site/ecosystem.html +162 -0
- package/site/how-it-works.html +8 -9
- package/site/index.html +104 -39
- package/site/perps.html +103 -45
- package/site/recipes.html +5 -6
- package/site/reviewers.html +5 -6
- package/site/tutorials/index.html +5 -6
- package/site/tutorials/v1.html +5 -6
- package/site/tutorials/v2.html +6 -8
- package/site/tutorials/v3.html +5 -6
- package/site/tutorials/v4.html +5 -6
- package/site/tutorials/v5.html +5 -6
- package/site/tutorials/v6.html +5 -6
- package/site/tutorials/v7.html +5 -6
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M32.7077 32.7522L25.1688 30.5174L19.4833 33.9008L15.5167 33.8991L9.82793 30.5174L2.29225 32.7522L0 25.0489L2.29225 16.4993L0 9.27094L2.29225 0.312256L14.0674 7.31554H20.9326L32.7077 0.312256L35 9.27094L32.7077 16.4993L35 25.0489L32.7077 32.7522Z" fill="#FF5C16"/>
|
|
3
|
+
<path d="M2.29395 0.312256L14.0691 7.32047L13.6008 12.1301L2.29395 0.312256Z" fill="#FF5C16"/>
|
|
4
|
+
<path d="M9.82959 25.0522L15.0106 28.9811L9.82959 30.5175V25.0522Z" fill="#FF5C16"/>
|
|
5
|
+
<path d="M14.5966 18.5565L13.6009 12.1333L7.22692 16.5009L7.22363 16.4993V16.5025L7.24335 20.9983L9.82809 18.5565H9.82974H14.5966Z" fill="#FF5C16"/>
|
|
6
|
+
<path d="M32.7077 0.312256L20.9326 7.32047L21.3993 12.1301L32.7077 0.312256Z" fill="#FF5C16"/>
|
|
7
|
+
<path d="M25.1722 25.0522L19.9912 28.9811L25.1722 30.5175V25.0522Z" fill="#FF5C16"/>
|
|
8
|
+
<path d="M27.7766 16.5025H27.7783H27.7766V16.4993L27.775 16.5009L21.401 12.1333L20.4053 18.5565H25.1722L27.7586 20.9983L27.7766 16.5025Z" fill="#FF5C16"/>
|
|
9
|
+
<path d="M9.82793 30.5175L2.29225 32.7522L0 25.0522H9.82793V30.5175Z" fill="#E34807"/>
|
|
10
|
+
<path d="M14.5947 18.5549L16.0341 27.8406L14.0393 22.6777L7.23975 20.9984L9.82613 18.5549H14.593H14.5947Z" fill="#E34807"/>
|
|
11
|
+
<path d="M25.1721 30.5175L32.7078 32.7522L35.0001 25.0522H25.1721V30.5175Z" fill="#E34807"/>
|
|
12
|
+
<path d="M20.4053 18.5549L18.9658 27.8406L20.9607 22.6777L27.7602 20.9984L25.1722 18.5549H20.4053Z" fill="#E34807"/>
|
|
13
|
+
<path d="M0 25.0488L2.29225 16.4993H7.22183L7.23991 20.9967L14.0394 22.676L16.0343 27.8389L15.0089 28.976L9.82793 25.0472H0V25.0488Z" fill="#FF8D5D"/>
|
|
14
|
+
<path d="M35.0001 25.0488L32.7078 16.4993H27.7783L27.7602 20.9967L20.9607 22.676L18.9658 27.8389L19.9912 28.976L25.1722 25.0472H35.0001V25.0488Z" fill="#FF8D5D"/>
|
|
15
|
+
<path d="M20.9325 7.31543H17.4999H14.0673L13.6006 12.1251L16.0342 27.834H18.9656L21.4008 12.1251L20.9325 7.31543Z" fill="#FF8D5D"/>
|
|
16
|
+
<path d="M2.29225 0.312256L0 9.27094L2.29225 16.4993H7.22183L13.5991 12.1301L2.29225 0.312256Z" fill="#661800"/>
|
|
17
|
+
<path d="M13.17 20.4199H10.9369L9.72095 21.6062L14.0409 22.6727L13.17 20.4182V20.4199Z" fill="#661800"/>
|
|
18
|
+
<path d="M32.7077 0.312256L34.9999 9.27094L32.7077 16.4993H27.7781L21.4009 12.1301L32.7077 0.312256Z" fill="#661800"/>
|
|
19
|
+
<path d="M21.833 20.4199H24.0694L25.2853 21.6079L20.9604 22.676L21.833 20.4182V20.4199Z" fill="#661800"/>
|
|
20
|
+
<path d="M19.4817 30.8362L19.9911 28.9794L18.9658 27.8423H16.0327L15.0073 28.9794L15.5167 30.8362" fill="#661800"/>
|
|
21
|
+
<path d="M19.4816 30.8359V33.9021H15.5166V30.8359H19.4816Z" fill="#C0C4CD"/>
|
|
22
|
+
<path d="M9.82959 30.5142L15.52 33.9008V30.8346L15.0106 28.9778L9.82959 30.5142Z" fill="#E7EBF6"/>
|
|
23
|
+
<path d="M25.1721 30.5142L19.4817 33.9008V30.8346L19.9911 28.9778L25.1721 30.5142Z" fill="#E7EBF6"/>
|
|
24
|
+
</svg>
|
package/site/assets/progress.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Shared behaviour for the getting-started site: checklist progress, copy
|
|
3
|
-
* buttons, platform filters, and the layer diagram. No dependencies, no
|
|
3
|
+
* buttons, platform filters, tabs, and the layer diagram. No dependencies, no
|
|
4
4
|
* network, no tracking. Progress lives in localStorage under
|
|
5
5
|
* `mmh.progress.<page>`, where <page> comes from body[data-progress-page].
|
|
6
6
|
* Pages that share a namespace share their state (the How it works walkthrough and the V1
|
|
@@ -235,6 +235,56 @@
|
|
|
235
235
|
select('all');
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
+
/* ---------- tabs ---------- */
|
|
239
|
+
|
|
240
|
+
/*
|
|
241
|
+
* One tablist per group, roving tabindex: only the selected tab is in the
|
|
242
|
+
* tab order, arrows move between them. Panels stay in the DOM so their
|
|
243
|
+
* commands remain copyable the moment a tab is shown.
|
|
244
|
+
*
|
|
245
|
+
* The markup ships every panel visible and the tablist hidden; hiding is
|
|
246
|
+
* this function's first act. Without it — stale cache, blocked module,
|
|
247
|
+
* file:// — the reader gets all three prompts stacked instead of controls
|
|
248
|
+
* that do nothing.
|
|
249
|
+
*/
|
|
250
|
+
function initTabs() {
|
|
251
|
+
[].slice.call(document.querySelectorAll('[role="tablist"]')).forEach(function (list) {
|
|
252
|
+
var tabs = [].slice.call(list.querySelectorAll('[role="tab"]'));
|
|
253
|
+
if (!tabs.length) return;
|
|
254
|
+
list.hidden = false;
|
|
255
|
+
|
|
256
|
+
function select(tab, focus) {
|
|
257
|
+
tabs.forEach(function (other) {
|
|
258
|
+
var on = other === tab;
|
|
259
|
+
other.setAttribute('aria-selected', String(on));
|
|
260
|
+
other.tabIndex = on ? 0 : -1;
|
|
261
|
+
var panel = document.getElementById(other.getAttribute('aria-controls'));
|
|
262
|
+
if (panel) panel.hidden = !on;
|
|
263
|
+
});
|
|
264
|
+
if (focus) tab.focus();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
tabs.forEach(function (tab, i) {
|
|
268
|
+
tab.addEventListener('click', function () { select(tab, false); });
|
|
269
|
+
tab.addEventListener('keydown', function (e) {
|
|
270
|
+
var next = null;
|
|
271
|
+
if (e.key === 'ArrowRight') next = tabs[(i + 1) % tabs.length];
|
|
272
|
+
if (e.key === 'ArrowLeft') next = tabs[(i - 1 + tabs.length) % tabs.length];
|
|
273
|
+
if (e.key === 'Home') next = tabs[0];
|
|
274
|
+
if (e.key === 'End') next = tabs[tabs.length - 1];
|
|
275
|
+
if (!next) return;
|
|
276
|
+
e.preventDefault();
|
|
277
|
+
select(next, true);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
var current = tabs.filter(function (t) {
|
|
282
|
+
return t.getAttribute('aria-selected') === 'true';
|
|
283
|
+
})[0];
|
|
284
|
+
select(current || tabs[0], false);
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
|
|
238
288
|
/* ---------- layer diagram ---------- */
|
|
239
289
|
|
|
240
290
|
function initLayers() {
|
|
@@ -261,6 +311,7 @@
|
|
|
261
311
|
initCopy();
|
|
262
312
|
initCellCopy();
|
|
263
313
|
initFilters();
|
|
314
|
+
initTabs();
|
|
264
315
|
initLayers();
|
|
265
316
|
}
|
|
266
317
|
|
package/site/assets/style.css
CHANGED
|
@@ -110,8 +110,10 @@ main { padding-bottom: 6rem; }
|
|
|
110
110
|
.topbar-inner {
|
|
111
111
|
display: flex;
|
|
112
112
|
align-items: center;
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
flex-wrap: wrap;
|
|
114
|
+
gap: 0.5rem 1.5rem;
|
|
115
|
+
min-height: 60px;
|
|
116
|
+
padding: 0.5rem 0;
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
.brand {
|
|
@@ -125,31 +127,24 @@ main { padding-bottom: 6rem; }
|
|
|
125
127
|
}
|
|
126
128
|
.brand:hover { text-decoration: none; }
|
|
127
129
|
|
|
128
|
-
|
|
129
|
-
.brand-mark {
|
|
130
|
-
width: 20px;
|
|
131
|
-
height: 20px;
|
|
132
|
-
flex: none;
|
|
133
|
-
border-radius: 5px;
|
|
134
|
-
background: linear-gradient(145deg, var(--accent) 0%, var(--accent-deep) 100%);
|
|
135
|
-
transform: rotate(45deg);
|
|
136
|
-
box-shadow: 0 0 0 1px rgba(246, 133, 27, 0.3), 0 3px 12px rgba(246, 133, 27, 0.22);
|
|
137
|
-
}
|
|
130
|
+
.brand-mark { width: 22px; height: 22px; flex: none; display: block; }
|
|
138
131
|
|
|
139
132
|
.brand-name { font-family: var(--mono); font-size: 0.95rem; }
|
|
140
133
|
|
|
134
|
+
/* Six items fit a laptop on one line; below that they wrap onto a second row
|
|
135
|
+
rather than scrolling a label out of sight. */
|
|
141
136
|
.nav {
|
|
142
137
|
display: flex;
|
|
143
138
|
gap: 0.3rem;
|
|
144
139
|
margin-left: auto;
|
|
145
140
|
min-width: 0;
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
scrollbar-width: thin;
|
|
141
|
+
flex-wrap: wrap;
|
|
142
|
+
justify-content: flex-end;
|
|
149
143
|
}
|
|
150
144
|
|
|
151
145
|
.nav a {
|
|
152
146
|
flex: none;
|
|
147
|
+
white-space: nowrap;
|
|
153
148
|
color: var(--text-dim);
|
|
154
149
|
font-size: 0.885rem;
|
|
155
150
|
font-weight: 500;
|
|
@@ -272,16 +267,7 @@ main { padding-bottom: 6rem; }
|
|
|
272
267
|
text-align: center;
|
|
273
268
|
}
|
|
274
269
|
|
|
275
|
-
.lobby-mark {
|
|
276
|
-
display: block;
|
|
277
|
-
width: 26px;
|
|
278
|
-
height: 26px;
|
|
279
|
-
margin: 0 auto 2rem;
|
|
280
|
-
border-radius: 7px;
|
|
281
|
-
background: linear-gradient(145deg, var(--accent) 0%, var(--accent-deep) 100%);
|
|
282
|
-
transform: rotate(45deg);
|
|
283
|
-
box-shadow: 0 0 0 1px rgba(246, 133, 27, 0.3), 0 4px 18px rgba(246, 133, 27, 0.25);
|
|
284
|
-
}
|
|
270
|
+
.lobby-mark { display: block; width: 52px; height: 52px; margin: 0 auto 1.6rem; }
|
|
285
271
|
|
|
286
272
|
.lobby h1 {
|
|
287
273
|
font-size: clamp(2rem, 4.6vw, 2.85rem);
|
|
@@ -341,6 +327,77 @@ main { padding-bottom: 6rem; }
|
|
|
341
327
|
border-color: var(--pass);
|
|
342
328
|
}
|
|
343
329
|
|
|
330
|
+
/* ---------- quick start (lobby) ----------
|
|
331
|
+
Two steps: set up once, then pick the work. Left-aligned inside the centred
|
|
332
|
+
lobby, because everything in here is read line by line. */
|
|
333
|
+
|
|
334
|
+
.qs { text-align: left; margin-top: 1.8rem; }
|
|
335
|
+
|
|
336
|
+
.qs-step + .qs-step { margin-top: 2.6rem; }
|
|
337
|
+
|
|
338
|
+
.qs-title {
|
|
339
|
+
display: flex;
|
|
340
|
+
align-items: center;
|
|
341
|
+
font-size: 1.16rem;
|
|
342
|
+
font-weight: 640;
|
|
343
|
+
margin: 0 0 0.35rem;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/* The margin rather than a flex gap: the badge stays separated from the title
|
|
347
|
+
even when the flex layout does not apply. */
|
|
348
|
+
.qs-num {
|
|
349
|
+
flex: none;
|
|
350
|
+
width: 1.7rem;
|
|
351
|
+
height: 1.7rem;
|
|
352
|
+
margin-right: 0.75rem;
|
|
353
|
+
display: inline-grid;
|
|
354
|
+
place-items: center;
|
|
355
|
+
border-radius: 50%;
|
|
356
|
+
background: var(--accent-soft);
|
|
357
|
+
border: 1px solid var(--accent-line);
|
|
358
|
+
color: var(--accent);
|
|
359
|
+
font-family: var(--mono);
|
|
360
|
+
font-size: 0.8rem;
|
|
361
|
+
line-height: 1;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.qs-why { color: var(--text-dim); font-size: 0.95rem; margin-bottom: 0.9rem; }
|
|
365
|
+
|
|
366
|
+
/* ---------- tabs ---------- */
|
|
367
|
+
|
|
368
|
+
.tablist {
|
|
369
|
+
display: flex;
|
|
370
|
+
flex-wrap: wrap;
|
|
371
|
+
gap: 0.4rem;
|
|
372
|
+
margin-bottom: 0.9rem;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.tab {
|
|
376
|
+
font: 560 0.9rem var(--sans);
|
|
377
|
+
color: var(--text-dim);
|
|
378
|
+
background: var(--surface);
|
|
379
|
+
border: 1px solid var(--line);
|
|
380
|
+
border-radius: 99px;
|
|
381
|
+
padding: 0.4rem 1rem;
|
|
382
|
+
cursor: pointer;
|
|
383
|
+
transition: all 0.16s var(--ease);
|
|
384
|
+
}
|
|
385
|
+
.tab:hover { color: var(--text); border-color: var(--accent-line); }
|
|
386
|
+
.tab[aria-selected="true"] {
|
|
387
|
+
color: var(--accent);
|
|
388
|
+
background: var(--accent-soft);
|
|
389
|
+
border-color: var(--accent-line);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.qs-panel[hidden] { display: none; }
|
|
393
|
+
.qs-panel:focus-visible { outline-offset: 4px; }
|
|
394
|
+
|
|
395
|
+
.qs-panel-why { color: var(--text-dim); font-size: 0.92rem; margin-bottom: 0.5rem; }
|
|
396
|
+
|
|
397
|
+
/* These prompts are the call to action too, so their copy control never hides. */
|
|
398
|
+
.qs-panel .cmd .copy { opacity: 1; }
|
|
399
|
+
.qs-panel .cmd pre { white-space: pre-wrap; word-break: break-word; font-size: 0.82rem; }
|
|
400
|
+
|
|
344
401
|
.lobby-cta { display: flex; justify-content: center; gap: 0.7rem; flex-wrap: wrap; margin-top: 1.6rem; }
|
|
345
402
|
|
|
346
403
|
.lobby-fine {
|
|
@@ -892,6 +949,76 @@ tr[hidden], .filter-hidden { display: none !important; }
|
|
|
892
949
|
.verdict.pass { color: var(--pass); }
|
|
893
950
|
.verdict.fail { color: var(--fail); }
|
|
894
951
|
|
|
952
|
+
/* ---------- dependency map ----------
|
|
953
|
+
A column of nodes with the edge label between them, so the direction reads
|
|
954
|
+
top to bottom without a diagram library. */
|
|
955
|
+
|
|
956
|
+
.map { margin: 1.5rem 0 2.5rem; }
|
|
957
|
+
|
|
958
|
+
.node {
|
|
959
|
+
background: linear-gradient(180deg, var(--surface) 0%, var(--bg-raised) 100%);
|
|
960
|
+
border: 1px solid var(--line);
|
|
961
|
+
border-radius: var(--radius);
|
|
962
|
+
padding: 1.25rem 1.4rem;
|
|
963
|
+
}
|
|
964
|
+
.node:hover { border-color: var(--accent-line); }
|
|
965
|
+
|
|
966
|
+
/* The one you install. */
|
|
967
|
+
.node-key { border-color: var(--accent-line); }
|
|
968
|
+
|
|
969
|
+
.node-tag {
|
|
970
|
+
display: block;
|
|
971
|
+
font-family: var(--mono);
|
|
972
|
+
font-size: 0.72rem;
|
|
973
|
+
letter-spacing: 0.08em;
|
|
974
|
+
text-transform: uppercase;
|
|
975
|
+
color: var(--text-faint);
|
|
976
|
+
margin-bottom: 0.35rem;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
.node-name { font-size: 1.12rem; font-weight: 640; margin: 0 0 0.4rem; }
|
|
980
|
+
.node-what { font-size: 0.94rem; color: var(--text-dim); margin-bottom: 0.7rem; }
|
|
981
|
+
|
|
982
|
+
.node-list {
|
|
983
|
+
list-style: none;
|
|
984
|
+
margin: 0 0 0.8rem;
|
|
985
|
+
padding: 0;
|
|
986
|
+
display: flex;
|
|
987
|
+
flex-wrap: wrap;
|
|
988
|
+
gap: 0.35rem 0.5rem;
|
|
989
|
+
font-size: 0.86rem;
|
|
990
|
+
}
|
|
991
|
+
.node-list li { color: var(--text-dim); }
|
|
992
|
+
|
|
993
|
+
.node-url {
|
|
994
|
+
display: block;
|
|
995
|
+
font-family: var(--mono);
|
|
996
|
+
font-size: 0.8rem;
|
|
997
|
+
word-break: break-all;
|
|
998
|
+
margin-bottom: 0.15rem;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
.node .badge { margin: 0.55rem 0.4rem 0 0; display: inline-block; }
|
|
1002
|
+
.node-more { display: block; font-size: 0.88rem; margin-top: 0.6rem; }
|
|
1003
|
+
|
|
1004
|
+
/* Edge labels carry the verb; the arrow alone would not say what flows. */
|
|
1005
|
+
.map-edge {
|
|
1006
|
+
margin: 0.7rem 0;
|
|
1007
|
+
text-align: center;
|
|
1008
|
+
font-family: var(--mono);
|
|
1009
|
+
font-size: 0.8rem;
|
|
1010
|
+
color: var(--text-faint);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
.map-split { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
|
|
1014
|
+
.map-row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; align-items: start; }
|
|
1015
|
+
|
|
1016
|
+
@media (max-width: 780px) {
|
|
1017
|
+
.map-split { grid-template-columns: 1fr; }
|
|
1018
|
+
.map-split .map-edge:last-child { margin-top: 0; }
|
|
1019
|
+
.map-row { grid-template-columns: 1fr; }
|
|
1020
|
+
}
|
|
1021
|
+
|
|
895
1022
|
/* ---------- misc ---------- */
|
|
896
1023
|
|
|
897
1024
|
.btn-row { display: flex; flex-wrap: wrap; gap: 0.7rem; margin-top: 1.8rem; }
|
package/site/cheatsheet.html
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>Cheatsheet — mm-harness</title>
|
|
7
7
|
<meta name="description" content="Every mm-harness command worth knowing, filterable by platform, with copy buttons.">
|
|
8
|
-
<link rel="
|
|
8
|
+
<link rel="icon" href="assets/metamask-fox.svg" type="image/svg+xml">
|
|
9
|
+
<link rel="stylesheet" href="assets/style.css?v=4">
|
|
9
10
|
</head>
|
|
10
11
|
<body data-progress-page="cheatsheet">
|
|
11
12
|
<a class="skip" href="#daily">Skip to the commands</a>
|
|
@@ -13,18 +14,16 @@
|
|
|
13
14
|
<header class="topbar">
|
|
14
15
|
<div class="wrap-wide topbar-inner">
|
|
15
16
|
<a class="brand" href="index.html">
|
|
16
|
-
<
|
|
17
|
+
<img class="brand-mark" src="assets/metamask-fox.svg" alt="" width="22" height="22">
|
|
17
18
|
<span class="brand-name">recipes</span>
|
|
18
19
|
</a>
|
|
19
20
|
<nav class="nav" aria-label="Main">
|
|
20
21
|
<a class="nav-cta" href="index.html#prompt">Quick start</a>
|
|
21
22
|
<a href="how-it-works.html">How it works</a>
|
|
22
|
-
<a href="
|
|
23
|
-
<a href="perps.html">Perps</a>
|
|
23
|
+
<a href="perps.html">Team / Perps</a>
|
|
24
24
|
<a href="cheatsheet.html" aria-current="page">Cheatsheet</a>
|
|
25
25
|
<a href="architecture.html">Architecture</a>
|
|
26
26
|
<a href="tutorials/index.html">Tutorials</a>
|
|
27
|
-
<a href="reviewers.html">For Reviewers</a>
|
|
28
27
|
</nav>
|
|
29
28
|
</div>
|
|
30
29
|
</header>
|
|
@@ -303,6 +302,6 @@
|
|
|
303
302
|
</div>
|
|
304
303
|
</footer>
|
|
305
304
|
|
|
306
|
-
<script type="module" src="assets/progress.mjs"></script>
|
|
305
|
+
<script type="module" src="assets/progress.mjs?v=4"></script>
|
|
307
306
|
</body>
|
|
308
307
|
</html>
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Ecosystem — which repo is which</title>
|
|
7
|
+
<meta name="description" content="A dependency map of the repositories and packages behind the recipe workflow: skills, mm-harness, the spec and engine, team recipe libraries, the product repos, and the learnings inbox.">
|
|
8
|
+
<link rel="icon" href="assets/metamask-fox.svg" type="image/svg+xml">
|
|
9
|
+
<link rel="stylesheet" href="assets/style.css?v=4">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<a class="skip" href="#map">Skip to the map</a>
|
|
13
|
+
|
|
14
|
+
<header class="topbar">
|
|
15
|
+
<div class="wrap topbar-inner">
|
|
16
|
+
<a class="brand" href="index.html">
|
|
17
|
+
<img class="brand-mark" src="assets/metamask-fox.svg" alt="" width="22" height="22">
|
|
18
|
+
<span class="brand-name">recipes</span>
|
|
19
|
+
</a>
|
|
20
|
+
<nav class="nav" aria-label="Main">
|
|
21
|
+
<a class="nav-cta" href="index.html#prompt">Quick start</a>
|
|
22
|
+
<a href="how-it-works.html">How it works</a>
|
|
23
|
+
<a href="perps.html">Team / Perps</a>
|
|
24
|
+
<a href="cheatsheet.html">Cheatsheet</a>
|
|
25
|
+
<a href="architecture.html">Architecture</a>
|
|
26
|
+
<a href="tutorials/index.html">Tutorials</a>
|
|
27
|
+
</nav>
|
|
28
|
+
</div>
|
|
29
|
+
</header>
|
|
30
|
+
|
|
31
|
+
<main>
|
|
32
|
+
<section class="wrap hero" style="padding-bottom:0.5rem">
|
|
33
|
+
<span class="eyebrow">Repositories</span>
|
|
34
|
+
<h1>Which repo is which</h1>
|
|
35
|
+
<p class="lede">
|
|
36
|
+
Six things sit behind a recipe run, and it is not obvious from the outside which one you install,
|
|
37
|
+
which one you contribute to, and which one is just a dependency. This is the dependency map — not
|
|
38
|
+
a pitch.
|
|
39
|
+
</p>
|
|
40
|
+
</section>
|
|
41
|
+
|
|
42
|
+
<section class="wrap-wide">
|
|
43
|
+
<div class="map" id="map">
|
|
44
|
+
|
|
45
|
+
<article class="node">
|
|
46
|
+
<span class="node-tag">You invoke this</span>
|
|
47
|
+
<h2 class="node-name">Skills</h2>
|
|
48
|
+
<p class="node-what">
|
|
49
|
+
The workflows — <code>mms-recipe-cook</code>, <code>mms-recipe-pr-qa-review</code> and the rest.
|
|
50
|
+
They call <code>mm-harness</code>; they are not a dependency of it.
|
|
51
|
+
</p>
|
|
52
|
+
<a class="node-url" href="https://github.com/Consensys/skills">github.com/Consensys/skills</a>
|
|
53
|
+
<span class="badge">internal</span>
|
|
54
|
+
</article>
|
|
55
|
+
|
|
56
|
+
<p class="map-edge">calls ↓</p>
|
|
57
|
+
|
|
58
|
+
<article class="node node-key">
|
|
59
|
+
<span class="node-tag">The runner</span>
|
|
60
|
+
<h2 class="node-name">mm-harness</h2>
|
|
61
|
+
<p class="node-what">
|
|
62
|
+
Launch, typed actions, graph execution, artifacts. Installed from npm as
|
|
63
|
+
<code>@deeeed/metamask-harness</code>; the MetaMask-specific layer lives here.
|
|
64
|
+
</p>
|
|
65
|
+
<a class="node-url" href="https://github.com/MetaMask/experimental-metamask-harness">github.com/MetaMask/experimental-metamask-harness</a>
|
|
66
|
+
<span class="badge">private</span>
|
|
67
|
+
<span class="badge">npm @deeeed/metamask-harness</span>
|
|
68
|
+
</article>
|
|
69
|
+
|
|
70
|
+
<div class="map-split">
|
|
71
|
+
<p class="map-edge">depends on ↓</p>
|
|
72
|
+
<p class="map-edge">runs recipes from ↓</p>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="map-row">
|
|
76
|
+
<article class="node">
|
|
77
|
+
<span class="node-tag">Spec & engine</span>
|
|
78
|
+
<h2 class="node-name">farmslot packages</h2>
|
|
79
|
+
<p class="node-what">
|
|
80
|
+
The recipe protocol and the execution engine, as pinned by mm-harness.
|
|
81
|
+
<code>recipe-harness</code> depends on <code>protocol</code>.
|
|
82
|
+
</p>
|
|
83
|
+
<ul class="node-list">
|
|
84
|
+
<li><code>@farmslot/protocol</code> 0.18.0</li>
|
|
85
|
+
<li><code>@farmslot/recipe-harness</code> 0.14.0</li>
|
|
86
|
+
<li><code>@farmslot/agent-runtime</code> 0.7.0</li>
|
|
87
|
+
<li><code>@farmslot/handoff</code> 0.3.1</li>
|
|
88
|
+
<li><code>@farmslot/expo-recipe</code> 0.7.1</li>
|
|
89
|
+
</ul>
|
|
90
|
+
<span class="badge">npm</span>
|
|
91
|
+
</article>
|
|
92
|
+
|
|
93
|
+
<article class="node">
|
|
94
|
+
<span class="node-tag">Your customization</span>
|
|
95
|
+
<h2 class="node-name">Recipe libraries</h2>
|
|
96
|
+
<p class="node-what">
|
|
97
|
+
One per team, pointed at with <code>RECIPE_LIBRARY_PATH</code>, resolved ahead of the small
|
|
98
|
+
bundled MetaMask library. Perps is the worked example.
|
|
99
|
+
</p>
|
|
100
|
+
<a class="node-url" href="https://github.com/MetaMask/experimental-metamask-recipe-perps">github.com/MetaMask/experimental-metamask-recipe-perps</a>
|
|
101
|
+
<span class="badge">private</span>
|
|
102
|
+
<a class="node-more" href="perps.html">How to point at one →</a>
|
|
103
|
+
</article>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<p class="map-edge">drives ↓</p>
|
|
107
|
+
|
|
108
|
+
<article class="node">
|
|
109
|
+
<span class="node-tag">What gets proved</span>
|
|
110
|
+
<h2 class="node-name">Product repos</h2>
|
|
111
|
+
<p class="node-what">
|
|
112
|
+
The real builds a recipe drives. Each also installs the skills — every one of the three has a
|
|
113
|
+
<code>skills</code> script running <code>metamask-skills sync</code>.
|
|
114
|
+
</p>
|
|
115
|
+
<a class="node-url" href="https://github.com/MetaMask/metamask-extension">github.com/MetaMask/metamask-extension</a>
|
|
116
|
+
<a class="node-url" href="https://github.com/MetaMask/metamask-mobile">github.com/MetaMask/metamask-mobile</a>
|
|
117
|
+
<a class="node-url" href="https://github.com/MetaMask/core">github.com/MetaMask/core</a>
|
|
118
|
+
<span class="badge">public</span>
|
|
119
|
+
</article>
|
|
120
|
+
|
|
121
|
+
<p class="map-edge">promoted learnings, via <code>@farmslot/handoff</code> ↓</p>
|
|
122
|
+
|
|
123
|
+
<article class="node">
|
|
124
|
+
<span class="node-tag">Opt-in output</span>
|
|
125
|
+
<h2 class="node-name">Learnings inbox</h2>
|
|
126
|
+
<p class="node-what">
|
|
127
|
+
Scrubbed learning packages staged from finished runs, for later review. A terminal mark stages
|
|
128
|
+
locally; sharing centrally is a separate, explicit step.
|
|
129
|
+
</p>
|
|
130
|
+
<a class="node-url" href="https://github.com/MetaMask/experimental-distributed-learnings">github.com/MetaMask/experimental-distributed-learnings</a>
|
|
131
|
+
<span class="badge">private</span>
|
|
132
|
+
</article>
|
|
133
|
+
|
|
134
|
+
</div>
|
|
135
|
+
</section>
|
|
136
|
+
|
|
137
|
+
<section class="wrap">
|
|
138
|
+
<div class="note">
|
|
139
|
+
<span class="note-title">Standing disclosure</span>
|
|
140
|
+
<p>
|
|
141
|
+
The farmslot <strong>control plane</strong> is experimental and sole-maintained. What is adopted
|
|
142
|
+
here is the spec and the engine — the npm packages above — not the control plane. Weigh that
|
|
143
|
+
before depending on anything beyond them.
|
|
144
|
+
</p>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<div class="btn-row">
|
|
148
|
+
<a class="btn btn-primary" href="perps.html">Customize it for your team →</a>
|
|
149
|
+
<a class="btn btn-ghost" href="architecture.html">How the layers fit</a>
|
|
150
|
+
</div>
|
|
151
|
+
</section>
|
|
152
|
+
</main>
|
|
153
|
+
|
|
154
|
+
<footer class="footer">
|
|
155
|
+
<div class="wrap">
|
|
156
|
+
<p>Internal getting-started guide for proving MetaMask changes with recipes. Not official MetaMask product documentation.</p>
|
|
157
|
+
<p>Versions are the ones mm-harness pins today; check <code>package.json</code> over this page.</p>
|
|
158
|
+
</div>
|
|
159
|
+
</footer>
|
|
160
|
+
<script type="module" src="assets/progress.mjs?v=4"></script>
|
|
161
|
+
</body>
|
|
162
|
+
</html>
|
package/site/how-it-works.html
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>How it works — proving a change with a recipe</title>
|
|
7
7
|
<meta name="description" content="How a recipe proves a change on a real MetaMask build, checks itself before handoff, and stays behind as a regression guard. The full walkthrough, step by step.">
|
|
8
|
-
<link rel="
|
|
8
|
+
<link rel="icon" href="assets/metamask-fox.svg" type="image/svg+xml">
|
|
9
|
+
<link rel="stylesheet" href="assets/style.css?v=4">
|
|
9
10
|
</head>
|
|
10
11
|
<body data-progress-page="start">
|
|
11
12
|
<a class="skip" href="#steps">Skip to the walkthrough</a>
|
|
@@ -13,18 +14,16 @@
|
|
|
13
14
|
<header class="topbar">
|
|
14
15
|
<div class="wrap topbar-inner">
|
|
15
16
|
<a class="brand" href="index.html">
|
|
16
|
-
<
|
|
17
|
+
<img class="brand-mark" src="assets/metamask-fox.svg" alt="" width="22" height="22">
|
|
17
18
|
<span class="brand-name">recipes</span>
|
|
18
19
|
</a>
|
|
19
20
|
<nav class="nav" aria-label="Main">
|
|
20
21
|
<a class="nav-cta" href="index.html#prompt">Quick start</a>
|
|
21
22
|
<a href="how-it-works.html" aria-current="page">How it works</a>
|
|
22
|
-
<a href="
|
|
23
|
-
<a href="perps.html">Perps</a>
|
|
23
|
+
<a href="perps.html">Team / Perps</a>
|
|
24
24
|
<a href="cheatsheet.html">Cheatsheet</a>
|
|
25
25
|
<a href="architecture.html">Architecture</a>
|
|
26
26
|
<a href="tutorials/index.html">Tutorials</a>
|
|
27
|
-
<a href="reviewers.html">For Reviewers</a>
|
|
28
27
|
</nav>
|
|
29
28
|
</div>
|
|
30
29
|
</header>
|
|
@@ -55,7 +54,7 @@
|
|
|
55
54
|
<span>progress saves in this browser</span>
|
|
56
55
|
</div>
|
|
57
56
|
<p style="margin-top:.9rem;opacity:.7;font-size:.9rem;max-width:60ch">
|
|
58
|
-
A proposal for how agents can code at MetaMask — offered for teams to try
|
|
57
|
+
A proposal for how agents can code at MetaMask — offered for teams to try.
|
|
59
58
|
</p>
|
|
60
59
|
</section>
|
|
61
60
|
|
|
@@ -663,9 +662,9 @@ artifacts (6):
|
|
|
663
662
|
<h2>Next</h2>
|
|
664
663
|
<div class="grid grid-3">
|
|
665
664
|
<div class="card">
|
|
666
|
-
<h3>
|
|
665
|
+
<h3>Recipe anatomy</h3>
|
|
667
666
|
<p>The graph, the intents, the assertions, and the test of whether yours is worth keeping.</p>
|
|
668
|
-
<p><a href="recipes.html">
|
|
667
|
+
<p><a href="recipes.html">Read the anatomy →</a></p>
|
|
669
668
|
</div>
|
|
670
669
|
<div class="card">
|
|
671
670
|
<h3>Your team's library</h3>
|
|
@@ -688,6 +687,6 @@ artifacts (6):
|
|
|
688
687
|
</div>
|
|
689
688
|
</footer>
|
|
690
689
|
|
|
691
|
-
<script type="module" src="assets/progress.mjs"></script>
|
|
690
|
+
<script type="module" src="assets/progress.mjs?v=4"></script>
|
|
692
691
|
</body>
|
|
693
692
|
</html>
|