steppy-dev 0.3.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 (592) hide show
  1. steppy_dev-0.3.0/.claude/launch.json +41 -0
  2. steppy_dev-0.3.0/.dockerignore +54 -0
  3. steppy_dev-0.3.0/.gitattributes +22 -0
  4. steppy_dev-0.3.0/.github/ISSUE_TEMPLATE/bug_report.yml +77 -0
  5. steppy_dev-0.3.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. steppy_dev-0.3.0/.github/ISSUE_TEMPLATE/feature_request.yml +41 -0
  7. steppy_dev-0.3.0/.github/pull_request_template.md +13 -0
  8. steppy_dev-0.3.0/.github/workflows/ci.yml +218 -0
  9. steppy_dev-0.3.0/.github/workflows/release.yml +200 -0
  10. steppy_dev-0.3.0/.github/workflows/steppy-e2e.yml +264 -0
  11. steppy_dev-0.3.0/.gitignore +110 -0
  12. steppy_dev-0.3.0/CHANGELOG.md +862 -0
  13. steppy_dev-0.3.0/CLAUDE.md +231 -0
  14. steppy_dev-0.3.0/CODE_OF_CONDUCT.md +26 -0
  15. steppy_dev-0.3.0/CONTRIBUTING.md +224 -0
  16. steppy_dev-0.3.0/Dockerfile +55 -0
  17. steppy_dev-0.3.0/LICENSE +202 -0
  18. steppy_dev-0.3.0/NEW_FEATURE.md +322 -0
  19. steppy_dev-0.3.0/NOTICE +13 -0
  20. steppy_dev-0.3.0/PKG-INFO +1335 -0
  21. steppy_dev-0.3.0/PROMPT_EXAMPLE.md +410 -0
  22. steppy_dev-0.3.0/README.md +1290 -0
  23. steppy_dev-0.3.0/SECURITY.md +271 -0
  24. steppy_dev-0.3.0/STEPPY-REFERENCE.md +556 -0
  25. steppy_dev-0.3.0/config.yaml +316 -0
  26. steppy_dev-0.3.0/contracts/bundle-manifest.schema.json +417 -0
  27. steppy_dev-0.3.0/contracts/fixtures/tours/cases.json +485 -0
  28. steppy_dev-0.3.0/contracts/fixtures/tours/valid/create-invoice.en.json +61 -0
  29. steppy_dev-0.3.0/contracts/fixtures/tours/valid/create-invoice.fr.json +61 -0
  30. steppy_dev-0.3.0/contracts/fixtures/tours/valid/remove-inactive-customers.en.json +76 -0
  31. steppy_dev-0.3.0/contracts/fixtures/tours/valid/remove-inactive-customers.fr.json +76 -0
  32. steppy_dev-0.3.0/contracts/fixtures/tours/valid/send-invoice.en.json +48 -0
  33. steppy_dev-0.3.0/contracts/fixtures/tours/valid/send-invoice.fr.json +48 -0
  34. steppy_dev-0.3.0/contracts/fixtures/tours/valid/tours.manifest.json +78 -0
  35. steppy_dev-0.3.0/contracts/report.schema.json +859 -0
  36. steppy_dev-0.3.0/contracts/tour.schema.json +213 -0
  37. steppy_dev-0.3.0/contracts/tours-manifest.schema.json +158 -0
  38. steppy_dev-0.3.0/credentials.yaml.example +33 -0
  39. steppy_dev-0.3.0/docs/brand/README.md +33 -0
  40. steppy_dev-0.3.0/docs/brand/steppy-icon.svg +1 -0
  41. steppy_dev-0.3.0/docs/brand/steppy-mark-dark.svg +1 -0
  42. steppy_dev-0.3.0/docs/brand/steppy-mark.svg +1 -0
  43. steppy_dev-0.3.0/docs/design/in-app-tours.md +371 -0
  44. steppy_dev-0.3.0/docs/tours.md +1390 -0
  45. steppy_dev-0.3.0/fixtures/demo-guide/create_screenshots.py +49 -0
  46. steppy_dev-0.3.0/fixtures/demo-guide/e2e/scenarios/editor/invoices.md +27 -0
  47. steppy_dev-0.3.0/fixtures/demo-guide/e2e/scenarios/editor/onboarding.md +27 -0
  48. steppy_dev-0.3.0/fixtures/demo-guide/package-lock.json +567 -0
  49. steppy_dev-0.3.0/fixtures/demo-guide/package.json +10 -0
  50. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/guide.json +140 -0
  51. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-01.json +1 -0
  52. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-01.png +0 -0
  53. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-02.json +1 -0
  54. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-02.png +0 -0
  55. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-01.json +1 -0
  56. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-01.png +0 -0
  57. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-02.json +1 -0
  58. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-02.png +0 -0
  59. steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/steppy-player.js +5419 -0
  60. steppy_dev-0.3.0/fixtures/demo-guide/steppy.guide.config.static.ts +46 -0
  61. steppy_dev-0.3.0/fixtures/demo-guide/steppy.guide.config.ts +54 -0
  62. steppy_dev-0.3.0/fixtures/tour-demo/README.md +95 -0
  63. steppy_dev-0.3.0/fixtures/tour-demo/app/app.css +291 -0
  64. steppy_dev-0.3.0/fixtures/tour-demo/app/app.js +550 -0
  65. steppy_dev-0.3.0/fixtures/tour-demo/app/index.html +52 -0
  66. steppy_dev-0.3.0/fixtures/tour-demo/project/app-assets/.gitkeep +0 -0
  67. steppy_dev-0.3.0/fixtures/tour-demo/project/config.yaml +40 -0
  68. steppy_dev-0.3.0/fixtures/tour-demo/project/scenarios/editor--create-invoice.md +89 -0
  69. steppy_dev-0.3.0/fixtures/tour-demo/project/scenarios/editor--remove-inactive-customers.md +89 -0
  70. steppy_dev-0.3.0/fixtures/tour-demo/project/scenarios/editor--send-invoice.md +50 -0
  71. steppy_dev-0.3.0/fixtures/tour-demo/serve.py +350 -0
  72. steppy_dev-0.3.0/fixtures/tour-demo-angular/README.md +44 -0
  73. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/.gitignore +44 -0
  74. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/angular.json +83 -0
  75. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/package-lock.json +7917 -0
  76. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/package.json +36 -0
  77. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/public/i18n/en.json +37 -0
  78. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/public/i18n/fr.json +37 -0
  79. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/app.config.ts +45 -0
  80. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/app.routes.ts +19 -0
  81. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/app.ts +118 -0
  82. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/customers.ts +101 -0
  83. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/demo-config.ts +49 -0
  84. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/invoice-detail.ts +45 -0
  85. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/invoice-list.ts +105 -0
  86. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/invoices.ts +57 -0
  87. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/index.html +13 -0
  88. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/main.ts +23 -0
  89. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/styles.css +144 -0
  90. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/tsconfig.app.json +15 -0
  91. steppy_dev-0.3.0/fixtures/tour-demo-angular/app/tsconfig.json +30 -0
  92. steppy_dev-0.3.0/hatch_build.py +61 -0
  93. steppy_dev-0.3.0/packages/angular/LICENSE +202 -0
  94. steppy_dev-0.3.0/packages/angular/NOTICE +6 -0
  95. steppy_dev-0.3.0/packages/angular/README.md +129 -0
  96. steppy_dev-0.3.0/packages/angular/angular.json +50 -0
  97. steppy_dev-0.3.0/packages/angular/ng-package.json +8 -0
  98. steppy_dev-0.3.0/packages/angular/package-lock.json +9169 -0
  99. steppy_dev-0.3.0/packages/angular/package.json +49 -0
  100. steppy_dev-0.3.0/packages/angular/src/config.ts +51 -0
  101. steppy_dev-0.3.0/packages/angular/src/navigate.spec.ts +70 -0
  102. steppy_dev-0.3.0/packages/angular/src/navigate.ts +49 -0
  103. steppy_dev-0.3.0/packages/angular/src/overlay.ts +68 -0
  104. steppy_dev-0.3.0/packages/angular/src/provide.ts +33 -0
  105. steppy_dev-0.3.0/packages/angular/src/public-api.ts +21 -0
  106. steppy_dev-0.3.0/packages/angular/src/real-overlay.spec.ts +39 -0
  107. steppy_dev-0.3.0/packages/angular/src/testing/fake-overlay.ts +137 -0
  108. steppy_dev-0.3.0/packages/angular/src/testing/zone-providers.ts +4 -0
  109. steppy_dev-0.3.0/packages/angular/src/testing/zone-setup.ts +3 -0
  110. steppy_dev-0.3.0/packages/angular/src/tour-start.directive.spec.ts +30 -0
  111. steppy_dev-0.3.0/packages/angular/src/tour-start.directive.ts +33 -0
  112. steppy_dev-0.3.0/packages/angular/src/tours.component.spec.ts +212 -0
  113. steppy_dev-0.3.0/packages/angular/src/tours.component.ts +182 -0
  114. steppy_dev-0.3.0/packages/angular/src/tours.service.spec.ts +153 -0
  115. steppy_dev-0.3.0/packages/angular/src/tours.service.ts +187 -0
  116. steppy_dev-0.3.0/packages/angular/src/tours.zone.spec.ts +119 -0
  117. steppy_dev-0.3.0/packages/angular/tsconfig.json +26 -0
  118. steppy_dev-0.3.0/packages/angular/tsconfig.lib.json +11 -0
  119. steppy_dev-0.3.0/packages/angular/tsconfig.lib.prod.json +9 -0
  120. steppy_dev-0.3.0/packages/angular/tsconfig.spec.json +8 -0
  121. steppy_dev-0.3.0/packages/player/LICENSE +202 -0
  122. steppy_dev-0.3.0/packages/player/NOTICE +9 -0
  123. steppy_dev-0.3.0/packages/player/README.md +191 -0
  124. steppy_dev-0.3.0/packages/player/THIRD_PARTY_LICENSES.txt +158 -0
  125. steppy_dev-0.3.0/packages/player/dev/fixture-manifest.json +240 -0
  126. steppy_dev-0.3.0/packages/player/dev/index.html +199 -0
  127. steppy_dev-0.3.0/packages/player/package-lock.json +2085 -0
  128. steppy_dev-0.3.0/packages/player/package.json +72 -0
  129. steppy_dev-0.3.0/packages/player/schema/README.md +19 -0
  130. steppy_dev-0.3.0/packages/player/scripts/check-pack.ts +51 -0
  131. steppy_dev-0.3.0/packages/player/scripts/check-tour-size.ts +45 -0
  132. steppy_dev-0.3.0/packages/player/scripts/emit-json-schema.ts +20 -0
  133. steppy_dev-0.3.0/packages/player/src/cursor/animator.ts +398 -0
  134. steppy_dev-0.3.0/packages/player/src/cursor/legacy-iife.ts +147 -0
  135. steppy_dev-0.3.0/packages/player/src/cursor/types.ts +67 -0
  136. steppy_dev-0.3.0/packages/player/src/i18n/ui-strings.ts +144 -0
  137. steppy_dev-0.3.0/packages/player/src/index.ts +30 -0
  138. steppy_dev-0.3.0/packages/player/src/interaction/positioning.ts +44 -0
  139. steppy_dev-0.3.0/packages/player/src/manifest/content.ts +46 -0
  140. steppy_dev-0.3.0/packages/player/src/manifest/index.ts +23 -0
  141. steppy_dev-0.3.0/packages/player/src/manifest/parse.ts +104 -0
  142. steppy_dev-0.3.0/packages/player/src/manifest/schema.ts +347 -0
  143. steppy_dev-0.3.0/packages/player/src/steppy-guide.ts +983 -0
  144. steppy_dev-0.3.0/packages/player/src/templates/base-styles.ts +347 -0
  145. steppy_dev-0.3.0/packages/player/src/templates/controls.ts +98 -0
  146. steppy_dev-0.3.0/packages/player/src/templates/index.ts +43 -0
  147. steppy_dev-0.3.0/packages/player/src/templates/inline.ts +81 -0
  148. steppy_dev-0.3.0/packages/player/src/templates/overlay.ts +38 -0
  149. steppy_dev-0.3.0/packages/player/src/templates/sidebar.ts +303 -0
  150. steppy_dev-0.3.0/packages/player/src/templates/types.ts +91 -0
  151. steppy_dev-0.3.0/packages/player/src/tour/api.ts +61 -0
  152. steppy_dev-0.3.0/packages/player/src/tour/contract.ts +60 -0
  153. steppy_dev-0.3.0/packages/player/src/tour/dom.ts +104 -0
  154. steppy_dev-0.3.0/packages/player/src/tour/engine.ts +307 -0
  155. steppy_dev-0.3.0/packages/player/src/tour/events.ts +34 -0
  156. steppy_dev-0.3.0/packages/player/src/tour/host.ts +699 -0
  157. steppy_dev-0.3.0/packages/player/src/tour/index.ts +32 -0
  158. steppy_dev-0.3.0/packages/player/src/tour/layer.ts +49 -0
  159. steppy_dev-0.3.0/packages/player/src/tour/loader.ts +289 -0
  160. steppy_dev-0.3.0/packages/player/src/tour/resolver.ts +109 -0
  161. steppy_dev-0.3.0/packages/player/src/tour/routes.ts +113 -0
  162. steppy_dev-0.3.0/packages/player/src/tour/signature.ts +64 -0
  163. steppy_dev-0.3.0/packages/player/src/tour/storage.ts +86 -0
  164. steppy_dev-0.3.0/packages/player/src/tour/strings.ts +139 -0
  165. steppy_dev-0.3.0/packages/player/src/tour/styles.ts +238 -0
  166. steppy_dev-0.3.0/packages/player/src/tour/templates.ts +135 -0
  167. steppy_dev-0.3.0/packages/player/src/tour/tracker.ts +193 -0
  168. steppy_dev-0.3.0/packages/player/src/tour/triggers.ts +197 -0
  169. steppy_dev-0.3.0/packages/player/src/tour/validate.ts +433 -0
  170. steppy_dev-0.3.0/packages/player/src/ui/markdown.ts +129 -0
  171. steppy_dev-0.3.0/packages/player/src/ui/names.ts +19 -0
  172. steppy_dev-0.3.0/packages/player/src/ui/placement.ts +193 -0
  173. steppy_dev-0.3.0/packages/player/src/ui/strings.ts +66 -0
  174. steppy_dev-0.3.0/packages/player/src/ui/tokens.ts +64 -0
  175. steppy_dev-0.3.0/packages/player/src/video/easing.ts +92 -0
  176. steppy_dev-0.3.0/packages/player/src/video/iife.ts +49 -0
  177. steppy_dev-0.3.0/packages/player/src/video/stage.ts +511 -0
  178. steppy_dev-0.3.0/packages/player/src/video/timeline.ts +633 -0
  179. steppy_dev-0.3.0/packages/player/test/animator.test.ts +207 -0
  180. steppy_dev-0.3.0/packages/player/test/bridge-from-python.test.ts +244 -0
  181. steppy_dev-0.3.0/packages/player/test/component.test.ts +730 -0
  182. steppy_dev-0.3.0/packages/player/test/fixtures.ts +88 -0
  183. steppy_dev-0.3.0/packages/player/test/markdown.test.ts +130 -0
  184. steppy_dev-0.3.0/packages/player/test/positioning.test.ts +58 -0
  185. steppy_dev-0.3.0/packages/player/test/schema.test.ts +475 -0
  186. steppy_dev-0.3.0/packages/player/test/setup.ts +8 -0
  187. steppy_dev-0.3.0/packages/player/test/templates.test.ts +430 -0
  188. steppy_dev-0.3.0/packages/player/test/tour/boundaries.test.ts +68 -0
  189. steppy_dev-0.3.0/packages/player/test/tour/engine.test.ts +211 -0
  190. steppy_dev-0.3.0/packages/player/test/tour/golden.test.ts +88 -0
  191. steppy_dev-0.3.0/packages/player/test/tour/helpers.ts +121 -0
  192. steppy_dev-0.3.0/packages/player/test/tour/host.test.ts +546 -0
  193. steppy_dev-0.3.0/packages/player/test/tour/loader.test.ts +259 -0
  194. steppy_dev-0.3.0/packages/player/test/tour/resolver-tracker.test.ts +185 -0
  195. steppy_dev-0.3.0/packages/player/test/tour/routes.test.ts +104 -0
  196. steppy_dev-0.3.0/packages/player/test/tour/small-modules.test.ts +182 -0
  197. steppy_dev-0.3.0/packages/player/test/tour/validate.test.ts +129 -0
  198. steppy_dev-0.3.0/packages/player/test/ui/guide-markdown-parity.test.ts +139 -0
  199. steppy_dev-0.3.0/packages/player/test/ui/guide-styles-stable.test.ts +23 -0
  200. steppy_dev-0.3.0/packages/player/test/ui/legacy-markdown.ts +62 -0
  201. steppy_dev-0.3.0/packages/player/test/ui/legacy-placement.ts +64 -0
  202. steppy_dev-0.3.0/packages/player/test/ui/legacy-ui-strings.ts +109 -0
  203. steppy_dev-0.3.0/packages/player/test/ui/markdown-policy.test.ts +83 -0
  204. steppy_dev-0.3.0/packages/player/test/ui/placement.test.ts +127 -0
  205. steppy_dev-0.3.0/packages/player/test/ui/strings.test.ts +80 -0
  206. steppy_dev-0.3.0/packages/player/test/video-stage.test.ts +334 -0
  207. steppy_dev-0.3.0/packages/player/test/video-timeline.test.ts +596 -0
  208. steppy_dev-0.3.0/packages/player/tsconfig.json +24 -0
  209. steppy_dev-0.3.0/packages/player/tsconfig.types.json +15 -0
  210. steppy_dev-0.3.0/packages/player/vite.config.ts +37 -0
  211. steppy_dev-0.3.0/packages/player/vite.iife.config.ts +33 -0
  212. steppy_dev-0.3.0/packages/player/vite.tour.config.ts +62 -0
  213. steppy_dev-0.3.0/packages/player/vite.video.config.ts +35 -0
  214. steppy_dev-0.3.0/packages/react/README.md +75 -0
  215. steppy_dev-0.3.0/packages/react/package-lock.json +1611 -0
  216. steppy_dev-0.3.0/packages/react/package.json +41 -0
  217. steppy_dev-0.3.0/packages/react/src/index.ts +197 -0
  218. steppy_dev-0.3.0/packages/react/src/shims.d.ts +4 -0
  219. steppy_dev-0.3.0/packages/react/test/component.test.ts +57 -0
  220. steppy_dev-0.3.0/packages/react/tsconfig.build.json +10 -0
  221. steppy_dev-0.3.0/packages/react/tsconfig.json +22 -0
  222. steppy_dev-0.3.0/packages/react/vite.config.ts +35 -0
  223. steppy_dev-0.3.0/packages/steppy/index.d.ts +67 -0
  224. steppy_dev-0.3.0/packages/steppy/index.js +8 -0
  225. steppy_dev-0.3.0/packages/steppy/index.ts +218 -0
  226. steppy_dev-0.3.0/packages/steppy/package.json +19 -0
  227. steppy_dev-0.3.0/packages/steppy/tsconfig.json +12 -0
  228. steppy_dev-0.3.0/packages/vue/README.md +67 -0
  229. steppy_dev-0.3.0/packages/vue/package-lock.json +1729 -0
  230. steppy_dev-0.3.0/packages/vue/package.json +38 -0
  231. steppy_dev-0.3.0/packages/vue/src/index.ts +136 -0
  232. steppy_dev-0.3.0/packages/vue/src/shims.d.ts +4 -0
  233. steppy_dev-0.3.0/packages/vue/test/component.test.ts +47 -0
  234. steppy_dev-0.3.0/packages/vue/tsconfig.build.json +10 -0
  235. steppy_dev-0.3.0/packages/vue/tsconfig.json +22 -0
  236. steppy_dev-0.3.0/packages/vue/vite.config.ts +29 -0
  237. steppy_dev-0.3.0/pyproject.toml +133 -0
  238. steppy_dev-0.3.0/scenarios/admin--create-project.md +58 -0
  239. steppy_dev-0.3.0/scenarios/admin--edit-settings.md +85 -0
  240. steppy_dev-0.3.0/scenarios/cross--task-approval.md +74 -0
  241. steppy_dev-0.3.0/scenarios/editor--manage-items.md +77 -0
  242. steppy_dev-0.3.0/seed/base.py +150 -0
  243. steppy_dev-0.3.0/skills/steppy-app-tours/SKILL.md +448 -0
  244. steppy_dev-0.3.0/skills/steppy-ci-report/SKILL.md +567 -0
  245. steppy_dev-0.3.0/skills/steppy-scenario-author/SKILL.md +2176 -0
  246. steppy_dev-0.3.0/skills/steppy-template/SKILL.md +676 -0
  247. steppy_dev-0.3.0/src/steppy/__init__.py +9 -0
  248. steppy_dev-0.3.0/src/steppy/__main__.py +13 -0
  249. steppy_dev-0.3.0/src/steppy/_cli_common.py +183 -0
  250. steppy_dev-0.3.0/src/steppy/_docker/Dockerfile.installed +53 -0
  251. steppy_dev-0.3.0/src/steppy/_parallel/__init__.py +7 -0
  252. steppy_dev-0.3.0/src/steppy/_parallel/compose.py +349 -0
  253. steppy_dev-0.3.0/src/steppy/_parallel/event_bus.py +418 -0
  254. steppy_dev-0.3.0/src/steppy/_parallel/failures.py +267 -0
  255. steppy_dev-0.3.0/src/steppy/_parallel/fingerprint.py +141 -0
  256. steppy_dev-0.3.0/src/steppy/_parallel/image.py +380 -0
  257. steppy_dev-0.3.0/src/steppy/_parallel/lastfailed.py +125 -0
  258. steppy_dev-0.3.0/src/steppy/_parallel/lifecycle.py +90 -0
  259. steppy_dev-0.3.0/src/steppy/_parallel/preauth.py +109 -0
  260. steppy_dev-0.3.0/src/steppy/_parallel/progress.py +101 -0
  261. steppy_dev-0.3.0/src/steppy/_parallel/queue.py +385 -0
  262. steppy_dev-0.3.0/src/steppy/_parallel/renderer.py +489 -0
  263. steppy_dev-0.3.0/src/steppy/_parallel/retry.py +316 -0
  264. steppy_dev-0.3.0/src/steppy/_player_bundle/THIRD_PARTY_LICENSES.txt +158 -0
  265. steppy_dev-0.3.0/src/steppy/_player_bundle/__init__.py +100 -0
  266. steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-cursor-legacy.js +2 -0
  267. steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-cursor-legacy.js.map +1 -0
  268. steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-player.js +5419 -0
  269. steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-player.js.map +1 -0
  270. steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-video.js +472 -0
  271. steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-video.js.map +1 -0
  272. steppy_dev-0.3.0/src/steppy/_templating.py +117 -0
  273. steppy_dev-0.3.0/src/steppy/assertions.py +251 -0
  274. steppy_dev-0.3.0/src/steppy/auth.py +493 -0
  275. steppy_dev-0.3.0/src/steppy/build.py +2798 -0
  276. steppy_dev-0.3.0/src/steppy/build_models.py +669 -0
  277. steppy_dev-0.3.0/src/steppy/buildid.py +134 -0
  278. steppy_dev-0.3.0/src/steppy/bundle/__init__.py +47 -0
  279. steppy_dev-0.3.0/src/steppy/bundle/archive.py +239 -0
  280. steppy_dev-0.3.0/src/steppy/bundle/classify.py +329 -0
  281. steppy_dev-0.3.0/src/steppy/bundle/create.py +490 -0
  282. steppy_dev-0.3.0/src/steppy/bundle/hashing.py +28 -0
  283. steppy_dev-0.3.0/src/steppy/bundle/manifest.py +334 -0
  284. steppy_dev-0.3.0/src/steppy/bundle/results.py +546 -0
  285. steppy_dev-0.3.0/src/steppy/bundle_cli.py +455 -0
  286. steppy_dev-0.3.0/src/steppy/captures.py +207 -0
  287. steppy_dev-0.3.0/src/steppy/cli.py +2489 -0
  288. steppy_dev-0.3.0/src/steppy/cloud/__init__.py +58 -0
  289. steppy_dev-0.3.0/src/steppy/cloud/client.py +267 -0
  290. steppy_dev-0.3.0/src/steppy/cloud/upload.py +497 -0
  291. steppy_dev-0.3.0/src/steppy/compat.py +109 -0
  292. steppy_dev-0.3.0/src/steppy/config.py +231 -0
  293. steppy_dev-0.3.0/src/steppy/config_schema.py +87 -0
  294. steppy_dev-0.3.0/src/steppy/contracts/__init__.py +54 -0
  295. steppy_dev-0.3.0/src/steppy/contracts/bundle.py +215 -0
  296. steppy_dev-0.3.0/src/steppy/contracts/report.py +346 -0
  297. steppy_dev-0.3.0/src/steppy/contracts/tours.py +505 -0
  298. steppy_dev-0.3.0/src/steppy/coordinator.py +1352 -0
  299. steppy_dev-0.3.0/src/steppy/coverage/__init__.py +9 -0
  300. steppy_dev-0.3.0/src/steppy/coverage/gaps.py +190 -0
  301. steppy_dev-0.3.0/src/steppy/coverage/manifest.py +193 -0
  302. steppy_dev-0.3.0/src/steppy/coverage/merge.py +363 -0
  303. steppy_dev-0.3.0/src/steppy/coverage/normalize.py +174 -0
  304. steppy_dev-0.3.0/src/steppy/coverage/report.py +178 -0
  305. steppy_dev-0.3.0/src/steppy/coverage/sourcemap.py +219 -0
  306. steppy_dev-0.3.0/src/steppy/coverage/store.py +473 -0
  307. steppy_dev-0.3.0/src/steppy/coverage/triage.py +151 -0
  308. steppy_dev-0.3.0/src/steppy/coverage_cli.py +265 -0
  309. steppy_dev-0.3.0/src/steppy/durations.py +48 -0
  310. steppy_dev-0.3.0/src/steppy/exclusive.py +178 -0
  311. steppy_dev-0.3.0/src/steppy/flaky_cli.py +169 -0
  312. steppy_dev-0.3.0/src/steppy/generator.py +633 -0
  313. steppy_dev-0.3.0/src/steppy/guide.py +1467 -0
  314. steppy_dev-0.3.0/src/steppy/history.py +352 -0
  315. steppy_dev-0.3.0/src/steppy/init_cli.py +330 -0
  316. steppy_dev-0.3.0/src/steppy/locales.py +282 -0
  317. steppy_dev-0.3.0/src/steppy/migrate/__init__.py +35 -0
  318. steppy_dev-0.3.0/src/steppy/migrate/apply.py +194 -0
  319. steppy_dev-0.3.0/src/steppy/migrate/plan.py +199 -0
  320. steppy_dev-0.3.0/src/steppy/migrate/rules.py +465 -0
  321. steppy_dev-0.3.0/src/steppy/migrate/verify.py +163 -0
  322. steppy_dev-0.3.0/src/steppy/migrate_cli.py +152 -0
  323. steppy_dev-0.3.0/src/steppy/models.py +2539 -0
  324. steppy_dev-0.3.0/src/steppy/naming.py +37 -0
  325. steppy_dev-0.3.0/src/steppy/parser.py +475 -0
  326. steppy_dev-0.3.0/src/steppy/pdf.py +193 -0
  327. steppy_dev-0.3.0/src/steppy/presets.py +284 -0
  328. steppy_dev-0.3.0/src/steppy/record_cli.py +796 -0
  329. steppy_dev-0.3.0/src/steppy/report/__init__.py +37 -0
  330. steppy_dev-0.3.0/src/steppy/report/assets.py +197 -0
  331. steppy_dev-0.3.0/src/steppy/report/build.py +261 -0
  332. steppy_dev-0.3.0/src/steppy/report/coverage_source.py +277 -0
  333. steppy_dev-0.3.0/src/steppy/report/model.py +423 -0
  334. steppy_dev-0.3.0/src/steppy/report/render.py +303 -0
  335. steppy_dev-0.3.0/src/steppy/report/source.py +238 -0
  336. steppy_dev-0.3.0/src/steppy/report_cli.py +173 -0
  337. steppy_dev-0.3.0/src/steppy/runmeta.py +114 -0
  338. steppy_dev-0.3.0/src/steppy/selection.py +183 -0
  339. steppy_dev-0.3.0/src/steppy/sitemap.py +205 -0
  340. steppy_dev-0.3.0/src/steppy/testids.py +166 -0
  341. steppy_dev-0.3.0/src/steppy/totp.py +26 -0
  342. steppy_dev-0.3.0/src/steppy/tour_spec.py +163 -0
  343. steppy_dev-0.3.0/src/steppy/tours/__init__.py +22 -0
  344. steppy_dev-0.3.0/src/steppy/tours/actions.py +402 -0
  345. steppy_dev-0.3.0/src/steppy/tours/compiler.py +144 -0
  346. steppy_dev-0.3.0/src/steppy/tours/diagnostics.py +137 -0
  347. steppy_dev-0.3.0/src/steppy/tours/emit.py +239 -0
  348. steppy_dev-0.3.0/src/steppy/tours/ids.py +40 -0
  349. steppy_dev-0.3.0/src/steppy/tours/inference.py +399 -0
  350. steppy_dev-0.3.0/src/steppy/tours/model.py +120 -0
  351. steppy_dev-0.3.0/src/steppy/tours/paths.py +126 -0
  352. steppy_dev-0.3.0/src/steppy/tours/pipeline.py +277 -0
  353. steppy_dev-0.3.0/src/steppy/tours/publish.py +124 -0
  354. steppy_dev-0.3.0/src/steppy/tours/replay.py +234 -0
  355. steppy_dev-0.3.0/src/steppy/tours/routes.py +175 -0
  356. steppy_dev-0.3.0/src/steppy/tours/settings.py +164 -0
  357. steppy_dev-0.3.0/src/steppy/tours/text.py +237 -0
  358. steppy_dev-0.3.0/src/steppy/tours_cli.py +219 -0
  359. steppy_dev-0.3.0/src/steppy/tts/__init__.py +280 -0
  360. steppy_dev-0.3.0/src/steppy/tts/cache.py +185 -0
  361. steppy_dev-0.3.0/src/steppy/tts/presets.py +125 -0
  362. steppy_dev-0.3.0/src/steppy/tts/providers/__init__.py +6 -0
  363. steppy_dev-0.3.0/src/steppy/tts/providers/http.py +184 -0
  364. steppy_dev-0.3.0/src/steppy/tts/providers/local.py +207 -0
  365. steppy_dev-0.3.0/src/steppy/tts/providers/null.py +28 -0
  366. steppy_dev-0.3.0/src/steppy/tts/registry.py +201 -0
  367. steppy_dev-0.3.0/src/steppy/tts/track.py +158 -0
  368. steppy_dev-0.3.0/src/steppy/tts/types.py +94 -0
  369. steppy_dev-0.3.0/src/steppy/update_cli.py +460 -0
  370. steppy_dev-0.3.0/src/steppy/video.py +730 -0
  371. steppy_dev-0.3.0/src/steppy/video_cache.py +239 -0
  372. steppy_dev-0.3.0/src/steppy/video_cli.py +271 -0
  373. steppy_dev-0.3.0/src/steppy/worker.py +301 -0
  374. steppy_dev-0.3.0/steppy-config.schema.json +1995 -0
  375. steppy_dev-0.3.0/templates/_steppy_events.py +291 -0
  376. steppy_dev-0.3.0/templates/_steppy_tours.py +404 -0
  377. steppy_dev-0.3.0/templates/angular/component-interactive.ts.j2 +109 -0
  378. steppy_dev-0.3.0/templates/angular/component-video.ts.j2 +112 -0
  379. steppy_dev-0.3.0/templates/angular/component.ts.j2 +229 -0
  380. steppy_dev-0.3.0/templates/angular/content.ts.j2 +31 -0
  381. steppy_dev-0.3.0/templates/angular/gitignore.j2 +3 -0
  382. steppy_dev-0.3.0/templates/angular/group.component.ts.j2 +39 -0
  383. steppy_dev-0.3.0/templates/angular/onboarding.component.ts.j2 +43 -0
  384. steppy_dev-0.3.0/templates/angular/routes.ts.j2 +34 -0
  385. steppy_dev-0.3.0/templates/ci/github-actions.yml +284 -0
  386. steppy_dev-0.3.0/templates/ci/gitlab-ci.yml +178 -0
  387. steppy_dev-0.3.0/templates/conftest.py.j2 +2405 -0
  388. steppy_dev-0.3.0/templates/guide.book.html.j2 +145 -0
  389. steppy_dev-0.3.0/templates/guide.fragment.html.j2 +257 -0
  390. steppy_dev-0.3.0/templates/guide.html.j2 +301 -0
  391. steppy_dev-0.3.0/templates/guide.md.j2 +18 -0
  392. steppy_dev-0.3.0/templates/init/config.yaml +124 -0
  393. steppy_dev-0.3.0/templates/init/credentials.yaml.example +30 -0
  394. steppy_dev-0.3.0/templates/init/scenarios/example--first-flow.md +53 -0
  395. steppy_dev-0.3.0/templates/report/_head.html.j2 +14 -0
  396. steppy_dev-0.3.0/templates/report/_mark.html.j2 +3 -0
  397. steppy_dev-0.3.0/templates/report/coverage.html.j2 +124 -0
  398. steppy_dev-0.3.0/templates/report/index.html.j2 +203 -0
  399. steppy_dev-0.3.0/templates/report/report.css +401 -0
  400. steppy_dev-0.3.0/templates/report/scenario.html.j2 +137 -0
  401. steppy_dev-0.3.0/templates/static/_headers.j2 +30 -0
  402. steppy_dev-0.3.0/templates/static/_mode_links.html.j2 +22 -0
  403. steppy_dev-0.3.0/templates/static/_seo_head.html.j2 +37 -0
  404. steppy_dev-0.3.0/templates/static/cursor.js.j2 +10 -0
  405. steppy_dev-0.3.0/templates/static/group.html.j2 +78 -0
  406. steppy_dev-0.3.0/templates/static/guides.css +678 -0
  407. steppy_dev-0.3.0/templates/static/index.html.j2 +79 -0
  408. steppy_dev-0.3.0/templates/static/interactive.html.j2 +100 -0
  409. steppy_dev-0.3.0/templates/static/onboarding.html.j2 +64 -0
  410. steppy_dev-0.3.0/templates/static/page.html.j2 +145 -0
  411. steppy_dev-0.3.0/templates/static/robots.txt.j2 +7 -0
  412. steppy_dev-0.3.0/templates/static/video.html.j2 +135 -0
  413. steppy_dev-0.3.0/templates/test_scenario.py.j2 +767 -0
  414. steppy_dev-0.3.0/tests/__init__.py +1 -0
  415. steppy_dev-0.3.0/tests/_codegen_snapshot.py +581 -0
  416. steppy_dev-0.3.0/tests/_private_terms.py +32 -0
  417. steppy_dev-0.3.0/tests/integration/README.md +286 -0
  418. steppy_dev-0.3.0/tests/integration/test_coverage_recorder_it.py +203 -0
  419. steppy_dev-0.3.0/tests/integration/test_tour_angular_it.py +384 -0
  420. steppy_dev-0.3.0/tests/integration/test_tour_player_it.py +603 -0
  421. steppy_dev-0.3.0/tests/integration/test_tour_replay_it.py +159 -0
  422. steppy_dev-0.3.0/tests/integration/tour_geometry.py +163 -0
  423. steppy_dev-0.3.0/tests/test_action_enum_sync.py +137 -0
  424. steppy_dev-0.3.0/tests/test_angular_adapter_sync.py +98 -0
  425. steppy_dev-0.3.0/tests/test_assert_contains_count.py +111 -0
  426. steppy_dev-0.3.0/tests/test_assertion_grammar.py +243 -0
  427. steppy_dev-0.3.0/tests/test_auth_form_rename.py +138 -0
  428. steppy_dev-0.3.0/tests/test_auth_js_injection.py +99 -0
  429. steppy_dev-0.3.0/tests/test_build.py +866 -0
  430. steppy_dev-0.3.0/tests/test_build_fixture.py +790 -0
  431. steppy_dev-0.3.0/tests/test_build_interactive.py +684 -0
  432. steppy_dev-0.3.0/tests/test_build_models.py +738 -0
  433. steppy_dev-0.3.0/tests/test_build_seo.py +726 -0
  434. steppy_dev-0.3.0/tests/test_build_tours.py +165 -0
  435. steppy_dev-0.3.0/tests/test_build_video.py +488 -0
  436. steppy_dev-0.3.0/tests/test_bundle.py +747 -0
  437. steppy_dev-0.3.0/tests/test_bundle_contract_parity.py +92 -0
  438. steppy_dev-0.3.0/tests/test_bundle_events_sink.py +356 -0
  439. steppy_dev-0.3.0/tests/test_bundle_events_steps.py +272 -0
  440. steppy_dev-0.3.0/tests/test_bundle_run_wiring.py +230 -0
  441. steppy_dev-0.3.0/tests/test_bundle_schema.py +102 -0
  442. steppy_dev-0.3.0/tests/test_bundle_upload.py +390 -0
  443. steppy_dev-0.3.0/tests/test_call_action.py +257 -0
  444. steppy_dev-0.3.0/tests/test_capture_dom.py +135 -0
  445. steppy_dev-0.3.0/tests/test_capture_resolution_robustness.py +300 -0
  446. steppy_dev-0.3.0/tests/test_capture_shell_security.py +77 -0
  447. steppy_dev-0.3.0/tests/test_captures.py +122 -0
  448. steppy_dev-0.3.0/tests/test_cli_error_handling.py +123 -0
  449. steppy_dev-0.3.0/tests/test_cli_rerun.py +292 -0
  450. steppy_dev-0.3.0/tests/test_cli_run_guide_tag.py +176 -0
  451. steppy_dev-0.3.0/tests/test_click_synthetic.py +100 -0
  452. steppy_dev-0.3.0/tests/test_compat_registry.py +25 -0
  453. steppy_dev-0.3.0/tests/test_compat_scan.py +94 -0
  454. steppy_dev-0.3.0/tests/test_config_env_interpolation.py +130 -0
  455. steppy_dev-0.3.0/tests/test_config_schema.py +83 -0
  456. steppy_dev-0.3.0/tests/test_confirm_action.py +108 -0
  457. steppy_dev-0.3.0/tests/test_conftest_locale_mirror.py +177 -0
  458. steppy_dev-0.3.0/tests/test_coverage_cli.py +246 -0
  459. steppy_dev-0.3.0/tests/test_coverage_config.py +87 -0
  460. steppy_dev-0.3.0/tests/test_coverage_gaps.py +310 -0
  461. steppy_dev-0.3.0/tests/test_coverage_manifest.py +262 -0
  462. steppy_dev-0.3.0/tests/test_coverage_non_ui.py +303 -0
  463. steppy_dev-0.3.0/tests/test_coverage_normalize.py +122 -0
  464. steppy_dev-0.3.0/tests/test_coverage_record_template.py +119 -0
  465. steppy_dev-0.3.0/tests/test_coverage_sourcemap.py +161 -0
  466. steppy_dev-0.3.0/tests/test_coverage_store.py +264 -0
  467. steppy_dev-0.3.0/tests/test_distribution_name.py +95 -0
  468. steppy_dev-0.3.0/tests/test_escaping_fuzz.py +282 -0
  469. steppy_dev-0.3.0/tests/test_example_scenarios_validate.py +47 -0
  470. steppy_dev-0.3.0/tests/test_exclusive_groups.py +191 -0
  471. steppy_dev-0.3.0/tests/test_expand_action.py +110 -0
  472. steppy_dev-0.3.0/tests/test_failure_fingerprint.py +155 -0
  473. steppy_dev-0.3.0/tests/test_fill_date_action.py +222 -0
  474. steppy_dev-0.3.0/tests/test_fill_flags.py +101 -0
  475. steppy_dev-0.3.0/tests/test_flaky_cli.py +149 -0
  476. steppy_dev-0.3.0/tests/test_generator_events_plugin.py +154 -0
  477. steppy_dev-0.3.0/tests/test_guide_cursor.py +200 -0
  478. steppy_dev-0.3.0/tests/test_guide_fragment.py +174 -0
  479. steppy_dev-0.3.0/tests/test_guide_mode_sync.py +106 -0
  480. steppy_dev-0.3.0/tests/test_guide_pdf_cli.py +214 -0
  481. steppy_dev-0.3.0/tests/test_guide_text_format.py +211 -0
  482. steppy_dev-0.3.0/tests/test_guide_video_cli.py +324 -0
  483. steppy_dev-0.3.0/tests/test_history.py +205 -0
  484. steppy_dev-0.3.0/tests/test_init.py +179 -0
  485. steppy_dev-0.3.0/tests/test_interactive_manifest.py +1330 -0
  486. steppy_dev-0.3.0/tests/test_layout_fixes.py +808 -0
  487. steppy_dev-0.3.0/tests/test_locale_screenshots.py +217 -0
  488. steppy_dev-0.3.0/tests/test_locales.py +184 -0
  489. steppy_dev-0.3.0/tests/test_locales_dynamic.py +141 -0
  490. steppy_dev-0.3.0/tests/test_match_within.py +329 -0
  491. steppy_dev-0.3.0/tests/test_migrate_custom.py +312 -0
  492. steppy_dev-0.3.0/tests/test_navigate_reload.py +99 -0
  493. steppy_dev-0.3.0/tests/test_navigate_wait.py +92 -0
  494. steppy_dev-0.3.0/tests/test_no_bundle_import_on_default_path.py +71 -0
  495. steppy_dev-0.3.0/tests/test_no_cloud_import_on_default_path.py +73 -0
  496. steppy_dev-0.3.0/tests/test_no_coverage_import_on_default_path.py +51 -0
  497. steppy_dev-0.3.0/tests/test_no_migrate_import_on_default_path.py +72 -0
  498. steppy_dev-0.3.0/tests/test_no_parallel_import_on_default_path.py +84 -0
  499. steppy_dev-0.3.0/tests/test_no_playwright_import_on_default_path.py +99 -0
  500. steppy_dev-0.3.0/tests/test_no_private_names.py +46 -0
  501. steppy_dev-0.3.0/tests/test_no_report_import_on_default_path.py +78 -0
  502. steppy_dev-0.3.0/tests/test_no_tours_import_on_default_path.py +81 -0
  503. steppy_dev-0.3.0/tests/test_no_video_import_on_default_path.py +117 -0
  504. steppy_dev-0.3.0/tests/test_optional_and_when.py +222 -0
  505. steppy_dev-0.3.0/tests/test_output_config.py +431 -0
  506. steppy_dev-0.3.0/tests/test_parallel_auth_isolation.py +132 -0
  507. steppy_dev-0.3.0/tests/test_parallel_circuit_breaker.py +119 -0
  508. steppy_dev-0.3.0/tests/test_parallel_compose.py +126 -0
  509. steppy_dev-0.3.0/tests/test_parallel_config.py +138 -0
  510. steppy_dev-0.3.0/tests/test_parallel_coordinator_wait.py +119 -0
  511. steppy_dev-0.3.0/tests/test_parallel_event_bus.py +347 -0
  512. steppy_dev-0.3.0/tests/test_parallel_events_plugin.py +287 -0
  513. steppy_dev-0.3.0/tests/test_parallel_exclusive_scheduling.py +314 -0
  514. steppy_dev-0.3.0/tests/test_parallel_exit_policy.py +211 -0
  515. steppy_dev-0.3.0/tests/test_parallel_failures.py +214 -0
  516. steppy_dev-0.3.0/tests/test_parallel_guide_integration.py +436 -0
  517. steppy_dev-0.3.0/tests/test_parallel_lastfailed.py +176 -0
  518. steppy_dev-0.3.0/tests/test_parallel_preauth.py +195 -0
  519. steppy_dev-0.3.0/tests/test_parallel_queue.py +344 -0
  520. steppy_dev-0.3.0/tests/test_parallel_renderer.py +364 -0
  521. steppy_dev-0.3.0/tests/test_parallel_report_flags.py +157 -0
  522. steppy_dev-0.3.0/tests/test_parallel_retry_pass.py +310 -0
  523. steppy_dev-0.3.0/tests/test_parallel_worker_image.py +321 -0
  524. steppy_dev-0.3.0/tests/test_parser.py +1630 -0
  525. steppy_dev-0.3.0/tests/test_parser_malformed_lines.py +93 -0
  526. steppy_dev-0.3.0/tests/test_pdf.py +313 -0
  527. steppy_dev-0.3.0/tests/test_pick_date_action.py +155 -0
  528. steppy_dev-0.3.0/tests/test_pick_time_action.py +136 -0
  529. steppy_dev-0.3.0/tests/test_player_bundle_files.py +42 -0
  530. steppy_dev-0.3.0/tests/test_record_cli.py +179 -0
  531. steppy_dev-0.3.0/tests/test_record_login_and_secrets.py +115 -0
  532. steppy_dev-0.3.0/tests/test_record_transform.py +296 -0
  533. steppy_dev-0.3.0/tests/test_report_assets.py +243 -0
  534. steppy_dev-0.3.0/tests/test_report_ci.py +160 -0
  535. steppy_dev-0.3.0/tests/test_report_ci_templates.py +255 -0
  536. steppy_dev-0.3.0/tests/test_report_cli.py +214 -0
  537. steppy_dev-0.3.0/tests/test_report_coverage.py +248 -0
  538. steppy_dev-0.3.0/tests/test_report_model.py +432 -0
  539. steppy_dev-0.3.0/tests/test_report_render.py +412 -0
  540. steppy_dev-0.3.0/tests/test_report_schema.py +122 -0
  541. steppy_dev-0.3.0/tests/test_report_source.py +209 -0
  542. steppy_dev-0.3.0/tests/test_reusable_workflow.py +142 -0
  543. steppy_dev-0.3.0/tests/test_robustness_flaws.py +214 -0
  544. steppy_dev-0.3.0/tests/test_run_byte_identical.py +134 -0
  545. steppy_dev-0.3.0/tests/test_scenario_version.py +59 -0
  546. steppy_dev-0.3.0/tests/test_screenshot_mask.py +72 -0
  547. steppy_dev-0.3.0/tests/test_screenshot_path_resolution.py +331 -0
  548. steppy_dev-0.3.0/tests/test_select_option_action.py +163 -0
  549. steppy_dev-0.3.0/tests/test_selection.py +239 -0
  550. steppy_dev-0.3.0/tests/test_selector_lint.py +190 -0
  551. steppy_dev-0.3.0/tests/test_seo_config_sync.py +92 -0
  552. steppy_dev-0.3.0/tests/test_sitemap.py +262 -0
  553. steppy_dev-0.3.0/tests/test_skills_neutralized.py +29 -0
  554. steppy_dev-0.3.0/tests/test_skills_sync.py +128 -0
  555. steppy_dev-0.3.0/tests/test_step_events_codegen.py +265 -0
  556. steppy_dev-0.3.0/tests/test_step_required_fields.py +111 -0
  557. steppy_dev-0.3.0/tests/test_step_timeout_and_force.py +237 -0
  558. steppy_dev-0.3.0/tests/test_template_precedence.py +144 -0
  559. steppy_dev-0.3.0/tests/test_toggle_action.py +127 -0
  560. steppy_dev-0.3.0/tests/test_totp.py +159 -0
  561. steppy_dev-0.3.0/tests/test_tour_action_table.py +30 -0
  562. steppy_dev-0.3.0/tests/test_tour_contract_sync.py +105 -0
  563. steppy_dev-0.3.0/tests/test_tour_demo_server.py +60 -0
  564. steppy_dev-0.3.0/tests/test_tour_leaves.py +226 -0
  565. steppy_dev-0.3.0/tests/test_tour_leaves_stdlib_only.py +34 -0
  566. steppy_dev-0.3.0/tests/test_tour_replay_codegen.py +224 -0
  567. steppy_dev-0.3.0/tests/test_tour_replay_conftest.py +187 -0
  568. steppy_dev-0.3.0/tests/test_tour_replay_helpers.py +590 -0
  569. steppy_dev-0.3.0/tests/test_tour_replay_helpers_mirror.py +73 -0
  570. steppy_dev-0.3.0/tests/test_tour_replay_plan.py +205 -0
  571. steppy_dev-0.3.0/tests/test_tours_cli.py +349 -0
  572. steppy_dev-0.3.0/tests/test_tours_config.py +110 -0
  573. steppy_dev-0.3.0/tests/test_tours_contract.py +173 -0
  574. steppy_dev-0.3.0/tests/test_tours_diagnostics.py +24 -0
  575. steppy_dev-0.3.0/tests/test_tours_disabled_inert.py +85 -0
  576. steppy_dev-0.3.0/tests/test_tours_docs_sync.py +178 -0
  577. steppy_dev-0.3.0/tests/test_tours_golden.py +120 -0
  578. steppy_dev-0.3.0/tests/test_tours_inference.py +808 -0
  579. steppy_dev-0.3.0/tests/test_tours_routes.py +73 -0
  580. steppy_dev-0.3.0/tests/test_tours_scenario_model.py +221 -0
  581. steppy_dev-0.3.0/tests/test_tours_schema.py +48 -0
  582. steppy_dev-0.3.0/tests/test_tours_text.py +180 -0
  583. steppy_dev-0.3.0/tests/test_tts.py +779 -0
  584. steppy_dev-0.3.0/tests/test_ui_presets.py +97 -0
  585. steppy_dev-0.3.0/tests/test_update.py +244 -0
  586. steppy_dev-0.3.0/tests/test_upload_action.py +284 -0
  587. steppy_dev-0.3.0/tests/test_versions_aligned.py +83 -0
  588. steppy_dev-0.3.0/tests/test_video.py +716 -0
  589. steppy_dev-0.3.0/tests/test_video_cache.py +161 -0
  590. steppy_dev-0.3.0/tests/test_wait_for_predicate.py +228 -0
  591. steppy_dev-0.3.0/tests/test_wait_for_state.py +91 -0
  592. steppy_dev-0.3.0/tests/test_widget_control_and_detect.py +204 -0
