create-appraisejs 0.3.1-alpha.0 → 0.4.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/README.md +17 -17
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/prepare-template-utils.d.ts.map +1 -1
  5. package/dist/prepare-template-utils.js.map +1 -1
  6. package/dist/prompts.d.ts.map +1 -1
  7. package/dist/prompts.js +2 -2
  8. package/dist/prompts.js.map +1 -1
  9. package/dist/sync-templates-utils.d.ts.map +1 -1
  10. package/dist/sync-templates-utils.js +1 -5
  11. package/dist/sync-templates-utils.js.map +1 -1
  12. package/package.json +1 -1
  13. package/templates/blank/.editorconfig +11 -0
  14. package/templates/blank/.env.example +2 -2
  15. package/templates/blank/.gitattributes +21 -0
  16. package/templates/blank/.gitconfig.appraise +14 -0
  17. package/templates/blank/.prettierrc +13 -0
  18. package/templates/blank/.vscode/settings.json +2 -0
  19. package/templates/blank/README.md +12 -12
  20. package/templates/blank/components.json +24 -24
  21. package/templates/blank/cucumber.mjs +27 -16
  22. package/templates/blank/e2e/README.md +56 -0
  23. package/templates/blank/e2e/apply-migrations.mjs +76 -0
  24. package/templates/blank/e2e/appraise-smoke.spec.ts +78 -0
  25. package/templates/blank/e2e/authoring.spec.ts +53 -0
  26. package/templates/blank/e2e/crud-configuration.spec.ts +138 -0
  27. package/templates/blank/e2e/crud-tests.spec.ts +76 -0
  28. package/templates/blank/e2e/helpers/forms.ts +186 -0
  29. package/templates/blank/e2e/helpers/navigation.ts +27 -0
  30. package/templates/blank/e2e/helpers/table.ts +45 -0
  31. package/templates/blank/e2e/helpers/test-data.ts +559 -0
  32. package/templates/blank/e2e/helpers/ui.ts +41 -0
  33. package/templates/blank/e2e/navigation.spec.ts +101 -0
  34. package/templates/blank/e2e/runs-and-reports.spec.ts +82 -0
  35. package/templates/blank/e2e/settings-sync.spec.ts +39 -0
  36. package/templates/blank/e2e/start-server.mjs +61 -0
  37. package/templates/blank/eslint.config.mjs +4 -4
  38. package/templates/blank/gitignore +0 -3
  39. package/templates/blank/next-env.d.ts +6 -6
  40. package/templates/blank/package-lock.json +60 -104
  41. package/templates/blank/package.json +11 -10
  42. package/templates/blank/packages/cucumber-runtime/package.json +14 -13
  43. package/templates/blank/packages/cucumber-runtime/src/cache.util.ts +93 -93
  44. package/templates/blank/packages/cucumber-runtime/src/cli.ts +77 -68
  45. package/templates/blank/packages/cucumber-runtime/src/environment.util.ts +21 -21
  46. package/templates/blank/packages/cucumber-runtime/src/executor.ts +32 -32
  47. package/templates/blank/packages/cucumber-runtime/src/index.ts +17 -17
  48. package/templates/blank/packages/cucumber-runtime/src/locator.util.ts +234 -234
  49. package/templates/blank/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  50. package/templates/blank/packages/cucumber-runtime/src/paths.ts +22 -5
  51. package/templates/blank/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  52. package/templates/blank/packages/cucumber-runtime/src/types.ts +13 -13
  53. package/templates/blank/packages/cucumber-runtime/src/world.ts +44 -44
  54. package/templates/blank/packages/cucumber-runtime/tsconfig.json +11 -11
  55. package/templates/blank/packages/locator-picker-companion/dist/cli.js +1 -1
  56. package/templates/blank/packages/locator-picker-companion/dist/index.d.ts +3 -3
  57. package/templates/blank/packages/locator-picker-companion/dist/index.js +3 -3
  58. package/templates/blank/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  59. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  60. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  61. package/templates/blank/packages/locator-picker-companion/package.json +2 -1
  62. package/templates/blank/packages/locator-picker-companion/src/cli.ts +1 -7
  63. package/templates/blank/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  64. package/templates/blank/packages/locator-picker-companion/src/launcher.ts +1 -3
  65. package/templates/blank/packages/locator-picker-companion/src/session-file.ts +4 -15
  66. package/templates/blank/packages/locator-picker-companion/src/types.ts +1 -8
  67. package/templates/blank/playwright.config.ts +46 -0
  68. package/templates/blank/postcss.config.mjs +8 -8
  69. package/templates/blank/prisma/dev.db +0 -0
  70. package/templates/blank/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  71. package/templates/blank/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  72. package/templates/blank/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  73. package/templates/blank/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  74. package/templates/blank/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  75. package/templates/blank/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  76. package/templates/blank/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  77. package/templates/blank/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  78. package/templates/blank/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  79. package/templates/blank/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  80. package/templates/blank/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  81. package/templates/blank/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  82. package/templates/blank/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  83. package/templates/blank/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  84. package/templates/blank/scripts/configure-git-line-endings.mjs +91 -0
  85. package/templates/blank/scripts/install-template-step.ts +5 -1
  86. package/templates/blank/scripts/lib/step-matcher.test.ts +3 -3
  87. package/templates/blank/scripts/lib/step-matcher.ts +5 -1
  88. package/templates/blank/scripts/lib/template-step-installer.test.ts +4 -2
  89. package/templates/blank/scripts/lib/template-step-installer.ts +16 -4
  90. package/templates/blank/scripts/lib/template-step-registry.test.ts +1 -1
  91. package/templates/blank/scripts/lib/template-step-registry.ts +4 -1
  92. package/templates/blank/scripts/run-fallow-commit.mjs +4 -6
  93. package/templates/blank/scripts/setup-env.ts +0 -0
  94. package/templates/blank/scripts/sync-all.ts +7 -6
  95. package/templates/blank/scripts/sync-appraise-base-template.ts +84 -77
  96. package/templates/blank/scripts/sync-environments.ts +47 -44
  97. package/templates/blank/scripts/sync-locator-groups.ts +67 -76
  98. package/templates/blank/scripts/sync-locators.ts +50 -53
  99. package/templates/blank/scripts/sync-modules.ts +42 -42
  100. package/templates/blank/scripts/sync-tags.ts +51 -51
  101. package/templates/blank/scripts/sync-template-step-groups.ts +34 -32
  102. package/templates/blank/scripts/sync-template-steps.ts +97 -97
  103. package/templates/blank/scripts/sync-test-cases.ts +125 -84
  104. package/templates/blank/scripts/sync-test-suites.ts +85 -80
  105. package/templates/blank/src/actions/server-action-boundary.test.ts +1 -7
  106. package/templates/blank/src/actions/settings/sync-actions.ts +3 -1
  107. package/templates/blank/src/actions/tags/tag-actions.ts +1 -7
  108. package/templates/blank/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  109. package/templates/blank/src/app/(base)/environments/create/page.tsx +28 -28
  110. package/templates/blank/src/app/(base)/environments/environment-form.tsx +3 -2
  111. package/templates/blank/src/app/(base)/environments/environment-helpers.ts +4 -1
  112. package/templates/blank/src/app/(base)/layout.tsx +10 -10
  113. package/templates/blank/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  114. package/templates/blank/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  115. package/templates/blank/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  116. package/templates/blank/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  117. package/templates/blank/src/app/(base)/locator-groups/page.tsx +9 -19
  118. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  119. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  120. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  121. package/templates/blank/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  122. package/templates/blank/src/app/(base)/locators/locator-file-sync.ts +1 -5
  123. package/templates/blank/src/app/(base)/locators/locator-helpers.ts +2 -12
  124. package/templates/blank/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  125. package/templates/blank/src/app/(base)/modules/module-form.tsx +3 -1
  126. package/templates/blank/src/app/(base)/reports/overview-chart.tsx +49 -49
  127. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  128. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  129. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  130. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  131. package/templates/blank/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  132. package/templates/blank/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  133. package/templates/blank/src/app/(base)/tags/tag-form.test.tsx +2 -10
  134. package/templates/blank/src/app/(base)/tags/tag-form.tsx +5 -3
  135. package/templates/blank/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  136. package/templates/blank/src/app/(base)/tags/tag-table.tsx +29 -29
  137. package/templates/blank/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  138. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  139. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  140. package/templates/blank/src/app/(base)/template-steps/paramChip.tsx +6 -10
  141. package/templates/blank/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  142. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  143. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  144. package/templates/blank/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  145. package/templates/blank/src/app/(base)/template-steps/template-step-types.ts +1 -5
  146. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  147. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  148. package/templates/blank/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  149. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  150. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  151. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  152. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  153. package/templates/blank/src/app/(base)/test-cases/create/page.tsx +1 -5
  154. package/templates/blank/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  155. package/templates/blank/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  156. package/templates/blank/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  157. package/templates/blank/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  158. package/templates/blank/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  159. package/templates/blank/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  160. package/templates/blank/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  161. package/templates/blank/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  162. package/templates/blank/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  163. package/templates/blank/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  164. package/templates/blank/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  165. package/templates/blank/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  166. package/templates/blank/src/assets/icons/empty-tube.tsx +23 -23
  167. package/templates/blank/src/assets/icons/tube-plus.tsx +29 -29
  168. package/templates/blank/src/components/data-visualization/info-card.tsx +56 -70
  169. package/templates/blank/src/components/data-visualization/info-grid.tsx +22 -22
  170. package/templates/blank/src/components/diagram/add-node-prompt-node.tsx +1 -1
  171. package/templates/blank/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  172. package/templates/blank/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  173. package/templates/blank/src/components/diagram/dynamic-parameters.tsx +0 -1
  174. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  175. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  176. package/templates/blank/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  177. package/templates/blank/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  178. package/templates/blank/src/components/diagram/flow-diagram-node-search.tsx +73 -66
  179. package/templates/blank/src/components/diagram/flow-diagram-toolbar.tsx +35 -3
  180. package/templates/blank/src/components/diagram/flow-diagram-view.tsx +1 -7
  181. package/templates/blank/src/components/diagram/flow-diagram.test.tsx +225 -0
  182. package/templates/blank/src/components/diagram/flow-node-data-helpers.ts +1 -1
  183. package/templates/blank/src/components/diagram/node-form-fields-content.tsx +9 -2
  184. package/templates/blank/src/components/diagram/node-form-helpers.test.ts +3 -1
  185. package/templates/blank/src/components/diagram/node-form-helpers.ts +1 -4
  186. package/templates/blank/src/components/diagram/node-form-template-step-selection.ts +1 -4
  187. package/templates/blank/src/components/diagram/node-form.test.tsx +25 -0
  188. package/templates/blank/src/components/diagram/node-form.tsx +2 -12
  189. package/templates/blank/src/components/diagram/options-header-node.test.tsx +4 -1
  190. package/templates/blank/src/components/diagram/options-header-node.tsx +140 -130
  191. package/templates/blank/src/components/diagram/use-flow-diagram-search.ts +2 -0
  192. package/templates/blank/src/components/diagram/use-flow-diagram.ts +93 -1
  193. package/templates/blank/src/components/form/error-message.tsx +7 -7
  194. package/templates/blank/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  195. package/templates/blank/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  196. package/templates/blank/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  197. package/templates/blank/src/components/navigation/entity-search-command.tsx +3 -9
  198. package/templates/blank/src/components/navigation/nav-link.tsx +60 -60
  199. package/templates/blank/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  200. package/templates/blank/src/components/test-case/test-case-form-helpers.ts +1 -5
  201. package/templates/blank/src/components/test-case/test-case-picker-helpers.ts +8 -7
  202. package/templates/blank/src/components/test-case/test-case-picker.tsx +2 -6
  203. package/templates/blank/src/components/test-run/log-viewer.test.tsx +25 -0
  204. package/templates/blank/src/components/test-run/log-viewer.tsx +2 -2
  205. package/templates/blank/src/components/test-run/test-run-details-guards.ts +10 -1
  206. package/templates/blank/src/components/test-run/test-run-details.test.tsx +9 -19
  207. package/templates/blank/src/components/test-run/use-log-viewer.ts +2 -8
  208. package/templates/blank/src/components/test-run/use-test-run-header.ts +1 -4
  209. package/templates/blank/src/components/test-suite/test-suite-picker.tsx +1 -1
  210. package/templates/blank/src/components/theme/theme-provider.tsx +7 -1
  211. package/templates/blank/src/components/typography/page-header-subtitle.tsx +7 -7
  212. package/templates/blank/src/components/typography/page-header.tsx +7 -7
  213. package/templates/blank/src/components/ui/chart.tsx +2 -8
  214. package/templates/blank/src/components/ui/command.tsx +2 -5
  215. package/templates/blank/src/components/ui/data-table-column-header.tsx +3 -3
  216. package/templates/blank/src/components/ui/data-table.test.tsx +1 -8
  217. package/templates/blank/src/components/ui/dialog.tsx +1 -4
  218. package/templates/blank/src/components/ui/select.tsx +2 -2
  219. package/templates/blank/src/components/ui/separator.tsx +5 -1
  220. package/templates/blank/src/components/ui/skeleton.tsx +7 -7
  221. package/templates/blank/src/components/ui/table.tsx +1 -1
  222. package/templates/blank/src/components/ui/toaster.tsx +26 -26
  223. package/templates/blank/src/components/ui/tooltip.tsx +1 -1
  224. package/templates/blank/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  225. package/templates/blank/src/lib/appraise-test-case-metadata.test.ts +78 -0
  226. package/templates/blank/src/lib/appraise-test-case-metadata.ts +220 -0
  227. package/templates/blank/src/lib/automation/automation-path-roots.test.ts +14 -0
  228. package/templates/blank/src/lib/automation/automation-path-roots.ts +10 -2
  229. package/templates/blank/src/lib/database-sync.ts +166 -15
  230. package/templates/blank/src/lib/executor/local-executor-adapter.ts +6 -2
  231. package/templates/blank/src/lib/feature-file-generator.ts +54 -10
  232. package/templates/blank/src/lib/gherkin-parser.test.ts +52 -0
  233. package/templates/blank/src/lib/gherkin-parser.ts +39 -1
  234. package/templates/blank/src/lib/locator-group-file-utils.ts +5 -1
  235. package/templates/blank/src/lib/locator-picker/session-manager.ts +1 -2
  236. package/templates/blank/src/lib/metrics/metric-calculator.test.ts +105 -6
  237. package/templates/blank/src/lib/metrics/metric-calculator.ts +39 -40
  238. package/templates/blank/src/lib/sync/projected-feature-utils.ts +5 -1
  239. package/templates/blank/src/lib/sync/sync-executor.ts +1 -4
  240. package/templates/blank/src/lib/sync/sync-pending-counts.test.ts +316 -7
  241. package/templates/blank/src/lib/sync/sync-pending-counts.ts +189 -26
  242. package/templates/blank/src/lib/template-automation-paths.ts +1 -1
  243. package/templates/blank/src/lib/template-sync-utils.d.ts +14 -7
  244. package/templates/blank/src/lib/test-case-utils.ts +6 -6
  245. package/templates/blank/src/lib/test-run/log-formatter.ts +82 -83
  246. package/templates/blank/src/lib/test-run/report-parser.ts +352 -352
  247. package/templates/blank/src/lib/transformers/gherkin-converter.ts +42 -42
  248. package/templates/blank/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  249. package/templates/blank/src/lib/utils/node-param-validation.ts +81 -81
  250. package/templates/blank/src/lib/utils/template-step-file-generator.ts +5 -3
  251. package/templates/blank/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  252. package/templates/blank/src/services/dashboard/dashboard-service.test.ts +28 -1
  253. package/templates/blank/src/services/dashboard/dashboard-service.ts +2 -0
  254. package/templates/blank/src/services/locator/locator-service.test.ts +1 -3
  255. package/templates/blank/src/services/locator/locator-service.ts +3 -1
  256. package/templates/blank/src/services/locator/locator-sync-utils.test.ts +1 -4
  257. package/templates/blank/src/services/module/module-service.ts +1 -4
  258. package/templates/blank/src/services/report/report-service.test.ts +70 -6
  259. package/templates/blank/src/services/report/report-service.ts +52 -9
  260. package/templates/blank/src/services/shared/errors.ts +2 -4
  261. package/templates/blank/src/services/template-step/template-step-service.ts +3 -1
  262. package/templates/blank/src/services/template-step-group/template-step-group-service.ts +3 -1
  263. package/templates/blank/src/services/test-case/test-case-service.ts +0 -5
  264. package/templates/blank/src/services/test-run/test-run-service.test.ts +13 -6
  265. package/templates/blank/src/services/test-run/test-run-service.ts +53 -8
  266. package/templates/blank/src/services/test-suite/test-suite-service.test.ts +1 -5
  267. package/templates/blank/src/services/test-suite/test-suite-service.ts +2 -4
  268. package/templates/blank/src/types/form/actionHandler.ts +1 -5
  269. package/templates/blank/tsconfig.json +8 -8
  270. package/templates/starter/.editorconfig +11 -0
  271. package/templates/starter/.env.example +2 -2
  272. package/templates/starter/.gitattributes +21 -0
  273. package/templates/starter/.gitconfig.appraise +14 -0
  274. package/templates/starter/.prettierrc +13 -0
  275. package/templates/starter/.vscode/settings.json +2 -0
  276. package/templates/starter/README.md +12 -12
  277. package/templates/starter/automation/steps/actions/click.step.ts +56 -58
  278. package/templates/starter/automation/steps/actions/hover.step.ts +25 -27
  279. package/templates/starter/automation/steps/actions/input.step.ts +85 -108
  280. package/templates/starter/automation/steps/actions/navigation.step.ts +67 -70
  281. package/templates/starter/automation/steps/actions/random_data.step.ts +149 -143
  282. package/templates/starter/automation/steps/actions/store.step.ts +69 -1
  283. package/templates/starter/automation/steps/actions/wait.step.ts +84 -1
  284. package/templates/starter/automation/steps/validations/active_state_assertion.step.ts +28 -30
  285. package/templates/starter/automation/steps/validations/navigation_assertion.step.ts +20 -22
  286. package/templates/starter/automation/steps/validations/text_assertion.step.ts +67 -107
  287. package/templates/starter/automation/steps/validations/visibility_assertion.step.ts +24 -26
  288. package/templates/starter/components.json +24 -24
  289. package/templates/starter/cucumber.mjs +27 -16
  290. package/templates/starter/e2e/README.md +56 -0
  291. package/templates/starter/e2e/apply-migrations.mjs +76 -0
  292. package/templates/starter/e2e/appraise-smoke.spec.ts +78 -0
  293. package/templates/starter/e2e/authoring.spec.ts +53 -0
  294. package/templates/starter/e2e/crud-configuration.spec.ts +138 -0
  295. package/templates/starter/e2e/crud-tests.spec.ts +76 -0
  296. package/templates/starter/e2e/helpers/forms.ts +186 -0
  297. package/templates/starter/e2e/helpers/navigation.ts +27 -0
  298. package/templates/starter/e2e/helpers/table.ts +45 -0
  299. package/templates/starter/e2e/helpers/test-data.ts +559 -0
  300. package/templates/starter/e2e/helpers/ui.ts +41 -0
  301. package/templates/starter/e2e/navigation.spec.ts +101 -0
  302. package/templates/starter/e2e/runs-and-reports.spec.ts +82 -0
  303. package/templates/starter/e2e/settings-sync.spec.ts +39 -0
  304. package/templates/starter/e2e/start-server.mjs +61 -0
  305. package/templates/starter/eslint.config.mjs +4 -4
  306. package/templates/starter/gitignore +0 -3
  307. package/templates/starter/next-env.d.ts +6 -6
  308. package/templates/starter/package-lock.json +60 -104
  309. package/templates/starter/package.json +11 -10
  310. package/templates/starter/packages/cucumber-runtime/package.json +14 -13
  311. package/templates/starter/packages/cucumber-runtime/src/cache.util.ts +93 -93
  312. package/templates/starter/packages/cucumber-runtime/src/cli.ts +77 -68
  313. package/templates/starter/packages/cucumber-runtime/src/environment.util.ts +21 -21
  314. package/templates/starter/packages/cucumber-runtime/src/executor.ts +32 -32
  315. package/templates/starter/packages/cucumber-runtime/src/index.ts +17 -17
  316. package/templates/starter/packages/cucumber-runtime/src/locator.util.ts +234 -234
  317. package/templates/starter/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  318. package/templates/starter/packages/cucumber-runtime/src/paths.ts +22 -5
  319. package/templates/starter/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  320. package/templates/starter/packages/cucumber-runtime/src/types.ts +13 -13
  321. package/templates/starter/packages/cucumber-runtime/src/world.ts +44 -44
  322. package/templates/starter/packages/cucumber-runtime/tsconfig.json +11 -11
  323. package/templates/starter/packages/locator-picker-companion/dist/cli.js +1 -1
  324. package/templates/starter/packages/locator-picker-companion/dist/index.d.ts +3 -3
  325. package/templates/starter/packages/locator-picker-companion/dist/index.js +3 -3
  326. package/templates/starter/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  327. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  328. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  329. package/templates/starter/packages/locator-picker-companion/package.json +2 -1
  330. package/templates/starter/packages/locator-picker-companion/src/cli.ts +1 -7
  331. package/templates/starter/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  332. package/templates/starter/packages/locator-picker-companion/src/launcher.ts +1 -3
  333. package/templates/starter/packages/locator-picker-companion/src/session-file.ts +4 -15
  334. package/templates/starter/packages/locator-picker-companion/src/types.ts +1 -8
  335. package/templates/starter/playwright.config.ts +46 -0
  336. package/templates/starter/postcss.config.mjs +8 -8
  337. package/templates/starter/prisma/dev.db +0 -0
  338. package/templates/starter/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  339. package/templates/starter/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  340. package/templates/starter/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  341. package/templates/starter/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  342. package/templates/starter/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  343. package/templates/starter/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  344. package/templates/starter/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  345. package/templates/starter/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  346. package/templates/starter/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  347. package/templates/starter/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  348. package/templates/starter/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  349. package/templates/starter/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  350. package/templates/starter/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  351. package/templates/starter/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  352. package/templates/starter/scripts/configure-git-line-endings.mjs +91 -0
  353. package/templates/starter/scripts/install-template-step.ts +5 -1
  354. package/templates/starter/scripts/lib/step-matcher.test.ts +3 -3
  355. package/templates/starter/scripts/lib/step-matcher.ts +5 -1
  356. package/templates/starter/scripts/lib/template-step-installer.test.ts +4 -2
  357. package/templates/starter/scripts/lib/template-step-installer.ts +16 -4
  358. package/templates/starter/scripts/lib/template-step-registry.test.ts +1 -1
  359. package/templates/starter/scripts/lib/template-step-registry.ts +4 -1
  360. package/templates/starter/scripts/run-fallow-commit.mjs +4 -6
  361. package/templates/starter/scripts/setup-env.ts +0 -0
  362. package/templates/starter/scripts/sync-all.ts +7 -6
  363. package/templates/starter/scripts/sync-appraise-base-template.ts +84 -77
  364. package/templates/starter/scripts/sync-environments.ts +47 -44
  365. package/templates/starter/scripts/sync-locator-groups.ts +67 -76
  366. package/templates/starter/scripts/sync-locators.ts +50 -53
  367. package/templates/starter/scripts/sync-modules.ts +42 -42
  368. package/templates/starter/scripts/sync-tags.ts +51 -51
  369. package/templates/starter/scripts/sync-template-step-groups.ts +34 -32
  370. package/templates/starter/scripts/sync-template-steps.ts +97 -97
  371. package/templates/starter/scripts/sync-test-cases.ts +125 -84
  372. package/templates/starter/scripts/sync-test-suites.ts +85 -80
  373. package/templates/starter/src/actions/server-action-boundary.test.ts +1 -7
  374. package/templates/starter/src/actions/settings/sync-actions.ts +3 -1
  375. package/templates/starter/src/actions/tags/tag-actions.ts +1 -7
  376. package/templates/starter/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  377. package/templates/starter/src/app/(base)/environments/create/page.tsx +28 -28
  378. package/templates/starter/src/app/(base)/environments/environment-form.tsx +3 -2
  379. package/templates/starter/src/app/(base)/environments/environment-helpers.ts +4 -1
  380. package/templates/starter/src/app/(base)/layout.tsx +10 -10
  381. package/templates/starter/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  382. package/templates/starter/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  383. package/templates/starter/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  384. package/templates/starter/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  385. package/templates/starter/src/app/(base)/locator-groups/page.tsx +9 -19
  386. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  387. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  388. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  389. package/templates/starter/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  390. package/templates/starter/src/app/(base)/locators/locator-file-sync.ts +1 -5
  391. package/templates/starter/src/app/(base)/locators/locator-helpers.ts +2 -12
  392. package/templates/starter/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  393. package/templates/starter/src/app/(base)/modules/module-form.tsx +3 -1
  394. package/templates/starter/src/app/(base)/reports/overview-chart.tsx +49 -49
  395. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  396. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  397. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  398. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  399. package/templates/starter/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  400. package/templates/starter/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  401. package/templates/starter/src/app/(base)/tags/tag-form.test.tsx +2 -10
  402. package/templates/starter/src/app/(base)/tags/tag-form.tsx +5 -3
  403. package/templates/starter/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  404. package/templates/starter/src/app/(base)/tags/tag-table.tsx +29 -29
  405. package/templates/starter/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  406. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  407. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  408. package/templates/starter/src/app/(base)/template-steps/paramChip.tsx +6 -10
  409. package/templates/starter/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  410. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  411. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  412. package/templates/starter/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  413. package/templates/starter/src/app/(base)/template-steps/template-step-types.ts +1 -5
  414. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  415. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  416. package/templates/starter/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  417. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  418. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  419. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  420. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  421. package/templates/starter/src/app/(base)/test-cases/create/page.tsx +1 -5
  422. package/templates/starter/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  423. package/templates/starter/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  424. package/templates/starter/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  425. package/templates/starter/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  426. package/templates/starter/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  427. package/templates/starter/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  428. package/templates/starter/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  429. package/templates/starter/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  430. package/templates/starter/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  431. package/templates/starter/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  432. package/templates/starter/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  433. package/templates/starter/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  434. package/templates/starter/src/assets/icons/empty-tube.tsx +23 -23
  435. package/templates/starter/src/assets/icons/tube-plus.tsx +29 -29
  436. package/templates/starter/src/components/data-visualization/info-card.tsx +56 -70
  437. package/templates/starter/src/components/data-visualization/info-grid.tsx +22 -22
  438. package/templates/starter/src/components/diagram/add-node-prompt-node.tsx +1 -1
  439. package/templates/starter/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  440. package/templates/starter/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  441. package/templates/starter/src/components/diagram/dynamic-parameters.tsx +0 -1
  442. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  443. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  444. package/templates/starter/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  445. package/templates/starter/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  446. package/templates/starter/src/components/diagram/flow-diagram-node-search.tsx +73 -66
  447. package/templates/starter/src/components/diagram/flow-diagram-toolbar.tsx +35 -3
  448. package/templates/starter/src/components/diagram/flow-diagram-view.tsx +1 -7
  449. package/templates/starter/src/components/diagram/flow-diagram.test.tsx +225 -0
  450. package/templates/starter/src/components/diagram/flow-node-data-helpers.ts +1 -1
  451. package/templates/starter/src/components/diagram/node-form-fields-content.tsx +9 -2
  452. package/templates/starter/src/components/diagram/node-form-helpers.test.ts +3 -1
  453. package/templates/starter/src/components/diagram/node-form-helpers.ts +1 -4
  454. package/templates/starter/src/components/diagram/node-form-template-step-selection.ts +1 -4
  455. package/templates/starter/src/components/diagram/node-form.test.tsx +25 -0
  456. package/templates/starter/src/components/diagram/node-form.tsx +2 -12
  457. package/templates/starter/src/components/diagram/options-header-node.test.tsx +4 -1
  458. package/templates/starter/src/components/diagram/options-header-node.tsx +140 -130
  459. package/templates/starter/src/components/diagram/use-flow-diagram-search.ts +2 -0
  460. package/templates/starter/src/components/diagram/use-flow-diagram.ts +93 -1
  461. package/templates/starter/src/components/form/error-message.tsx +7 -7
  462. package/templates/starter/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  463. package/templates/starter/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  464. package/templates/starter/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  465. package/templates/starter/src/components/navigation/entity-search-command.tsx +3 -9
  466. package/templates/starter/src/components/navigation/nav-link.tsx +60 -60
  467. package/templates/starter/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  468. package/templates/starter/src/components/test-case/test-case-form-helpers.ts +1 -5
  469. package/templates/starter/src/components/test-case/test-case-picker-helpers.ts +8 -7
  470. package/templates/starter/src/components/test-case/test-case-picker.tsx +2 -6
  471. package/templates/starter/src/components/test-run/log-viewer.test.tsx +25 -0
  472. package/templates/starter/src/components/test-run/log-viewer.tsx +2 -2
  473. package/templates/starter/src/components/test-run/test-run-details-guards.ts +10 -1
  474. package/templates/starter/src/components/test-run/test-run-details.test.tsx +9 -19
  475. package/templates/starter/src/components/test-run/use-log-viewer.ts +2 -8
  476. package/templates/starter/src/components/test-run/use-test-run-header.ts +1 -4
  477. package/templates/starter/src/components/test-suite/test-suite-picker.tsx +1 -1
  478. package/templates/starter/src/components/theme/theme-provider.tsx +7 -1
  479. package/templates/starter/src/components/typography/page-header-subtitle.tsx +7 -7
  480. package/templates/starter/src/components/typography/page-header.tsx +7 -7
  481. package/templates/starter/src/components/ui/chart.tsx +2 -8
  482. package/templates/starter/src/components/ui/command.tsx +2 -5
  483. package/templates/starter/src/components/ui/data-table-column-header.tsx +3 -3
  484. package/templates/starter/src/components/ui/data-table.test.tsx +1 -8
  485. package/templates/starter/src/components/ui/dialog.tsx +1 -4
  486. package/templates/starter/src/components/ui/select.tsx +2 -2
  487. package/templates/starter/src/components/ui/separator.tsx +5 -1
  488. package/templates/starter/src/components/ui/skeleton.tsx +7 -7
  489. package/templates/starter/src/components/ui/table.tsx +1 -1
  490. package/templates/starter/src/components/ui/toaster.tsx +26 -26
  491. package/templates/starter/src/components/ui/tooltip.tsx +1 -1
  492. package/templates/starter/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  493. package/templates/starter/src/lib/appraise-test-case-metadata.test.ts +78 -0
  494. package/templates/starter/src/lib/appraise-test-case-metadata.ts +220 -0
  495. package/templates/starter/src/lib/automation/automation-path-roots.test.ts +14 -0
  496. package/templates/starter/src/lib/automation/automation-path-roots.ts +10 -2
  497. package/templates/starter/src/lib/database-sync.ts +166 -15
  498. package/templates/starter/src/lib/executor/local-executor-adapter.ts +6 -2
  499. package/templates/starter/src/lib/feature-file-generator.ts +54 -10
  500. package/templates/starter/src/lib/gherkin-parser.test.ts +52 -0
  501. package/templates/starter/src/lib/gherkin-parser.ts +39 -1
  502. package/templates/starter/src/lib/locator-group-file-utils.ts +5 -1
  503. package/templates/starter/src/lib/locator-picker/session-manager.ts +1 -2
  504. package/templates/starter/src/lib/metrics/metric-calculator.test.ts +105 -6
  505. package/templates/starter/src/lib/metrics/metric-calculator.ts +39 -40
  506. package/templates/starter/src/lib/sync/projected-feature-utils.ts +5 -1
  507. package/templates/starter/src/lib/sync/sync-executor.ts +1 -4
  508. package/templates/starter/src/lib/sync/sync-pending-counts.test.ts +316 -7
  509. package/templates/starter/src/lib/sync/sync-pending-counts.ts +189 -26
  510. package/templates/starter/src/lib/template-automation-paths.ts +1 -1
  511. package/templates/starter/src/lib/template-sync-utils.d.ts +14 -7
  512. package/templates/starter/src/lib/test-case-utils.ts +6 -6
  513. package/templates/starter/src/lib/test-run/log-formatter.ts +82 -83
  514. package/templates/starter/src/lib/test-run/report-parser.ts +352 -352
  515. package/templates/starter/src/lib/transformers/gherkin-converter.ts +42 -42
  516. package/templates/starter/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  517. package/templates/starter/src/lib/utils/node-param-validation.ts +81 -81
  518. package/templates/starter/src/lib/utils/template-step-file-generator.ts +5 -3
  519. package/templates/starter/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  520. package/templates/starter/src/services/dashboard/dashboard-service.test.ts +28 -1
  521. package/templates/starter/src/services/dashboard/dashboard-service.ts +2 -0
  522. package/templates/starter/src/services/locator/locator-service.test.ts +1 -3
  523. package/templates/starter/src/services/locator/locator-service.ts +3 -1
  524. package/templates/starter/src/services/locator/locator-sync-utils.test.ts +1 -4
  525. package/templates/starter/src/services/module/module-service.ts +1 -4
  526. package/templates/starter/src/services/report/report-service.test.ts +70 -6
  527. package/templates/starter/src/services/report/report-service.ts +52 -9
  528. package/templates/starter/src/services/shared/errors.ts +2 -4
  529. package/templates/starter/src/services/template-step/template-step-service.ts +3 -1
  530. package/templates/starter/src/services/template-step-group/template-step-group-service.ts +3 -1
  531. package/templates/starter/src/services/test-case/test-case-service.ts +0 -5
  532. package/templates/starter/src/services/test-run/test-run-service.test.ts +13 -6
  533. package/templates/starter/src/services/test-run/test-run-service.ts +53 -8
  534. package/templates/starter/src/services/test-suite/test-suite-service.test.ts +1 -5
  535. package/templates/starter/src/services/test-suite/test-suite-service.ts +2 -4
  536. package/templates/starter/src/types/form/actionHandler.ts +1 -5
  537. package/templates/starter/tsconfig.json +8 -8
  538. package/dist/cli.e2e.test.d.ts +0 -2
  539. package/dist/cli.e2e.test.d.ts.map +0 -1
  540. package/dist/cli.e2e.test.js +0 -73
  541. package/dist/cli.e2e.test.js.map +0 -1
  542. package/dist/config.test.d.ts +0 -2
  543. package/dist/config.test.d.ts.map +0 -1
  544. package/dist/config.test.js +0 -65
  545. package/dist/config.test.js.map +0 -1
  546. package/dist/copy-template.test.d.ts +0 -2
  547. package/dist/copy-template.test.d.ts.map +0 -1
  548. package/dist/copy-template.test.js +0 -71
  549. package/dist/copy-template.test.js.map +0 -1
  550. package/dist/download-repo.test.d.ts +0 -2
  551. package/dist/download-repo.test.d.ts.map +0 -1
  552. package/dist/download-repo.test.js +0 -14
  553. package/dist/download-repo.test.js.map +0 -1
  554. package/dist/install.test.d.ts +0 -2
  555. package/dist/install.test.d.ts.map +0 -1
  556. package/dist/install.test.js +0 -119
  557. package/dist/install.test.js.map +0 -1
  558. package/dist/prompts.test.d.ts +0 -2
  559. package/dist/prompts.test.d.ts.map +0 -1
  560. package/dist/prompts.test.js +0 -58
  561. package/dist/prompts.test.js.map +0 -1
  562. package/templates/default/next-env.d.ts +0 -6
  563. package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +0 -1
  564. package/templates/default/packages/locator-picker-companion/dist/cli.js +0 -302
  565. package/templates/default/packages/locator-picker-companion/dist/index.d.ts +0 -3
  566. package/templates/default/packages/locator-picker-companion/dist/index.js +0 -3
  567. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +0 -1
  568. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +0 -615
  569. package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +0 -11
  570. package/templates/default/packages/locator-picker-companion/dist/launcher.js +0 -59
  571. package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +0 -3
  572. package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +0 -257
  573. package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +0 -22
  574. package/templates/default/packages/locator-picker-companion/dist/session-file.js +0 -150
  575. package/templates/default/packages/locator-picker-companion/dist/types.d.ts +0 -31
  576. package/templates/default/packages/locator-picker-companion/dist/types.js +0 -1
  577. package/templates/default/prisma/dev.db +0 -0
