waygraph 0.15.53 → 0.16.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/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +13 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -2
- package/dist/{highlights → demo/narration}/device.js +3 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
- package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +1 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +23 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +33 -0
- package/dist/demo/overlay/rings.js +448 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +31 -0
- package/dist/demo/stepper/demo-log.js +309 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +3 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +10 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
- package/dist/{core → engine/flow}/map-builder.js +46 -48
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +4 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
- package/dist/{traverse → live/traverse}/coverage.js +3 -0
- package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
- package/dist/{traverse → live/traverse}/lease.js +1 -0
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
- package/dist/{blocks-select.js → manifest/select.js} +2 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
- package/dist/{extensions.js → runtime/extensions.js} +3 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/README.md +11 -12
- package/examples/saucedemo/config/waygraph.config.ts +17 -0
- package/examples/saucedemo/docs/CONVENTION.md +5 -7
- package/examples/saucedemo/docs/HELPERS.md +12 -12
- package/examples/saucedemo/package-lock.json +10 -3
- package/examples/saucedemo/package.json +12 -29
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
- package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
- package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
- package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
- package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
- package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
- package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
- package/examples/saucedemo/src/flows/login.flow.ts +11 -18
- package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
- package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
- package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
- package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
- package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
- package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
- package/examples/saucedemo/src/stubs/login.ts +37 -0
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
- package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
- package/package.json +12 -7
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/README.md +4 -7
- package/templates/quickstart/config/waygraph.config.ts +17 -0
- package/templates/quickstart/docs/CONVENTION.md +5 -6
- package/templates/quickstart/docs/HELPERS.md +11 -9
- package/templates/quickstart/package.json +14 -17
- package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
- package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
- package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
- package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
- package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
- package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
- package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
- package/templates/quickstart/src/flows/login.flow.ts +11 -18
- package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
- package/templates/quickstart/src/flows/shop.flow.ts +15 -20
- package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
- package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
- package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
- package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
- package/templates/quickstart/src/stubs/login.ts +37 -0
- package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -293
- package/dist/core/flow.js +0 -432
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -607
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/playwright.config.ts +0 -19
- package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/playwright.config.ts +0 -14
- package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -45,13 +45,15 @@ against a live site, use `--skill-pilot-blind`.
|
|
|
45
45
|
hand-supplied every time, `registerMemStub(key, fake)` + `memStub: true` on the flow (or
|
|
46
46
|
`--mem-stub`) fills it from a registry instead - a key with no registration still fails
|
|
47
47
|
preflight exactly as before, so this narrows what needs real input, never removes the guard.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
`
|
|
48
|
+
Put those `registerMemStub` calls in a `*.mem-stubs.ts` file (`src/states/demo.mem-stubs.ts`): live sessions (`auto`,
|
|
49
|
+
`pilot`, `traverse`) load every one and use them as the default for a Block's `requires`.
|
|
50
|
+
6. **Checkpoints are values.** Declare each once in `src/states/`: `export const Home = checkpoint("Home");
|
|
51
|
+
export type Home = typeof Home;` (a union: `export const CanAddItem = [Home, CartEmpty] as const`). Blocks take
|
|
52
|
+
the values, never tag strings or `<In, Out>` type arguments: `defineNavBlock({ checkpoint: Home, … })`,
|
|
53
|
+
`defineAssertBlock({ checkpoint: ItemInCart, … })`, `defineMethodBlock({ from: CanAddItem, to: ItemInCart, … })`
|
|
54
|
+
(leave `from` out for "from anywhere"; `resolve` is implied when `to` is one Checkpoint). The Block then carries its
|
|
55
|
+
route at runtime, so `waygraph graph`, `auto` and the manifest read it exactly. Older projects:
|
|
56
|
+
`waygraph upgrade --codemod checkpoints`.
|
|
55
57
|
7. **One input/action per Method Block.** No block that `.fill()`s two fields or `.fill()` + `.click()` in one
|
|
56
58
|
`act()` — split like saucedemo login (`fill-username`, `fill-password`, `submit-login`). Opt out per file:
|
|
57
59
|
`// waygraph-ignore: multi-input` or `// waygraph-ignore-practices`.
|
|
@@ -69,22 +71,23 @@ against a live site, use `--skill-pilot-blind`.
|
|
|
69
71
|
## Flows, stubs and config (the scaffold's shape)
|
|
70
72
|
|
|
71
73
|
- **Build flows with `map()`** (`engine.map({ memStub }).start().gotoPage(Nav).method(B, { pace }).assert(A).end()`;
|
|
72
|
-
`.gotoExternal` for another origin)
|
|
73
|
-
and `.end()` takes nothing. The flow's title is `ctx.title(...)` in a stub. **Nest flows with `.flow(sub, { reset: true })
|
|
74
|
-
|
|
74
|
+
`.gotoExternal` for another origin); it is the only way to build one. Flow settings (`memStub`, `expectedFailure`, `demoPace`, `sessionReset`) go in `map({ … })` before the chain
|
|
75
|
+
and `.end()` takes nothing. The flow's title is `ctx.title(...)` in a stub. **Nest flows with `.flow(sub, { reset: true })`**.
|
|
76
|
+
`defineFlow`, `chainFlow` and the `with*` flow wrappers were removed in 0.16.0; `waygraph upgrade --codemod flows` converts them.
|
|
75
77
|
- **`src/flows/` holds use cases and mirrors the front end's endpoints**: a folder per page (`flows/auth/login/`) with one
|
|
76
78
|
file per scenario named for its outcome (`success.flow.ts`, `wrong-password.flow.ts`, `empty-fields.flow.ts`), and
|
|
77
79
|
`(user-stories)/` (any `(group)`) for flows that cross pages. Export names are `<page><Outcome>Flow`. Not one file per
|
|
78
80
|
Block chain, not a flat folder of unrelated flows.
|
|
79
81
|
- **Blocks carry no stubs; the flow does.** Demo highlights are ctx stubs chained on the Block where the flow uses it:
|
|
80
82
|
`AddItemBlock.stubAfter((ctx) => { ctx.ring("cart", { selector: DemoSel.cartCount, label: "AC · item in cart" }); })`.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
+
That chained function is the only form: a Block's definition (its options or `instruction`) takes no stub, and a stub
|
|
84
|
+
is never a slot map. A Block used twice gets one `const AddShown = AddItemBlock.stubAfter(...)`. A stub that throws
|
|
85
|
+
fails its step in the demo, named.
|
|
83
86
|
- **Reading a value into `mem` happens in `act`** (`mem.set(Key, value)`), like Mailpit's `extract-email-link`.
|
|
84
87
|
`observe` is only for a Block that branches (it feeds `resolve`); an empty `act(){}` plus an `observe` that
|
|
85
88
|
writes `mem` is a misuse.
|
|
86
89
|
- **Demo pace is a map option or config, never a wrapper.** `.method(SetBearerTokenBlock, { pace: "blitz" })` speeds one step,
|
|
87
|
-
`map({ demoPace: "fast" })` a flow, `demo: { pace, typingMs, slowMo }` in the config the whole project.
|
|
90
|
+
`map({ demoPace: "fast" })` a flow, `demo: { pace, typingMs, slowMo }` in the config the whole project.
|
|
88
91
|
- **Per-environment values** (a different `baseUrl` for staging) come from `.env` files read in the config function:
|
|
89
92
|
`defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))`; `--env staging` loads `.env.staging`. Never edit the config to switch.
|
|
90
93
|
- **More than one config** (staging, another app) is another file, `config/waygraph.<name>.config.ts`, chosen with `--config <name>`.
|
|
@@ -93,7 +96,7 @@ against a live site, use `--skill-pilot-blind`.
|
|
|
93
96
|
Block's `act`; the click Block stays a plain click.
|
|
94
97
|
- **Project settings live in `config/waygraph.config.ts`** (`defineConfig({ baseUrl, testDir, webServer,
|
|
95
98
|
extensions, playwright: {...} })`). The config file also exports `engine = new Engine(config)`; flows `import { engine } from "../../config/waygraph.config.js"`; a project needs no
|
|
96
|
-
`playwright.config.ts` - `waygraph test` builds one from it
|
|
99
|
+
`playwright.config.ts` - `waygraph test` builds one from it (a project's own `playwright.config.*` is not read).
|
|
97
100
|
- **Another origin the test needs is a Map external** under `src/map/(external)/<tool>/`. For REST API
|
|
98
101
|
tests, `(external)/hoppscotch` (list `extensions: ["hoppscotch"]` in the config) drives hoppscotch.io's client
|
|
99
102
|
with the extension, so requests skip CORS: `set-method`, `set-url`, `set-headers`, `set-json-body`,
|
|
@@ -110,6 +113,7 @@ against a live site, use `--skill-pilot-blind`.
|
|
|
110
113
|
| Effect | `*.effect.block.ts` in `methods/` / `_methods/` | `defineEffectBlock` | No |
|
|
111
114
|
| Method | `*.method.block.ts` in `methods/` / `_methods/` | `defineMethodBlock` | No |
|
|
112
115
|
| Assert | with Method/Effect peers | `defineAssertBlock` | No |
|
|
116
|
+
| API | `*.api.block.ts` in `methods/` | `defineApiBlock({ from, to, call })` (a real HTTP request; `map().method(...)`) | No |
|
|
113
117
|
|
|
114
118
|
Effects that appear in `waygraph auto` menus need `instanceOptions` that scan the live DOM
|
|
115
119
|
(or mem) for labeled rows.
|
|
@@ -165,9 +169,14 @@ npx waygraph check --no-practices . # skip bad-practice scan only
|
|
|
165
169
|
npx waygraph map . # exit 1 if src/map/ folder path != real static url
|
|
166
170
|
npx waygraph validate . # every .flow.ts loads
|
|
167
171
|
npx waygraph graph . # nodes/edges/skipped/orphans - counts should make sense
|
|
172
|
+
npx waygraph manifest . # JSON of every Block (kind, from/to, requires), Flow and Checkpoint
|
|
173
|
+
npx waygraph map pack <group> # a src/map/ group with its own _states.ts/_keys.ts -> installable package
|
|
168
174
|
npm run typecheck # when the consumer has it
|
|
169
175
|
```
|
|
170
176
|
|
|
177
|
+
Every `run`/`demo`/`test` also writes `.waygraph/runs/<runId>.jsonl` (step start/end/error, artifacts): read the
|
|
178
|
+
newest one to see which Block failed and with what error, instead of re-running.
|
|
179
|
+
|
|
171
180
|
`waygraph check` should report zero nav warnings. Orphan Blocks (not in any `.flow.ts`)
|
|
172
181
|
are still runnable in Pilot's live menu - orphan status only blocks
|
|
173
182
|
`auto --blocks <From> <To>` pathfinding.
|
|
@@ -50,6 +50,11 @@ waygraph auto highlight <sessionId> '<json>' # paint rings/todos on the live pa
|
|
|
50
50
|
just what's reachable from here - use it to plan several steps ahead before you start
|
|
51
51
|
sending picks.
|
|
52
52
|
|
|
53
|
+
A Block's `requires` are filled from `--data '{...}'` first, then from the project's mem stubs: the session loads
|
|
54
|
+
every `*.mem-stubs.ts` and uses each `registerMemStub` fake as that key's default. A start URL that can't be opened
|
|
55
|
+
(server down, DNS) fails `browser start` / `pilot start` with the reason; it never starts a blank session silently.
|
|
56
|
+
An unknown flag is an error, not a project path.
|
|
57
|
+
|
|
53
58
|
## Bad practices (`waygraph check` / `waygraph typecheck`)
|
|
54
59
|
|
|
55
60
|
Run `waygraph typecheck .` (or `npm run typecheck`) — runs `tsc --noEmit` then bad-practice warnings.
|
|
@@ -58,8 +63,6 @@ Use `--no-practices` on either command to skip the practice scan.
|
|
|
58
63
|
|
|
59
64
|
Patterns warned (does not fail `check`; fails `typecheck` only when `tsc` fails):
|
|
60
65
|
|
|
61
|
-
- **`Checkpoint<string>` as a Block's output** — e.g. `defineMethodBlock<…, Checkpoint<string>>` instead of a project Checkpoint type from `src/states/` (a wildcard *input* means "reachable from anywhere" and is allowed).
|
|
62
|
-
- **`defineAssertBlock({…})` without an explicit type arg** — use `defineAssertBlock<YourCheckpoint>({…})` so `defineFlow` typing stays honest.
|
|
63
66
|
- **Multiple `.fill()` in one Method** — split into one Block per input (fill-username, fill-password, …).
|
|
64
67
|
- **`.fill()` + `.click()` in one Method** — split fill and submit into separate Blocks.
|
|
65
68
|
|
|
@@ -105,7 +108,7 @@ thing that differs from demo is *who* triggers the paint:
|
|
|
105
108
|
| Mode | Who paints | How |
|
|
106
109
|
|------|------------|-----|
|
|
107
110
|
| `waygraph demo` | Engine, automatically | ctx stubs chained in the flow run each step |
|
|
108
|
-
| Pilot / `
|
|
111
|
+
| Pilot / `browser start` session | **You (the agent)** | `waygraph auto highlight <sessionId> '<json>'` before (or between) sends |
|
|
109
112
|
|
|
110
113
|
The ctx stubs a flow chains onto Blocks show up in Pilot's `auto trace` as metadata, but they do **not**
|
|
111
114
|
auto-draw. You re-express the same intent with `auto highlight` (copy selectors/labels from the flow's stubs or
|
|
@@ -133,7 +136,7 @@ waygraph auto highlight <sessionId> '{"clear":true}'
|
|
|
133
136
|
Supported fields (demo parity):
|
|
134
137
|
- `rings[]`: `selector`, `label`, `detail`, `tag`, `tone`, `size`, `weight`, `color`, `zoom`, `zoomOut`, `focus`
|
|
135
138
|
- `todos` / `todoIndex` / `todoTitle` / `todoPos` (`right` default | `left`)
|
|
136
|
-
- `todoUi`: `{ compact?, cap?, expandCap?, collision?, behindRing? }` — same dock UX as demo (defaults smart-on; see docs/
|
|
139
|
+
- `todoUi`: `{ compact?, cap?, expandCap?, collision?, behindRing? }` — same dock UX as demo (defaults smart-on; see docs/reference/cli.md "Todo dock UI")
|
|
137
140
|
- `zoom` / `zoomSelector` / `zoomOut` - scroll + zoom badge (not CSS page scale)
|
|
138
141
|
- `device`: `mobile` | `tablet` | `desktop` (Playwright viewport)
|
|
139
142
|
- `holdMs`: ms to keep fixtures; `0` = until the next highlight / clear (default 30000)
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One log format for every overlay surface (demo / auto / browser / pilot): `waygraph <surface>: ...`
|
|
3
|
-
* with a `HH:MM:SS.mmm` prefix, same shape as `runner/demo-log.js`'s (demo stays on the JS copy since
|
|
4
|
-
* it runs in the target project's own process; this one is for TS-side code — pilot/auto/browser —
|
|
5
|
-
* that can't import a plain .js runner module). Silenced by WAYGRAPH_JSON=1, same convention as demo.
|
|
6
|
-
*/
|
|
7
|
-
function ts() {
|
|
8
|
-
const d = new Date();
|
|
9
|
-
const p = (n) => String(n).padStart(2, "0");
|
|
10
|
-
return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${String(d.getMilliseconds()).padStart(3, "0")}`;
|
|
11
|
-
}
|
|
12
|
-
export function verboseLog(surface, msg) {
|
|
13
|
-
if (process.env.WAYGRAPH_JSON === "1")
|
|
14
|
-
return;
|
|
15
|
-
console.log(`[${ts()}] waygraph ${surface}: ${msg}`);
|
|
16
|
-
}
|
package/dist/auto-session.d.ts
DELETED
package/dist/auto-session.js
DELETED
package/dist/cli/discover.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export declare function walkDir(dir: string, pattern: RegExp): string[];
|
|
2
|
-
export declare function discoverFlows(projectDir: string): string[];
|
|
3
|
-
export declare function extractFlowNames(filePath: string): string[];
|
|
4
|
-
/** `LoginBlock` -> `"login"`; `OverviewMetricsBlock` -> `"overview-metrics"`. */
|
|
5
|
-
export declare function blockExportToLabel(exportId: string): string;
|
|
6
|
-
/** Every `...Block` identifier a `.flow.ts` file imports, in source order. */
|
|
7
|
-
export declare function parseBlockImports(filePath: string): string[];
|
|
8
|
-
/** Every `page.goto("...")` string literal in a file, in source order. */
|
|
9
|
-
export declare function extractGotos(filePath: string): string[];
|
|
10
|
-
/** Every `Trait.url({ pathname: "..." })` target in a file, in source order. */
|
|
11
|
-
export declare function extractUrlTraits(filePath: string): string[];
|
|
12
|
-
export declare function importModule(filePath: string): Promise<Record<string, unknown>>;
|
|
13
|
-
/** Kept as a named alias - `run`/`validate` below were written against this name first. */
|
|
14
|
-
export declare const importFlowFile: typeof importModule;
|
|
15
|
-
export declare function isFlowLike(val: unknown): val is {
|
|
16
|
-
run: (...args: unknown[]) => Promise<unknown>;
|
|
17
|
-
};
|
|
18
|
-
export declare function discoverBlocks(projectDir: string): string[];
|
|
19
|
-
export declare function isBlockLike(val: unknown): val is {
|
|
20
|
-
name: string;
|
|
21
|
-
instruction: {
|
|
22
|
-
act: unknown;
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
/** Set by `defineNavBlock` (non-enumerable) - see src/core.ts. */
|
|
26
|
-
export declare function isNavBlockMarked(val: Record<string, unknown>): boolean;
|
|
27
|
-
export declare const NAV_METHOD_CALLS: readonly ["page.goto(", "page.reload(", "page.goBack(", "page.goForward("];
|
|
28
|
-
/**
|
|
29
|
-
* Matches a selector-taking Trait factory call whose first argument is a
|
|
30
|
-
* literal string/template, not an identifier or property access - the exact
|
|
31
|
-
* shape found repeatedly in hand-written assertion Blocks
|
|
32
|
-
* (`Trait.visible("#some-id")` instead of `Trait.visible(SomeSel.thing)`).
|
|
33
|
-
* `Trait.url(...)` is deliberately excluded - it takes a URLPatternInit, never
|
|
34
|
-
* a DOM selector. Same file-scoped-regex bluntness the nav-escape sweep above
|
|
35
|
-
* already accepts (see openspec/specs/nav-block-and-check/spec.md) - a known
|
|
36
|
-
* blind spot on string concatenation/template-built selectors, not solved
|
|
37
|
-
* here for the same "recipe before promotion" reason that check accepts its
|
|
38
|
-
* own shared-helper blind spot.
|
|
39
|
-
*/
|
|
40
|
-
export declare const INLINE_SELECTOR_CALL: RegExp;
|
package/dist/cli/discover.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
// Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
|
|
2
|
-
import { readFileSync, readdirSync } from "node:fs";
|
|
3
|
-
import { join, resolve } from "node:path";
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// Filesystem
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
export function walkDir(dir, pattern) {
|
|
8
|
-
const results = [];
|
|
9
|
-
let entries;
|
|
10
|
-
try {
|
|
11
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return results;
|
|
15
|
-
}
|
|
16
|
-
for (const entry of entries) {
|
|
17
|
-
const full = join(dir, entry.name);
|
|
18
|
-
if (entry.isDirectory()) {
|
|
19
|
-
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git")
|
|
20
|
-
continue;
|
|
21
|
-
results.push(...walkDir(full, pattern));
|
|
22
|
-
}
|
|
23
|
-
else if (pattern.test(entry.name)) {
|
|
24
|
-
results.push(full);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return results;
|
|
28
|
-
}
|
|
29
|
-
export function discoverFlows(projectDir) {
|
|
30
|
-
return walkDir(projectDir, /\.flow\.ts$/);
|
|
31
|
-
}
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
// Static analysis for `list`/`nav` (no import, regex only)
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
export function extractFlowNames(filePath) {
|
|
36
|
-
const src = readFileSync(filePath, "utf-8");
|
|
37
|
-
const names = [];
|
|
38
|
-
const re = /export\s+const\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*[=:]/g;
|
|
39
|
-
let m;
|
|
40
|
-
while ((m = re.exec(src)) !== null) {
|
|
41
|
-
const name = m[1];
|
|
42
|
-
if (name !== undefined)
|
|
43
|
-
names.push(name);
|
|
44
|
-
}
|
|
45
|
-
return names;
|
|
46
|
-
}
|
|
47
|
-
/** `LoginBlock` -> `"login"`; `OverviewMetricsBlock` -> `"overview-metrics"`. */
|
|
48
|
-
export function blockExportToLabel(exportId) {
|
|
49
|
-
const base = exportId.replace(/Block$/, "");
|
|
50
|
-
return base
|
|
51
|
-
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
52
|
-
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
|
|
53
|
-
.toLowerCase();
|
|
54
|
-
}
|
|
55
|
-
/** Every `...Block` identifier a `.flow.ts` file imports, in source order. */
|
|
56
|
-
export function parseBlockImports(filePath) {
|
|
57
|
-
const src = readFileSync(filePath, "utf-8");
|
|
58
|
-
const names = [];
|
|
59
|
-
const re = /import\s*\{([^}]*)\}\s*from\s*["'][^"']*\.block(?:\.js)?["']/g;
|
|
60
|
-
let m;
|
|
61
|
-
while ((m = re.exec(src)) !== null) {
|
|
62
|
-
for (const part of m[1].split(",")) {
|
|
63
|
-
const name = part.trim().split(/\s+as\s+/)[0]?.trim();
|
|
64
|
-
if (name)
|
|
65
|
-
names.push(name);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return names;
|
|
69
|
-
}
|
|
70
|
-
/** Every `page.goto("...")` string literal in a file, in source order. */
|
|
71
|
-
export function extractGotos(filePath) {
|
|
72
|
-
const src = readFileSync(filePath, "utf-8");
|
|
73
|
-
const results = [];
|
|
74
|
-
const re = /\.goto\(\s*["'`]([^"'`]*)["'`]/g;
|
|
75
|
-
let m;
|
|
76
|
-
while ((m = re.exec(src)) !== null) {
|
|
77
|
-
const url = m[1];
|
|
78
|
-
if (url !== undefined)
|
|
79
|
-
results.push(url);
|
|
80
|
-
}
|
|
81
|
-
return results;
|
|
82
|
-
}
|
|
83
|
-
/** Every `Trait.url({ pathname: "..." })` target in a file, in source order. */
|
|
84
|
-
export function extractUrlTraits(filePath) {
|
|
85
|
-
const src = readFileSync(filePath, "utf-8");
|
|
86
|
-
const results = [];
|
|
87
|
-
const re = /Trait\.url\(\s*\{[^}]*pathname:\s*["'`]([^"'`]*)["'`]/g;
|
|
88
|
-
let m;
|
|
89
|
-
while ((m = re.exec(src)) !== null) {
|
|
90
|
-
const url = m[1];
|
|
91
|
-
if (url !== undefined)
|
|
92
|
-
results.push(url);
|
|
93
|
-
}
|
|
94
|
-
return results;
|
|
95
|
-
}
|
|
96
|
-
// ---------------------------------------------------------------------------
|
|
97
|
-
// Dynamic import + validation
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
export async function importModule(filePath) {
|
|
100
|
-
const url = new URL(`file://${resolve(filePath)}`);
|
|
101
|
-
return (await import(url.href));
|
|
102
|
-
}
|
|
103
|
-
/** Kept as a named alias - `run`/`validate` below were written against this name first. */
|
|
104
|
-
export const importFlowFile = importModule;
|
|
105
|
-
export function isFlowLike(val) {
|
|
106
|
-
if (val === null || typeof val !== "object")
|
|
107
|
-
return false;
|
|
108
|
-
const obj = val;
|
|
109
|
-
return typeof obj.run === "function";
|
|
110
|
-
}
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
// `check` - secondary/complementary to the ActionPage @deprecated warning
|
|
113
|
-
// (src/types.ts). That's the primary, always-on signal an editor shows the
|
|
114
|
-
// instant a regular Block's act() calls a navigation method; this command
|
|
115
|
-
// sweeps a whole project in one shot for contexts with no editor watching
|
|
116
|
-
// (CI, an autonomous agent writing Block files without a language server).
|
|
117
|
-
// See openspec/specs/nav-block-and-check/spec.md for the full rationale.
|
|
118
|
-
// ---------------------------------------------------------------------------
|
|
119
|
-
export function discoverBlocks(projectDir) {
|
|
120
|
-
return walkDir(projectDir, /\.block\.ts$/);
|
|
121
|
-
}
|
|
122
|
-
export function isBlockLike(val) {
|
|
123
|
-
if (val === null || typeof val !== "object")
|
|
124
|
-
return false;
|
|
125
|
-
const obj = val;
|
|
126
|
-
if (typeof obj.name !== "string")
|
|
127
|
-
return false;
|
|
128
|
-
const instruction = obj.instruction;
|
|
129
|
-
return instruction !== null && typeof instruction === "object" && typeof instruction?.act === "function";
|
|
130
|
-
}
|
|
131
|
-
/** Set by `defineNavBlock` (non-enumerable) - see src/core.ts. */
|
|
132
|
-
export function isNavBlockMarked(val) {
|
|
133
|
-
return val.__waygraphKind === "nav";
|
|
134
|
-
}
|
|
135
|
-
export const NAV_METHOD_CALLS = ["page.goto(", "page.reload(", "page.goBack(", "page.goForward("];
|
|
136
|
-
/**
|
|
137
|
-
* Matches a selector-taking Trait factory call whose first argument is a
|
|
138
|
-
* literal string/template, not an identifier or property access - the exact
|
|
139
|
-
* shape found repeatedly in hand-written assertion Blocks
|
|
140
|
-
* (`Trait.visible("#some-id")` instead of `Trait.visible(SomeSel.thing)`).
|
|
141
|
-
* `Trait.url(...)` is deliberately excluded - it takes a URLPatternInit, never
|
|
142
|
-
* a DOM selector. Same file-scoped-regex bluntness the nav-escape sweep above
|
|
143
|
-
* already accepts (see openspec/specs/nav-block-and-check/spec.md) - a known
|
|
144
|
-
* blind spot on string concatenation/template-built selectors, not solved
|
|
145
|
-
* here for the same "recipe before promotion" reason that check accepts its
|
|
146
|
-
* own shared-helper blind spot.
|
|
147
|
-
*/
|
|
148
|
-
export const INLINE_SELECTOR_CALL = /\b(?:Trait\.visible|Trait\.text|textEquals|visible)\(\s*["'`]/;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
// Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
|
|
2
|
-
import { runAgentDive } from "./agent-dive-scaffold.js";
|
|
3
|
-
import { resolve } from "node:path";
|
|
4
|
-
import { existsSync, statSync } from "node:fs";
|
|
5
|
-
export async function agentDiveCase(args) {
|
|
6
|
-
// Playwright analogue: npx playwright init-agents --loop <provider>
|
|
7
|
-
const rest = args.slice(1);
|
|
8
|
-
let loop = "claude";
|
|
9
|
-
let prompts = false;
|
|
10
|
-
let projectDir = process.cwd();
|
|
11
|
-
for (let i = 0; i < rest.length; i++) {
|
|
12
|
-
const a = rest[i];
|
|
13
|
-
if (a === "--prompts") {
|
|
14
|
-
prompts = true;
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
if (a === "--loop" || a.startsWith("--loop=")) {
|
|
18
|
-
const v = a.startsWith("--loop=") ? a.slice("--loop=".length) : rest[++i];
|
|
19
|
-
if (!v || !["claude", "opencode", "cursor", "vscode"].includes(v)) {
|
|
20
|
-
console.error("waygraph agent-dive: --loop must be claude | opencode | cursor | vscode");
|
|
21
|
-
process.exit(1);
|
|
22
|
-
}
|
|
23
|
-
loop = v;
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
if (a === "--help" || a === "-h") {
|
|
27
|
-
console.log(`waygraph agent-dive [--loop claude|opencode|cursor|vscode] [--prompts] [project]
|
|
28
|
-
|
|
29
|
-
Initialize coding-agent definitions for diving an app into waygraph Blocks
|
|
30
|
-
(Playwright \`init-agents\` analogue).
|
|
31
|
-
|
|
32
|
-
--loop claude write .claude/agents/*.md (default)
|
|
33
|
-
--loop opencode write .opencode/prompts/*.md
|
|
34
|
-
--loop cursor write .cursor/rules/waygraph-*.mdc
|
|
35
|
-
--loop vscode write .github/agents/*.md
|
|
36
|
-
--prompts also copy docs/waygraph-agents/*.md
|
|
37
|
-
|
|
38
|
-
Agents shipped: waygraph-planner, waygraph-author, waygraph-healer.
|
|
39
|
-
`);
|
|
40
|
-
process.exit(0);
|
|
41
|
-
}
|
|
42
|
-
if (!a.startsWith("-")) {
|
|
43
|
-
projectDir = resolve(a);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (!existsSync(projectDir) || !statSync(projectDir).isDirectory()) {
|
|
47
|
-
console.error(`waygraph agent-dive: no such directory: ${projectDir}`);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
runAgentDive({ loop, projectDir, prompts });
|
|
51
|
-
return;
|
|
52
|
-
}
|
package/dist/commands/check.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
|
|
2
|
-
import { INLINE_SELECTOR_CALL, NAV_METHOD_CALLS, discoverBlocks, discoverFlows, importFlowFile, importModule, isBlockLike, isFlowLike, isNavBlockMarked, walkDir } from "../cli/discover.js";
|
|
3
|
-
import { basename, relative, resolve } from "node:path";
|
|
4
|
-
import { discoverGraph, findBlockPath, findOrphanBlocks } from "../analysis/graph.js";
|
|
5
|
-
import { parseRunFlags, resolveBaseUrl } from "../cli/flags.js";
|
|
6
|
-
import { runChain } from "../cli/run-chain.js";
|
|
7
|
-
import { collectPracticeWarnings, practiceKindLabel } from "../analysis/practices-check.js";
|
|
8
|
-
import { readFileSync } from "node:fs";
|
|
9
|
-
async function validateFlows(projectDir) {
|
|
10
|
-
const files = discoverFlows(projectDir);
|
|
11
|
-
const results = [];
|
|
12
|
-
for (const file of files) {
|
|
13
|
-
try {
|
|
14
|
-
const mod = await importFlowFile(file);
|
|
15
|
-
for (const [exportName, exported] of Object.entries(mod)) {
|
|
16
|
-
if (isFlowLike(exported)) {
|
|
17
|
-
results.push({ file, name: exportName, valid: true });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
23
|
-
results.push({ file, name: basename(file, ".ts"), valid: false, error: msg });
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return results;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Walks every `*.block.ts` file under `projectDir`, imports each to find its
|
|
30
|
-
* exported Blocks, and for any Block NOT built via `defineNavBlock`, scans
|
|
31
|
-
* that file's own source text for a navigation call. Warning only - never
|
|
32
|
-
* throws, never changes the caller's exit code on its own account (a Block
|
|
33
|
-
* file that fails to import for unrelated reasons is silently skipped here;
|
|
34
|
-
* `validate` is the command that reports import failures).
|
|
35
|
-
*/
|
|
36
|
-
function printOrphanReport(projectDir, orphans) {
|
|
37
|
-
if (orphans.length === 0) {
|
|
38
|
-
console.log(`waygraph check: no orphan Blocks (every *.block.ts export is wired into a flow)`);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
for (const o of orphans) {
|
|
42
|
-
console.warn(`waygraph check: orphan Block ${o.file} (${o.exportName} / "${o.block}") is not referenced in any defineFlow([...]) - wire it into a .flow.ts before chain auto shorthand`);
|
|
43
|
-
}
|
|
44
|
-
console.log(`waygraph check: ${orphans.length} orphan Block${orphans.length === 1 ? "" : "s"}`);
|
|
45
|
-
}
|
|
46
|
-
async function requireNoOrphans(projectDir, forCommand) {
|
|
47
|
-
const orphans = await findOrphanBlocks(projectDir);
|
|
48
|
-
if (orphans.length === 0)
|
|
49
|
-
return true;
|
|
50
|
-
console.error(`waygraph ${forCommand}: ${orphans.length} orphan Block(s) - wire every Block into a .flow.ts before auto shorthand. Run: waygraph check ${projectDir === process.cwd() ? "." : JSON.stringify(projectDir)}`);
|
|
51
|
-
for (const o of orphans) {
|
|
52
|
-
console.error(` - ${o.file} (${o.exportName} / "${o.block}")`);
|
|
53
|
-
}
|
|
54
|
-
process.exitCode = 1;
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
export async function runChainAuto(projectDir, fromTag, toTag) {
|
|
58
|
-
if (!(await requireNoOrphans(projectDir, "chain auto")))
|
|
59
|
-
return;
|
|
60
|
-
const graph = await discoverGraph(projectDir);
|
|
61
|
-
const path = findBlockPath(graph, fromTag, toTag);
|
|
62
|
-
if (!path) {
|
|
63
|
-
console.error(`waygraph chain auto: no Block path from "${fromTag}" to "${toTag}" in the discovered graph`);
|
|
64
|
-
process.exitCode = 1;
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const spec = path.join(" then ");
|
|
68
|
-
console.error(`waygraph chain auto: ${fromTag} -> ${toTag} via ${spec}`);
|
|
69
|
-
if (!process.env.WAYGRAPH_BASE_URL) {
|
|
70
|
-
const resolved = await resolveBaseUrl(projectDir);
|
|
71
|
-
if (resolved)
|
|
72
|
-
process.env.WAYGRAPH_BASE_URL = resolved;
|
|
73
|
-
}
|
|
74
|
-
await runChain(projectDir, spec);
|
|
75
|
-
}
|
|
76
|
-
function printPracticeReport(projectDir, practiceWarnings) {
|
|
77
|
-
if (practiceWarnings.length === 0) {
|
|
78
|
-
console.log(`waygraph check: no bad-practice patterns under ${projectDir}`);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
for (const w of practiceWarnings) {
|
|
82
|
-
console.warn(`waygraph check: ${w.file} (${practiceKindLabel(w.kind)}) — ${w.detail}`);
|
|
83
|
-
}
|
|
84
|
-
console.log(`waygraph check: ${practiceWarnings.length} bad-practice warning${practiceWarnings.length === 1 ? "" : "s"}`);
|
|
85
|
-
}
|
|
86
|
-
async function checkCommand(projectDir, opts) {
|
|
87
|
-
const files = discoverBlocks(projectDir);
|
|
88
|
-
const navWarnings = [];
|
|
89
|
-
const selWarnings = [];
|
|
90
|
-
for (const file of files) {
|
|
91
|
-
let mod;
|
|
92
|
-
try {
|
|
93
|
-
mod = await importModule(file);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
let src;
|
|
99
|
-
for (const [exportName, exported] of Object.entries(mod)) {
|
|
100
|
-
if (!isBlockLike(exported))
|
|
101
|
-
continue;
|
|
102
|
-
src ??= readFileSync(file, "utf-8");
|
|
103
|
-
// Nav-escape: NavBlocks are exempt (their generated act() is the one
|
|
104
|
-
// legitimate goto/click call site).
|
|
105
|
-
if (!isNavBlockMarked(exported) &&
|
|
106
|
-
NAV_METHOD_CALLS.some((needle) => src.includes(needle))) {
|
|
107
|
-
navWarnings.push({ file, blockName: exported.name, exportName });
|
|
108
|
-
}
|
|
109
|
-
// Inline selector: applies to every Block kind, including NavBlocks -
|
|
110
|
-
// a Nav's own `verify` array is just as likely to inline a selector.
|
|
111
|
-
if (INLINE_SELECTOR_CALL.test(src)) {
|
|
112
|
-
selWarnings.push({ file, blockName: exported.name, exportName });
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
const practiceWarnings = collectPracticeWarnings(projectDir, walkDir, {
|
|
117
|
-
disabled: opts?.noPractices === true,
|
|
118
|
-
});
|
|
119
|
-
return { navWarnings, selWarnings, practiceWarnings };
|
|
120
|
-
}
|
|
121
|
-
async function runTypecheckCommand(projectDir, noPractices) {
|
|
122
|
-
const { spawnSync } = await import("node:child_process");
|
|
123
|
-
const tsc = spawnSync("npx", ["tsc", "--noEmit"], {
|
|
124
|
-
cwd: projectDir,
|
|
125
|
-
stdio: "inherit",
|
|
126
|
-
shell: false,
|
|
127
|
-
});
|
|
128
|
-
if (tsc.status !== 0) {
|
|
129
|
-
process.exit(tsc.status === null ? 1 : tsc.status);
|
|
130
|
-
}
|
|
131
|
-
if (noPractices)
|
|
132
|
-
return;
|
|
133
|
-
const practiceWarnings = collectPracticeWarnings(projectDir, walkDir);
|
|
134
|
-
printPracticeReport(projectDir, practiceWarnings);
|
|
135
|
-
}
|
|
136
|
-
export async function validateCase(args) {
|
|
137
|
-
const proj = resolve(args[1] ?? process.cwd());
|
|
138
|
-
const results = await validateFlows(proj);
|
|
139
|
-
let failed = 0;
|
|
140
|
-
for (const r of results) {
|
|
141
|
-
const rel = relative(proj, r.file);
|
|
142
|
-
if (r.valid) {
|
|
143
|
-
console.log(`OK ${rel} ${r.name}`);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
failed++;
|
|
147
|
-
console.log(`FAIL ${rel} ${r.name} -- ${r.error}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (failed > 0)
|
|
151
|
-
process.exitCode = 1;
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
export async function typecheckCase(args) {
|
|
155
|
-
const flags = parseRunFlags(args.slice(1));
|
|
156
|
-
const proj = resolve(flags.positionals[0] ?? process.cwd());
|
|
157
|
-
await runTypecheckCommand(proj, flags.noPractices === true);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
export async function checkCase(args) {
|
|
161
|
-
const flags = parseRunFlags(args.slice(1));
|
|
162
|
-
const proj = resolve(flags.positionals[0] ?? process.cwd());
|
|
163
|
-
const { navWarnings, selWarnings, practiceWarnings } = await checkCommand(proj, flags.noPractices ? { noPractices: true } : undefined);
|
|
164
|
-
if (navWarnings.length === 0) {
|
|
165
|
-
console.log(`waygraph check: no navigation found outside NavBlocks under ${proj}`);
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
for (const w of navWarnings) {
|
|
169
|
-
const rel = relative(proj, w.file);
|
|
170
|
-
console.warn(`waygraph check: ${rel} (${w.blockName}) calls page.goto/reload/goBack/goForward outside a NavBlock - consider defineNavBlock instead`);
|
|
171
|
-
}
|
|
172
|
-
console.log(`waygraph check: ${navWarnings.length} nav warning${navWarnings.length === 1 ? "" : "s"}`);
|
|
173
|
-
}
|
|
174
|
-
if (selWarnings.length === 0) {
|
|
175
|
-
console.log(`waygraph check: no inline selectors found in verify arrays under ${proj}`);
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
for (const w of selWarnings) {
|
|
179
|
-
const rel = relative(proj, w.file);
|
|
180
|
-
console.warn(`waygraph check: ${rel} (${w.blockName}) has an inline selector literal in verify - move it into a *Sel object`);
|
|
181
|
-
}
|
|
182
|
-
console.log(`waygraph check: ${selWarnings.length} inline-selector warning${selWarnings.length === 1 ? "" : "s"}`);
|
|
183
|
-
}
|
|
184
|
-
if (!flags.noPractices) {
|
|
185
|
-
printPracticeReport(proj, practiceWarnings);
|
|
186
|
-
}
|
|
187
|
-
const orphans = await findOrphanBlocks(proj);
|
|
188
|
-
printOrphanReport(proj, orphans);
|
|
189
|
-
// Warnings only - never fail exit code. Orphans are reported for
|
|
190
|
-
// human/agent cleanup; chain auto refuses while any remain.
|
|
191
|
-
return;
|
|
192
|
-
}
|
package/dist/commands/map.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
|
|
2
|
-
import { relative, resolve } from "node:path";
|
|
3
|
-
import { checkMap } from "../analysis/map-check.js";
|
|
4
|
-
export async function mapCase(args) {
|
|
5
|
-
const proj = resolve(args[1] ?? process.cwd());
|
|
6
|
-
const result = await checkMap(proj);
|
|
7
|
-
if (!result.hasMapDir) {
|
|
8
|
-
console.log(`waygraph map: no src/map/ directory under ${proj} - nothing to check ` +
|
|
9
|
-
"(this project isn't on the Waygraph Map convention, or hasn't been migrated yet)");
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
console.log(`waygraph map: ${result.nodes.length} node(s) found under ${relative(proj, result.mapRoot)}`);
|
|
13
|
-
if (result.violations.length === 0) {
|
|
14
|
-
console.log("waygraph map: 0 violations - every static Nav/Page url verbatim-matches its folder path");
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
for (const v of result.violations) {
|
|
18
|
-
console.error(`waygraph map: ${v.file} (${v.block}) - ${v.reason}`);
|
|
19
|
-
}
|
|
20
|
-
console.error(`waygraph map: ${result.violations.length} violation${result.violations.length === 1 ? "" : "s"}`);
|
|
21
|
-
// Unlike `check`'s warnings-only stance, a Map violation is exactly
|
|
22
|
-
// the class of bug this command exists to catch (a fabricated
|
|
23
|
-
// folder grouping that never matched the real site, e.g. the real
|
|
24
|
-
// (auth)/signin/ mistake this command's own header comment cites) -
|
|
25
|
-
// fail loud, not just warn.
|
|
26
|
-
process.exitCode = 1;
|
|
27
|
-
}
|
|
28
|
-
return;
|
|
29
|
-
}
|