sootsim 0.1.209 → 0.1.211
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 +10 -9
- package/dist-cli/bin.js +4 -4
- package/dist-cli/chunks/{agent-KEC5PILM.js → agent-YMWIMQSZ.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-PVXYV2Z5.js → agent-wrapper-6MN4L5WR.js} +2 -2
- package/dist-cli/chunks/{app-fonts-ANPET46E.js → app-fonts-C7OF7H5G.js} +2 -2
- package/dist-cli/chunks/{assert-TIABJI4M.js → assert-JVVKDGJZ.js} +2 -2
- package/dist-cli/chunks/{auth-R7PMD6TZ.js → auth-K5PLXC65.js} +2 -2
- package/dist-cli/chunks/beta-FFPVM735.js +2 -0
- package/dist-cli/chunks/{camera-7UFJSFK7.js → camera-LN5T6FHN.js} +2 -2
- package/dist-cli/chunks/chunk-2OE3UXXF.js +119 -0
- package/dist-cli/chunks/{chunk-2OT4F6F2.js → chunk-33FTN3AV.js} +3 -3
- package/dist-cli/chunks/{chunk-OVT65DWK.js → chunk-3AMN64TG.js} +1 -1
- package/dist-cli/chunks/{chunk-RGRLM7AT.js → chunk-4L4WXCMZ.js} +2 -2
- package/dist-cli/chunks/{chunk-5MEH5VHS.js → chunk-75ZI44EE.js} +4 -4
- package/dist-cli/chunks/{chunk-CXBNEQNP.js → chunk-ADHPC2X3.js} +2 -2
- package/dist-cli/chunks/{chunk-GGRLGKFC.js → chunk-AQXWKFSQ.js} +1 -1
- package/dist-cli/chunks/{chunk-QYOLP7E2.js → chunk-AVJOEZLW.js} +2 -2
- package/dist-cli/chunks/chunk-BVOMJLZJ.js +1 -0
- package/dist-cli/chunks/chunk-CA53GTDU.js +2 -0
- package/dist-cli/chunks/{chunk-JXOQBX5R.js → chunk-CDMWW44J.js} +2 -2
- package/dist-cli/chunks/{chunk-GGPPDEWU.js → chunk-CNMIJNUJ.js} +2 -2
- package/dist-cli/chunks/chunk-CZJWXULV.js +13 -0
- package/dist-cli/chunks/{chunk-IE3M7UCB.js → chunk-E2HECQS5.js} +48 -48
- package/dist-cli/chunks/{chunk-2N7YUIB6.js → chunk-E2TCQ5AD.js} +1 -1
- package/dist-cli/chunks/{chunk-DNAKPQ56.js → chunk-FLQJ4E4B.js} +2 -2
- package/dist-cli/chunks/{chunk-VUTSNH77.js → chunk-FUUQJQ6D.js} +1 -1
- package/dist-cli/chunks/{chunk-VCUGCWFW.js → chunk-GDIUF4LO.js} +2 -2
- package/dist-cli/chunks/{chunk-Y2YT6G2K.js → chunk-GIPNU35K.js} +2 -2
- package/dist-cli/chunks/{chunk-H7I4QQBU.js → chunk-HYCIJ46S.js} +1 -1
- package/dist-cli/chunks/{chunk-3MSLDFKZ.js → chunk-IHQXMMQA.js} +2 -2
- package/dist-cli/chunks/{chunk-KUFSYYKY.js → chunk-KDCFEKQG.js} +1 -1
- package/dist-cli/chunks/{chunk-CNHZWLE3.js → chunk-KKOQCQ7C.js} +1 -1
- package/dist-cli/chunks/{chunk-44EPIO7S.js → chunk-LN2YBE53.js} +3 -3
- package/dist-cli/chunks/{chunk-IUG5LGAH.js → chunk-MRVFOA46.js} +2 -2
- package/dist-cli/chunks/{chunk-JUBCRVXK.js → chunk-NLHBFC44.js} +8 -8
- package/dist-cli/chunks/{chunk-VHUEJNYT.js → chunk-OEVW6X6O.js} +1 -1
- package/dist-cli/chunks/{chunk-UQX3RDUO.js → chunk-OJXQDTQP.js} +1 -1
- package/dist-cli/chunks/{chunk-4N2A7WPD.js → chunk-OYKIZT5Q.js} +1 -1
- package/dist-cli/chunks/{chunk-7XXN43QW.js → chunk-PC3RU3SN.js} +1 -1
- package/dist-cli/chunks/{chunk-56YCENXG.js → chunk-RCNPJNHG.js} +1 -1
- package/dist-cli/chunks/{chunk-TCIUR5IB.js → chunk-RNCB3OP2.js} +2 -2
- package/dist-cli/chunks/{chunk-IELT7YPL.js → chunk-SSYQZ5IN.js} +2 -2
- package/dist-cli/chunks/{chunk-EYISIVUC.js → chunk-T3L3I3XN.js} +2 -2
- package/dist-cli/chunks/{chunk-YC4E3DRA.js → chunk-TBBKY5QW.js} +2 -2
- package/dist-cli/chunks/{chunk-W2SLUPGS.js → chunk-TYJ7RKBZ.js} +1 -1
- package/dist-cli/chunks/{chunk-5HAEGTT5.js → chunk-U74PRAD5.js} +2 -2
- package/dist-cli/chunks/{chunk-JOFHXMRG.js → chunk-UMBVQZ22.js} +2 -2
- package/dist-cli/chunks/{chunk-YB7GMFBR.js → chunk-UXJC5TWI.js} +1 -1
- package/dist-cli/chunks/{chunk-IEDKCUPC.js → chunk-VDLNYLQ3.js} +1 -1
- package/dist-cli/chunks/chunk-X5F2XRCT.js +1 -0
- package/dist-cli/chunks/{chunk-L23EEIDG.js → chunk-XNJNWR34.js} +2 -2
- package/dist-cli/chunks/cli-version-6ZGU3OMS.js +2 -0
- package/dist-cli/chunks/{compat-MR7RNAP6.js → compat-FHMWPGR4.js} +3 -3
- package/dist-cli/chunks/{config-MMRF4WYY.js → config-OKQY5P52.js} +2 -2
- package/dist-cli/chunks/{control-ULQKJBAD.js → control-7WL54I6D.js} +2 -2
- package/dist-cli/chunks/daemon-MJAW7WLB.js +2 -0
- package/dist-cli/chunks/{debug-QRTBFTZC.js → debug-QWZHZQPU.js} +3 -3
- package/dist-cli/chunks/{desktop-WTUZLOEG.js → desktop-FXGRW74A.js} +3 -3
- package/dist-cli/chunks/{detox-I4NFW53N.js → detox-3EDUFJTL.js} +4 -4
- package/dist-cli/chunks/{device-UL3V6W3S.js → device-QCRIH4UL.js} +2 -2
- package/dist-cli/chunks/{diagnose-63E4BQXG.js → diagnose-URCT4GRE.js} +2 -2
- package/dist-cli/chunks/drivers-K6AYJ4K4.js +2 -0
- package/dist-cli/chunks/flow-FJK6CFCI.js +2 -0
- package/dist-cli/chunks/help-GCSPMIWH.js +2 -0
- package/dist-cli/chunks/{home-paths-U6VSF2D3.js → home-paths-EO6LWXWX.js} +2 -2
- package/dist-cli/chunks/inspect-DLPOHI65.js +2 -0
- package/dist-cli/chunks/install-desktop-LKSETTBL.js +2 -0
- package/dist-cli/chunks/{login-4Y32SP3B.js → login-7NUQAWXS.js} +4 -4
- package/dist-cli/chunks/{logout-HRGK2TLN.js → logout-BH53ZI7B.js} +2 -2
- package/dist-cli/chunks/{maestro-UOOWOSMW.js → maestro-C3RK43L7.js} +17 -11
- package/dist-cli/chunks/maestro-generate-NJBAT2VF.js +34 -0
- package/dist-cli/chunks/{mode-6PO2NWNV.js → mode-2LMGYLFI.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-A27PORZB.js +2 -0
- package/dist-cli/chunks/{perf-6ZGFXV7T.js → perf-LA7ZSQ7P.js} +2 -2
- package/dist-cli/chunks/{record-IIVWF5QW.js → record-3RNPPFI5.js} +3 -3
- package/dist-cli/chunks/runtime-7VEUKPNE.js +2 -0
- package/dist-cli/chunks/{screenshot-command-JLSF5QJO.js → screenshot-command-KIWXTT6Q.js} +6 -6
- package/dist-cli/chunks/{screenshots-capture-GW4YS6YN.js → screenshots-capture-ZADO3BSL.js} +2 -2
- package/dist-cli/chunks/{serve-ZINIYVBO.js → serve-64IOEG4C.js} +2 -2
- package/dist-cli/chunks/{setup-T4TUKR5N.js → setup-GANEERC5.js} +3 -3
- package/dist-cli/chunks/{skills-VMVA5KMV.js → skills-DYN4EKIN.js} +2 -2
- package/dist-cli/chunks/{storage-2I3TEBEI.js → storage-773UY5XZ.js} +2 -2
- package/dist-cli/chunks/store-LSC33DBI.js +2 -0
- package/dist-cli/chunks/telemetry-4DVRYGKH.js +2 -0
- package/dist-cli/chunks/{timeline-DSZIKBSD.js → timeline-HLF3CJNH.js} +2 -2
- package/dist-cli/chunks/upgrade-RDAUF53R.js +4 -0
- package/dist-cli/chunks/upload-KI23CKE4.js +2 -0
- package/dist-cli/chunks/{version-HNDOSSV6.js → version-63PZYMY6.js} +2 -2
- package/dist-cli/chunks/{web-YFMICNP2.js → web-XN5ZVSZR.js} +2 -2
- package/dist-cli/chunks/{what-happened-RJNSVNUE.js → what-happened-T3WJ7LTW.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +108 -108
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/skills/soot/SKILL.md +5 -7
- package/skills/sootsim-debug/SKILL.md +1 -1
- package/skills/sootsim-perf/SKILL.md +1 -1
- package/skills/sootsim-test/SKILL.md +36 -40
- package/src/skills/builtin/{test-flow.ts → maestro-test.ts} +6 -6
- package/src/skills/registry.ts +3 -3
- package/dist-cli/chunks/beta-FFASIXKH.js +0 -2
- package/dist-cli/chunks/chunk-2PGB3DOK.js +0 -119
- package/dist-cli/chunks/chunk-3RVUM7UI.js +0 -1
- package/dist-cli/chunks/chunk-CYDWIYRJ.js +0 -1
- package/dist-cli/chunks/chunk-OL7X4HKV.js +0 -2
- package/dist-cli/chunks/chunk-S73LN4A3.js +0 -13
- package/dist-cli/chunks/cli-version-VMYLWAMI.js +0 -2
- package/dist-cli/chunks/daemon-KLIQUGQB.js +0 -2
- package/dist-cli/chunks/drivers-FSTNEQAE.js +0 -2
- package/dist-cli/chunks/flow-JHQNIALS.js +0 -2
- package/dist-cli/chunks/help-S7U65PPA.js +0 -2
- package/dist-cli/chunks/inspect-Z4GQNIWJ.js +0 -2
- package/dist-cli/chunks/install-desktop-AEDLWUK6.js +0 -2
- package/dist-cli/chunks/optional-demo-registry-RVVVXHLS.js +0 -2
- package/dist-cli/chunks/runtime-CQCSXHC2.js +0 -2
- package/dist-cli/chunks/store-IAFN6XPI.js +0 -2
- package/dist-cli/chunks/telemetry-G2XJWKVX.js +0 -2
- package/dist-cli/chunks/test-PR7EPXIP.js +0 -69
- package/dist-cli/chunks/upgrade-EM7AEJCX.js +0 -4
- package/dist-cli/chunks/upload-BU5GF2ZF.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-VDLNYLQ3.js";import{g as A,i as _}from"./chunk-TBBKY5QW.js";import"./chunk-OYKIZT5Q.js";import{b as k}from"./chunk-E2TCQ5AD.js";import"./chunk-3AMN64TG.js";import"./chunk-UXJC5TWI.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
|
|
3
3
|
sootsim what-happened \u2014 show recent events from the semantic timeline
|
|
4
4
|
|
|
5
5
|
usage:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/detox/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/home-paths.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/host/fetch-proxy-overrides.ts
|
|
4
4
|
var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/menu.mjs
CHANGED
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/render-mode.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/sdk.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/sdk.mjs
CHANGED
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -18992,8 +18992,111 @@ function isNative(name) {
|
|
|
18992
18992
|
return name.startsWith("expo-") || name.startsWith("react-native-") || name.startsWith("@react-native/") || name.startsWith("@react-native-community/") || name.startsWith("@expo/") || name === "expo";
|
|
18993
18993
|
}
|
|
18994
18994
|
|
|
18995
|
-
// src/skills/builtin/
|
|
18995
|
+
// src/skills/builtin/maestro-test.ts
|
|
18996
|
+
function sleep3(ms) {
|
|
18997
|
+
return new Promise((resolve5) => setTimeout(resolve5, ms));
|
|
18998
|
+
}
|
|
18996
18999
|
var skill3 = {
|
|
19000
|
+
name: "maestro-test",
|
|
19001
|
+
description: "Run Maestro YAML tests against the app",
|
|
19002
|
+
type: "testing",
|
|
19003
|
+
version: "1.0.0",
|
|
19004
|
+
triggers: ["run test", "test flow", "run maestro", "test the app"],
|
|
19005
|
+
tools: [
|
|
19006
|
+
{
|
|
19007
|
+
name: "run_maestro",
|
|
19008
|
+
description: "Run a Maestro YAML test against the app",
|
|
19009
|
+
parameters: {
|
|
19010
|
+
flowPath: {
|
|
19011
|
+
type: "string",
|
|
19012
|
+
description: "Path to the YAML flow file",
|
|
19013
|
+
required: true
|
|
19014
|
+
},
|
|
19015
|
+
record: { type: "boolean", description: "Record video of the flow" }
|
|
19016
|
+
},
|
|
19017
|
+
async execute(params, context) {
|
|
19018
|
+
const fs11 = await import("fs");
|
|
19019
|
+
const path11 = await import("path");
|
|
19020
|
+
const yaml2 = await import("yaml");
|
|
19021
|
+
const { DEFAULT_SOOTSIM_BRIDGE_PORT: DEFAULT_SOOTSIM_BRIDGE_PORT2 } = await Promise.resolve().then(() => (init_bridge_constants(), bridge_constants_exports));
|
|
19022
|
+
const { SootSimBridgeHost: SootSimBridgeHost2 } = await Promise.resolve().then(() => (init_bridge_host(), bridge_host_exports));
|
|
19023
|
+
const { createBridge: createBridge2 } = await Promise.resolve().then(() => (init_ws_bridge(), ws_bridge_exports));
|
|
19024
|
+
const { SootSimBridgeFlowRunner: SootSimBridgeFlowRunner2 } = await Promise.resolve().then(() => (init_bridge_flow_runner(), bridge_flow_runner_exports));
|
|
19025
|
+
const host = new SootSimBridgeHost2({ port: DEFAULT_SOOTSIM_BRIDGE_PORT2 });
|
|
19026
|
+
host.start({ silent: true });
|
|
19027
|
+
try {
|
|
19028
|
+
const flowContent = fs11.readFileSync(params.flowPath, "utf8");
|
|
19029
|
+
const fmMatch = flowContent.match(/^---\n([\s\S]*?)\n---\n?/);
|
|
19030
|
+
const stepsBody = fmMatch ? flowContent.slice(fmMatch[0].length) : flowContent;
|
|
19031
|
+
const steps = yaml2.parse(stepsBody);
|
|
19032
|
+
const beforeIds = new Set(host.listSims().map((sim) => sim.id));
|
|
19033
|
+
await host.openUrl(context.url);
|
|
19034
|
+
let simId = null;
|
|
19035
|
+
for (let i = 0; i < 60; i++) {
|
|
19036
|
+
const sims = host.listSims();
|
|
19037
|
+
const opened = sims.find((sim) => !beforeIds.has(sim.id) && sim.readyState === "open") || sims.find((sim) => sim.readyState === "open");
|
|
19038
|
+
if (opened) {
|
|
19039
|
+
simId = opened.id;
|
|
19040
|
+
break;
|
|
19041
|
+
}
|
|
19042
|
+
await sleep3(500);
|
|
19043
|
+
}
|
|
19044
|
+
if (!simId) {
|
|
19045
|
+
throw new Error("no sim connected to the bridge host");
|
|
19046
|
+
}
|
|
19047
|
+
const bridge = createBridge2(DEFAULT_SOOTSIM_BRIDGE_PORT2, {
|
|
19048
|
+
simId,
|
|
19049
|
+
commandTimeoutMs: 15e3
|
|
19050
|
+
});
|
|
19051
|
+
const driver = new SootSimBridgeFlowRunner2(bridge, {
|
|
19052
|
+
screenshotDir: context.outputDir,
|
|
19053
|
+
flowDir: path11.dirname(path11.resolve(params.flowPath)),
|
|
19054
|
+
simId,
|
|
19055
|
+
recordingOutputDir: params.record ? context.outputDir : void 0
|
|
19056
|
+
});
|
|
19057
|
+
let videoPath = null;
|
|
19058
|
+
try {
|
|
19059
|
+
await driver.waitForTree(12e4);
|
|
19060
|
+
if (params.record) {
|
|
19061
|
+
await driver.startRecording();
|
|
19062
|
+
}
|
|
19063
|
+
await driver.runFlow(steps);
|
|
19064
|
+
if (params.record) {
|
|
19065
|
+
videoPath = await driver.stopRecording();
|
|
19066
|
+
}
|
|
19067
|
+
return {
|
|
19068
|
+
success: true,
|
|
19069
|
+
message: `Flow completed: ${steps.length} steps passed`,
|
|
19070
|
+
data: {
|
|
19071
|
+
steps: steps.length,
|
|
19072
|
+
simId,
|
|
19073
|
+
videoPath: videoPath || void 0
|
|
19074
|
+
},
|
|
19075
|
+
artifacts: videoPath ? [{ type: "video", name: path11.basename(videoPath), path: videoPath }] : void 0
|
|
19076
|
+
};
|
|
19077
|
+
} finally {
|
|
19078
|
+
try {
|
|
19079
|
+
await bridge.closeSim(simId);
|
|
19080
|
+
} catch {
|
|
19081
|
+
}
|
|
19082
|
+
bridge.close();
|
|
19083
|
+
}
|
|
19084
|
+
} catch (err) {
|
|
19085
|
+
return {
|
|
19086
|
+
success: false,
|
|
19087
|
+
message: `Flow failed: ${err.message}`
|
|
19088
|
+
};
|
|
19089
|
+
} finally {
|
|
19090
|
+
await host.close().catch(() => {
|
|
19091
|
+
});
|
|
19092
|
+
}
|
|
19093
|
+
}
|
|
19094
|
+
}
|
|
19095
|
+
]
|
|
19096
|
+
};
|
|
19097
|
+
|
|
19098
|
+
// src/skills/builtin/perf-profile.ts
|
|
19099
|
+
var skill4 = {
|
|
18997
19100
|
name: "perf-profile",
|
|
18998
19101
|
description: "Profile render performance of the app",
|
|
18999
19102
|
type: "performance",
|
|
@@ -19058,7 +19161,7 @@ var skill3 = {
|
|
|
19058
19161
|
};
|
|
19059
19162
|
|
|
19060
19163
|
// src/skills/builtin/screenshot-all.ts
|
|
19061
|
-
var
|
|
19164
|
+
var skill5 = {
|
|
19062
19165
|
name: "screenshot-all",
|
|
19063
19166
|
description: "Capture screenshots of all screens in the app",
|
|
19064
19167
|
type: "screenshot",
|
|
@@ -19097,109 +19200,6 @@ var skill4 = {
|
|
|
19097
19200
|
]
|
|
19098
19201
|
};
|
|
19099
19202
|
|
|
19100
|
-
// src/skills/builtin/test-flow.ts
|
|
19101
|
-
function sleep3(ms) {
|
|
19102
|
-
return new Promise((resolve5) => setTimeout(resolve5, ms));
|
|
19103
|
-
}
|
|
19104
|
-
var skill5 = {
|
|
19105
|
-
name: "test-flow",
|
|
19106
|
-
description: "Run YAML test flows against the app",
|
|
19107
|
-
type: "testing",
|
|
19108
|
-
version: "1.0.0",
|
|
19109
|
-
triggers: ["run test", "test flow", "run flow", "test the app"],
|
|
19110
|
-
tools: [
|
|
19111
|
-
{
|
|
19112
|
-
name: "run_flow",
|
|
19113
|
-
description: "Run a YAML flow against the app",
|
|
19114
|
-
parameters: {
|
|
19115
|
-
flowPath: {
|
|
19116
|
-
type: "string",
|
|
19117
|
-
description: "Path to the YAML flow file",
|
|
19118
|
-
required: true
|
|
19119
|
-
},
|
|
19120
|
-
record: { type: "boolean", description: "Record video of the flow" }
|
|
19121
|
-
},
|
|
19122
|
-
async execute(params, context) {
|
|
19123
|
-
const fs11 = await import("fs");
|
|
19124
|
-
const path11 = await import("path");
|
|
19125
|
-
const yaml2 = await import("yaml");
|
|
19126
|
-
const { DEFAULT_SOOTSIM_BRIDGE_PORT: DEFAULT_SOOTSIM_BRIDGE_PORT2 } = await Promise.resolve().then(() => (init_bridge_constants(), bridge_constants_exports));
|
|
19127
|
-
const { SootSimBridgeHost: SootSimBridgeHost2 } = await Promise.resolve().then(() => (init_bridge_host(), bridge_host_exports));
|
|
19128
|
-
const { createBridge: createBridge2 } = await Promise.resolve().then(() => (init_ws_bridge(), ws_bridge_exports));
|
|
19129
|
-
const { SootSimBridgeFlowRunner: SootSimBridgeFlowRunner2 } = await Promise.resolve().then(() => (init_bridge_flow_runner(), bridge_flow_runner_exports));
|
|
19130
|
-
const host = new SootSimBridgeHost2({ port: DEFAULT_SOOTSIM_BRIDGE_PORT2 });
|
|
19131
|
-
host.start({ silent: true });
|
|
19132
|
-
try {
|
|
19133
|
-
const flowContent = fs11.readFileSync(params.flowPath, "utf8");
|
|
19134
|
-
const fmMatch = flowContent.match(/^---\n([\s\S]*?)\n---\n?/);
|
|
19135
|
-
const stepsBody = fmMatch ? flowContent.slice(fmMatch[0].length) : flowContent;
|
|
19136
|
-
const steps = yaml2.parse(stepsBody);
|
|
19137
|
-
const beforeIds = new Set(host.listSims().map((sim) => sim.id));
|
|
19138
|
-
await host.openUrl(context.url);
|
|
19139
|
-
let simId = null;
|
|
19140
|
-
for (let i = 0; i < 60; i++) {
|
|
19141
|
-
const sims = host.listSims();
|
|
19142
|
-
const opened = sims.find((sim) => !beforeIds.has(sim.id) && sim.readyState === "open") || sims.find((sim) => sim.readyState === "open");
|
|
19143
|
-
if (opened) {
|
|
19144
|
-
simId = opened.id;
|
|
19145
|
-
break;
|
|
19146
|
-
}
|
|
19147
|
-
await sleep3(500);
|
|
19148
|
-
}
|
|
19149
|
-
if (!simId) {
|
|
19150
|
-
throw new Error("no sim connected to the bridge host");
|
|
19151
|
-
}
|
|
19152
|
-
const bridge = createBridge2(DEFAULT_SOOTSIM_BRIDGE_PORT2, {
|
|
19153
|
-
simId,
|
|
19154
|
-
commandTimeoutMs: 15e3
|
|
19155
|
-
});
|
|
19156
|
-
const driver = new SootSimBridgeFlowRunner2(bridge, {
|
|
19157
|
-
screenshotDir: context.outputDir,
|
|
19158
|
-
flowDir: path11.dirname(path11.resolve(params.flowPath)),
|
|
19159
|
-
simId,
|
|
19160
|
-
recordingOutputDir: params.record ? context.outputDir : void 0
|
|
19161
|
-
});
|
|
19162
|
-
let videoPath = null;
|
|
19163
|
-
try {
|
|
19164
|
-
await driver.waitForTree(12e4);
|
|
19165
|
-
if (params.record) {
|
|
19166
|
-
await driver.startRecording();
|
|
19167
|
-
}
|
|
19168
|
-
await driver.runFlow(steps);
|
|
19169
|
-
if (params.record) {
|
|
19170
|
-
videoPath = await driver.stopRecording();
|
|
19171
|
-
}
|
|
19172
|
-
return {
|
|
19173
|
-
success: true,
|
|
19174
|
-
message: `Flow completed: ${steps.length} steps passed`,
|
|
19175
|
-
data: {
|
|
19176
|
-
steps: steps.length,
|
|
19177
|
-
simId,
|
|
19178
|
-
videoPath: videoPath || void 0
|
|
19179
|
-
},
|
|
19180
|
-
artifacts: videoPath ? [{ type: "video", name: path11.basename(videoPath), path: videoPath }] : void 0
|
|
19181
|
-
};
|
|
19182
|
-
} finally {
|
|
19183
|
-
try {
|
|
19184
|
-
await bridge.closeSim(simId);
|
|
19185
|
-
} catch {
|
|
19186
|
-
}
|
|
19187
|
-
bridge.close();
|
|
19188
|
-
}
|
|
19189
|
-
} catch (err) {
|
|
19190
|
-
return {
|
|
19191
|
-
success: false,
|
|
19192
|
-
message: `Flow failed: ${err.message}`
|
|
19193
|
-
};
|
|
19194
|
-
} finally {
|
|
19195
|
-
await host.close().catch(() => {
|
|
19196
|
-
});
|
|
19197
|
-
}
|
|
19198
|
-
}
|
|
19199
|
-
}
|
|
19200
|
-
]
|
|
19201
|
-
};
|
|
19202
|
-
|
|
19203
19203
|
// src/skills/builtin/visual-diff.ts
|
|
19204
19204
|
var skill6 = {
|
|
19205
19205
|
name: "visual-diff",
|
|
@@ -19285,9 +19285,9 @@ var _skills = /* @__PURE__ */ new Map();
|
|
|
19285
19285
|
var BUILTIN_SKILLS = [
|
|
19286
19286
|
skill,
|
|
19287
19287
|
skill2,
|
|
19288
|
-
skill3,
|
|
19289
19288
|
skill4,
|
|
19290
19289
|
skill5,
|
|
19290
|
+
skill3,
|
|
19291
19291
|
skill6
|
|
19292
19292
|
];
|
|
19293
19293
|
var skillRegistry = {
|
|
@@ -19348,7 +19348,7 @@ var skillRegistry = {
|
|
|
19348
19348
|
const pkg = JSON.parse(fs10.readFileSync(pkgPath, "utf8"));
|
|
19349
19349
|
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
19350
19350
|
if (deps["detox"] || deps["maestro"]) {
|
|
19351
|
-
suggestions.push("test
|
|
19351
|
+
suggestions.push("maestro-test");
|
|
19352
19352
|
}
|
|
19353
19353
|
if (!deps["jest-axe"] && !deps["@testing-library/jest-dom"]) {
|
|
19354
19354
|
suggestions.push("a11y-review");
|
package/dist-lib/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.211 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/package.json
CHANGED
package/skills/soot/SKILL.md
CHANGED
|
@@ -19,9 +19,7 @@ automation, inspecting the render tree, and managing sims.
|
|
|
19
19
|
|
|
20
20
|
| command | description |
|
|
21
21
|
| --- | --- |
|
|
22
|
-
| `sootsim
|
|
23
|
-
| `sootsim flow` | run flows through the current sim or manage a draft from live inspect actions |
|
|
24
|
-
| `sootsim maestro` | run existing Maestro YAML flows against sootsim |
|
|
22
|
+
| `sootsim maestro` | author, generate, and run Maestro YAML flows against sootsim |
|
|
25
23
|
| `sootsim detox` | run existing Detox suites against sootsim on headless Chromium |
|
|
26
24
|
| `sootsim record` | capture the live sim as webm/mp4/gif, or sample N png frames (--frames) |
|
|
27
25
|
| `sootsim storage` | manage guest app storage and launch profiles |
|
|
@@ -92,7 +90,7 @@ skills for working with the SootSim native preview engine:
|
|
|
92
90
|
| `/sootsim-debug` | Debug rendering, animation, gesture, performance, and accessibility issues in a React Native app running under sootsim. Reach for this whenever an animation looks wrong (janky, stutters, snaps, only updates once, or doesn't move at all), a swipe/transition/gesture misbehaves or feels broken, scrolling drops frames or feels slow, the UI renders the wrong tree/props, or a screen reader can't reach something — and drive the sootsim CLI debug tooling first, not screenshots or ad-hoc logging. |
|
|
93
91
|
| `/sootsim-perf` | Optimize SootSim engine and app performance — scroll jank, dropped frames, slow animation, idle CPU, memory growth, and "smooth normally but laggy under load" (video calls, busy machines). Covers measuring on the right thread with the right browser, proving each perf tier actually engages via its counters, a CPU-contention test harness, and the map of existing perf machinery so you improve it instead of reinventing it. For general app debugging load /sootsim-debug first. |
|
|
94
92
|
| `/sootsim-setup` | Get sootsim connected to your React Native app — from `sootsim setup` to a driveable sim |
|
|
95
|
-
| `/sootsim-test` | Run automated tests against your React Native app under sootsim
|
|
93
|
+
| `/sootsim-test` | Run automated tests against your React Native app under sootsim with Maestro YAML or Detox/Jest |
|
|
96
94
|
| `/sootsim-visual` | Pixel-level rendering comparison between sootsim and native iOS — fonts, gradients, shadows, image fidelity |
|
|
97
95
|
|
|
98
96
|
## automatic settling
|
|
@@ -153,9 +151,9 @@ sootsim debug state shell # runtime state dump
|
|
|
153
151
|
### testing
|
|
154
152
|
|
|
155
153
|
```sh
|
|
156
|
-
sootsim test
|
|
157
|
-
sootsim
|
|
158
|
-
sootsim
|
|
154
|
+
sootsim maestro test .maestro/ # run Maestro YAML flows
|
|
155
|
+
sootsim maestro generate "login" # generate and run a Maestro flow
|
|
156
|
+
sootsim detox # run Detox/Jest suites
|
|
159
157
|
```
|
|
160
158
|
|
|
161
159
|
### inspection
|
|
@@ -199,7 +199,7 @@ budget. **p95 >20 ms is visible jank for a scrolling surface.**
|
|
|
199
199
|
profiling a whole flow:
|
|
200
200
|
|
|
201
201
|
```sh
|
|
202
|
-
sootsim
|
|
202
|
+
sootsim maestro test .maestro/scroll-feed.yaml --profile # per-step + frame stats
|
|
203
203
|
sootsim perf cpu --duration 5 --output /tmp/trace.cpuprofile # sampled CPU
|
|
204
204
|
```
|
|
205
205
|
|
|
@@ -72,7 +72,7 @@ runs clears the buffer.
|
|
|
72
72
|
deeper tools when the frame report isn't enough:
|
|
73
73
|
|
|
74
74
|
```sh
|
|
75
|
-
sootsim
|
|
75
|
+
sootsim maestro test .maestro/scroll.yaml --profile # per-step + frame stats
|
|
76
76
|
sootsim perf cpu --duration 5 --output /tmp/t.cpuprofile # sampled CPU
|
|
77
77
|
sootsim open 8089 --new --driver playwright --cdp-port 9222 # cpu-profile a driveable sim
|
|
78
78
|
sootsim debug enable layout,render && sootsim debug recent layout 40
|