@@ -248,55 +248,55 @@ async function deleteOrphanedModules(fsModulePaths: Set<string>, result: SyncRes
248
248
  * Generates and displays sync summary
249
249
  */
250
250
  async function main(): Promise<SyncResult> {
251
- console.log('🔄 Starting modules sync...')
252
- console.log('This will scan filesystem directories and sync module hierarchy to database.')
253
- console.log('Filesystem is the source of truth - modules in DB but not in FS will be deleted.\n')
251
+ console.log('🔄 Starting modules sync...')
252
+ console.log('This will scan filesystem directories and sync module hierarchy to database.')
253
+ console.log('Filesystem is the source of truth - modules in DB but not in FS will be deleted.\n')
254
254
 
255
- const baseDir = process.cwd()
255
+ const baseDir = process.cwd()
256
256
 
257
- // Scan directories
258
- console.log('📁 Scanning automation/locators...')
259
- const locatorModulePaths = await scanLocatorDirectories(baseDir)
260
- console.log(` Found ${locatorModulePaths.length} module path(s): ${locatorModulePaths.join(', ') || 'none'}`)
257
+ // Scan directories
258
+ console.log('📁 Scanning automation/locators...')
259
+ const locatorModulePaths = await scanLocatorDirectories(baseDir)
260
+ console.log(` Found ${locatorModulePaths.length} module path(s): ${locatorModulePaths.join(', ') || 'none'}`)
261
261
 
262
- console.log('\n📁 Scanning automation/features...')
263
- const featureModulePaths = await scanFeatureDirectories(baseDir)
264
- console.log(` Found ${featureModulePaths.length} module path(s): ${featureModulePaths.join(', ') || 'none'}`)
262
+ console.log('\n📁 Scanning automation/features...')
263
+ const featureModulePaths = await scanFeatureDirectories(baseDir)
264
+ console.log(` Found ${featureModulePaths.length} module path(s): ${featureModulePaths.join(', ') || 'none'}`)
265
265
 
266
- // Combine and deduplicate
267
- const allModulePaths = Array.from(new Set([...locatorModulePaths, ...featureModulePaths]))
268
- console.log(`\n🔍 Building module hierarchy from ${allModulePaths.length} unique module path(s)...`)
266
+ // Combine and deduplicate
267
+ const allModulePaths = Array.from(new Set([...locatorModulePaths, ...featureModulePaths]))
268
+ console.log(`\n🔍 Building module hierarchy from ${allModulePaths.length} unique module path(s)...`)
269
269
 
270
- // Build module tree
271
- const moduleTree = buildModuleTree(allModulePaths)
270
+ // Build module tree
271
+ const moduleTree = buildModuleTree(allModulePaths)
272
272
 
273
- // Sync to database (create missing modules)
274
- console.log('\n✅ Syncing modules to database...')
275
- const result = await syncModulesToDatabase(moduleTree)
273
+ // Sync to database (create missing modules)
274
+ console.log('\n✅ Syncing modules to database...')
275
+ const result = await syncModulesToDatabase(moduleTree)
276
276
 
277
- // Delete orphaned modules (modules in DB but not in FS)
278
- const fsModulePathsSet = new Set(allModulePaths)
279
- // Also add all parent paths from the tree
280
- for (const path of moduleTree.keys()) {
281
- fsModulePathsSet.add(path)
282
- }
283
- await deleteOrphanedModules(fsModulePathsSet, result)
284
-
285
- printSyncSummary(
286
- [
287
- { label: '📁 Modules scanned', value: result.modulesScanned },
288
- { label: '✅ Modules existing', value: result.modulesExisting },
289
- { label: '➕ Modules created', value: result.modulesCreated },
290
- { label: '🗑️ Modules deleted', value: result.modulesDeleted },
291
- { label: '❌ Errors', value: result.errors.length },
292
- ],
293
- [
294
- { title: 'Created modules', items: result.createdModules },
295
- { title: 'Deleted modules', items: result.deletedModules },
296
- { title: 'Errors', items: result.errors },
297
- ],
298
- )
299
- return result
277
+ // Delete orphaned modules (modules in DB but not in FS)
278
+ const fsModulePathsSet = new Set(allModulePaths)
279
+ // Also add all parent paths from the tree
280
+ for (const path of moduleTree.keys()) {
281
+ fsModulePathsSet.add(path)
282
+ }
283
+ await deleteOrphanedModules(fsModulePathsSet, result)
284
+
285
+ printSyncSummary(
286
+ [
287
+ { label: '📁 Modules scanned', value: result.modulesScanned },
288
+ { label: '✅ Modules existing', value: result.modulesExisting },
289
+ { label: '➕ Modules created', value: result.modulesCreated },
290
+ { label: '🗑️ Modules deleted', value: result.modulesDeleted },
291
+ { label: '❌ Errors', value: result.errors.length },
292
+ ],
293
+ [
294
+ { title: 'Created modules', items: result.createdModules },
295
+ { title: 'Deleted modules', items: result.deletedModules },
296
+ { title: 'Errors', items: result.errors },
297
+ ],
298
+ )
299
+ return result
300
300
  }
301
301
 
302
302
  runSyncScript(main)
@@ -191,65 +191,65 @@ async function syncTagsToDatabase(tagObjects: TagData[]): Promise<SyncResult> {
191
191
  * Generates and displays sync summary
192
192
  */
193
193
  async function main(): Promise<SyncResult | void> {
194
- console.log('🔄 Starting tags sync...')
195
- console.log('This will scan feature files and sync tags to database.')
196
- console.log('Filesystem is the source of truth - tags in DB but not in FS will be deleted.\n')
194
+ console.log('🔄 Starting tags sync...')
195
+ console.log('This will scan feature files and sync tags to database.')
196
+ console.log('Filesystem is the source of truth - tags in DB but not in FS will be deleted.\n')
197
197
 
198
- const baseDir = process.cwd()
199
- const featuresDir = join(baseDir, 'automation', 'features')
198
+ const baseDir = process.cwd()
199
+ const featuresDir = join(baseDir, 'automation', 'features')
200
200
 
201
- // Scan feature files
202
- console.log('📁 Scanning feature files in automation/features...')
203
- const parsedFeatures = await scanFeatureFiles(featuresDir)
204
- console.log(` Found ${parsedFeatures.length} feature file(s)`)
201
+ // Scan feature files
202
+ console.log('📁 Scanning feature files in automation/features...')
203
+ const parsedFeatures = await scanFeatureFiles(featuresDir)
204
+ console.log(` Found ${parsedFeatures.length} feature file(s)`)
205
205
 
206
- if (parsedFeatures.length === 0) {
207
- console.log('\n⚠️ No feature files found. Nothing to sync.')
208
- return
209
- }
206
+ if (parsedFeatures.length === 0) {
207
+ console.log('\n⚠️ No feature files found. Nothing to sync.')
208
+ return
209
+ }
210
210
 
211
- // Extract unique tags
212
- console.log('\n🔍 Extracting unique tags from feature files...')
213
- const uniqueTagExpressions = extractUniqueTags(parsedFeatures)
214
- console.log(` Found ${uniqueTagExpressions.size} unique tag(s)`)
211
+ // Extract unique tags
212
+ console.log('\n🔍 Extracting unique tags from feature files...')
213
+ const uniqueTagExpressions = extractUniqueTags(parsedFeatures)
214
+ console.log(` Found ${uniqueTagExpressions.size} unique tag(s)`)
215
215
 
216
- if (uniqueTagExpressions.size === 0) {
217
- console.log('\n⚠️ No tags found in feature files. Nothing to sync.')
218
- return
219
- }
216
+ if (uniqueTagExpressions.size === 0) {
217
+ console.log('\n⚠️ No tags found in feature files. Nothing to sync.')
218
+ return
219
+ }
220
220
 
221
- // Build tag objects
222
- console.log('\n🔨 Building tag objects...')
223
- const tagObjects = buildTagObjects(uniqueTagExpressions)
224
- console.log(` Built ${tagObjects.length} tag object(s)`)
221
+ // Build tag objects
222
+ console.log('\n🔨 Building tag objects...')
223
+ const tagObjects = buildTagObjects(uniqueTagExpressions)
224
+ console.log(` Built ${tagObjects.length} tag object(s)`)
225
225
 
226
- // Log tag details
227
- console.log('\n Tag details:')
228
- for (const tag of tagObjects) {
229
- console.log(` - ${tag.tagExpression} → name: '${tag.name}', type: ${tag.type}`)
230
- }
226
+ // Log tag details
227
+ console.log('\n Tag details:')
228
+ for (const tag of tagObjects) {
229
+ console.log(` - ${tag.tagExpression} → name: '${tag.name}', type: ${tag.type}`)
230
+ }
231
231
 
232
- // Sync to database
233
- const result = await syncTagsToDatabase(tagObjects)
234
-
235
- printSyncSummary(
236
- [
237
- { label: '📁 Tags scanned', value: result.tagsScanned },
238
- { label: '✅ Tags existing', value: result.tagsExisting },
239
- { label: '➕ Tags created', value: result.tagsCreated },
240
- { label: '🔄 Tags updated', value: result.tagsUpdated },
241
- { label: '🗑️ Tags deleted', value: result.tagsDeleted },
242
- { label: '❌ Errors', value: result.errors.length },
243
- ],
244
- [
245
- { title: 'Updated tags', items: result.updatedTags },
246
- { title: 'Created tags', items: result.createdTags },
247
- { title: 'Deleted tags', items: result.deletedTags },
248
- { title: 'Errors', items: result.errors },
249
- ],
250
- )
251
-
252
- return result
232
+ // Sync to database
233
+ const result = await syncTagsToDatabase(tagObjects)
234
+
235
+ printSyncSummary(
236
+ [
237
+ { label: '📁 Tags scanned', value: result.tagsScanned },
238
+ { label: '✅ Tags existing', value: result.tagsExisting },
239
+ { label: '➕ Tags created', value: result.tagsCreated },
240
+ { label: '🔄 Tags updated', value: result.tagsUpdated },
241
+ { label: '🗑️ Tags deleted', value: result.tagsDeleted },
242
+ { label: '❌ Errors', value: result.errors.length },
243
+ ],
244
+ [
245
+ { title: 'Updated tags', items: result.updatedTags },
246
+ { title: 'Created tags', items: result.createdTags },
247
+ { title: 'Deleted tags', items: result.deletedTags },
248
+ { title: 'Errors', items: result.errors },
249
+ ],
250
+ )
251
+
252
+ return result
253
253
  }
254
254
 
255
255
  runSyncScript(main)
@@ -206,42 +206,44 @@ async function syncStepGroupsToDatabase(stepGroups: StepGroupData[]): Promise<Sy
206
206
  * Generates and displays sync summary
207
207
  */
208
208
  async function main(): Promise<SyncResult> {
209
- console.log('🔄 Starting template step group sync...')
210
- console.log('This will scan step definition files and sync step groups to database.\n')
209
+ console.log('🔄 Starting template step group sync...')
210
+ console.log('This will scan step definition files and sync step groups to database.\n')
211
211
 
212
- const baseDir = process.cwd()
212
+ const baseDir = process.cwd()
213
213
 
214
- // Read step groups from files
215
- console.log('📁 Scanning step definition files...')
216
- const stepGroups = await readStepGroupsFromFiles(baseDir)
217
- console.log(` Found ${stepGroups.length} step group(s) with valid JSDoc`)
214
+ // Read step groups from files
215
+ console.log('📁 Scanning step definition files...')
216
+ const stepGroups = await readStepGroupsFromFiles(baseDir)
217
+ console.log(` Found ${stepGroups.length} step group(s) with valid JSDoc`)
218
218
 
219
- if (stepGroups.length === 0) {
220
- console.log('\n⚠️ No step groups found. Continuing so the database can be reconciled with an empty filesystem state.')
221
- }
222
-
223
- // Sync to database
224
- console.log('\n✅ Syncing step groups to database...')
225
- const result = await syncStepGroupsToDatabase(stepGroups)
226
-
227
- printSyncSummary(
228
- [
229
- { label: '📁 Step groups scanned', value: result.groupsScanned },
230
- { label: '✅ Step groups existing', value: result.groupsExisting },
231
- { label: '➕ Step groups created', value: result.groupsCreated },
232
- { label: '🗑️ Step groups deleted', value: result.groupsDeleted },
233
- { label: '⚠️ Step groups skipped', value: result.groupsSkipped },
234
- { label: '❌ Errors', value: result.errors.length },
235
- ],
236
- [
237
- { title: 'Created step groups', items: result.createdGroups },
238
- { title: 'Existing step groups', items: result.existingGroups },
239
- { title: 'Deleted step groups', items: result.deletedGroups },
240
- { title: 'Skipped step groups (have template steps)', items: result.skippedGroups },
241
- { title: 'Errors', items: result.errors },
242
- ],
219
+ if (stepGroups.length === 0) {
220
+ console.log(
221
+ '\n⚠️ No step groups found. Continuing so the database can be reconciled with an empty filesystem state.',
243
222
  )
244
- return result
223
+ }
224
+
225
+ // Sync to database
226
+ console.log('\n✅ Syncing step groups to database...')
227
+ const result = await syncStepGroupsToDatabase(stepGroups)
228
+
229
+ printSyncSummary(
230
+ [
231
+ { label: '📁 Step groups scanned', value: result.groupsScanned },
232
+ { label: '✅ Step groups existing', value: result.groupsExisting },
233
+ { label: '➕ Step groups created', value: result.groupsCreated },
234
+ { label: '🗑️ Step groups deleted', value: result.groupsDeleted },
235
+ { label: '⚠️ Step groups skipped', value: result.groupsSkipped },
236
+ { label: '❌ Errors', value: result.errors.length },
237
+ ],
238
+ [
239
+ { title: 'Created step groups', items: result.createdGroups },
240
+ { title: 'Existing step groups', items: result.existingGroups },
241
+ { title: 'Deleted step groups', items: result.deletedGroups },
242
+ { title: 'Skipped step groups (have template steps)', items: result.skippedGroups },
243
+ { title: 'Errors', items: result.errors },
244
+ ],
245
+ )
246
+ return result
245
247
  }
246
248
 
247
249
  runSyncScript(main)
@@ -267,120 +267,120 @@ async function syncStepsToDatabase(
267
267
  * Generates and displays sync summary
268
268
  */
269
269
  async function main(): Promise<SyncResult | void> {
270
- console.log('🔄 Starting template step sync...')
271
- console.log('This will scan step definition files and sync template steps to database.')
272
- console.log('Filesystem is the source of truth - steps in DB but not in FS will be deleted.\n')
270
+ console.log('🔄 Starting template step sync...')
271
+ console.log('This will scan step definition files and sync template steps to database.')
272
+ console.log('Filesystem is the source of truth - steps in DB but not in FS will be deleted.\n')
273
273
 
274
- const baseDir = process.cwd()
274
+ const baseDir = process.cwd()
275
275
 
276
- // Scan step files
277
- console.log('📁 Scanning step definition files...')
278
- const stepFiles = await scanStepFiles(baseDir)
279
- console.log(` Found ${stepFiles.length} step file(s)`)
276
+ // Scan step files
277
+ console.log('📁 Scanning step definition files...')
278
+ const stepFiles = await scanStepFiles(baseDir)
279
+ console.log(` Found ${stepFiles.length} step file(s)`)
280
280
 
281
- if (stepFiles.length === 0) {
282
- console.log('\n⚠️ No step files found. Nothing to sync.')
283
- return
284
- }
285
-
286
- // Parse all files
287
- console.log('\n📖 Parsing step files...')
288
- const allSteps: Array<{ step: ParsedStep; groupName: string; filePath: string }> = []
289
- const errors: string[] = []
281
+ if (stepFiles.length === 0) {
282
+ console.log('\n⚠️ No step files found. Nothing to sync.')
283
+ return
284
+ }
290
285
 
291
- for (const file of stepFiles) {
292
- try {
293
- const filePath = join(baseDir, file)
294
- const content = await fs.readFile(filePath, 'utf-8')
295
- const stepData = parseStepFile(content, file)
296
-
297
- if (!stepData) {
298
- errors.push(`File '${file}' does not have a valid group JSDoc comment`)
299
- console.log(` ⚠️ Skipped '${file}' (no group JSDoc)`)
300
- continue
301
- }
286
+ // Parse all files
287
+ console.log('\n📖 Parsing step files...')
288
+ const allSteps: Array<{ step: ParsedStep; groupName: string; filePath: string }> = []
289
+ const errors: string[] = []
302
290
 
303
- if (stepData.steps.length === 0) {
304
- console.log(` ⚠️ No steps found in '${file}'`)
305
- continue
306
- }
291
+ for (const file of stepFiles) {
292
+ try {
293
+ const filePath = join(baseDir, file)
294
+ const content = await fs.readFile(filePath, 'utf-8')
295
+ const stepData = parseStepFile(content, file)
307
296
 
308
- console.log(` ✓ Parsed '${file}' (${stepData.steps.length} step(s))`)
297
+ if (!stepData) {
298
+ errors.push(`File '${file}' does not have a valid group JSDoc comment`)
299
+ console.log(` ⚠️ Skipped '${file}' (no group JSDoc)`)
300
+ continue
301
+ }
309
302
 
310
- for (const step of stepData.steps) {
311
- allSteps.push({
312
- step,
313
- groupName: stepData.group.name,
314
- filePath: file,
315
- })
316
- }
317
- } catch (error) {
318
- const errorMsg = `Error parsing file '${file}': ${error}`
319
- errors.push(errorMsg)
320
- console.error(` ❌ ${errorMsg}`)
303
+ if (stepData.steps.length === 0) {
304
+ console.log(` ⚠️ No steps found in '${file}'`)
305
+ continue
321
306
  }
322
- }
323
307
 
324
- if (errors.length > 0 && allSteps.length === 0) {
325
- console.log('\n⚠️ No valid steps found. Please check the errors above.')
326
- process.exit(1)
327
- }
308
+ console.log(` ✓ Parsed '${file}' (${stepData.steps.length} step(s))`)
328
309
 
329
- // Check for duplicate signatures
330
- const signatureMap = new Map<string, string[]>()
331
- for (const { step, filePath } of allSteps) {
332
- if (!signatureMap.has(step.signature)) {
333
- signatureMap.set(step.signature, [])
310
+ for (const step of stepData.steps) {
311
+ allSteps.push({
312
+ step,
313
+ groupName: stepData.group.name,
314
+ filePath: file,
315
+ })
334
316
  }
335
- signatureMap.get(step.signature)!.push(filePath)
317
+ } catch (error) {
318
+ const errorMsg = `Error parsing file '${file}': ${error}`
319
+ errors.push(errorMsg)
320
+ console.error(` ❌ ${errorMsg}`)
336
321
  }
322
+ }
337
323
 
338
- for (const [signature, files] of signatureMap.entries()) {
339
- if (files.length > 1) {
340
- const errorMsg = `Duplicate signature found: "${signature}" in files: ${files.join(', ')}`
341
- errors.push(errorMsg)
342
- console.error(` ❌ ${errorMsg}`)
343
- }
324
+ if (errors.length > 0 && allSteps.length === 0) {
325
+ console.log('\n⚠️ No valid steps found. Please check the errors above.')
326
+ process.exit(1)
327
+ }
328
+
329
+ // Check for duplicate signatures
330
+ const signatureMap = new Map<string, string[]>()
331
+ for (const { step, filePath } of allSteps) {
332
+ if (!signatureMap.has(step.signature)) {
333
+ signatureMap.set(step.signature, [])
344
334
  }
335
+ signatureMap.get(step.signature)!.push(filePath)
336
+ }
345
337
 
346
- if (errors.length > 0 && allSteps.length === 0) {
347
- console.log('\n⚠️ Cannot proceed due to errors. Please fix the issues above.')
348
- process.exit(1)
338
+ for (const [signature, files] of signatureMap.entries()) {
339
+ if (files.length > 1) {
340
+ const errorMsg = `Duplicate signature found: "${signature}" in files: ${files.join(', ')}`
341
+ errors.push(errorMsg)
342
+ console.error(` ❌ ${errorMsg}`)
349
343
  }
344
+ }
350
345
 
351
- // Sync to database
352
- console.log('\n Syncing template steps to database...')
353
- const result = await syncStepsToDatabase(allSteps)
354
-
355
- // Add parsing errors to result
356
- result.errors.push(...errors)
357
-
358
- printSyncSummary(
359
- [
360
- { label: '📁 Steps scanned', value: result.stepsScanned },
361
- { label: '✅ Steps existing', value: result.stepsExisting },
362
- { label: '➕ Steps created', value: result.stepsCreated },
363
- { label: '🔄 Steps updated', value: result.stepsUpdated },
364
- { label: '🗑️ Steps deleted', value: result.stepsDeleted },
365
- { label: ' Errors', value: result.errors.length },
366
- ],
367
- [
368
- {
369
- title: 'Created steps',
370
- items: result.createdSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
371
- },
372
- {
373
- title: 'Updated steps',
374
- items: result.updatedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
375
- },
376
- {
377
- title: 'Deleted steps',
378
- items: result.deletedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
379
- },
380
- { title: 'Errors', items: result.errors },
381
- ],
382
- )
383
- return result
346
+ if (errors.length > 0 && allSteps.length === 0) {
347
+ console.log('\n⚠️ Cannot proceed due to errors. Please fix the issues above.')
348
+ process.exit(1)
349
+ }
350
+
351
+ // Sync to database
352
+ console.log('\n✅ Syncing template steps to database...')
353
+ const result = await syncStepsToDatabase(allSteps)
354
+
355
+ // Add parsing errors to result
356
+ result.errors.push(...errors)
357
+
358
+ printSyncSummary(
359
+ [
360
+ { label: '📁 Steps scanned', value: result.stepsScanned },
361
+ { label: '✅ Steps existing', value: result.stepsExisting },
362
+ { label: '➕ Steps created', value: result.stepsCreated },
363
+ { label: '🔄 Steps updated', value: result.stepsUpdated },
364
+ { label: '🗑️ Steps deleted', value: result.stepsDeleted },
365
+ { label: '❌ Errors', value: result.errors.length },
366
+ ],
367
+ [
368
+ {
369
+ title: 'Created steps',
370
+ items: result.createdSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
371
+ },
372
+ {
373
+ title: 'Updated steps',
374
+ items: result.updatedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
375
+ },
376
+ {
377
+ title: 'Deleted steps',
378
+ items: result.deletedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
379
+ },
380
+ { title: 'Errors', items: result.errors },
381
+ ],
382
+ )
383
+ return result
384
384
  }
385
385
 
386
386
  runSyncScript(main)