@@ -0,0 +1,41 @@
1
+ {
2
+ "version": "0.0.1",
3
+ "configurations": [
4
+ {
5
+ "name": "player-dev",
6
+ "runtimeExecutable": "python",
7
+ "runtimeArgs": [
8
+ "-m",
9
+ "http.server",
10
+ "8099",
11
+ "--directory",
12
+ "packages/player"
13
+ ],
14
+ "port": 8099
15
+ },
16
+ {
17
+ "name": "tour-demo",
18
+ "runtimeExecutable": "python",
19
+ "runtimeArgs": [
20
+ "fixtures/tour-demo/serve.py",
21
+ "--port",
22
+ "8770"
23
+ ],
24
+ "port": 8770
25
+ },
26
+ {
27
+ "name": "tour-demo-angular",
28
+ "runtimeExecutable": "python",
29
+ "runtimeArgs": [
30
+ "fixtures/tour-demo/serve.py",
31
+ "--port",
32
+ "8772",
33
+ "--style-src",
34
+ "'unsafe-inline'",
35
+ "--app-dir",
36
+ "fixtures/tour-demo-angular/app/dist/tour-demo-angular/browser"
37
+ ],
38
+ "port": 8772
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,54 @@
1
+ # Build context for the worker image (see Dockerfile). The image build only
2
+ # needs: pyproject.toml, hatch_build.py, src/, templates/, skills/,
3
+ # CHANGELOG.md. Everything else is excluded to keep `docker build` fast and
4
+ # to keep local secrets/state from being sent to the Docker daemon.
5
+
6
+ # VCS / editor
7
+ .git/
8
+ .github/
9
+ .claude/
10
+
11
+ # Secrets — never leave the host
12
+ .auth/
13
+ credentials.yaml
14
+ credentials.yml
15
+
16
+ # Runtime state / generated output
17
+ .steppy/
18
+ output/
19
+ tests/e2e/
20
+
21
+ # Python caches / envs
22
+ __pycache__/
23
+ **/__pycache__/
24
+ *.py[cod]
25
+ *.egg-info/
26
+ .venv/
27
+ venv/
28
+ .pytest_cache/
29
+ .mypy_cache/
30
+ .ruff_cache/
31
+
32
+ # Node workspaces — the built player bundle is vendored at
33
+ # src/steppy/_player_bundle/, so packages/ isn't needed for the image build.
34
+ packages/
35
+ node_modules/
36
+ **/node_modules/
37
+
38
+ # Project/dev files not needed to pip-install the steppy package
39
+ tests/
40
+ fixtures/
41
+ scenarios/
42
+ seed/
43
+ config.yaml
44
+ credentials.yaml.example
45
+ steppy.guide.config.ts
46
+ steppy-config.schema.json
47
+ docker-compose*.yml
48
+ Dockerfile
49
+ .dockerignore
50
+ README.md
51
+ SECURITY.md
52
+ CONTRIBUTING.md
53
+ NEW_COMMANDS.md
54
+ PROJECT.md
@@ -0,0 +1,22 @@
1
+ # LF everywhere, on every OS. Several guard tests compare files byte for byte
2
+ # (the _totp_now / _base_language / sanitise_nodeid mirrors, the generated
3
+ # JSON schemas, the vendored bundles), and a CRLF checkout on Windows turns
4
+ # those into diffs nobody made.
5
+ * text=auto eol=lf
6
+
7
+ *.png binary
8
+ *.jpg binary
9
+ *.jpeg binary
10
+ *.gif binary
11
+ *.webp binary
12
+ *.ico binary
13
+ *.pdf binary
14
+ *.mp4 binary
15
+ *.wav binary
16
+ *.zip binary
17
+
18
+ # Build outputs committed on purpose (so `pip install git+...` needs no Node).
19
+ # Collapsed in diffs and left out of GitHub's language statistics.
20
+ src/steppy/_player_bundle/*.js linguist-generated=true
21
+ src/steppy/_player_bundle/*.js.map linguist-generated=true
22
+ fixtures/demo-guide/public/assets/**/steppy-player.js linguist-generated=true
@@ -0,0 +1,77 @@
1
+ name: Bug report
2
+ description: Something in Steppy behaves differently from what the docs say.
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for taking the time to report this. A security vulnerability goes
9
+ through a private advisory instead (see SECURITY.md), never a public issue.
10
+
11
+ - type: dropdown
12
+ id: area
13
+ attributes:
14
+ label: Area
15
+ options:
16
+ - Scenarios, validate or generate
17
+ - Running tests (steppy run)
18
+ - Parallel runs (--workers)
19
+ - Guides, build, PDF or video
20
+ - In-app tours
21
+ - Report, bundle or coverage
22
+ - Recording (steppy record)
23
+ - "@steppy/player"
24
+ - "@steppy/angular"
25
+ - Something else
26
+ validations:
27
+ required: true
28
+
29
+ - type: textarea
30
+ id: what-happened
31
+ attributes:
32
+ label: What happened
33
+ description: Include the full error. Re-running with `--verbose` (or `STEPPY_DEBUG=1`) prints the traceback.
34
+ validations:
35
+ required: true
36
+
37
+ - type: textarea
38
+ id: expected
39
+ attributes:
40
+ label: What you expected
41
+ validations:
42
+ required: true
43
+
44
+ - type: textarea
45
+ id: reproduce
46
+ attributes:
47
+ label: How to reproduce
48
+ description: |
49
+ The command you ran, and the smallest scenario or `config.yaml` excerpt that shows the
50
+ problem. Use the neutral example domain if you can.
51
+ render: markdown
52
+ validations:
53
+ required: true
54
+
55
+ - type: input
56
+ id: steppy-version
57
+ attributes:
58
+ label: Steppy version
59
+ description: Output of `python -c "import steppy; print(steppy.__version__)"`, or the npm package version.
60
+ validations:
61
+ required: true
62
+
63
+ - type: textarea
64
+ id: environment
65
+ attributes:
66
+ label: Environment
67
+ description: Operating system, Python version, Playwright version, and Node version if the problem involves `steppy build` or an npm package.
68
+ validations:
69
+ required: true
70
+
71
+ - type: checkboxes
72
+ id: redaction
73
+ attributes:
74
+ label: Before you submit
75
+ options:
76
+ - label: I removed credentials, tokens, internal URLs and personal data from the logs, config and screenshots above.
77
+ required: true
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Report a security vulnerability
4
+ url: https://github.com/Steppy-dev/steppy/security/advisories/new
5
+ about: Report it privately through a security advisory, never in a public issue.
@@ -0,0 +1,41 @@
1
+ name: Feature request
2
+ description: Suggest a new capability or a change to an existing one.
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: The problem
9
+ description: What are you trying to do, and what gets in the way today? A scenario excerpt helps.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: proposal
15
+ attributes:
16
+ label: What you would like
17
+ description: How it could work from your side, such as a new step field, action, config key or command.
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: alternatives
23
+ attributes:
24
+ label: What you do today instead
25
+ description: "For example an `action: custom` block or a `call` helper you had to write."
26
+
27
+ - type: dropdown
28
+ id: area
29
+ attributes:
30
+ label: Area
31
+ options:
32
+ - Scenarios, validate or generate
33
+ - Running tests (steppy run)
34
+ - Parallel runs (--workers)
35
+ - Guides, build, PDF or video
36
+ - In-app tours
37
+ - Report, bundle or coverage
38
+ - Recording (steppy record)
39
+ - "@steppy/player"
40
+ - "@steppy/angular"
41
+ - Something else
@@ -0,0 +1,13 @@
1
+ ## What this changes
2
+
3
+ <!-- What the change does and why. Link the issue it closes, if any. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] `python -m pytest tests/ --ignore=tests/e2e -q` passes
8
+ - [ ] `ruff check . && ruff format --check .` passes
9
+ - [ ] Templates were edited in `templates/` only, never in the generated `src/steppy/templates/`
10
+ - [ ] If `packages/player/src/` changed: `npm --prefix packages/player test` passes, and the bundles were rebuilt and re-vendored into `src/steppy/_player_bundle/`
11
+ - [ ] A user-visible change has an entry under `[Unreleased]` in `CHANGELOG.md`, and the docs and skills say the same thing
12
+
13
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) for the guard tests and what each one protects. By opening this pull request you agree that your contribution is licensed under the Apache License 2.0, as described there.
@@ -0,0 +1,218 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ lint:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ # Ruff comes from the `dev` dependency group (pyproject.toml), never from
18
+ # whatever happens to be on PATH — see CONTRIBUTING.md for why that matters.
19
+ - uses: astral-sh/setup-uv@v6
20
+
21
+ - name: Lint
22
+ run: uv run --only-group dev ruff check .
23
+
24
+ - name: Format
25
+ run: uv run --only-group dev ruff format --check .
26
+
27
+ python:
28
+ runs-on: ubuntu-latest
29
+ strategy:
30
+ fail-fast: false
31
+ matrix:
32
+ python-version: ['3.12', '3.13']
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+
36
+ - uses: actions/setup-python@v5
37
+ with:
38
+ python-version: ${{ matrix.python-version }}
39
+
40
+ - name: Install package (editable) + extras
41
+ run: |
42
+ python -m pip install --upgrade pip
43
+ pip install -e '.[report,retry,bundle]'
44
+
45
+ - name: Run unit tests
46
+ run: python -m pytest tests/ --ignore=tests/e2e -q
47
+
48
+ player:
49
+ runs-on: ubuntu-latest
50
+ steps:
51
+ - uses: actions/checkout@v4
52
+
53
+ - uses: actions/setup-node@v4
54
+ with:
55
+ node-version: '20'
56
+ cache: 'npm'
57
+ cache-dependency-path: packages/player/package-lock.json
58
+
59
+ - name: Install player workspace
60
+ run: npm --prefix packages/player ci
61
+
62
+ - name: Run player tests
63
+ run: npm --prefix packages/player test
64
+
65
+ # The bundles under src/steppy/_player_bundle/ are committed so that
66
+ # `pip install git+...` needs no Node toolchain. The build is reproducible,
67
+ # so a mismatch means someone changed packages/player/src/ without
68
+ # rebuilding and re-vendoring — and every git install would ship the old player.
69
+ - name: Vendored bundles match the source
70
+ run: |
71
+ npm --prefix packages/player run build
72
+ fail=0
73
+ for f in steppy-player.js steppy-cursor-legacy.js steppy-video.js; do
74
+ for g in "$f" "$f.map"; do
75
+ if ! cmp -s "packages/player/dist/$g" "src/steppy/_player_bundle/$g"; then
76
+ echo "::error file=src/steppy/_player_bundle/$g::stale vendored bundle — run the player build and copy dist/ into src/steppy/_player_bundle/"
77
+ fail=1
78
+ fi
79
+ done
80
+ done
81
+ exit $fail
82
+
83
+ # The in-app tour overlay (dist/steppy-tour.js) ships to apps through
84
+ # npm, not the wheel, so it is not compared above. It has a size budget
85
+ # instead; the build above already produced it.
86
+ - name: Tour overlay size budget
87
+ run: npm --prefix packages/player run size:tour
88
+
89
+ # Publish-readiness: every file package.json points at is in the tarball.
90
+ - name: npm pack contents
91
+ run: npm --prefix packages/player run check:pack
92
+
93
+ # In-app tours in a real browser: the overlay in the demo app (top layer,
94
+ # focus, keyboard, remote loading with CORS and SRI, a built guide site as
95
+ # the remote origin) and the generated tour replays — including the one this
96
+ # feature exists for: a renamed test-id fails the build, naming tour, step
97
+ # and test-id. happy-dom covers the logic; only Chromium covers this.
98
+ tour-e2e:
99
+ runs-on: ubuntu-latest
100
+ steps:
101
+ - uses: actions/checkout@v4
102
+
103
+ - uses: actions/setup-node@v4
104
+ with:
105
+ node-version: '20'
106
+ cache: 'npm'
107
+ cache-dependency-path: packages/player/package-lock.json
108
+
109
+ - name: Build the tour overlay
110
+ run: |
111
+ npm --prefix packages/player ci
112
+ npm --prefix packages/player run build
113
+
114
+ - uses: actions/setup-python@v5
115
+ with:
116
+ python-version: '3.12'
117
+
118
+ - name: Install package (editable) + Chromium
119
+ run: |
120
+ python -m pip install --upgrade pip
121
+ pip install -e .
122
+ playwright install chromium --with-deps
123
+
124
+ - name: Run the tour browser tests
125
+ env:
126
+ STEPPY_TOUR_E2E: '1'
127
+ run: python -m pytest tests/integration/test_tour_replay_it.py tests/integration/test_tour_player_it.py -q
128
+
129
+ - name: Keep the failure evidence
130
+ if: failure()
131
+ uses: actions/upload-artifact@v4
132
+ with:
133
+ name: tour-e2e-failure
134
+ path: |
135
+ /tmp/pytest-of-*/pytest-*/**/tests/e2e/**
136
+ /tmp/pytest-of-*/pytest-*/**/output/**
137
+ if-no-files-found: ignore
138
+ retention-days: 7
139
+
140
+ # @steppy/angular: the zoneless and the zone.js unit suites, the
141
+ # ng-packagr build, and what `npm publish ./dist` would ship. The adapter
142
+ # type-checks against the overlay's declarations, so the player is built first.
143
+ angular-adapter:
144
+ runs-on: ubuntu-latest
145
+ steps:
146
+ - uses: actions/checkout@v4
147
+
148
+ - uses: actions/setup-node@v4
149
+ with:
150
+ node-version: '22'
151
+ cache: 'npm'
152
+ cache-dependency-path: |
153
+ packages/player/package-lock.json
154
+ packages/angular/package-lock.json
155
+
156
+ - name: Build the player
157
+ run: |
158
+ npm --prefix packages/player ci
159
+ npm --prefix packages/player run build
160
+
161
+ - name: Test and build the adapter
162
+ run: |
163
+ npm --prefix packages/angular ci
164
+ npm --prefix packages/angular test
165
+ npm --prefix packages/angular run build
166
+ npm pack --dry-run ./packages/angular/dist
167
+
168
+ # In-app tours in a real Angular + PrimeNG + ngx-translate app, through the
169
+ # adapter: the plain demo's scenarios and their generated replays run
170
+ # unchanged against it, plus the router bridge, zone hygiene and i18n.
171
+ tour-angular-e2e:
172
+ runs-on: ubuntu-latest
173
+ steps:
174
+ - uses: actions/checkout@v4
175
+
176
+ - uses: actions/setup-node@v4
177
+ with:
178
+ node-version: '22'
179
+ cache: 'npm'
180
+ cache-dependency-path: |
181
+ packages/player/package-lock.json
182
+ packages/angular/package-lock.json
183
+ fixtures/tour-demo-angular/app/package-lock.json
184
+
185
+ - name: Build the player, the adapter and the demo
186
+ run: |
187
+ npm --prefix packages/player ci
188
+ npm --prefix packages/player run build
189
+ npm --prefix packages/angular ci
190
+ npm --prefix packages/angular run build
191
+ npm --prefix fixtures/tour-demo-angular/app ci
192
+ npm --prefix fixtures/tour-demo-angular/app run build
193
+
194
+ - uses: actions/setup-python@v5
195
+ with:
196
+ python-version: '3.12'
197
+
198
+ - name: Install package (editable) + Chromium
199
+ run: |
200
+ python -m pip install --upgrade pip
201
+ pip install -e .
202
+ playwright install chromium --with-deps
203
+
204
+ - name: Run the Angular tour browser tests
205
+ env:
206
+ STEPPY_TOUR_ANGULAR_E2E: '1'
207
+ run: python -m pytest tests/integration/test_tour_angular_it.py -q
208
+
209
+ - name: Keep the failure evidence
210
+ if: failure()
211
+ uses: actions/upload-artifact@v4
212
+ with:
213
+ name: tour-angular-e2e-failure
214
+ path: |
215
+ /tmp/pytest-of-*/pytest-*/**/tests/e2e/**
216
+ /tmp/pytest-of-*/pytest-*/**/output/**
217
+ if-no-files-found: ignore
218
+ retention-days: 7
@@ -0,0 +1,200 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ build-and-release:
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Verify tag matches all package versions
20
+ run: |
21
+ TAG_VERSION="${GITHUB_REF_NAME#v}"
22
+ PROJECT_VERSION=$(grep -E '^version = ' pyproject.toml | head -1 | sed -E 's/version = "(.*)"/\1/')
23
+ TYPES_VERSION=$(python -c "import json;print(json.load(open('packages/steppy/package.json'))['version'])")
24
+ PLAYER_VERSION=$(python -c "import json;print(json.load(open('packages/player/package.json'))['version'])")
25
+ ANGULAR_VERSION=$(python -c "import json;print(json.load(open('packages/angular/package.json'))['version'])")
26
+ echo "Tag: $TAG_VERSION"
27
+ echo "pyproject.toml: $PROJECT_VERSION"
28
+ echo "packages/steppy/package.json: $TYPES_VERSION"
29
+ echo "packages/player/package.json: $PLAYER_VERSION"
30
+ echo "packages/angular/package.json: $ANGULAR_VERSION"
31
+ fail=0
32
+ for name_ver in "pyproject.toml=$PROJECT_VERSION" "packages/steppy=$TYPES_VERSION" "packages/player=$PLAYER_VERSION" "packages/angular=$ANGULAR_VERSION"; do
33
+ name="${name_ver%%=*}"; ver="${name_ver##*=}"
34
+ if [ "$TAG_VERSION" != "$ver" ]; then
35
+ echo "::error::Tag $GITHUB_REF_NAME does not match $name version $ver"
36
+ fail=1
37
+ fi
38
+ done
39
+ [ "$fail" = 0 ]
40
+
41
+ - name: Setup Node
42
+ uses: actions/setup-node@v4
43
+ with:
44
+ node-version: '20'
45
+ cache: 'npm'
46
+ cache-dependency-path: packages/player/package-lock.json
47
+
48
+ - name: Setup Python
49
+ uses: actions/setup-python@v5
50
+ with:
51
+ python-version: '3.12'
52
+
53
+ - name: Install player workspace
54
+ run: npm --prefix packages/player ci
55
+
56
+ - name: Build player bundles
57
+ run: npm --prefix packages/player run build
58
+
59
+ # The tour overlay ships through npm only: its size budget and the
60
+ # package's contents are checked here, before anything is released.
61
+ - name: Tour overlay size budget and npm pack contents
62
+ run: |
63
+ npm --prefix packages/player run size:tour
64
+ npm --prefix packages/player run check:pack
65
+
66
+ - name: Vendor player bundles into Python package
67
+ run: |
68
+ cp packages/player/dist/steppy-player.js src/steppy/_player_bundle/
69
+ cp packages/player/dist/steppy-player.js.map src/steppy/_player_bundle/
70
+ cp packages/player/dist/steppy-cursor-legacy.js src/steppy/_player_bundle/
71
+ cp packages/player/dist/steppy-cursor-legacy.js.map src/steppy/_player_bundle/
72
+ cp packages/player/dist/steppy-video.js src/steppy/_player_bundle/
73
+ cp packages/player/dist/steppy-video.js.map src/steppy/_player_bundle/
74
+ ls -la src/steppy/_player_bundle/
75
+
76
+ - name: Install build tools
77
+ run: pip install --upgrade build twine
78
+
79
+ - name: Build wheel + sdist
80
+ run: python -m build
81
+
82
+ # The README becomes the PyPI project page; a description PyPI cannot
83
+ # render is refused at upload, after the GitHub Release already exists.
84
+ - name: Check the metadata PyPI will render
85
+ run: twine check --strict dist/*
86
+
87
+ - name: Verify wheel contains vendored bundles
88
+ run: |
89
+ WHEEL=$(ls dist/*.whl | head -1)
90
+ echo "Inspecting $WHEEL"
91
+ python -m zipfile -l "$WHEEL" | tee /tmp/wheel-contents.txt
92
+ for f in steppy-player.js steppy-cursor-legacy.js steppy-video.js THIRD_PARTY_LICENSES.txt; do
93
+ if ! grep -q "steppy/_player_bundle/$f" /tmp/wheel-contents.txt; then
94
+ echo "::error::$f missing from wheel"
95
+ exit 1
96
+ fi
97
+ done
98
+ for f in LICENSE NOTICE; do
99
+ if ! grep -q "dist-info/licenses/$f" /tmp/wheel-contents.txt; then
100
+ echo "::error::$f missing from wheel"
101
+ exit 1
102
+ fi
103
+ done
104
+ # The tour replay helper is copied next to conftest.py by `generate`;
105
+ # the tour overlay itself is never vendored (it ships through npm).
106
+ if ! grep -q "steppy/templates/_steppy_tours.py" /tmp/wheel-contents.txt; then
107
+ echo "::error::templates/_steppy_tours.py missing from wheel"
108
+ exit 1
109
+ fi
110
+ if grep -q "steppy-tour.js" /tmp/wheel-contents.txt; then
111
+ echo "::error::steppy-tour.js must not be vendored into the wheel"
112
+ exit 1
113
+ fi
114
+
115
+ # The PyPI job publishes these exact files rather than building again.
116
+ - name: Keep the distributions for the PyPI job
117
+ uses: actions/upload-artifact@v4
118
+ with:
119
+ name: python-dist
120
+ path: dist/
121
+ if-no-files-found: error
122
+
123
+ - name: Create GitHub Release
124
+ env:
125
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
126
+ run: |
127
+ gh release create "$GITHUB_REF_NAME" \
128
+ --title "$GITHUB_REF_NAME" \
129
+ --generate-notes \
130
+ dist/*.whl dist/*.tar.gz
131
+
132
+ - name: PyPI publishing is off
133
+ if: vars.PYPI_PUBLISH != 'true'
134
+ run: echo "::notice::The PYPI_PUBLISH repository variable is not 'true'; steppy-dev is not published to PyPI"
135
+
136
+ # steppy-dev on PyPI, through Trusted Publishing: PyPI trusts this workflow
137
+ # in this repository and the `pypi` environment, so no token is stored.
138
+ # Skipped until the PYPI_PUBLISH repository variable is 'true', which is set
139
+ # once the trusted publisher exists (CONTRIBUTING.md, "Releasing").
140
+ publish-pypi:
141
+ needs: build-and-release
142
+ if: vars.PYPI_PUBLISH == 'true'
143
+ runs-on: ubuntu-latest
144
+ environment:
145
+ name: pypi
146
+ url: https://pypi.org/project/steppy-dev/
147
+ permissions:
148
+ id-token: write # Trusted Publishing
149
+ # Every step here can mint the token that uploads to PyPI, so each action
150
+ # is pinned to a commit rather than a tag its owner could move.
151
+ steps:
152
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
153
+ with:
154
+ name: python-dist
155
+ path: dist/
156
+
157
+ - name: Publish steppy-dev
158
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
159
+
160
+ # @steppy/player (the guide player and the in-app tour overlay) and
161
+ # @steppy/angular. Skipped until an NPM_TOKEN secret exists; the player
162
+ # goes first because the adapter names it as a peer at the same version.
163
+ publish-npm:
164
+ needs: build-and-release
165
+ runs-on: ubuntu-latest
166
+ permissions:
167
+ contents: read
168
+ id-token: write # npm provenance
169
+ env:
170
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
171
+ steps:
172
+ - name: No npm token
173
+ if: env.NODE_AUTH_TOKEN == ''
174
+ run: echo "::notice::NPM_TOKEN is not set; the npm packages are not published"
175
+
176
+ - uses: actions/checkout@v4
177
+ if: env.NODE_AUTH_TOKEN != ''
178
+
179
+ - uses: actions/setup-node@v4
180
+ if: env.NODE_AUTH_TOKEN != ''
181
+ with:
182
+ node-version: '22'
183
+ registry-url: 'https://registry.npmjs.org'
184
+
185
+ - name: Build the player and the Angular adapter
186
+ if: env.NODE_AUTH_TOKEN != ''
187
+ run: |
188
+ npm --prefix packages/player ci
189
+ npm --prefix packages/player run build
190
+ npm --prefix packages/player run check:pack
191
+ npm --prefix packages/angular ci
192
+ npm --prefix packages/angular run build
193
+
194
+ - name: Publish @steppy/player
195
+ if: env.NODE_AUTH_TOKEN != ''
196
+ run: npm publish ./packages/player --provenance --ignore-scripts
197
+
198
+ - name: Publish @steppy/angular
199
+ if: env.NODE_AUTH_TOKEN != ''
200
+ run: npm publish ./packages/angular/dist --provenance