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.
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/workflows/steppy-e2e.yml +2 -2
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CHANGELOG.md +62 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CLAUDE.md +2 -2
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/PKG-INFO +2 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/README.md +1 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/SECURITY.md +14 -4
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/STEPPY-REFERENCE.md +7 -3
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/config.yaml +9 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/package-lock.json +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/package-lock.json +3 -3
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/package-lock.json +4 -4
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/package.json +2 -2
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/package-lock.json +2 -2
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/package.json +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/package-lock.json +3 -3
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/package.json +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/package.json +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/package-lock.json +3 -3
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/package.json +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/pyproject.toml +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-ci-report/SKILL.md +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-scenario-author/SKILL.md +6 -3
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/__init__.py +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/auth.py +84 -12
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cli.py +42 -14
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/config.py +28 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/generator.py +4 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/verify.py +4 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/models.py +8 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/parser.py +21 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/presets.py +4 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/steppy-config.schema.json +24 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/ci/github-actions.yml +2 -2
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/ci/gitlab-ci.yml +1 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/conftest.py.j2 +84 -16
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/init/config.yaml +6 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/test_scenario.py.j2 +13 -8
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_assert_contains_count.py +33 -4
- steppy_dev-0.4.0/tests/test_auth_login_cli.py +278 -0
- steppy_dev-0.4.0/tests/test_form_login.py +638 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_migrate_custom.py +12 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_navigate_reload.py +15 -1
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_navigate_wait.py +46 -2
- steppy_dev-0.4.0/tests/test_scenario_timeout_lint.py +65 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_wait_for_predicate.py +13 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.claude/launch.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.dockerignore +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.gitattributes +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/pull_request_template.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/workflows/ci.yml +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.github/workflows/release.yml +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/.gitignore +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CODE_OF_CONDUCT.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/CONTRIBUTING.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/Dockerfile +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/LICENSE +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/NEW_FEATURE.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/NOTICE +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/PROMPT_EXAMPLE.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/bundle-manifest.schema.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/cases.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/create-invoice.en.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/create-invoice.fr.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/remove-inactive-customers.en.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/remove-inactive-customers.fr.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/send-invoice.en.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/send-invoice.fr.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/fixtures/tours/valid/tours.manifest.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/report.schema.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/tour.schema.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/contracts/tours-manifest.schema.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/credentials.yaml.example +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/steppy-icon.svg +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/steppy-mark-dark.svg +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/brand/steppy-mark.svg +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/design/in-app-tours.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/docs/tours.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/create_screenshots.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/e2e/scenarios/editor/invoices.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/e2e/scenarios/editor/onboarding.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/package.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/guide.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-01.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-01.png +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-02.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/invoices/step-02.png +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-01.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-01.png +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-02.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/onboarding/step-02.png +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/public/assets/editor/steppy-player.js +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/steppy.guide.config.static.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/demo-guide/steppy.guide.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/app/app.css +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/app/app.js +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/app/index.html +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/app-assets/.gitkeep +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/config.yaml +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/scenarios/editor--create-invoice.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/scenarios/editor--remove-inactive-customers.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/project/scenarios/editor--send-invoice.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo/serve.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/.gitignore +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/angular.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/package.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/public/i18n/en.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/public/i18n/fr.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/app.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/app.routes.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/app.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/customers.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/demo-config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/invoice-detail.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/invoice-list.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/app/invoices.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/index.html +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/main.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/src/styles.css +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/tsconfig.app.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/fixtures/tour-demo-angular/app/tsconfig.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/hatch_build.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/LICENSE +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/NOTICE +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/angular.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/ng-package.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/navigate.spec.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/navigate.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/overlay.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/provide.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/public-api.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/real-overlay.spec.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/testing/fake-overlay.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/testing/zone-providers.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/testing/zone-setup.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tour-start.directive.spec.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tour-start.directive.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.component.spec.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.component.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.service.spec.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.service.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/src/tours.zone.spec.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.lib.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.lib.prod.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/angular/tsconfig.spec.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/LICENSE +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/NOTICE +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/THIRD_PARTY_LICENSES.txt +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/dev/fixture-manifest.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/dev/index.html +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/schema/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/scripts/check-pack.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/scripts/check-tour-size.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/scripts/emit-json-schema.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/cursor/animator.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/cursor/legacy-iife.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/cursor/types.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/i18n/ui-strings.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/interaction/positioning.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/content.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/parse.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/manifest/schema.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/steppy-guide.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/base-styles.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/controls.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/inline.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/overlay.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/sidebar.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/templates/types.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/api.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/contract.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/dom.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/engine.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/events.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/host.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/layer.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/loader.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/resolver.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/routes.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/signature.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/storage.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/strings.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/styles.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/templates.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/tracker.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/triggers.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/tour/validate.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/markdown.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/names.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/placement.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/strings.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/ui/tokens.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/easing.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/iife.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/stage.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/src/video/timeline.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/animator.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/bridge-from-python.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/component.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/fixtures.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/markdown.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/positioning.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/schema.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/setup.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/templates.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/boundaries.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/engine.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/golden.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/helpers.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/host.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/loader.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/resolver-tracker.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/routes.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/small-modules.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/tour/validate.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/guide-markdown-parity.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/guide-styles-stable.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/legacy-markdown.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/legacy-placement.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/legacy-ui-strings.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/markdown-policy.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/placement.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/ui/strings.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/video-stage.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/test/video-timeline.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/tsconfig.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/tsconfig.types.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.iife.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.tour.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/player/vite.video.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/src/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/src/shims.d.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/test/component.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/tsconfig.build.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/tsconfig.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/react/vite.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/index.d.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/index.js +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/steppy/tsconfig.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/src/index.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/src/shims.d.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/test/component.test.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/tsconfig.build.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/tsconfig.json +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/packages/vue/vite.config.ts +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/admin--create-project.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/admin--edit-settings.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/cross--task-approval.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/scenarios/editor--manage-items.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/seed/base.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-app-tours/SKILL.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/skills/steppy-template/SKILL.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/__main__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_cli_common.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_docker/Dockerfile.installed +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/compose.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/event_bus.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/failures.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/fingerprint.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/image.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/lastfailed.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/lifecycle.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/preauth.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/progress.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/queue.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/renderer.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_parallel/retry.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/THIRD_PARTY_LICENSES.txt +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-cursor-legacy.js +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-cursor-legacy.js.map +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-player.js +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-player.js.map +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-video.js +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_player_bundle/steppy-video.js.map +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/_templating.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/assertions.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/build.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/build_models.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/buildid.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/archive.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/classify.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/create.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/hashing.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/manifest.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle/results.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/bundle_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/captures.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cloud/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cloud/client.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/cloud/upload.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/compat.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/config_schema.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/bundle.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/report.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/contracts/tours.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coordinator.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/gaps.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/manifest.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/merge.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/normalize.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/report.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/sourcemap.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/store.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage/triage.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/coverage_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/durations.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/exclusive.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/flaky_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/guide.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/history.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/init_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/locales.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/apply.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/plan.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate/rules.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/migrate_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/naming.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/pdf.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/record_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/assets.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/build.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/coverage_source.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/model.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/render.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report/source.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/report_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/runmeta.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/selection.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/sitemap.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/testids.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/totp.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tour_spec.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/actions.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/compiler.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/diagnostics.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/emit.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/ids.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/inference.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/model.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/paths.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/pipeline.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/publish.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/replay.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/routes.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/settings.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours/text.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tours_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/cache.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/presets.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/http.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/local.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/providers/null.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/registry.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/track.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/tts/types.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/update_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/video.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/video_cache.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/video_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/src/steppy/worker.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/_steppy_events.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/_steppy_tours.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/component-interactive.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/component-video.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/component.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/content.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/gitignore.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/group.component.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/onboarding.component.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/angular/routes.ts.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.book.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.fragment.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/guide.md.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/init/credentials.yaml.example +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/init/scenarios/example--first-flow.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/_head.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/_mark.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/coverage.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/index.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/report.css +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/report/scenario.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/_headers.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/_mode_links.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/_seo_head.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/cursor.js.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/group.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/guides.css +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/index.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/interactive.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/onboarding.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/page.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/robots.txt.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/templates/static/video.html.j2 +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/__init__.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/_codegen_snapshot.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/_private_terms.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/README.md +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_coverage_recorder_it.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_tour_angular_it.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_tour_player_it.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/test_tour_replay_it.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/integration/tour_geometry.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_action_enum_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_angular_adapter_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_assertion_grammar.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_auth_form_rename.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_auth_js_injection.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_fixture.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_interactive.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_models.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_seo.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_tours.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_build_video.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_contract_parity.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_events_sink.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_events_steps.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_run_wiring.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_schema.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_bundle_upload.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_call_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_capture_dom.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_capture_resolution_robustness.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_capture_shell_security.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_captures.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_cli_error_handling.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_cli_rerun.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_cli_run_guide_tag.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_click_synthetic.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_compat_registry.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_compat_scan.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_config_env_interpolation.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_config_schema.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_confirm_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_conftest_locale_mirror.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_config.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_gaps.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_manifest.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_non_ui.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_normalize.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_record_template.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_sourcemap.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_coverage_store.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_distribution_name.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_escaping_fuzz.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_example_scenarios_validate.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_exclusive_groups.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_expand_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_failure_fingerprint.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_fill_date_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_fill_flags.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_flaky_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_generator_events_plugin.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_cursor.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_fragment.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_mode_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_pdf_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_text_format.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_guide_video_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_history.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_init.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_interactive_manifest.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_layout_fixes.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_locale_screenshots.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_locales.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_locales_dynamic.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_match_within.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_bundle_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_cloud_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_coverage_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_migrate_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_parallel_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_playwright_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_private_names.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_report_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_tours_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_no_video_import_on_default_path.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_optional_and_when.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_output_config.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_auth_isolation.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_circuit_breaker.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_compose.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_config.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_coordinator_wait.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_event_bus.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_events_plugin.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_exclusive_scheduling.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_exit_policy.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_failures.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_guide_integration.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_lastfailed.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_preauth.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_queue.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_renderer.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_report_flags.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_retry_pass.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parallel_worker_image.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parser.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_parser_malformed_lines.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_pdf.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_pick_date_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_pick_time_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_player_bundle_files.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_record_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_record_login_and_secrets.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_record_transform.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_assets.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_ci.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_ci_templates.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_coverage.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_model.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_render.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_schema.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_report_source.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_reusable_workflow.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_robustness_flaws.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_run_byte_identical.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_scenario_version.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_screenshot_mask.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_screenshot_path_resolution.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_select_option_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_selection.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_selector_lint.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_seo_config_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_sitemap.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_skills_neutralized.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_skills_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_step_events_codegen.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_step_required_fields.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_step_timeout_and_force.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_template_precedence.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_toggle_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_totp.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_action_table.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_contract_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_demo_server.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_leaves.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_leaves_stdlib_only.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_codegen.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_conftest.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_helpers.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_helpers_mirror.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tour_replay_plan.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_cli.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_config.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_contract.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_diagnostics.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_disabled_inert.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_docs_sync.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_golden.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_inference.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_routes.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_scenario_model.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_schema.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tours_text.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_tts.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_ui_presets.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_update.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_upload_action.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_versions_aligned.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_video.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_video_cache.py +0 -0
- {steppy_dev-0.3.0 → steppy_dev-0.4.0}/tests/test_wait_for_state.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
|
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)` (`>= <= == != > <`) →
|
|
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
|
+
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`).
|
|
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
|
|
73
|
-
state (subject to `auth.storage_state_ttl`)
|
|
74
|
-
|
|
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) | — |
|
|
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`).
|
|
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)` |
|
|
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
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"../../../packages/angular/dist": {
|
|
36
36
|
"name": "@steppy/angular",
|
|
37
|
-
"version": "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.
|
|
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.
|
|
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
|
+
"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.
|
|
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.
|
|
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.
|
|
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
|
+
"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.
|
|
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
|
+
"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.
|
|
9
|
+
"version": "0.4.0",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"lit": "^3.2.0",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steppy/react",
|
|
3
|
-
"version": "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.
|
|
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.
|
|
30
|
+
"version": "0.4.0",
|
|
31
31
|
"license": "Apache-2.0",
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"lit": "^3.2.0",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steppy/vue",
|
|
3
|
-
"version": "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.
|
|
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.
|
|
27
|
+
"version": "0.4.0",
|
|
28
28
|
"license": "Apache-2.0",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"lit": "^3.2.0",
|
|
@@ -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.
|
|
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]).
|
|
@@ -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;
|
|
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").
|
|
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` |
|
|
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
|
+
__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
|