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
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Every command's flags, read with node:util's parseArgs from the command's own table, which also prints its help. An
|
|
2
|
+
// unknown flag or a flag missing its value stops the command with the reason.
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
export function parseCommand(command, table, argv) {
|
|
5
|
+
const options = Object.fromEntries(Object.entries(table).map(([name, o]) => [name, { type: o.type, multiple: o.multiple === true }]));
|
|
6
|
+
try {
|
|
7
|
+
const { values, positionals, tokens } = parseArgs({ args: argv, options, allowPositionals: true, strict: true, tokens: true });
|
|
8
|
+
return { values: values, positionals, tokens };
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
console.error(`waygraph ${command}: ${err instanceof Error ? err.message : String(err)}`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** The table as aligned help lines (`--name <value> help`). */
|
|
16
|
+
export function helpLines(table, indent = 2) {
|
|
17
|
+
const rows = Object.entries(table).map(([name, o]) => [`--${name}${o.value ? " " + o.value : ""}`, o.help]);
|
|
18
|
+
const width = Math.max(...rows.map(([flag]) => flag.length)) + 2;
|
|
19
|
+
return rows.map(([flag, help]) => " ".repeat(indent) + flag.padEnd(width) + help).join("\n");
|
|
20
|
+
}
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Also: list / nav / validate / check / graph / init / agent-dive / traverse / try
|
|
12
12
|
* Skills: --skill / --skill-pilot / --skill-pilot-blind / --skill-convention
|
|
13
|
-
* Aliases (one release): `chain` -> run/demo --blocks; `--autoplay` -> `--auto-next`
|
|
14
13
|
*
|
|
15
14
|
* "project" defaults to cwd. Flags beat WAYGRAPH_* env.
|
|
16
15
|
*/
|
|
@@ -10,17 +10,16 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Also: list / nav / validate / check / graph / init / agent-dive / traverse / try
|
|
12
12
|
* Skills: --skill / --skill-pilot / --skill-pilot-blind / --skill-convention
|
|
13
|
-
* Aliases (one release): `chain` -> run/demo --blocks; `--autoplay` -> `--auto-next`
|
|
14
13
|
*
|
|
15
14
|
* "project" defaults to cwd. Flags beat WAYGRAPH_* env.
|
|
16
15
|
*/
|
|
17
16
|
import { SKILL_FLAG_MAP, printSkillIndex, readSkillMarkdown } from "./commands/agent-dive-scaffold.js";
|
|
18
|
-
import { takeEnvFlag } from "
|
|
19
|
-
import { takeConfigFlag } from "
|
|
20
|
-
import { usage } from "./
|
|
17
|
+
import { takeEnvFlag } from "../runtime/env-file.js";
|
|
18
|
+
import { takeConfigFlag } from "../runtime/waygraph-config.js";
|
|
19
|
+
import { usage } from "./usage.js";
|
|
21
20
|
import { listCase, navCase } from "./commands/list.js";
|
|
22
21
|
import { checkCase, typecheckCase, validateCase } from "./commands/check.js";
|
|
23
|
-
import {
|
|
22
|
+
import { demoCase, runCase } from "./commands/run.js";
|
|
24
23
|
import { testCase } from "./commands/test.js";
|
|
25
24
|
import { initCase } from "./commands/init.js";
|
|
26
25
|
import { traverseCase } from "./commands/traverse.js";
|
|
@@ -28,12 +27,14 @@ import { agentDiveCase } from "./commands/agent-dive.js";
|
|
|
28
27
|
import { autoServeCase, sessionCase } from "./commands/session.js";
|
|
29
28
|
import { tryCase } from "./commands/try.js";
|
|
30
29
|
import { upgradeCase } from "./commands/upgrade.js";
|
|
30
|
+
import { manifestCase } from "./commands/manifest.js";
|
|
31
31
|
import { extensionsCase } from "./commands/extensions.js";
|
|
32
32
|
import { mapCase } from "./commands/map.js";
|
|
33
|
+
import { setEnv } from "../engine/env.js";
|
|
33
34
|
const args = takeConfigFlag(takeEnvFlag(process.argv.slice(2)));
|
|
34
35
|
const command = args[0];
|
|
35
36
|
if (command)
|
|
36
|
-
|
|
37
|
+
setEnv("WAYGRAPH_COMMAND", command);
|
|
37
38
|
async function main() {
|
|
38
39
|
if (!command || command === "--help" || command === "-h") {
|
|
39
40
|
usage();
|
|
@@ -73,9 +74,6 @@ async function main() {
|
|
|
73
74
|
case "init-agents":
|
|
74
75
|
await agentDiveCase(args);
|
|
75
76
|
break;
|
|
76
|
-
case "chain":
|
|
77
|
-
await chainCase(args);
|
|
78
|
-
break;
|
|
79
77
|
case "demo":
|
|
80
78
|
await demoCase(args);
|
|
81
79
|
break;
|
|
@@ -106,6 +104,9 @@ async function main() {
|
|
|
106
104
|
case "upgrade":
|
|
107
105
|
await upgradeCase(args);
|
|
108
106
|
break;
|
|
107
|
+
case "manifest":
|
|
108
|
+
await manifestCase(args);
|
|
109
|
+
break;
|
|
109
110
|
case "extensions":
|
|
110
111
|
await extensionsCase(args);
|
|
111
112
|
break;
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
6
6
|
import { basename, dirname, join, resolve } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
8
9
|
function packageRoot() {
|
|
9
10
|
// dist/commands/agent-dive-scaffold.js -> ../..
|
|
10
|
-
return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
11
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
11
12
|
}
|
|
12
13
|
function agentsTemplateDir() {
|
|
13
14
|
return join(packageRoot(), "templates", "agents");
|
|
@@ -15,46 +16,33 @@ function agentsTemplateDir() {
|
|
|
15
16
|
function skillsTemplateDir() {
|
|
16
17
|
return join(packageRoot(), "templates", "skills");
|
|
17
18
|
}
|
|
18
|
-
/**
|
|
19
|
-
function
|
|
19
|
+
/** A markdown file's YAML frontmatter (between the leading `---` lines) and its body. */
|
|
20
|
+
function readFrontmatter(filePath) {
|
|
20
21
|
const raw = readFileSync(filePath, "utf-8");
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
throw new Error(`agent-dive:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (!m)
|
|
40
|
-
continue;
|
|
41
|
-
const key = m[1];
|
|
42
|
-
const val = m[2].trim();
|
|
43
|
-
if (val === "") {
|
|
44
|
-
listKey = key;
|
|
45
|
-
lists[key] = [];
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
meta[key] = val;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const name = meta.name || basename(filePath).replace(/\.agent\.md$/, "");
|
|
22
|
+
const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(raw);
|
|
23
|
+
if (!m)
|
|
24
|
+
throw new Error(`agent-dive: missing or unclosed frontmatter in ${filePath}`);
|
|
25
|
+
const data = parseYaml(m[1]);
|
|
26
|
+
if (data === null || typeof data !== "object" || Array.isArray(data))
|
|
27
|
+
throw new Error(`agent-dive: frontmatter in ${filePath} is not a mapping`);
|
|
28
|
+
return { data: data, body: m[2].trim() };
|
|
29
|
+
}
|
|
30
|
+
/** Markdown with `data` as YAML frontmatter. */
|
|
31
|
+
function withFrontmatter(data, body) {
|
|
32
|
+
return `---\n${stringifyYaml(data, { lineWidth: 0 })}---\n\n${body}\n`;
|
|
33
|
+
}
|
|
34
|
+
function parseAgentSpec(filePath) {
|
|
35
|
+
const { data, body } = readFrontmatter(filePath);
|
|
36
|
+
const text = (k) => (typeof data[k] === "string" && data[k] !== "" ? data[k] : undefined);
|
|
37
|
+
const name = text("name") ?? basename(filePath).replace(/\.(agent|skill)\.md$/, "");
|
|
38
|
+
const model = text("model");
|
|
39
|
+
const color = text("color");
|
|
52
40
|
return {
|
|
53
41
|
name,
|
|
54
|
-
description:
|
|
55
|
-
...(
|
|
56
|
-
...(
|
|
57
|
-
tools:
|
|
42
|
+
description: text("description") ?? name,
|
|
43
|
+
...(model ? { model } : {}),
|
|
44
|
+
...(color ? { color } : {}),
|
|
45
|
+
tools: Array.isArray(data.tools) ? data.tools.map(String) : [],
|
|
58
46
|
instructions: body,
|
|
59
47
|
};
|
|
60
48
|
}
|
|
@@ -126,42 +114,25 @@ function writeFileLogged(path, content, kind) {
|
|
|
126
114
|
console.log(` wrote ${path} (${kind})`);
|
|
127
115
|
}
|
|
128
116
|
function claudeAgentMd(agent) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
...(agent.
|
|
135
|
-
|
|
136
|
-
...(tools ? [`tools: ${tools}`] : []),
|
|
137
|
-
"---",
|
|
138
|
-
"",
|
|
139
|
-
agent.instructions,
|
|
140
|
-
"",
|
|
141
|
-
];
|
|
142
|
-
return lines.join("\n");
|
|
117
|
+
return withFrontmatter({
|
|
118
|
+
name: agent.name,
|
|
119
|
+
description: agent.description,
|
|
120
|
+
...(agent.model ? { model: agent.model } : {}),
|
|
121
|
+
...(agent.color ? { color: agent.color } : {}),
|
|
122
|
+
...(agent.tools.length ? { tools: agent.tools.join(", ") } : {}),
|
|
123
|
+
}, agent.instructions);
|
|
143
124
|
}
|
|
144
125
|
function opencodePromptMd(agent) {
|
|
145
126
|
return `${agent.instructions}\n`;
|
|
146
127
|
}
|
|
147
128
|
function cursorRuleMdc(agent) {
|
|
148
|
-
return
|
|
149
|
-
description: ${agent.description}
|
|
150
|
-
globs:
|
|
151
|
-
alwaysApply: false
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
# ${agent.name}
|
|
155
|
-
|
|
156
|
-
${agent.instructions}
|
|
157
|
-
`;
|
|
129
|
+
return withFrontmatter({ description: agent.description, globs: null, alwaysApply: false }, `# ${agent.name}\n\n${agent.instructions}`);
|
|
158
130
|
}
|
|
159
131
|
function vscodeAgentMd(agent) {
|
|
160
132
|
return claudeAgentMd(agent);
|
|
161
133
|
}
|
|
162
134
|
function claudeSkillMd(skill) {
|
|
163
|
-
|
|
164
|
-
return lines.join("\n");
|
|
135
|
+
return withFrontmatter({ name: skill.name, description: skill.description }, skill.instructions);
|
|
165
136
|
}
|
|
166
137
|
export function runAgentDive(opts) {
|
|
167
138
|
const agents = loadAgentSpecs();
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { runAgentDive } from "./agent-dive-scaffold.js";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { existsSync, statSync } from "node:fs";
|
|
4
|
+
import { helpLines, parseCommand } from "../args.js";
|
|
5
|
+
const LOOPS = ["claude", "opencode", "cursor", "vscode"];
|
|
6
|
+
const OPTIONS = {
|
|
7
|
+
loop: { type: "string", value: "claude|opencode|cursor|vscode", help: "Which agent tool to write for (default claude)" },
|
|
8
|
+
prompts: { type: "boolean", help: "Also copy docs/waygraph-agents/*.md" },
|
|
9
|
+
help: { type: "boolean", help: "This help" },
|
|
10
|
+
};
|
|
11
|
+
export async function agentDiveCase(args) {
|
|
12
|
+
// Playwright analogue: npx playwright init-agents --loop <provider>
|
|
13
|
+
const { values, positionals } = parseCommand("agent-dive", OPTIONS, args.slice(1));
|
|
14
|
+
if (values.help) {
|
|
15
|
+
console.log(`waygraph agent-dive [--loop claude|opencode|cursor|vscode] [--prompts] [project]
|
|
16
|
+
|
|
17
|
+
Initialize coding-agent definitions for diving an app into waygraph Blocks
|
|
18
|
+
(Playwright \`init-agents\` analogue).
|
|
19
|
+
|
|
20
|
+
${helpLines(OPTIONS)}
|
|
21
|
+
|
|
22
|
+
--loop claude writes .claude/agents/*.md, opencode .opencode/prompts/*.md,
|
|
23
|
+
cursor .cursor/rules/waygraph-*.mdc, vscode .github/agents/*.md.
|
|
24
|
+
|
|
25
|
+
Agents shipped: waygraph-planner, waygraph-author, waygraph-healer.
|
|
26
|
+
`);
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
const loop = (values.loop ?? "claude");
|
|
30
|
+
if (!LOOPS.includes(loop)) {
|
|
31
|
+
console.error("waygraph agent-dive: --loop must be claude | opencode | cursor | vscode");
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const prompts = values.prompts === true;
|
|
35
|
+
const projectDir = resolve(positionals[0] ?? process.cwd());
|
|
36
|
+
if (!existsSync(projectDir) || !statSync(projectDir).isDirectory()) {
|
|
37
|
+
console.error(`waygraph agent-dive: no such directory: ${projectDir}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
runAgentDive({ loop, projectDir, prompts });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare function runChainAuto(projectDir: string, fromTag: string, toTag: string): Promise<void>;
|
|
2
1
|
export declare function validateCase(args: string[]): Promise<void>;
|
|
3
2
|
export declare function typecheckCase(args: string[]): Promise<void>;
|
|
4
3
|
export declare function checkCase(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { relative, resolve } from "node:path";
|
|
2
|
+
import { findOrphanBlocks } from "../../analysis/graph.js";
|
|
3
|
+
import { checkMapGroups, checkProject, validateFlows } from "../../analysis/check.js";
|
|
4
|
+
import { parseRunFlags } from "../flags.js";
|
|
5
|
+
import { walkDir } from "../../manifest/scan.js";
|
|
6
|
+
import { collectPracticeWarnings, practiceKindLabel } from "../../analysis/practices-check.js";
|
|
7
|
+
function printOrphanReport(projectDir, orphans) {
|
|
8
|
+
if (orphans.length === 0) {
|
|
9
|
+
console.log(`waygraph check: no orphan Blocks (every *.block.ts export is wired into a flow)`);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
for (const o of orphans) {
|
|
13
|
+
console.warn(`waygraph check: orphan Block ${o.file} (${o.exportName} / "${o.block}") is not used in any flow - wire it into a .flow.ts before chain auto shorthand`);
|
|
14
|
+
}
|
|
15
|
+
console.log(`waygraph check: ${orphans.length} orphan Block${orphans.length === 1 ? "" : "s"}`);
|
|
16
|
+
}
|
|
17
|
+
function printPracticeReport(projectDir, practiceWarnings) {
|
|
18
|
+
if (practiceWarnings.length === 0) {
|
|
19
|
+
console.log(`waygraph check: no bad-practice patterns under ${projectDir}`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
for (const w of practiceWarnings) {
|
|
23
|
+
console.warn(`waygraph check: ${w.file} (${practiceKindLabel(w.kind)}) — ${w.detail}`);
|
|
24
|
+
}
|
|
25
|
+
console.log(`waygraph check: ${practiceWarnings.length} bad-practice warning${practiceWarnings.length === 1 ? "" : "s"}`);
|
|
26
|
+
}
|
|
27
|
+
async function runTypecheckCommand(projectDir, noPractices) {
|
|
28
|
+
const { spawnSync } = await import("node:child_process");
|
|
29
|
+
const tsc = spawnSync("npx", ["tsc", "--noEmit"], {
|
|
30
|
+
cwd: projectDir,
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
shell: false,
|
|
33
|
+
});
|
|
34
|
+
if (tsc.status !== 0) {
|
|
35
|
+
process.exit(tsc.status === null ? 1 : tsc.status);
|
|
36
|
+
}
|
|
37
|
+
if (noPractices)
|
|
38
|
+
return;
|
|
39
|
+
const practiceWarnings = collectPracticeWarnings(projectDir, walkDir);
|
|
40
|
+
printPracticeReport(projectDir, practiceWarnings);
|
|
41
|
+
}
|
|
42
|
+
export async function validateCase(args) {
|
|
43
|
+
const proj = resolve(args[1] ?? process.cwd());
|
|
44
|
+
const results = await validateFlows(proj);
|
|
45
|
+
let failed = 0;
|
|
46
|
+
for (const r of results) {
|
|
47
|
+
const rel = relative(proj, r.file);
|
|
48
|
+
if (r.valid) {
|
|
49
|
+
console.log(`OK ${rel} ${r.name}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
failed++;
|
|
53
|
+
console.log(`FAIL ${rel} ${r.name} -- ${r.error}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (failed > 0)
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
export async function typecheckCase(args) {
|
|
61
|
+
const flags = parseRunFlags(args.slice(1), args[0] ?? "check");
|
|
62
|
+
const proj = resolve(flags.positionals[0] ?? process.cwd());
|
|
63
|
+
await runTypecheckCommand(proj, flags.noPractices === true);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
export async function checkCase(args) {
|
|
67
|
+
const flags = parseRunFlags(args.slice(1), args[0] ?? "check");
|
|
68
|
+
const proj = resolve(flags.positionals[0] ?? process.cwd());
|
|
69
|
+
const { navWarnings, selWarnings, practiceWarnings } = await checkProject(proj, flags.noPractices ? { noPractices: true } : undefined);
|
|
70
|
+
if (navWarnings.length === 0) {
|
|
71
|
+
console.log(`waygraph check: no navigation found outside NavBlocks under ${proj}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
for (const w of navWarnings) {
|
|
75
|
+
const rel = relative(proj, w.file);
|
|
76
|
+
console.warn(`waygraph check: ${rel} (${w.blockName}) calls page.goto/reload/goBack/goForward outside a NavBlock - consider defineNavBlock instead`);
|
|
77
|
+
}
|
|
78
|
+
console.log(`waygraph check: ${navWarnings.length} nav warning${navWarnings.length === 1 ? "" : "s"}`);
|
|
79
|
+
}
|
|
80
|
+
if (selWarnings.length === 0) {
|
|
81
|
+
console.log(`waygraph check: no inline selectors found in verify arrays under ${proj}`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
for (const w of selWarnings) {
|
|
85
|
+
const rel = relative(proj, w.file);
|
|
86
|
+
console.warn(`waygraph check: ${rel} (${w.blockName}) has an inline selector literal in verify - move it into a *Sel object`);
|
|
87
|
+
}
|
|
88
|
+
console.log(`waygraph check: ${selWarnings.length} inline-selector warning${selWarnings.length === 1 ? "" : "s"}`);
|
|
89
|
+
}
|
|
90
|
+
if (!flags.noPractices) {
|
|
91
|
+
printPracticeReport(proj, practiceWarnings);
|
|
92
|
+
}
|
|
93
|
+
const groupProblems = checkMapGroups(proj);
|
|
94
|
+
for (const p of groupProblems) {
|
|
95
|
+
console.warn(`waygraph check: ${relative(proj, p.file)} imports "${p.spec}" from outside map group ${p.group} - a group imports only waygraph and its own files, so it can be packed`);
|
|
96
|
+
}
|
|
97
|
+
if (groupProblems.length > 0)
|
|
98
|
+
console.log(`waygraph check: ${groupProblems.length} map group import warning${groupProblems.length === 1 ? "" : "s"}`);
|
|
99
|
+
const orphans = await findOrphanBlocks(proj);
|
|
100
|
+
printOrphanReport(proj, orphans);
|
|
101
|
+
// Warnings only - never fail exit code. Orphans are reported for
|
|
102
|
+
// human/agent cleanup; chain auto refuses while any remain.
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Checkpoint name -> tag, and union aliases -> member names, found in the states files. */
|
|
2
|
+
interface StatesInfo {
|
|
3
|
+
tags: Map<string, string>;
|
|
4
|
+
unions: Map<string, string[]>;
|
|
5
|
+
}
|
|
6
|
+
/** Rewrites one states file; returns the new text and what it declared. */
|
|
7
|
+
export declare function convertStates(text: string, info: StatesInfo): string;
|
|
8
|
+
/** Rewrites one Block file. Calls whose Checkpoints are not plain declared names are left as they are. */
|
|
9
|
+
export declare function convertBlocks(text: string, info: StatesInfo): {
|
|
10
|
+
text: string;
|
|
11
|
+
skipped: string[];
|
|
12
|
+
};
|
|
13
|
+
/** Runs the codemod over a project; returns the files changed and the calls it left alone. */
|
|
14
|
+
export declare function codemodCheckpoints(projectDir: string): {
|
|
15
|
+
changed: string[];
|
|
16
|
+
skipped: string[];
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// `waygraph upgrade --codemod checkpoints`: rewrites a project from tag strings and `<In, Out>` type arguments to
|
|
2
|
+
// Checkpoint values (`export const Home = checkpoint("Home")`, `checkpoint: Home`, `from: Home, to: ItemInCart`). Works
|
|
3
|
+
// on the TypeScript AST (ts-morph), so formatting, comments and odd line breaks don't fool it.
|
|
4
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { relative } from "node:path";
|
|
6
|
+
import { IndentationText, Node, Project, SyntaxKind } from "ts-morph";
|
|
7
|
+
import { walkDir } from "../../manifest/scan.js";
|
|
8
|
+
function parse(text) {
|
|
9
|
+
const indentationText = /\n\t/.test(text) ? IndentationText.Tab : /\n {4}\S/.test(text) && !/\n {2}\S/.test(text) ? IndentationText.FourSpaces : IndentationText.TwoSpaces;
|
|
10
|
+
return new Project({ useInMemoryFileSystem: true, manipulationSettings: { indentationText } }).createSourceFile("/file.ts", text);
|
|
11
|
+
}
|
|
12
|
+
/** Whether `name` is still used anywhere outside import statements. */
|
|
13
|
+
function usedOutsideImports(sf, name) {
|
|
14
|
+
return sf.getDescendantsOfKind(SyntaxKind.Identifier).some((id) => {
|
|
15
|
+
if (id.getText() !== name || id.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))
|
|
16
|
+
return false;
|
|
17
|
+
const parent = id.getParent();
|
|
18
|
+
return !(Node.isPropertyAccessExpression(parent) && parent.getNameNode() === id) && !(Node.isPropertyAssignment(parent) && parent.getNameNode() === id);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** Drops a named import from "waygraph" that nothing uses any more (and the import, when it ends up empty). */
|
|
22
|
+
function dropUnusedWaygraphImport(sf, name) {
|
|
23
|
+
if (usedOutsideImports(sf, name))
|
|
24
|
+
return;
|
|
25
|
+
for (const imp of sf.getImportDeclarations().filter((d) => d.getModuleSpecifierValue() === "waygraph")) {
|
|
26
|
+
imp.getNamedImports().find((n) => n.getName() === name)?.remove();
|
|
27
|
+
if (imp.getNamedImports().length === 0 && !imp.getDefaultImport() && !imp.getNamespaceImport())
|
|
28
|
+
imp.remove();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Learns Checkpoint declarations already in value form, so the codemod can run again after a partial run. */
|
|
32
|
+
function learnValues(sf, info) {
|
|
33
|
+
for (const decl of sf.getVariableDeclarations()) {
|
|
34
|
+
const init = decl.getInitializer();
|
|
35
|
+
if (Node.isCallExpression(init) && init.getExpression().getText() === "checkpoint") {
|
|
36
|
+
const tag = init.getArguments()[0];
|
|
37
|
+
if (Node.isStringLiteral(tag))
|
|
38
|
+
info.tags.set(decl.getName(), tag.getLiteralValue());
|
|
39
|
+
}
|
|
40
|
+
else if (Node.isAsExpression(init) && Node.isArrayLiteralExpression(init.getExpression())) {
|
|
41
|
+
info.unions.set(decl.getName(), init.getExpression().asKindOrThrow(SyntaxKind.ArrayLiteralExpression).getElements().map((e) => e.getText()));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Rewrites one states file; returns the new text and what it declared. */
|
|
46
|
+
export function convertStates(text, info) {
|
|
47
|
+
const sf = parse(text);
|
|
48
|
+
learnValues(sf, info);
|
|
49
|
+
let changed = false;
|
|
50
|
+
for (const alias of sf.getTypeAliases()) {
|
|
51
|
+
if (!alias.isExported())
|
|
52
|
+
continue;
|
|
53
|
+
const name = alias.getName();
|
|
54
|
+
const type = alias.getTypeNodeOrThrow();
|
|
55
|
+
if (Node.isTypeReference(type) && type.getTypeName().getText() === "Checkpoint") {
|
|
56
|
+
const arg = type.getTypeArguments()[0];
|
|
57
|
+
if (!Node.isLiteralTypeNode(arg) || !Node.isStringLiteral(arg.getLiteral()))
|
|
58
|
+
continue;
|
|
59
|
+
const tag = arg.getLiteral().asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();
|
|
60
|
+
info.tags.set(name, tag);
|
|
61
|
+
alias.replaceWithText(`export const ${name} = checkpoint("${tag}");\nexport type ${name} = typeof ${name};`);
|
|
62
|
+
changed = true;
|
|
63
|
+
}
|
|
64
|
+
else if (Node.isUnionTypeNode(type)) {
|
|
65
|
+
const names = type.getTypeNodes().map((t) => t.getText());
|
|
66
|
+
if (!names.every((n) => info.tags.has(n) || info.unions.has(n)))
|
|
67
|
+
continue;
|
|
68
|
+
const flat = names.flatMap((n) => info.unions.get(n) ?? [n]);
|
|
69
|
+
info.unions.set(name, flat);
|
|
70
|
+
alias.replaceWithText(`export const ${name} = [${flat.join(", ")}] as const;\nexport type ${name} = (typeof ${name})[number];`);
|
|
71
|
+
changed = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!changed)
|
|
75
|
+
return text;
|
|
76
|
+
// `checkpoint` is now used as a value; `Checkpoint` stays only while something still names the type.
|
|
77
|
+
const wg = sf.getImportDeclarations().find((d) => d.getModuleSpecifierValue() === "waygraph");
|
|
78
|
+
if (!wg)
|
|
79
|
+
sf.insertImportDeclaration(0, { moduleSpecifier: "waygraph", namedImports: ["checkpoint"] });
|
|
80
|
+
else if (wg.isTypeOnly())
|
|
81
|
+
sf.insertImportDeclaration(wg.getChildIndex(), { moduleSpecifier: "waygraph", namedImports: ["checkpoint"] });
|
|
82
|
+
else if (!wg.getNamedImports().some((n) => n.getName() === "checkpoint"))
|
|
83
|
+
wg.addNamedImport("checkpoint");
|
|
84
|
+
dropUnusedWaygraphImport(sf, "Checkpoint");
|
|
85
|
+
return sf.getFullText();
|
|
86
|
+
}
|
|
87
|
+
const SINGLE_CHECKPOINT = ["defineNavBlock", "defineNavClickBlock", "defineMemNavBlock", "definePageBlock", "defineAssertBlock"];
|
|
88
|
+
const ROUTED = ["defineMethodBlock", "defineEffectBlock"];
|
|
89
|
+
function optionsOf(call) {
|
|
90
|
+
const arg = call.getArguments()[0];
|
|
91
|
+
return Node.isObjectLiteralExpression(arg) ? arg : undefined;
|
|
92
|
+
}
|
|
93
|
+
/** `checkpoint: "Home"` with `<Home>` becomes `checkpoint: Home`. */
|
|
94
|
+
function convertSingle(call, fn, info, skipped) {
|
|
95
|
+
const typeArg = call.getTypeArguments()[0];
|
|
96
|
+
const prop = optionsOf(call)?.getProperty("checkpoint");
|
|
97
|
+
const value = Node.isPropertyAssignment(prop) ? prop.getInitializer() : undefined;
|
|
98
|
+
if (!typeArg || !Node.isPropertyAssignment(prop) || !Node.isStringLiteral(value))
|
|
99
|
+
return;
|
|
100
|
+
const name = typeArg.getText();
|
|
101
|
+
if (info.tags.get(name) !== value.getLiteralValue()) {
|
|
102
|
+
skipped.push(`${fn}<${name}>`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
call.removeTypeArgument(typeArg);
|
|
106
|
+
prop.setInitializer(name);
|
|
107
|
+
}
|
|
108
|
+
/** `<In, Out>` becomes `from: In, to: Out` (right after the name and description); a resolve that only returns `to` goes. */
|
|
109
|
+
function convertRouted(call, fn, info, skipped) {
|
|
110
|
+
const [fromArg, toArg] = call.getTypeArguments();
|
|
111
|
+
const options = optionsOf(call);
|
|
112
|
+
if (!fromArg || !toArg || !options)
|
|
113
|
+
return;
|
|
114
|
+
const from = fromArg.getText();
|
|
115
|
+
const to = toArg.getText();
|
|
116
|
+
const known = (n) => info.tags.has(n) || info.unions.has(n);
|
|
117
|
+
const anywhere = from === "Checkpoint<string>";
|
|
118
|
+
if ((!anywhere && !known(from)) || !known(to)) {
|
|
119
|
+
skipped.push(`${fn}<${from}, ${to}>`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
call.removeTypeArgument(toArg);
|
|
123
|
+
call.removeTypeArgument(fromArg);
|
|
124
|
+
const props = options.getProperties();
|
|
125
|
+
const after = Math.max(...["name", "description"].map((n) => props.findIndex((p) => Node.isPropertyAssignment(p) && p.getName() === n)));
|
|
126
|
+
options.insertPropertyAssignments(after + 1, [...(anywhere ? [] : [{ name: "from", initializer: from }]), { name: "to", initializer: to }]);
|
|
127
|
+
const tag = info.tags.get(to);
|
|
128
|
+
const instruction = options.getProperty("instruction");
|
|
129
|
+
const body = Node.isPropertyAssignment(instruction) ? instruction.getInitializer() : undefined;
|
|
130
|
+
const resolve = Node.isObjectLiteralExpression(body) ? body.getProperty("resolve") : undefined;
|
|
131
|
+
if (tag && Node.isPropertyAssignment(resolve) && resolve.getInitializer()?.getText().replace(/\s/g, "") === `()=>checkpoint("${tag}")`)
|
|
132
|
+
resolve.remove();
|
|
133
|
+
// Inserting and removing properties leaves the object's indentation uneven; tidy just this call.
|
|
134
|
+
call.formatText({ indentSize: call.getSourceFile().getProject().manipulationSettings.getIndentationText().length, convertTabsToSpaces: !call.getSourceFile().getFullText().includes("\n\t") });
|
|
135
|
+
}
|
|
136
|
+
/** Rewrites one Block file. Calls whose Checkpoints are not plain declared names are left as they are. */
|
|
137
|
+
export function convertBlocks(text, info) {
|
|
138
|
+
const sf = parse(text);
|
|
139
|
+
const skipped = [];
|
|
140
|
+
for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression).reverse()) {
|
|
141
|
+
if (call.wasForgotten())
|
|
142
|
+
continue;
|
|
143
|
+
const fn = call.getExpression().getText();
|
|
144
|
+
if (SINGLE_CHECKPOINT.includes(fn))
|
|
145
|
+
convertSingle(call, fn, info, skipped);
|
|
146
|
+
else if (ROUTED.includes(fn))
|
|
147
|
+
convertRouted(call, fn, info, skipped);
|
|
148
|
+
}
|
|
149
|
+
if (sf.getFullText() === text)
|
|
150
|
+
return { text, skipped };
|
|
151
|
+
dropUnusedWaygraphImport(sf, "Checkpoint");
|
|
152
|
+
dropUnusedWaygraphImport(sf, "checkpoint");
|
|
153
|
+
// Checkpoints are now used as values: import them as values.
|
|
154
|
+
const known = (n) => info.tags.has(n) || info.unions.has(n);
|
|
155
|
+
for (const imp of sf.getImportDeclarations()) {
|
|
156
|
+
if (imp.isTypeOnly() && /states/.test(imp.getModuleSpecifierValue()) && imp.getNamedImports().some((n) => known(n.getName())))
|
|
157
|
+
imp.setIsTypeOnly(false);
|
|
158
|
+
}
|
|
159
|
+
return { text: sf.getFullText(), skipped };
|
|
160
|
+
}
|
|
161
|
+
/** Runs the codemod over a project; returns the files changed and the calls it left alone. */
|
|
162
|
+
export function codemodCheckpoints(projectDir) {
|
|
163
|
+
const info = { tags: new Map(), unions: new Map() };
|
|
164
|
+
const files = walkDir(projectDir, /\.ts$/).filter((f) => !f.endsWith(".d.ts"));
|
|
165
|
+
const states = files.filter((f) => /\.states\.ts$|[/\\]_states\.ts$/.test(f));
|
|
166
|
+
const changed = [];
|
|
167
|
+
const skipped = [];
|
|
168
|
+
for (const f of states) {
|
|
169
|
+
const before = readFileSync(f, "utf8");
|
|
170
|
+
const after = convertStates(before, info);
|
|
171
|
+
if (after !== before) {
|
|
172
|
+
writeFileSync(f, after);
|
|
173
|
+
changed.push(relative(projectDir, f));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
for (const f of files.filter((x) => !states.includes(x))) {
|
|
177
|
+
const before = readFileSync(f, "utf8");
|
|
178
|
+
const { text, skipped: s } = convertBlocks(before, info);
|
|
179
|
+
skipped.push(...s.map((c) => `${relative(projectDir, f)}: ${c}`));
|
|
180
|
+
if (text !== before) {
|
|
181
|
+
writeFileSync(f, text);
|
|
182
|
+
changed.push(relative(projectDir, f));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { changed, skipped };
|
|
186
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Project } from "ts-morph";
|
|
2
|
+
import type { SourceFile } from "ts-morph";
|
|
3
|
+
/** A Block's kind by the file and export it is declared in; undefined when it isn't a known Block. */
|
|
4
|
+
export type KindOf = (file: string, exportName: string) => string | undefined;
|
|
5
|
+
/** Rewrites the old flow forms in a project's source files; returns problems it left for a person. */
|
|
6
|
+
export declare function convertFlows(project: Project, kindOf: KindOf): {
|
|
7
|
+
changed: SourceFile[];
|
|
8
|
+
problems: {
|
|
9
|
+
file: string;
|
|
10
|
+
line: number;
|
|
11
|
+
reason: string;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
/** Runs the codemod over a project's TypeScript files, using its runtime scan for each Block's kind. */
|
|
15
|
+
export declare function codemodFlows(projectDir: string): Promise<{
|
|
16
|
+
changed: string[];
|
|
17
|
+
problems: string[];
|
|
18
|
+
}>;
|