steppy-dev 0.3.0__tar.gz → 0.4.0__tar.gz

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.
Files changed (595) hide show
  1. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/workflows/steppy-e2e.yml +2 -2
  2. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CHANGELOG.md +62 -1
  3. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CLAUDE.md +2 -2
  4. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/PKG-INFO +2 -1
  5. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/README.md +1 -0
  6. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/SECURITY.md +14 -4
  7. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/STEPPY-REFERENCE.md +7 -3
  8. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/config.yaml +9 -1
  9. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/package-lock.json +1 -1
  10. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/package-lock.json +3 -3
  11. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/package-lock.json +4 -4
  12. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/package.json +2 -2
  13. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/package-lock.json +2 -2
  14. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/package.json +1 -1
  15. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/package-lock.json +3 -3
  16. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/package.json +1 -1
  17. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/package.json +1 -1
  18. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/package-lock.json +3 -3
  19. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/package.json +1 -1
  20. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/pyproject.toml +1 -1
  21. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-ci-report/SKILL.md +1 -1
  22. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-scenario-author/SKILL.md +6 -3
  23. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/__init__.py +1 -1
  24. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/auth.py +84 -12
  25. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cli.py +42 -14
  26. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/config.py +28 -0
  27. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/generator.py +4 -0
  28. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/verify.py +4 -1
  29. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/models.py +8 -1
  30. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/parser.py +21 -0
  31. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/presets.py +4 -0
  32. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/steppy-config.schema.json +24 -0
  33. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/ci/github-actions.yml +2 -2
  34. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/ci/gitlab-ci.yml +1 -1
  35. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/conftest.py.j2 +84 -16
  36. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/init/config.yaml +6 -1
  37. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/test_scenario.py.j2 +13 -8
  38. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_assert_contains_count.py +33 -4
  39. steppy_dev-0.4.0/tests/test_auth_login_cli.py +278 -0
  40. steppy_dev-0.4.0/tests/test_form_login.py +638 -0
  41. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_migrate_custom.py +12 -0
  42. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_navigate_reload.py +15 -1
  43. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_navigate_wait.py +46 -2
  44. steppy_dev-0.4.0/tests/test_scenario_timeout_lint.py +65 -0
  45. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_wait_for_predicate.py +13 -0
  46. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.claude/launch.json +0 -0
  47. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.dockerignore +0 -0
  48. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.gitattributes +0 -0
  49. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  50. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  51. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  52. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/pull_request_template.md +0 -0
  53. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/workflows/ci.yml +0 -0
  54. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/workflows/release.yml +0 -0
  55. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.gitignore +0 -0
  56. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  57. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CONTRIBUTING.md +0 -0
  58. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/Dockerfile +0 -0
  59. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/LICENSE +0 -0
  60. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/NEW_FEATURE.md +0 -0
  61. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/NOTICE +0 -0
  62. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/PROMPT_EXAMPLE.md +0 -0
  63. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/bundle-manifest.schema.json +0 -0
  64. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/cases.json +0 -0
  65. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/create-invoice.en.json +0 -0
  66. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/create-invoice.fr.json +0 -0
  67. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/remove-inactive-customers.en.json +0 -0
  68. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/remove-inactive-customers.fr.json +0 -0
  69. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/send-invoice.en.json +0 -0
  70. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/send-invoice.fr.json +0 -0
  71. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/tours.manifest.json +0 -0
  72. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/report.schema.json +0 -0
  73. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/tour.schema.json +0 -0
  74. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/tours-manifest.schema.json +0 -0
  75. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/credentials.yaml.example +0 -0
  76. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/README.md +0 -0
  77. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/steppy-icon.svg +0 -0
  78. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/steppy-mark-dark.svg +0 -0
  79. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/steppy-mark.svg +0 -0
  80. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/design/in-app-tours.md +0 -0
  81. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/tours.md +0 -0
  82. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/create_screenshots.py +0 -0
  83. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/e2e/scenarios/editor/invoices.md +0 -0
  84. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/e2e/scenarios/editor/onboarding.md +0 -0
  85. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/package.json +0 -0
  86. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/guide.json +0 -0
  87. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-01.json +0 -0
  88. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-01.png +0 -0
  89. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-02.json +0 -0
  90. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-02.png +0 -0
  91. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-01.json +0 -0
  92. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-01.png +0 -0
  93. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-02.json +0 -0
  94. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-02.png +0 -0
  95. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/steppy-player.js +0 -0
  96. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/steppy.guide.config.static.ts +0 -0
  97. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/steppy.guide.config.ts +0 -0
  98. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/README.md +0 -0
  99. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/app/app.css +0 -0
  100. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/app/app.js +0 -0
  101. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/app/index.html +0 -0
  102. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/app-assets/.gitkeep +0 -0
  103. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/config.yaml +0 -0
  104. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/scenarios/editor--create-invoice.md +0 -0
  105. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/scenarios/editor--remove-inactive-customers.md +0 -0
  106. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/scenarios/editor--send-invoice.md +0 -0
  107. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/serve.py +0 -0
  108. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/README.md +0 -0
  109. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/.gitignore +0 -0
  110. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/angular.json +0 -0
  111. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/package.json +0 -0
  112. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/public/i18n/en.json +0 -0
  113. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/public/i18n/fr.json +0 -0
  114. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/app.config.ts +0 -0
  115. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/app.routes.ts +0 -0
  116. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/app.ts +0 -0
  117. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/customers.ts +0 -0
  118. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/demo-config.ts +0 -0
  119. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/invoice-detail.ts +0 -0
  120. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/invoice-list.ts +0 -0
  121. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/invoices.ts +0 -0
  122. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/index.html +0 -0
  123. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/main.ts +0 -0
  124. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/styles.css +0 -0
  125. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/tsconfig.app.json +0 -0
  126. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/tsconfig.json +0 -0
  127. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/hatch_build.py +0 -0
  128. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/LICENSE +0 -0
  129. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/NOTICE +0 -0
  130. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/README.md +0 -0
  131. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/angular.json +0 -0
  132. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/ng-package.json +0 -0
  133. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/config.ts +0 -0
  134. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/navigate.spec.ts +0 -0
  135. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/navigate.ts +0 -0
  136. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/overlay.ts +0 -0
  137. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/provide.ts +0 -0
  138. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/public-api.ts +0 -0
  139. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/real-overlay.spec.ts +0 -0
  140. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/testing/fake-overlay.ts +0 -0
  141. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/testing/zone-providers.ts +0 -0
  142. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/testing/zone-setup.ts +0 -0
  143. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tour-start.directive.spec.ts +0 -0
  144. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tour-start.directive.ts +0 -0
  145. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.component.spec.ts +0 -0
  146. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.component.ts +0 -0
  147. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.service.spec.ts +0 -0
  148. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.service.ts +0 -0
  149. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.zone.spec.ts +0 -0
  150. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.json +0 -0
  151. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.lib.json +0 -0
  152. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.lib.prod.json +0 -0
  153. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.spec.json +0 -0
  154. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/LICENSE +0 -0
  155. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/NOTICE +0 -0
  156. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/README.md +0 -0
  157. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/THIRD_PARTY_LICENSES.txt +0 -0
  158. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/dev/fixture-manifest.json +0 -0
  159. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/dev/index.html +0 -0
  160. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/schema/README.md +0 -0
  161. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/scripts/check-pack.ts +0 -0
  162. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/scripts/check-tour-size.ts +0 -0
  163. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/scripts/emit-json-schema.ts +0 -0
  164. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/cursor/animator.ts +0 -0
  165. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/cursor/legacy-iife.ts +0 -0
  166. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/cursor/types.ts +0 -0
  167. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/i18n/ui-strings.ts +0 -0
  168. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/index.ts +0 -0
  169. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/interaction/positioning.ts +0 -0
  170. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/content.ts +0 -0
  171. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/index.ts +0 -0
  172. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/parse.ts +0 -0
  173. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/schema.ts +0 -0
  174. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/steppy-guide.ts +0 -0
  175. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/base-styles.ts +0 -0
  176. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/controls.ts +0 -0
  177. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/index.ts +0 -0
  178. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/inline.ts +0 -0
  179. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/overlay.ts +0 -0
  180. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/sidebar.ts +0 -0
  181. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/types.ts +0 -0
  182. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/api.ts +0 -0
  183. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/contract.ts +0 -0
  184. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/dom.ts +0 -0
  185. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/engine.ts +0 -0
  186. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/events.ts +0 -0
  187. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/host.ts +0 -0
  188. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/index.ts +0 -0
  189. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/layer.ts +0 -0
  190. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/loader.ts +0 -0
  191. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/resolver.ts +0 -0
  192. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/routes.ts +0 -0
  193. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/signature.ts +0 -0
  194. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/storage.ts +0 -0
  195. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/strings.ts +0 -0
  196. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/styles.ts +0 -0
  197. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/templates.ts +0 -0
  198. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/tracker.ts +0 -0
  199. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/triggers.ts +0 -0
  200. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/validate.ts +0 -0
  201. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/markdown.ts +0 -0
  202. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/names.ts +0 -0
  203. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/placement.ts +0 -0
  204. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/strings.ts +0 -0
  205. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/tokens.ts +0 -0
  206. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/easing.ts +0 -0
  207. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/iife.ts +0 -0
  208. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/stage.ts +0 -0
  209. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/timeline.ts +0 -0
  210. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/animator.test.ts +0 -0
  211. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/bridge-from-python.test.ts +0 -0
  212. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/component.test.ts +0 -0
  213. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/fixtures.ts +0 -0
  214. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/markdown.test.ts +0 -0
  215. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/positioning.test.ts +0 -0
  216. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/schema.test.ts +0 -0
  217. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/setup.ts +0 -0
  218. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/templates.test.ts +0 -0
  219. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/boundaries.test.ts +0 -0
  220. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/engine.test.ts +0 -0
  221. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/golden.test.ts +0 -0
  222. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/helpers.ts +0 -0
  223. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/host.test.ts +0 -0
  224. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/loader.test.ts +0 -0
  225. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/resolver-tracker.test.ts +0 -0
  226. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/routes.test.ts +0 -0
  227. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/small-modules.test.ts +0 -0
  228. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/validate.test.ts +0 -0
  229. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/guide-markdown-parity.test.ts +0 -0
  230. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/guide-styles-stable.test.ts +0 -0
  231. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/legacy-markdown.ts +0 -0
  232. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/legacy-placement.ts +0 -0
  233. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/legacy-ui-strings.ts +0 -0
  234. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/markdown-policy.test.ts +0 -0
  235. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/placement.test.ts +0 -0
  236. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/strings.test.ts +0 -0
  237. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/video-stage.test.ts +0 -0
  238. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/video-timeline.test.ts +0 -0
  239. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/tsconfig.json +0 -0
  240. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/tsconfig.types.json +0 -0
  241. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.config.ts +0 -0
  242. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.iife.config.ts +0 -0
  243. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.tour.config.ts +0 -0
  244. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.video.config.ts +0 -0
  245. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/README.md +0 -0
  246. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/src/index.ts +0 -0
  247. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/src/shims.d.ts +0 -0
  248. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/test/component.test.ts +0 -0
  249. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/tsconfig.build.json +0 -0
  250. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/tsconfig.json +0 -0
  251. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/vite.config.ts +0 -0
  252. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/index.d.ts +0 -0
  253. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/index.js +0 -0
  254. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/index.ts +0 -0
  255. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/tsconfig.json +0 -0
  256. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/README.md +0 -0
  257. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/src/index.ts +0 -0
  258. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/src/shims.d.ts +0 -0
  259. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/test/component.test.ts +0 -0
  260. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/tsconfig.build.json +0 -0
  261. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/tsconfig.json +0 -0
  262. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/vite.config.ts +0 -0
  263. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/admin--create-project.md +0 -0
  264. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/admin--edit-settings.md +0 -0
  265. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/cross--task-approval.md +0 -0
  266. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/editor--manage-items.md +0 -0
  267. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/seed/base.py +0 -0
  268. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-app-tours/SKILL.md +0 -0
  269. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-template/SKILL.md +0 -0
  270. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/__main__.py +0 -0
  271. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_cli_common.py +0 -0
  272. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_docker/Dockerfile.installed +0 -0
  273. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/__init__.py +0 -0
  274. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/compose.py +0 -0
  275. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/event_bus.py +0 -0
  276. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/failures.py +0 -0
  277. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/fingerprint.py +0 -0
  278. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/image.py +0 -0
  279. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/lastfailed.py +0 -0
  280. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/lifecycle.py +0 -0
  281. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/preauth.py +0 -0
  282. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/progress.py +0 -0
  283. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/queue.py +0 -0
  284. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/renderer.py +0 -0
  285. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/retry.py +0 -0
  286. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/THIRD_PARTY_LICENSES.txt +0 -0
  287. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/__init__.py +0 -0
  288. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-cursor-legacy.js +0 -0
  289. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-cursor-legacy.js.map +0 -0
  290. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-player.js +0 -0
  291. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-player.js.map +0 -0
  292. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-video.js +0 -0
  293. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-video.js.map +0 -0
  294. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_templating.py +0 -0
  295. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/assertions.py +0 -0
  296. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/build.py +0 -0
  297. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/build_models.py +0 -0
  298. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/buildid.py +0 -0
  299. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/__init__.py +0 -0
  300. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/archive.py +0 -0
  301. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/classify.py +0 -0
  302. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/create.py +0 -0
  303. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/hashing.py +0 -0
  304. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/manifest.py +0 -0
  305. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/results.py +0 -0
  306. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle_cli.py +0 -0
  307. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/captures.py +0 -0
  308. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cloud/__init__.py +0 -0
  309. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cloud/client.py +0 -0
  310. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cloud/upload.py +0 -0
  311. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/compat.py +0 -0
  312. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/config_schema.py +0 -0
  313. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/__init__.py +0 -0
  314. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/bundle.py +0 -0
  315. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/report.py +0 -0
  316. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/tours.py +0 -0
  317. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coordinator.py +0 -0
  318. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/__init__.py +0 -0
  319. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/gaps.py +0 -0
  320. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/manifest.py +0 -0
  321. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/merge.py +0 -0
  322. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/normalize.py +0 -0
  323. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/report.py +0 -0
  324. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/sourcemap.py +0 -0
  325. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/store.py +0 -0
  326. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/triage.py +0 -0
  327. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage_cli.py +0 -0
  328. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/durations.py +0 -0
  329. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/exclusive.py +0 -0
  330. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/flaky_cli.py +0 -0
  331. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/guide.py +0 -0
  332. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/history.py +0 -0
  333. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/init_cli.py +0 -0
  334. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/locales.py +0 -0
  335. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/__init__.py +0 -0
  336. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/apply.py +0 -0
  337. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/plan.py +0 -0
  338. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/rules.py +0 -0
  339. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate_cli.py +0 -0
  340. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/naming.py +0 -0
  341. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/pdf.py +0 -0
  342. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/record_cli.py +0 -0
  343. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/__init__.py +0 -0
  344. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/assets.py +0 -0
  345. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/build.py +0 -0
  346. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/coverage_source.py +0 -0
  347. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/model.py +0 -0
  348. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/render.py +0 -0
  349. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/source.py +0 -0
  350. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report_cli.py +0 -0
  351. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/runmeta.py +0 -0
  352. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/selection.py +0 -0
  353. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/sitemap.py +0 -0
  354. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/testids.py +0 -0
  355. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/totp.py +0 -0
  356. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tour_spec.py +0 -0
  357. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/__init__.py +0 -0
  358. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/actions.py +0 -0
  359. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/compiler.py +0 -0
  360. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/diagnostics.py +0 -0
  361. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/emit.py +0 -0
  362. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/ids.py +0 -0
  363. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/inference.py +0 -0
  364. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/model.py +0 -0
  365. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/paths.py +0 -0
  366. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/pipeline.py +0 -0
  367. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/publish.py +0 -0
  368. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/replay.py +0 -0
  369. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/routes.py +0 -0
  370. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/settings.py +0 -0
  371. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/text.py +0 -0
  372. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours_cli.py +0 -0
  373. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/__init__.py +0 -0
  374. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/cache.py +0 -0
  375. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/presets.py +0 -0
  376. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/__init__.py +0 -0
  377. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/http.py +0 -0
  378. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/local.py +0 -0
  379. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/null.py +0 -0
  380. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/registry.py +0 -0
  381. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/track.py +0 -0
  382. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/types.py +0 -0
  383. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/update_cli.py +0 -0
  384. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/video.py +0 -0
  385. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/video_cache.py +0 -0
  386. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/video_cli.py +0 -0
  387. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/worker.py +0 -0
  388. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/_steppy_events.py +0 -0
  389. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/_steppy_tours.py +0 -0
  390. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/component-interactive.ts.j2 +0 -0
  391. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/component-video.ts.j2 +0 -0
  392. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/component.ts.j2 +0 -0
  393. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/content.ts.j2 +0 -0
  394. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/gitignore.j2 +0 -0
  395. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/group.component.ts.j2 +0 -0
  396. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/onboarding.component.ts.j2 +0 -0
  397. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/routes.ts.j2 +0 -0
  398. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.book.html.j2 +0 -0
  399. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.fragment.html.j2 +0 -0
  400. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.html.j2 +0 -0
  401. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.md.j2 +0 -0
  402. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/init/credentials.yaml.example +0 -0
  403. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/init/scenarios/example--first-flow.md +0 -0
  404. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/_head.html.j2 +0 -0
  405. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/_mark.html.j2 +0 -0
  406. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/coverage.html.j2 +0 -0
  407. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/index.html.j2 +0 -0
  408. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/report.css +0 -0
  409. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/scenario.html.j2 +0 -0
  410. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/_headers.j2 +0 -0
  411. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/_mode_links.html.j2 +0 -0
  412. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/_seo_head.html.j2 +0 -0
  413. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/cursor.js.j2 +0 -0
  414. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/group.html.j2 +0 -0
  415. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/guides.css +0 -0
  416. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/index.html.j2 +0 -0
  417. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/interactive.html.j2 +0 -0
  418. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/onboarding.html.j2 +0 -0
  419. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/page.html.j2 +0 -0
  420. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/robots.txt.j2 +0 -0
  421. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/video.html.j2 +0 -0
  422. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/__init__.py +0 -0
  423. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/_codegen_snapshot.py +0 -0
  424. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/_private_terms.py +0 -0
  425. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/README.md +0 -0
  426. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_coverage_recorder_it.py +0 -0
  427. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_tour_angular_it.py +0 -0
  428. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_tour_player_it.py +0 -0
  429. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_tour_replay_it.py +0 -0
  430. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/tour_geometry.py +0 -0
  431. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_action_enum_sync.py +0 -0
  432. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_angular_adapter_sync.py +0 -0
  433. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_assertion_grammar.py +0 -0
  434. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_auth_form_rename.py +0 -0
  435. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_auth_js_injection.py +0 -0
  436. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build.py +0 -0
  437. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_fixture.py +0 -0
  438. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_interactive.py +0 -0
  439. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_models.py +0 -0
  440. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_seo.py +0 -0
  441. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_tours.py +0 -0
  442. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_video.py +0 -0
  443. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle.py +0 -0
  444. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_contract_parity.py +0 -0
  445. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_events_sink.py +0 -0
  446. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_events_steps.py +0 -0
  447. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_run_wiring.py +0 -0
  448. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_schema.py +0 -0
  449. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_upload.py +0 -0
  450. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_call_action.py +0 -0
  451. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_capture_dom.py +0 -0
  452. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_capture_resolution_robustness.py +0 -0
  453. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_capture_shell_security.py +0 -0
  454. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_captures.py +0 -0
  455. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_cli_error_handling.py +0 -0
  456. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_cli_rerun.py +0 -0
  457. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_cli_run_guide_tag.py +0 -0
  458. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_click_synthetic.py +0 -0
  459. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_compat_registry.py +0 -0
  460. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_compat_scan.py +0 -0
  461. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_config_env_interpolation.py +0 -0
  462. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_config_schema.py +0 -0
  463. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_confirm_action.py +0 -0
  464. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_conftest_locale_mirror.py +0 -0
  465. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_cli.py +0 -0
  466. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_config.py +0 -0
  467. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_gaps.py +0 -0
  468. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_manifest.py +0 -0
  469. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_non_ui.py +0 -0
  470. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_normalize.py +0 -0
  471. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_record_template.py +0 -0
  472. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_sourcemap.py +0 -0
  473. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_store.py +0 -0
  474. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_distribution_name.py +0 -0
  475. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_escaping_fuzz.py +0 -0
  476. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_example_scenarios_validate.py +0 -0
  477. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_exclusive_groups.py +0 -0
  478. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_expand_action.py +0 -0
  479. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_failure_fingerprint.py +0 -0
  480. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_fill_date_action.py +0 -0
  481. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_fill_flags.py +0 -0
  482. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_flaky_cli.py +0 -0
  483. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_generator_events_plugin.py +0 -0
  484. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_cursor.py +0 -0
  485. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_fragment.py +0 -0
  486. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_mode_sync.py +0 -0
  487. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_pdf_cli.py +0 -0
  488. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_text_format.py +0 -0
  489. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_video_cli.py +0 -0
  490. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_history.py +0 -0
  491. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_init.py +0 -0
  492. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_interactive_manifest.py +0 -0
  493. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_layout_fixes.py +0 -0
  494. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_locale_screenshots.py +0 -0
  495. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_locales.py +0 -0
  496. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_locales_dynamic.py +0 -0
  497. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_match_within.py +0 -0
  498. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_bundle_import_on_default_path.py +0 -0
  499. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_cloud_import_on_default_path.py +0 -0
  500. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_coverage_import_on_default_path.py +0 -0
  501. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_migrate_import_on_default_path.py +0 -0
  502. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_parallel_import_on_default_path.py +0 -0
  503. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_playwright_import_on_default_path.py +0 -0
  504. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_private_names.py +0 -0
  505. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_report_import_on_default_path.py +0 -0
  506. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_tours_import_on_default_path.py +0 -0
  507. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_video_import_on_default_path.py +0 -0
  508. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_optional_and_when.py +0 -0
  509. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_output_config.py +0 -0
  510. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_auth_isolation.py +0 -0
  511. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_circuit_breaker.py +0 -0
  512. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_compose.py +0 -0
  513. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_config.py +0 -0
  514. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_coordinator_wait.py +0 -0
  515. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_event_bus.py +0 -0
  516. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_events_plugin.py +0 -0
  517. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_exclusive_scheduling.py +0 -0
  518. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_exit_policy.py +0 -0
  519. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_failures.py +0 -0
  520. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_guide_integration.py +0 -0
  521. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_lastfailed.py +0 -0
  522. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_preauth.py +0 -0
  523. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_queue.py +0 -0
  524. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_renderer.py +0 -0
  525. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_report_flags.py +0 -0
  526. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_retry_pass.py +0 -0
  527. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_worker_image.py +0 -0
  528. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parser.py +0 -0
  529. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parser_malformed_lines.py +0 -0
  530. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_pdf.py +0 -0
  531. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_pick_date_action.py +0 -0
  532. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_pick_time_action.py +0 -0
  533. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_player_bundle_files.py +0 -0
  534. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_record_cli.py +0 -0
  535. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_record_login_and_secrets.py +0 -0
  536. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_record_transform.py +0 -0
  537. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_assets.py +0 -0
  538. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_ci.py +0 -0
  539. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_ci_templates.py +0 -0
  540. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_cli.py +0 -0
  541. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_coverage.py +0 -0
  542. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_model.py +0 -0
  543. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_render.py +0 -0
  544. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_schema.py +0 -0
  545. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_source.py +0 -0
  546. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_reusable_workflow.py +0 -0
  547. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_robustness_flaws.py +0 -0
  548. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_run_byte_identical.py +0 -0
  549. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_scenario_version.py +0 -0
  550. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_screenshot_mask.py +0 -0
  551. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_screenshot_path_resolution.py +0 -0
  552. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_select_option_action.py +0 -0
  553. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_selection.py +0 -0
  554. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_selector_lint.py +0 -0
  555. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_seo_config_sync.py +0 -0
  556. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_sitemap.py +0 -0
  557. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_skills_neutralized.py +0 -0
  558. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_skills_sync.py +0 -0
  559. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_step_events_codegen.py +0 -0
  560. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_step_required_fields.py +0 -0
  561. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_step_timeout_and_force.py +0 -0
  562. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_template_precedence.py +0 -0
  563. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_toggle_action.py +0 -0
  564. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_totp.py +0 -0
  565. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_action_table.py +0 -0
  566. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_contract_sync.py +0 -0
  567. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_demo_server.py +0 -0
  568. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_leaves.py +0 -0
  569. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_leaves_stdlib_only.py +0 -0
  570. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_codegen.py +0 -0
  571. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_conftest.py +0 -0
  572. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_helpers.py +0 -0
  573. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_helpers_mirror.py +0 -0
  574. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_plan.py +0 -0
  575. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_cli.py +0 -0
  576. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_config.py +0 -0
  577. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_contract.py +0 -0
  578. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_diagnostics.py +0 -0
  579. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_disabled_inert.py +0 -0
  580. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_docs_sync.py +0 -0
  581. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_golden.py +0 -0
  582. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_inference.py +0 -0
  583. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_routes.py +0 -0
  584. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_scenario_model.py +0 -0
  585. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_schema.py +0 -0
  586. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_text.py +0 -0
  587. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tts.py +0 -0
  588. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_ui_presets.py +0 -0
  589. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_update.py +0 -0
  590. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_upload_action.py +0 -0
  591. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_versions_aligned.py +0 -0
  592. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_video.py +0 -0
  593. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_video_cache.py +0 -0
  594. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_wait_for_state.py +0 -0
  595. {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_widget_control_and_detect.py +0 -0
@@ -7,7 +7,7 @@
7
7
  #
8
8
  # jobs:
9
9
  # e2e:
10
- # uses: Steppy-dev/steppy/.github/workflows/steppy-e2e.yml@v0.3.0
10
+ # uses: Steppy-dev/steppy/.github/workflows/steppy-e2e.yml@v0.4.0
11
11
  # with:
12
12
  # compose-file: docker-compose.yml
13
13
  # secrets:
@@ -57,7 +57,7 @@ on:
57
57
  steppy-ref:
58
58
  description: 'Git ref of Steppy to install. Defaults to the version this workflow ships with.'
59
59
  type: string
60
- default: 'v0.3.0'
60
+ default: 'v0.4.0'
61
61
  extras:
62
62
  description: 'Extras to install. `report` enables report.html, `retry` enables --retries.'
63
63
  type: string
@@ -6,6 +6,66 @@ follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0] - 2026-10-23
10
+
11
+ Fixes found by running Steppy against an app that keeps a live connection open
12
+ and puts its own login page in front of the identity provider: navigation and
13
+ login no longer require a network-idle page, form login gets past that page, and
14
+ `count(...)` comparisons wait like every other assertion. Upgrading changes the
15
+ generated code for comparison counts; regenerate with `steppy generate`.
16
+
17
+ ### Added
18
+ - **Form login past the app's own login page.** Two optional `auth.form` keys:
19
+ `login_path` (where automatic login starts, default `/`) and `start_selector`
20
+ (a "Log in" button on the app's own page, clicked when it shows up before the
21
+ provider's form). The `login` step clicks it too.
22
+ - **`steppy auth login <role> --auto`** logs a `form` role in headless with its
23
+ configured credentials and saves the session. It needs no terminal, so it works
24
+ in CI and scripts.
25
+ - `steppy validate` warns when a scenario `timeout:` is above 60 s (see the note
26
+ under Changed).
27
+
28
+ ### Changed
29
+ - **`count(sel, >=N)` and the other comparator forms now wait.** They re-count
30
+ until the comparison holds, within the step's timeout, like every other
31
+ assertion. Before, they read the page once, so a list that was still loading
32
+ failed with 0. Every comparison count generates different code
33
+ (`_wait_until(...)` instead of `_n = ….count()`); `count(sel, N)` is
34
+ unchanged. `<` and `<=` still hold at once on a page that has not rendered.
35
+ - **A scenario's `timeout:` is the default timeout of each of its steps.** This
36
+ already shipped in 0.3.0 without a note; before 0.3.0 the field did nothing. It
37
+ is not a limit on the whole test, so a large value (projects had set 3–5
38
+ minutes) now makes every failing step wait that long. The docs say so now, and
39
+ `steppy validate` warns above 60 s.
40
+
41
+ ### Fixed
42
+ - **`navigate` honours `timing.navigate_wait` and `wait:` for the page load
43
+ itself.** `goto()`/`reload()` always waited for the `load` event (30 s) before
44
+ the configured wait ran, so `domcontentloaded` and `none` could only add
45
+ waiting. They now pass `wait_until` (`none` becomes `commit`). `networkidle`
46
+ and `load` generate the same code as before.
47
+ - **Form login no longer requires `networkidle`.** After submitting, it waits for
48
+ `timing.navigate_wait` (`none` skips the wait), so an app that keeps an
49
+ EventSource or WebSocket open can log in. This covers the generated tests'
50
+ automatic login, the `login` step, the TOTP step and `steppy.auth`.
51
+ - **`auth.form.post_login_url_pattern` is read.** It was parsed and ignored, and
52
+ the fallback, any page under the app's `url`, already matches a provider
53
+ served on the same origin (Keycloak behind the app's proxy). Automatic login
54
+ waits for it, and so does the `login` step when it is set. `steppy init` no
55
+ longer writes the `**/callback**` placeholder, and loading a config that still
56
+ has it prints a warning: on a typical SPA that URL has already redirected away
57
+ when login is checked, so keeping it would fail every login. Remove it, or set
58
+ the URL your app lands on.
59
+ - **Generated tests honour `auth.form.preset`.** They read `config.yaml` as it
60
+ is written, so `preset: keycloak` with no explicit selectors left the Auth0
61
+ defaults in place, and login waited for a field Keycloak never renders. The
62
+ conftest now carries the preset table and resolves it the way the config model
63
+ does: explicit keys win.
64
+ - **`steppy auth login` without a terminal** fails at once with a hint to use
65
+ `--auto`, instead of `Login failed: EOF when reading a line`. Interactively, it
66
+ saves the session only once the browser has left the login page (type `save`
67
+ to override).
68
+
9
69
  ## [0.3.0] - 2026-10-22
10
70
 
11
71
  The first public release, under the Apache-2.0 licence. This entry captures
@@ -858,5 +918,6 @@ individual commit.
858
918
  `output:` also gained `extra: forbid`, so a `screenshot_dir:` typo now fails
859
919
  loudly instead of being swallowed.
860
920
 
861
- [Unreleased]: https://github.com/Steppy-dev/steppy/compare/v0.3.0...HEAD
921
+ [Unreleased]: https://github.com/Steppy-dev/steppy/compare/v0.4.0...HEAD
922
+ [0.4.0]: https://github.com/Steppy-dev/steppy/compare/v0.3.0...v0.4.0
862
923
  [0.3.0]: https://github.com/Steppy-dev/steppy/releases/tag/v0.3.0
@@ -147,14 +147,14 @@ Code generator, not a runtime engine — generated tests are standalone.
147
147
  - `optional: true` and `when: visible(sel)|hidden(sel)|count(sel,>=N)|contains(sel,"x")`. Placement is load-bearing: `optional` wraps the body **inside** the step markers (the step ran), `when` joins `_step_runs` **outside** them (it did not). `when`'s vocabulary is deliberately smaller than `expect:` — an assertion auto-waits, and a guarded step must not pay a timeout for something that was never coming.
148
148
  - `match:`/`within:` widened from 4 actions to every action that resolves a selector. `pick-date`/`pick-time` take a selector *string*, so the chain folds into it via Playwright's `>>` (`disambig_selector`); everything else gets a real locator, which is what lets `_safe_bbox_locator` give the guide cursor a bbox.
149
149
  - **`call` action** — run a project helper as a first-class step: `fn: mod.func`, `args:`, `kwargs:`, `store:`, `page: false` for a helper that takes no page. The runtime helper `call_helper` imports through `importlib`; **no `sys.path` setup is needed or emitted** — pytest runs as `python -m pytest` from the project root, which puts it on `sys.path[0]` (the worker image sets `WORKDIR /steppy/project` for the same reason). A `call` step shares `custom`'s cursor decision: it honours `guide-cursor:` and shows nothing without one, which is the reason to prefer it over `custom` for a helper-driven guide step.
150
- - **`expect:` is a list, and carries messages.** A scalar is still one assertion and still generates byte-identically; a list holds several, each optionally `{check:, message:}`. `message` maps to Playwright's own `expect(locator, message=...)`, except on `count-cmp`, which is a bare `assert` and takes it in the assert clause. The descriptor key is `fail_message`, **not** `message` — `toast(...)`'s descriptor already owns `message`, and clobbering it silently asserted on the string `"None"`. New forms: `value` · `attribute` · `not-contains` · `not-visible` · `icontains` · `checked`/`unchecked` · `stays-hidden(sel, "3s")` (a *held* assertion — `hidden()` auto-waits for the element to *become* hidden, the opposite of proving it never appears).
150
+ - **`expect:` is a list, and carries messages.** A scalar is still one assertion and still generates byte-identically; a list holds several, each optionally `{check:, message:}`. `message` maps to Playwright's own `expect(locator, message=...)`, except on `count-cmp`, which polls through the conftest's `_wait_until` and passes it as that helper's `message=`. The descriptor key is `fail_message`, **not** `message` — `toast(...)`'s descriptor already owns `message`, and clobbering it silently asserted on the string `"None"`. New forms: `value` · `attribute` · `not-contains` · `not-visible` · `icontains` · `checked`/`unchecked` · `stays-hidden(sel, "3s")` (a *held* assertion — `hidden()` auto-waits for the element to *become* hidden, the opposite of proving it never appears).
151
151
  - **The assertion grammar lives in `src/steppy/assertions.py`** (stdlib-only leaf), imported by both `generator._format_assertion` and `Step.validate_expect_grammar`. Before that split, an unrecognised `expect:` returned `{"type": "unknown"}`, `assert_body`'s `{% else %}` rendered `pass`, and `steppy validate` said nothing — so `status("done")` parsed, generated, and asserted **nothing**. Adding a form means adding a parser branch AND a macro branch; `tests/test_assertion_grammar.py::test_every_parsed_form_generates_real_code_not_pass` is the drift guard. Argument splitting is quote/bracket-aware (`split_top_level`), because selectors are written bare and `[data-testid="a,b"]` used to be cut in half.
152
152
  - **`_ALLOWED_FIELDS` is the inverse of `_REQUIRED_FIELDS`** (models.py). `extra = "forbid"` only ever caught a key *no* action has; a key belonging to a *different* action passed. Probed before the fix: `retry`, `interval`, `format`, `variant`, `button`, `danger`, `search` and `method` each validated on all 23 actions and generated code on one, so `- action: click` + `- date: today` passed `steppy validate` and did nothing. Adding a field to an action means adding it here too, or validation rejects the very scenario the feature is for. Only explicitly-set, non-`None` keys are checked.
153
153
  - **Inline flow collections parse now** — `- layouts: [desktop, mobile]`, `- args: [a, b]`, `- guide-cursor: {behavior: click, target: '#a'}`. CLAUDE.md had documented that spelling in five places while `_parse_step_content` stored the literal string. Restricted to `parser._STRUCTURED_STEP_KEYS`, derived from the model: a bare attribute selector is shaped exactly like a flow sequence, and `- selector: [data-testid="row"]` is how 2 981 steps across the live projects are written.
154
154
  - **`upload` action**: codegens to `locator(selector).set_input_files(value)`. `selector` targets the `<input type="file">`; `value` is the file path (relative paths resolve from pytest cwd = project root). For hidden inputs behind a styled trigger, scenarios add `guide-cursor: { behavior: click, target: '<visible-selector>' }` and bbox + screenshot land on the visible trigger (mirrors the `custom` branch's `guide-cursor` handling). Touch points: see **Adding a new action** above — `upload` needs no bespoke validator (it is pure `_REQUIRED_FIELDS` rows) and no bespoke cursor branch (`_SIMPLE_CURSOR`), but it does read `step.guide_cursor` in `_cursor_from_override`.
155
155
  - **`select-option` action** (component dropdown): drives a PrimeNG-style `p-select`/`p-autocomplete`/`p-multiselect` (native `select` only drives `<select>`). `selector` = the trigger/host; opens it, optionally types `search:` into the filter box (then settles per `config.dropdown.settle`), and picks via `option: first|last|N|text:"..."` — or several via `multiple:` (a YAML **indented** list, like `layouts:`; inline `[a, b]` is **not** parsed as a list) which auto-`Escape`s to close. Framework selectors come from the `dropdown:` config preset (`DropdownConfig` in models.py, PrimeNG defaults so it works with no config). Option parsing is the `format_dropdown_option` Jinja filter (generator.py). The option-pick clicks (all `first`/`last`/`nth`/`text` branches + the `multiple:` loop) emit `.click(force=True)`; the trigger-open click stays plain. Force is required because the PrimeNG overlay open-animation + highlighted-option re-render leaves it never "stable", so a non-forced click times out (esp. when the option is already `aria-selected`) — matching the hand-written code this action replaced. Guide cursor auto-targets the trigger (grouped with `click`/`select` in `_compute_cursor_behavior`). Touch points: see **Adding a new action** above, plus the `search`/`option`/`multiple` fields and `validate_select_option_fields` (models.py) for the option/multiple exclusivity rule a required-field table cannot express.
156
156
  - **`wait-for` `state:` field**: `state: visible|hidden|detached|attached` passes through to `wait_for_selector(state=...)`; the dominant use is `hidden` (wait for a dialog to close as the success signal after a save). Omitting `state` emits no `state=` kwarg (byte-identical to pre-feature output). Field is `Step.state` (models.py); codegen is the `wait-for` Jinja block.
157
- - **`assert` `contains` / comparator `count`**: `expect: contains(<selector>, "text")` → Playwright `to_contain_text` (substring, auto-waiting); `expect: count(<selector>, >=N)` (`>= <= == != > <`) → a manual `_n = locator.count(); assert _n >= N` (Playwright's `to_have_count` has no comparator). **Bare-integer `count(sel, 3)` / `count(sel, 0)` stay on `to_have_count` (byte-identical).** Parsing is in `_format_assertion` (generator.py); each form is one `{% elif %}` branch in the shared `assert_body(...)` macro (`templates/test_scenario.py.j2`), which both `expect:` sites — the standalone `- action: assert` step and an `expect:` riding on another action — render. The historical "edit both assert blocks in both template trees" rule is gone.
157
+ - **`assert` `contains` / comparator `count`**: `expect: contains(<selector>, "text")` → Playwright `to_contain_text` (substring, auto-waiting); `expect: count(<selector>, >=N)` (`>= <= == != > <`) → `_wait_until(locator, "count:>=N", <step timeout>, message=...)`, the same poll `wait-for until: count:` uses (Playwright's `to_have_count` has no comparator, and a one-shot `.count()` read 0 on a list still loading). `migrate/verify.SUBSTITUTIONS["count"]` names `_wait_until`, or the assert-count codemod rule stops verifying. **Bare-integer `count(sel, 3)` / `count(sel, 0)` stay on `to_have_count` (byte-identical).** Parsing is in `_format_assertion` (generator.py); each form is one `{% elif %}` branch in the shared `assert_body(...)` macro (`templates/test_scenario.py.j2`), which both `expect:` sites — the standalone `- action: assert` step and an `expect:` riding on another action — render. The historical "edit both assert blocks in both template trees" rule is gone.
158
158
  - **`match` / `within` locator disambiguation** (Cmd 6, P1): `click`/`hover`/`wait-for`/`assert` gain optional `within: <scope-selector>` and `match: first|last|N` to resolve a selector that hits >1 element (the strict-mode escape that drove ~2,300 `.first`/`.nth` custom blocks). Codegen only switches from the string form (`page.click(sel)`) to the locator chain (`page.locator(within).locator(sel).nth(i).click()`) **when `within`/`match` is present** — absent ⇒ byte-identical. A shared Jinja macro `disambig_locator(role, selector, step)` (top of `test_scenario.py.j2`) emits the chain; the assert block reuses it once via `{% set _aloc %}` across all selector-based subtypes. `match` parsing is the `format_match_suffix` filter (generator.py). For guide-mode bbox, `_safe_bbox_locator(page, locator)` (conftest, both trees) measures the resolved locator; `wait-for` switches to `locator.wait_for(...)` (keeps `state:`). Touch points: `within`/`match` fields + `validate_match_within` (models.py); the four action blocks in `templates/test_scenario.py.j2`; no `schema.ts` change (runtime-only).
159
159
  - **`confirm` action** (Cmd 2, P1): clicks a confirmation-dialog button (PrimeNG `p-confirmDialog`, whose accept/reject buttons have no `data-testid`). Default = accept the active (`.last`) overlay; `variant: reject`, `danger: true`, or `button: "<label>"` (filter by visible text, mutually exclusive with variant/danger) pick a different button. Selectors come from the `dialog:` config preset (`DialogConfig`, PrimeNG defaults, so it works with no config). The cursor auto-targets the resolved button via `_safe_bbox_locator` (no `step.selector`; guide bbox flows from the sidecar). Touch points: see **Adding a new action** above, plus `variant`/`button`/`danger` + `validate_confirm_fields` and `DialogConfig` on `SteppyConfig` (models.py). `confirm` is the one entry in `_NO_SELECTOR_CURSOR` (guide.py) — it resolves its button imperatively, so the cursor rides on the sidecar bbox alone.
160
160
  - **`fill-date` action** (Cmd 3, P1): computes a relative/dynamic date **at test run time** (so tests stay valid forever) and types it into a date input via `press_sequentially` + `Tab` (fires Angular `ngModelChange`). `date:` grammar = `today | this-<weekday> | next-<weekday> | ±N[d|w|m|y] | YYYY-MM-DD`; `format:` defaults to `%d/%m/%Y`. The runtime helper `_resolve_date(expr, fmt)` lives in `conftest.py.j2` (both trees) — plain Python (calendar/datetime), unit-tested by extracting its source. `method: calendar` is reserved for the future `pick-date` action (Cmd 7) and currently rejected. Touch points: see **Adding a new action** above, plus the `date`/`format`/`method` fields, `validate_fill_date_fields` (models.py, which now only rejects `method: calendar`) and the `_resolve_date` conftest helper.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: steppy-dev
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Generate Playwright pytest suites from Markdown scenarios, and turn their screenshots into multi-locale user guides
5
5
  Project-URL: Homepage, https://github.com/Steppy-dev/steppy
6
6
  Project-URL: Source, https://github.com/Steppy-dev/steppy
@@ -399,6 +399,7 @@ See [In-app tours](#in-app-tours-opt-in-1) below.
399
399
 
400
400
  ```bash
401
401
  steppy auth login editor # interactive (headed) login
402
+ steppy auth login editor --auto # headless, with a form role's credentials (CI, scripts)
402
403
  steppy auth status # cached session state per role
403
404
  steppy auth clear # clear everything
404
405
  steppy auth clear editor # clear a single role
@@ -354,6 +354,7 @@ See [In-app tours](#in-app-tours-opt-in-1) below.
354
354
 
355
355
  ```bash
356
356
  steppy auth login editor # interactive (headed) login
357
+ steppy auth login editor --auto # headless, with a form role's credentials (CI, scripts)
357
358
  steppy auth status # cached session state per role
358
359
  steppy auth clear # clear everything
359
360
  steppy auth clear editor # clear a single role
@@ -55,7 +55,15 @@ Hardening:
55
55
  fills the role's credentials, submits, handles an optional consent screen, and
56
56
  waits for the redirect. Works against **any IdP with a fillable login form**
57
57
  (Auth0, Keycloak, …). The three selectors live under global `auth.form:` and
58
- can be filled at once with an IdP `preset:` (`auth0` | `keycloak`). *(The old
58
+ can be filled at once with an IdP `preset:` (`auth0` | `keycloak`). Three
59
+ optional keys shape the flow around them: `login_path` (where automatic login
60
+ starts, default `/`) and `start_selector` (a "Log in" button on the app's own
61
+ page, clicked when it shows up before the provider), and
62
+ `post_login_url_pattern` (the URL glob that means "logged in"; without it the
63
+ login waits for any page under the app's `url`, which a provider served on the
64
+ same origin already matches). After submitting, it waits for
65
+ `timing.navigate_wait`, so an app that holds an EventSource or WebSocket open
66
+ can use `domcontentloaded` or `none`. *(The old
59
67
  name `auth0` — both the mode and the `auth0-login` step action — is a
60
68
  kept-forever deprecated alias.)*
61
69
  - **`storage-state`** — reuse a Playwright storage-state file you captured out of
@@ -69,9 +77,11 @@ Hardening:
69
77
  **Flows without a scriptable form** — SAML / corporate SSO with conditional
70
78
  access, magic-link email, or CAPTCHA — are not automatable headlessly by design.
71
79
  The supported answer is a **one-time headed login**: run `steppy auth login`,
72
- complete the challenge in the visible browser, and Steppy caches the storage
73
- state (subject to `auth.storage_state_ttl`). This is the same posture Playwright
74
- itself recommends. TOTP-based MFA automation (via a shared secret) is a possible
80
+ complete the challenge in the visible browser, press Enter, and Steppy caches the
81
+ storage state (subject to `auth.storage_state_ttl`) once the browser has left the
82
+ login page. This is the same posture Playwright itself recommends. A `form` role
83
+ needs no person at all: `steppy auth login <role> --auto` logs in headless with
84
+ its configured credentials, which also works where there is no terminal. TOTP-based MFA automation (via a shared secret) is a possible
75
85
  future opt-in, not shipped today.
76
86
 
77
87
  ## `capture from.type=shell` — command execution
@@ -86,7 +86,7 @@ guide:
86
86
  | `tags` | list of strings | `[]` | Free-form. `user-guide-<role>` tags drive guide discovery; `--tag X` filters runs. |
87
87
  | `priority` | `critical` \| `high` \| `medium` \| `low` | — | Metadata only. |
88
88
  | `auth` | bool | `true` | `false` = the scenario tests the login flow itself (no pre-auth fixture). |
89
- | `timeout` | int (ms) | — | Per-scenario timeout hint. |
89
+ | `timeout` | int (ms) | — | Default timeout for **each step** of this scenario (a step's own `timeout:` wins; `timing.step_timeout` applies when neither is set). Not a limit on the whole test: `steppy validate` warns above 60000. |
90
90
  | `layouts` | list of strings | — | Viewports this scenario must pass in (keys of `screenshot.layouts`). **Authoritative**: even a plain `steppy run` parametrizes the whole flow over these; `--layouts`/`--guide` filters the declared set (disjoint ⇒ the scenario is deselected). Omit ⇒ no scenario-level layout dimension (unchanged behavior). Composes with the step-level `layouts:` in §3. |
91
91
  | `exclusive` | string | — | Exclusion group. Two scenarios naming the same group never run **at the same time** under `steppy run --workers N`; different groups still run concurrently. Lowercase `[a-z0-9._+-]`, starting alphanumeric (the name becomes a filename). Promises non-overlap only — not ordering, not indivisibility. Inert without `--workers N ≥ 2`, where one pytest process is already sequential. |
92
92
  | `seed` | string \| object | — | Seed script to run around the test. String `base` ≡ `{script: base, run: before}`. `run` = `before` \| `after` \| `both`. Scripts live in `seed/<script>.py`. |
@@ -378,7 +378,11 @@ Keycloak, …). `auth0-login` is a kept-forever deprecated alias.
378
378
 
379
379
  > **Auth modes:** `apps.<role>.auth.mode` is `form` \| `storage-state` \| `bypass` \| `token`
380
380
  > (`auth0` is a deprecated alias for `form`). The `form` selectors live under global
381
- > `auth.form:` and accept an IdP `preset:` (`auth0` \| `keycloak`). `token` mode fetches a
381
+ > `auth.form:` and accept an IdP `preset:` (`auth0` \| `keycloak`). Optional
382
+ > `login_path` + `start_selector` get automatic login past the app's own "Log in" page,
383
+ > `post_login_url_pattern` names the URL that means "logged in" (default: any page
384
+ > under the app's `url`), and the post-submit wait follows `timing.navigate_wait`.
385
+ > The `login` step clicks `start_selector` too when that page is showing. `token` mode fetches a
382
386
  > JWT from an endpoint and injects it via `inject_as: localStorage | cookie | header`.
383
387
  > For SAML / corporate SSO with conditional access, magic links, or CAPTCHA, use the
384
388
  > one-time headed `steppy auth login` + storage-state TTL (see SECURITY.md).
@@ -402,7 +406,7 @@ arguments accept the same `within`/`match` disambiguation as element actions.
402
406
  | `contains(selector, "expected")` | `to_contain_text` (substring, auto-waiting). |
403
407
  | `url-contains("/path")` | URL matches `.*<path>.*`. |
404
408
  | `count(selector, N)` | `to_have_count(N)` (exact integer). |
405
- | `count(selector, >=N)` | Manual `assert` with a comparator: `>=` `<=` `==` `!=` `>` `<`. |
409
+ | `count(selector, >=N)` | Re-counts until the comparison holds (`>=` `<=` `==` `!=` `>` `<`), within the step timeout. `<`/`<=` hold at once on an empty page. |
406
410
  | `row-contains("text")` | A `text="text"` element is visible. |
407
411
  | `status("value")` | Status-badge text check. |
408
412
 
@@ -59,8 +59,16 @@ auth:
59
59
  username_selector: "input[name='username'], input[name='email'], #username"
60
60
  password_selector: "input[name='password'], #password"
61
61
  submit_selector: "button[type='submit'], button[name='action'][value='default']"
62
- post_login_url_pattern: "**/callback**"
63
62
  consent_selector: null
63
+ # Where the login ends (a URL glob). Unset, Steppy waits for any page under
64
+ # the app's url — which a provider on the app's own origin (Keycloak behind
65
+ # the same proxy) already matches, so set it there.
66
+ # post_login_url_pattern: "**/home**"
67
+ # When the app shows its own page with a "Log in" button before the
68
+ # provider: where automatic login starts, and the button to click.
69
+ # login_path: /auth
70
+ # start_selector: "[data-testid='login-button']"
71
+ # After submitting, login waits for timing.navigate_wait (none = no wait).
64
72
  # TOTP/MFA (optional): set totp_selector here and a per-app
65
73
  # credentials.totp_secret (env-ref) to auto-fill a time-based one-time code
66
74
  # after the password submit. The auth0/keycloak presets fill a starter
@@ -13,7 +13,7 @@
13
13
  }
14
14
  },
15
15
  "../../packages/steppy": {
16
- "version": "0.3.0",
16
+ "version": "0.4.0",
17
17
  "dev": true,
18
18
  "license": "Apache-2.0"
19
19
  },
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "../../../packages/angular/dist": {
36
36
  "name": "@steppy/angular",
37
- "version": "0.3.0",
37
+ "version": "0.4.0",
38
38
  "license": "Apache-2.0",
39
39
  "dependencies": {
40
40
  "tslib": "^2.3.0"
@@ -43,13 +43,13 @@
43
43
  "@angular/common": ">=20.0.0 <23.0.0",
44
44
  "@angular/core": ">=20.0.0 <23.0.0",
45
45
  "@angular/router": ">=20.0.0 <23.0.0",
46
- "@steppy/player": "0.3.0",
46
+ "@steppy/player": "0.4.0",
47
47
  "rxjs": "^7.4.0"
48
48
  }
49
49
  },
50
50
  "../../../packages/player": {
51
51
  "name": "@steppy/player",
52
- "version": "0.3.0",
52
+ "version": "0.4.0",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "lit": "^3.2.0",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@steppy/angular",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@steppy/angular",
9
- "version": "0.3.0",
9
+ "version": "0.4.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "tslib": "^2.3.0"
@@ -32,13 +32,13 @@
32
32
  "@angular/common": ">=20.0.0 <23.0.0",
33
33
  "@angular/core": ">=20.0.0 <23.0.0",
34
34
  "@angular/router": ">=20.0.0 <23.0.0",
35
- "@steppy/player": "0.3.0",
35
+ "@steppy/player": "0.4.0",
36
36
  "rxjs": "^7.4.0"
37
37
  }
38
38
  },
39
39
  "../player": {
40
40
  "name": "@steppy/player",
41
- "version": "0.3.0",
41
+ "version": "0.4.0",
42
42
  "dev": true,
43
43
  "license": "Apache-2.0",
44
44
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steppy/angular",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Angular adapter for the Steppy in-app tour overlay: provideSteppyTours(), <steppy-tours> and the SteppyTours service",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -23,7 +23,7 @@
23
23
  "@angular/common": ">=20.0.0 <23.0.0",
24
24
  "@angular/core": ">=20.0.0 <23.0.0",
25
25
  "@angular/router": ">=20.0.0 <23.0.0",
26
- "@steppy/player": "0.3.0",
26
+ "@steppy/player": "0.4.0",
27
27
  "rxjs": "^7.4.0"
28
28
  },
29
29
  "dependencies": {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@steppy/player",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@steppy/player",
9
- "version": "0.3.0",
9
+ "version": "0.4.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "lit": "^3.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steppy/player",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Steppy players — the interactive guide (Lit web component + manifest validator) and the in-app tour overlay",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@steppy/react",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@steppy/react",
9
- "version": "0.3.0",
9
+ "version": "0.4.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@steppy/player": "file:../player"
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "../player": {
29
29
  "name": "@steppy/player",
30
- "version": "0.3.0",
30
+ "version": "0.4.0",
31
31
  "license": "Apache-2.0",
32
32
  "dependencies": {
33
33
  "lit": "^3.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steppy/react",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Thin React wrapper around the Steppy <steppy-guide> web component",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "steppy",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "TypeScript types and config helper for Steppy guide builds",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@steppy/vue",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@steppy/vue",
9
- "version": "0.3.0",
9
+ "version": "0.4.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@steppy/player": "file:../player"
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "../player": {
26
26
  "name": "@steppy/player",
27
- "version": "0.3.0",
27
+ "version": "0.4.0",
28
28
  "license": "Apache-2.0",
29
29
  "dependencies": {
30
30
  "lit": "^3.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steppy/vue",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Thin Vue 3 wrapper around the Steppy <steppy-guide> web component",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -2,7 +2,7 @@
2
2
  # `steppy` on PyPI is an unrelated project. The import package and the command
3
3
  # stay `steppy`; `steppy.DISTRIBUTION` must match this name.
4
4
  name = "steppy-dev"
5
- version = "0.3.0"
5
+ version = "0.4.0"
6
6
  description = "Generate Playwright pytest suites from Markdown scenarios, and turn their screenshots into multi-locale user guides"
7
7
  readme = "README.md"
8
8
  # PEP 639 SPDX expression; needs hatchling>=1.27 (pinned in [build-system]).
@@ -64,7 +64,7 @@ ships, called by ref:
64
64
  ```yaml
65
65
  jobs:
66
66
  e2e:
67
- uses: Steppy-dev/steppy/.github/workflows/steppy-e2e.yml@v0.3.0
67
+ uses: Steppy-dev/steppy/.github/workflows/steppy-e2e.yml@v0.4.0
68
68
  with:
69
69
  compose-file: docker-compose.yml
70
70
  secrets:
@@ -46,7 +46,7 @@ tags: # optional; enables filtering
46
46
  seed: base # optional; string or {script, run}
47
47
  priority: critical # optional; critical|high|medium|low
48
48
  auth: true # default true; set false ONLY for login-flow scenarios
49
- timeout: 30000 # optional; scenario-level timeout in ms
49
+ timeout: 30000 # optional; default timeout (ms) for EACH step, not a whole-test limit
50
50
  layouts: # optional; viewports this flow must pass in (keys of screenshot.layouts)
51
51
  - desktop
52
52
  - mobile
@@ -397,7 +397,10 @@ whose surrounding text varies — it replaces the old `assert "X" in el.inner_te
397
397
  **`count(...)` comparators**: the second argument accepts `>= <= == != > <` (e.g.
398
398
  `count(.row, >=1)`, `count(.row, !=0)`). A **bare integer** (`count(.row, 3)`) keeps the exact
399
399
  `to_have_count` check. The dominant uses are `>=1` ("at least one row appeared") and `0` ("the
400
- row was removed"). Interpolation works in the selector: `contains([data-testid="item-{{record_id}}"], "...")`.
400
+ row was removed"). Like every other assertion, a comparator **waits** — it re-counts until the
401
+ comparison holds or the step's timeout (`timeout:` → scenario `timeout:` → `timing.step_timeout`)
402
+ runs out. So `<` and `<=`, like `count(.row, 0)`, pass at once on a list that has not rendered
403
+ yet: assert something that proves the page loaded first. Interpolation works in the selector: `contains([data-testid="item-{{record_id}}"], "...")`.
401
404
 
402
405
  ---
403
406
 
@@ -982,7 +985,7 @@ The authoring loop is `validate` → `generate` → `run` → `guide` / `build`.
982
985
  | `steppy record [URL]` | Bootstrap a **draft** scenario from a live click-through (see Workflow step 1) |
983
986
  | `steppy seed <name>` | Run one seed script by hand, outside a test run |
984
987
  | `steppy rerun` | Re-run only the previously failed tests |
985
- | `steppy auth login \| status \| clear` | Interactive login for a role, inspect cached sessions, clear `.auth/` |
988
+ | `steppy auth login \| status \| clear` | Log in for a role (headed by hand, or `--auto`: headless with a form role's credentials, no terminal needed), inspect cached sessions, clear `.auth/` |
986
989
  | `steppy flaky` | Rank scenarios by flake rate across recent parallel runs |
987
990
  | `steppy stacks cleanup` | Rescue command: tear down orphaned `steppy-run-*` Compose projects left by a force-killed parallel run |
988
991
  | `steppy video check \| cache` | Preflight and cache management for narrated video (see Narrated video guides) |
@@ -1,6 +1,6 @@
1
1
  """Steppy - A Python CLI for generating Playwright tests from Markdown scenarios."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.4.0"
4
4
 
5
5
  # The name pip installs this package under. `steppy` on PyPI belongs to an
6
6
  # unrelated project, so the distribution is `steppy-dev` while the import