@broberg/lens-daemon 0.1.40 → 0.1.42
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/package.json +1 -1
- package/src/flow-store.ts +6 -0
- package/src/flow.ts +7 -1
- package/src/mcp.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@broberg/lens-daemon",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.42",
|
|
4
4
|
"description": "The Lens module of the cardmem daemon (flows, critic, coverage, capture sessions, the /lens/* routes and the cardmem-lens MCP) as a package. The daemon mounts createLensRouter(deps) + createLensMcpRouter(deps). Bun runtime.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/src/flow-store.ts
CHANGED
|
@@ -183,6 +183,12 @@ export async function recordFlowRun(
|
|
|
183
183
|
// F009.128 — always written when the run reported it, empty included.
|
|
184
184
|
...(result.downloads ? { downloads: storedDownloads } : {}),
|
|
185
185
|
...(networkShapes ? { network_shapes: networkShapes } : {}),
|
|
186
|
+
// F009.137 / F010.1 / F010.7 — produced in flow.ts and, until measured live on
|
|
187
|
+
// 25 Oct (run 1a337c03: a mail was consumed, the report said nothing), written
|
|
188
|
+
// nowhere. Counts and engines only; never a code or a mail.
|
|
189
|
+
...(result.mail ? { mail: result.mail } : {}),
|
|
190
|
+
...(result.browser_repaired ? { browser_repaired: result.browser_repaired } : {}),
|
|
191
|
+
...(result.chrome_clones_removed ? { chrome_clones_removed: result.chrome_clones_removed } : {}),
|
|
186
192
|
}),
|
|
187
193
|
};
|
|
188
194
|
|
package/src/flow.ts
CHANGED
|
@@ -1412,7 +1412,13 @@ function parseManuscriptStep(s: string): FlowStep {
|
|
|
1412
1412
|
};
|
|
1413
1413
|
}
|
|
1414
1414
|
case 'inspect': {
|
|
1415
|
-
const [, frame] = splitFrame(s);
|
|
1415
|
+
const [head, frame] = splitFrame(s);
|
|
1416
|
+
// F009.138 — `inspect html [testid]` is the flow step's html form (F389.2):
|
|
1417
|
+
// the built screen's outerHTML, for cardmem_check_mockup_fidelity.
|
|
1418
|
+
if (/^inspect\s+html\b/i.test(head)) {
|
|
1419
|
+
const m = head.match(/\[([^\]]+)\]/);
|
|
1420
|
+
return { type: 'inspect', html: true, ...(m ? { testid: m[1]!.trim() } : {}), ...(frame ? { frame } : {}) };
|
|
1421
|
+
}
|
|
1416
1422
|
return { type: 'inspect', ...(frame ? { frame } : {}) };
|
|
1417
1423
|
}
|
|
1418
1424
|
case 'assert':
|
package/src/mcp.ts
CHANGED
|
@@ -405,7 +405,7 @@ export const TOOLS = [
|
|
|
405
405
|
{
|
|
406
406
|
name: 'lens_run_manuscript',
|
|
407
407
|
description:
|
|
408
|
-
`Compile a human-readable markdown manuscript (fmc-automation style: "# flow: name", "base: <url>", then one "- <verb> …" per line) into a flow and run it E2E. VERBS (${MANUSCRIPT_VERBS.length}, this is the complete list): ${MANUSCRIPT_VERBS.join(' / ')}. Shapes: "- goto /x" · "- fill [testid] = value" · a PASSWORD without plaintext: "- fill [testid] from file <path>" (absolute, or relative to local_path) or "- fill [testid] from env <NAME>" (F009.121 — password inputs only; the value never appears in the run, the report or a screenshot) · "- click [testid]" · "- press Enter" (global) or "- press Enter [testid]" (on a focused element) · "- expectText [testid] ~ text" · "- drag [source] -> [target]" or "- drag [node] by 120,-40" (a canvas offset; both move in 10 mousemoves so React Flow / d3-drag nodes really move — "steps N" to change, F009.123) · "- upload [input-testid] = <fixture>" · an input with NO testid, also inside an open shadow root: "- uploadSelector <css> = <fixture>[, <fixture>]" (F009.136; fixtures repo-relative to local_path or data:) · a CODE FROM MAIL: "- fill [testid] from mail to jam@jams.party subject ~ Jam match /\\b\\d{6}\\b/" (F009.137 — waits ≤60 s for a mail received after the step started, read through mail-mcp; only the test mailbox webhouse.developer@gmail.com / jam@jams.party; the mail is deleted after the run, report carries mail {consumed, cleaned}; the code never appears in the report) · "- assert: <js>" · "- screenshot label" · frame-aware "- fillSelector <css> = <value> @frame <iframe>" and "- clickSelector <css> @frame <iframe>" · "- waitForUrl <substring>". TWO BROWSERS AT ONCE (F009.122): prefix a step with "in <name>:" — "- in b: goto /" · "- in b: expectText [note] == Hej" — and it runs in its own browser (own cookies + storage), open alongside the default one for the rest of the run; steps without the prefix run in the default browser. Click modifiers: "- click [testid] via enter" (F255.1, for Angular/MDC buttons a mouse click does not activate) and "- click [testid] @ 50%,28%" (F255.4, aim at a point inside a canvas/3D surface). A field that already HOLDS a value may no longer render an input — a combobox typically swaps to its selected state, so "fill" times out there while "press ArrowDown" / "press Enter" still drive it (fd-sundhed, 2026-08-21). The authoring shortcut — write prose, not JSON.`,
|
|
408
|
+
`Compile a human-readable markdown manuscript (fmc-automation style: "# flow: name", "base: <url>", then one "- <verb> …" per line) into a flow and run it E2E. VERBS (${MANUSCRIPT_VERBS.length}, this is the complete list): ${MANUSCRIPT_VERBS.join(' / ')}. Shapes: "- goto /x" · "- fill [testid] = value" · a PASSWORD without plaintext: "- fill [testid] from file <path>" (absolute, or relative to local_path) or "- fill [testid] from env <NAME>" (F009.121 — password inputs only; the value never appears in the run, the report or a screenshot) · "- click [testid]" · "- press Enter" (global) or "- press Enter [testid]" (on a focused element) · "- expectText [testid] ~ text" · "- drag [source] -> [target]" or "- drag [node] by 120,-40" (a canvas offset; both move in 10 mousemoves so React Flow / d3-drag nodes really move — "steps N" to change, F009.123) · "- upload [input-testid] = <fixture>" · an input with NO testid, also inside an open shadow root: "- uploadSelector <css> = <fixture>[, <fixture>]" (F009.136; fixtures repo-relative to local_path or data:) · a CODE FROM MAIL: "- fill [testid] from mail to jam@jams.party subject ~ Jam match /\\b\\d{6}\\b/" (F009.137 — waits ≤60 s for a mail received after the step started, read through mail-mcp; only the test mailbox webhouse.developer@gmail.com / jam@jams.party; the mail is deleted after the run, report carries mail {consumed, cleaned}; the code never appears in the report) · the BUILT SCREEN'S HTML after the click path: "- inspect html [testid]" (or "- inspect html" for the whole body) — the step detail is that outerHTML, for cardmem_check_mockup_fidelity's built_html (F009.138) · "- assert: <js>" · "- screenshot label" · frame-aware "- fillSelector <css> = <value> @frame <iframe>" and "- clickSelector <css> @frame <iframe>" · "- waitForUrl <substring>". TWO BROWSERS AT ONCE (F009.122): prefix a step with "in <name>:" — "- in b: goto /" · "- in b: expectText [note] == Hej" — and it runs in its own browser (own cookies + storage), open alongside the default one for the rest of the run; steps without the prefix run in the default browser. Click modifiers: "- click [testid] via enter" (F255.1, for Angular/MDC buttons a mouse click does not activate) and "- click [testid] @ 50%,28%" (F255.4, aim at a point inside a canvas/3D surface). A field that already HOLDS a value may no longer render an input — a combobox typically swaps to its selected state, so "fill" times out there while "press ArrowDown" / "press Enter" still drive it (fd-sundhed, 2026-08-21). The authoring shortcut — write prose, not JSON.`,
|
|
409
409
|
inputSchema: {
|
|
410
410
|
type: 'object',
|
|
411
411
|
required: ['project', 'manuscript'],
|