synapse-hub 2.2.4 → 2.4.1

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 (312) hide show
  1. package/.agents/agents/failure-analyst.md +11 -0
  2. package/.agents/agents/live-explorer.md +28 -0
  3. package/.agents/agents/orchestrator.md +23 -4
  4. package/.agents/agents/pom-crafter.md +15 -0
  5. package/.agents/agents/quality-gatekeeper.md +20 -4
  6. package/.agents/agents/test-runner.md +12 -0
  7. package/.agents/rules/communication-style.md +40 -0
  8. package/.agents/rules/context-engineering.md +23 -0
  9. package/.agents/rules/git-push-protocol.md +10 -16
  10. package/.agents/rules/graphify.md +14 -14
  11. package/.agents/rules/mandatory-playwright-live.md +29 -29
  12. package/.agents/rules/mobile_appium_rules.md +132 -0
  13. package/.agents/rules/performance_testing_rules.md +74 -0
  14. package/.agents/rules/systematic-debugging.md +6 -6
  15. package/.agents/skills/agent-orchestration-multi-agent-optimize/SKILL.md +64 -215
  16. package/.agents/skills/agent-orchestration-multi-agent-optimize/examples/swarm_workload_config.json +12 -0
  17. package/.agents/skills/antigravity-test-sentinel/SKILL.md +3 -3
  18. package/.agents/skills/antigravity-test-sentinel/examples/dod_gate_policy.json +11 -0
  19. package/.agents/skills/api-network-mocking-interception/SKILL.md +1 -1
  20. package/.agents/skills/api-network-mocking-interception/examples/network_route_stub.json +9 -0
  21. package/.agents/skills/api-spec-to-e2e-matrix/SKILL.md +9 -9
  22. package/.agents/skills/api-spec-to-e2e-matrix/examples/sample_openapi.json +19 -0
  23. package/.agents/skills/architecture-decision-records/SKILL.md +35 -412
  24. package/.agents/skills/architecture-decision-records/examples/0001-record-architecture-decisions.md +12 -0
  25. package/.agents/skills/auth-session-and-cookie-manager/SKILL.md +1 -1
  26. package/.agents/skills/auth-session-and-cookie-manager/examples/storage_state_sample.json +11 -0
  27. package/.agents/skills/backend-load-and-stress-patterns/SKILL.md +80 -186
  28. package/.agents/skills/backend-load-and-stress-patterns/examples/k6_load_test_sample.js +13 -0
  29. package/.agents/skills/bats-testing-patterns/SKILL.md +1 -1
  30. package/.agents/skills/bats-testing-patterns/examples/cli_runner_test.bats +6 -0
  31. package/.agents/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -614
  32. package/.agents/skills/clean-pom-crafter/SKILL.md +21 -3
  33. package/.agents/skills/clean-pom-crafter/examples/standard_test_case.groovy +28 -28
  34. package/.agents/skills/clean-pom-crafter/references/pom_patterns.groovy +138 -138
  35. package/.agents/skills/code-refactoring-refactor-clean/SKILL.md +2 -2
  36. package/.agents/skills/code-refactoring-refactor-clean/examples/refactored_page_sample.groovy +9 -0
  37. package/.agents/skills/db-state-verifier-and-seeder/SKILL.md +5 -5
  38. package/.agents/skills/db-state-verifier-and-seeder/examples/db_fixture_seed.json +12 -0
  39. package/.agents/skills/e2e-testing-patterns/SKILL.md +1 -1
  40. package/.agents/skills/e2e-testing-patterns/examples/playwright_sharded_config.ts +12 -0
  41. package/.agents/skills/e2e-testing-patterns/resources/implementation-playbook.md +522 -522
  42. package/.agents/skills/failure-autopsy-and-healing/SKILL.md +17 -3
  43. package/.agents/skills/failure-autopsy-and-healing/examples/sample_junit_failure.xml +8 -0
  44. package/.agents/skills/failure-autopsy-and-healing/references/healing_matrix.md +64 -64
  45. package/.agents/skills/failure-autopsy-and-healing/references/qa_investigation_protocol.md +56 -56
  46. package/.agents/skills/failure-autopsy-and-healing/scripts/triage_failures.sh +98 -98
  47. package/.agents/skills/file-and-report-validator/SKILL.md +1 -1
  48. package/.agents/skills/file-and-report-validator/examples/sample_export_schema.json +14 -0
  49. package/.agents/skills/flaky-test-sentinel-and-quarantine/SKILL.md +3 -3
  50. package/.agents/skills/flaky-test-sentinel-and-quarantine/examples/quarantine_registry.json +11 -0
  51. package/.agents/skills/gherkin-to-suite/SKILL.md +103 -0
  52. package/.agents/skills/gherkin-to-suite/examples/checkout.feature +39 -0
  53. package/.agents/skills/gherkin-to-suite/examples/suite_report_sample.json +334 -0
  54. package/.agents/skills/github-actions-templates/SKILL.md +47 -304
  55. package/.agents/skills/github-actions-templates/examples/matrix_test_pipeline.yml +8 -0
  56. package/.agents/skills/graphify-impact-analyzer/SKILL.md +6 -6
  57. package/.agents/skills/graphify-impact-analyzer/examples/dependency_blast_radius.json +8 -0
  58. package/.agents/skills/katalon-cli-runner/SKILL.md +2 -2
  59. package/.agents/skills/katalon-cli-runner/examples/headless_kre_exec.sh +3 -0
  60. package/.agents/skills/katalon-cli-runner/references/groovy-patterns.md +209 -209
  61. package/.agents/skills/katalon-cli-runner/references/katalon-api.md +155 -155
  62. package/.agents/skills/katalon-cli-runner/references/runner_commands.md +67 -67
  63. package/.agents/skills/lam-script-generator/SKILL.md +42 -1
  64. package/.agents/skills/lam-script-generator/examples/user_story_sample.md +8 -0
  65. package/.agents/skills/lean-code-ladder/SKILL.md +83 -0
  66. package/.agents/skills/lean-code-ladder/examples/ladder_walkthrough.md +37 -0
  67. package/.agents/skills/meta-prompt-crafter/SKILL.md +107 -0
  68. package/.agents/skills/meta-prompt-crafter/examples/qa_prompt_template.md +35 -0
  69. package/.agents/skills/persistent-planning-files/SKILL.md +108 -0
  70. package/.agents/skills/persistent-planning-files/examples/task_plan_example.md +56 -0
  71. package/.agents/skills/playwright-live-interaction/SKILL.md +49 -1
  72. package/.agents/skills/playwright-live-interaction/examples/live_probe_script.js +5 -0
  73. package/.agents/skills/playwright-live-interaction/references/advanced_superpowers.md +160 -160
  74. package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md +75 -75
  75. package/.agents/skills/playwright-live-interaction/references/recipes.md +388 -388
  76. package/.agents/skills/playwright-live-interaction/references/swarm_orchestration.md +134 -134
  77. package/.agents/skills/playwright-webapp-testing/SKILL.md +93 -0
  78. package/.agents/skills/playwright-webapp-testing/examples/server_lifecycle_playwright.py +63 -0
  79. package/.agents/skills/rbt-manual-testing/SKILL.md +150 -0
  80. package/.agents/skills/rbt-manual-testing/examples/checkout_rbt_manual_suite.md +25 -0
  81. package/.agents/skills/security-dast-sentinel/SKILL.md +54 -135
  82. package/.agents/skills/security-dast-sentinel/examples/dast_scan_config.json +10 -0
  83. package/.agents/skills/self-healing-locator/SKILL.md +24 -10
  84. package/.agents/skills/self-healing-locator/examples/aom_diff_sample.json +16 -0
  85. package/.agents/skills/skillspector-security-guard/SKILL.md +32 -90
  86. package/.agents/skills/skillspector-security-guard/examples/safe_mcp_config.json +12 -0
  87. package/.agents/skills/surgical-coding-principles/SKILL.md +89 -0
  88. package/.agents/skills/surgical-coding-principles/examples/surgical_vs_scope_creep.md +46 -0
  89. package/.agents/skills/synthetic-test-data-generator/SKILL.md +3 -3
  90. package/.agents/skills/synthetic-test-data-generator/examples/idempotent_data_recipe.json +9 -0
  91. package/.agents/skills/systematic-debugging/SKILL.md +100 -0
  92. package/.agents/skills/systematic-debugging/examples/four_phase_case.md +44 -0
  93. package/.agents/skills/test-driven-development/SKILL.md +114 -0
  94. package/.agents/skills/test-driven-development/examples/red_green_refactor_qa.md +78 -0
  95. package/.agents/skills/token-and-context-optimizer/SKILL.md +1 -1
  96. package/.agents/skills/token-and-context-optimizer/examples/distilled_log_sample.txt +3 -0
  97. package/.agents/skills/verification-before-completion/SKILL.md +100 -0
  98. package/.agents/skills/verification-before-completion/examples/evidence_log_example.md +46 -0
  99. package/.agents/skills/visual-regression-sentinel/SKILL.md +21 -1
  100. package/.agents/skills/visual-regression-sentinel/examples/visual_mask_rules.json +9 -0
  101. package/.agents/skills/wcag-audit-patterns/SKILL.md +3 -3
  102. package/.agents/skills/wcag-audit-patterns/examples/wcag_compliance_checklist.json +10 -0
  103. package/.agents/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -541
  104. package/.agents/skills/web-vitals-and-performance-profiler/SKILL.md +1 -1
  105. package/.agents/skills/web-vitals-and-performance-profiler/examples/cwv_budget_policy.json +6 -0
  106. package/.agents/templates/completion_report.md +57 -57
  107. package/.agents/workflows/analyze_requirement_document.md +18 -0
  108. package/.agents/workflows/export_testcases_excel.md +32 -0
  109. package/.agents/workflows/generate_combinatorial_test_data.md +28 -0
  110. package/.agents/workflows/generate_cross_module_test_plan.md +37 -0
  111. package/.agents/workflows/generate_manual_testcases_rbt.md +56 -0
  112. package/.agents/workflows/generate_requirements_from_website.md +25 -0
  113. package/.agents/workflows/generate_testcases_from_requirements.md +21 -0
  114. package/.agents/workflows/graphify.md +10 -10
  115. package/.agents/workflows/verify.md +2 -2
  116. package/.cursor/rules/language.mdc +7 -7
  117. package/.cursor/rules/synapse-qa.mdc +23 -0
  118. package/.cursorrules +7 -0
  119. package/.pre-commit-hooks.yaml +14 -0
  120. package/.windsurfrules +7 -0
  121. package/AGENTS.md +54 -15
  122. package/CLAUDE.md +35 -12
  123. package/LICENSE +30 -0
  124. package/NOTICE +180 -0
  125. package/README.en.md +331 -0
  126. package/README.md +252 -515
  127. package/action.yml +51 -0
  128. package/benchmarks/qa_eval/README.md +71 -0
  129. package/benchmarks/qa_eval/build_dataset.py +677 -0
  130. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-06_api_contract_drift.json +22 -0
  131. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-07_api_contract_drift.json +22 -0
  132. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-08_api_contract_drift.json +22 -0
  133. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-09_api_contract_drift.json +22 -0
  134. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-10_api_contract_drift.json +22 -0
  135. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-21_fake_pass_tautology.json +21 -0
  136. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-22_fake_pass_tautology.json +21 -0
  137. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-23_fake_pass_tautology.json +21 -0
  138. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-24_fake_pass_tautology.json +21 -0
  139. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-25_fake_pass_tautology.json +21 -0
  140. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-01_locator_drift.json +23 -0
  141. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-02_locator_drift.json +23 -0
  142. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-03_locator_drift.json +23 -0
  143. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-04_locator_drift.json +23 -0
  144. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-05_locator_drift.json +23 -0
  145. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-16_stale_and_mutation.json +22 -0
  146. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-17_stale_and_mutation.json +22 -0
  147. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-18_stale_and_mutation.json +22 -0
  148. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-19_stale_and_mutation.json +22 -0
  149. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-20_stale_and_mutation.json +23 -0
  150. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-11_timing_and_race.json +22 -0
  151. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-12_timing_and_race.json +22 -0
  152. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-13_timing_and_race.json +22 -0
  153. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-14_timing_and_race.json +22 -0
  154. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-15_timing_and_race.json +22 -0
  155. package/benchmarks/qa_eval/eval_runner.py +418 -0
  156. package/benchmarks/qa_eval/reports/AB_METHODOLOGY_REPORT.md +83 -0
  157. package/benchmarks/qa_eval/reports/BENCHMARK_REPORT.md +69 -0
  158. package/benchmarks/qa_eval/reports/eval_results.json +105 -0
  159. package/bin/agent-qa.js +16 -4
  160. package/docs/ARCHITECTURE.md +107 -0
  161. package/docs/CI_CD_INTEGRATION.md +94 -0
  162. package/docs/CLI_REFERENCE.md +157 -0
  163. package/docs/CONTRIBUTING.md +91 -0
  164. package/docs/PLUGIN_DEVELOPMENT_GUIDE.md +126 -0
  165. package/docs/TOKEN_QUOTA_PLAYBOOK.md +41 -0
  166. package/docs/adopted-ecosystem-tools.md +87 -0
  167. package/docs/schemas/synapse.config.schema.json +64 -0
  168. package/examples/cypress-ecommerce-suite/README.md +45 -0
  169. package/examples/cypress-ecommerce-suite/cypress/e2e/checkout.cy.js +17 -0
  170. package/examples/cypress-ecommerce-suite/cypress/pages/BasePage.js +29 -0
  171. package/examples/cypress-ecommerce-suite/cypress/pages/CartPage.js +51 -0
  172. package/examples/cypress-ecommerce-suite/cypress.config.js +13 -0
  173. package/examples/cypress-ecommerce-suite/package.json +13 -0
  174. package/examples/katalon-suite/Keywords/pages/BasePage.groovy +19 -0
  175. package/examples/katalon-suite/Keywords/pages/DashboardPage.groovy +29 -0
  176. package/examples/katalon-suite/Keywords/pages/LoginPage.groovy +45 -0
  177. package/examples/katalon-suite/Profiles/default.glbl +12 -0
  178. package/examples/katalon-suite/README.md +18 -0
  179. package/examples/katalon-suite/Scripts/Auth/TC_LoginSuccess/Script1234567890.groovy +12 -0
  180. package/examples/katalon-suite/Scripts/Dashboard/TC_ViewSummary/Script1234567891.groovy +15 -0
  181. package/examples/katalon-suite/katalon_suite.prj +21 -0
  182. package/examples/playwright-crm-suite/README.md +40 -0
  183. package/examples/playwright-crm-suite/package.json +14 -0
  184. package/examples/playwright-crm-suite/pages/BasePage.ts +37 -0
  185. package/examples/playwright-crm-suite/pages/CustomerPage.ts +57 -0
  186. package/examples/playwright-crm-suite/pages/LoginPage.ts +32 -0
  187. package/examples/playwright-crm-suite/playwright.config.ts +27 -0
  188. package/examples/playwright-crm-suite/tests/auth.spec.ts +22 -0
  189. package/examples/playwright-crm-suite/tests/customers.spec.ts +33 -0
  190. package/examples/plugins/sample-custom-plugin/README.md +14 -0
  191. package/examples/plugins/sample-custom-plugin/plugin.json +16 -0
  192. package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/SKILL.md +29 -0
  193. package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/examples/audit_fixture.json +8 -0
  194. package/examples/plugins/sample-custom-plugin/tools/custom_security_headers.py +125 -0
  195. package/examples/practices/README.md +22 -0
  196. package/examples/practices/requirements/crm/requirements_contracts.md +292 -0
  197. package/examples/practices/requirements/crm/requirements_customers.md +462 -0
  198. package/examples/practices/requirements/crm/requirements_login.md +202 -0
  199. package/examples/practices/requirements/crm/requirements_projects.md +396 -0
  200. package/examples/practices/requirements/crm/requirements_tasks.md +343 -0
  201. package/examples/practices/requirements/ecommerce/requirements_category_brand.txt +402 -0
  202. package/examples/practices/requirements/jira/KAN-5/KAN-1/2026-04-03_04-28-27.png +0 -0
  203. package/examples/practices/requirements/jira/KAN-5/KAN-1/KAN-1_requirement.md +52 -0
  204. package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-19.png +0 -0
  205. package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-57.png +0 -0
  206. package/examples/practices/requirements/jira/KAN-5/KAN-4/KAN-4_requirement.md +119 -0
  207. package/examples/practices/requirements/jira/KAN-5/KAN-5_overview.md +9 -0
  208. package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-08.png +0 -0
  209. package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-23.png +0 -0
  210. package/examples/practices/requirements/jira/KAN-5/KAN-6/KAN-6_requirement.md +32 -0
  211. package/examples/practices/testcases/api/book_management_api_test_cases.md +144 -0
  212. package/examples/practices/testcases/api/user_management_api_test_cases.md +139 -0
  213. package/examples/practices/testcases/crm/test_cases_crm_login.md +148 -0
  214. package/examples/practices/testcases/crm/test_cases_customers.md +156 -0
  215. package/examples/pytest-api-suite/README.md +45 -0
  216. package/examples/pytest-api-suite/conftest.py +31 -0
  217. package/examples/pytest-api-suite/pages/user_api_client.py +36 -0
  218. package/examples/pytest-api-suite/requirements.txt +2 -0
  219. package/examples/pytest-api-suite/tests/test_user_api.py +44 -0
  220. package/examples/selenium-suite/README.md +18 -0
  221. package/examples/selenium-suite/pages/base_page.py +27 -0
  222. package/examples/selenium-suite/pages/login_page.py +29 -0
  223. package/examples/selenium-suite/pages/order_page.py +25 -0
  224. package/examples/selenium-suite/pytest.ini +6 -0
  225. package/examples/selenium-suite/requirements.txt +2 -0
  226. package/examples/selenium-suite/tests/test_login.py +10 -0
  227. package/examples/selenium-suite/tests/test_order.py +10 -0
  228. package/package.json +27 -12
  229. package/scripts/generate_skill_examples.py +244 -0
  230. package/scripts/install.ps1 +112 -0
  231. package/scripts/install_global_plugin.ps1 +94 -0
  232. package/scripts/install_global_plugin.sh +49 -0
  233. package/scripts/lint_skills.ps1 +57 -0
  234. package/scripts/package_dist.py +323 -0
  235. package/scripts/setup.sh +59 -0
  236. package/scripts/update_hub.ps1 +19 -0
  237. package/scripts/update_hub.sh +15 -0
  238. package/skills_manifest.json +209 -6
  239. package/synapse.config.json +30 -0
  240. package/templates/PROJECT_AI_GUIDE_TEMPLATE.md +7 -7
  241. package/templates/PROJECT_STATE_TEMPLATE.md +1 -1
  242. package/templates/ai_bridges/CLAUDE.md +33 -16
  243. package/templates/ai_bridges/copilot-instructions.md +14 -21
  244. package/templates/ai_bridges/cursor_synapse_qa.mdc +17 -20
  245. package/templates/ai_bridges/windsurfrules +21 -21
  246. package/templates/ci/github-actions-synapse.yml +71 -4
  247. package/templates/welcome.html.tmpl +1674 -0
  248. package/tools/.infer_baseline.json +1102 -0
  249. package/tools/TOOLS_RUNBOOK.md +98 -131
  250. package/tools/__init__.py +26 -0
  251. package/tools/agent_canary.py +501 -501
  252. package/tools/analyze_project.py +31 -17
  253. package/tools/api_fuzzer.py +278 -6
  254. package/tools/author_integrity.py +6 -6
  255. package/tools/auto_heal.py +1 -1
  256. package/tools/browser_helpers.js +105 -7
  257. package/tools/bug_reporter.py +31 -1
  258. package/tools/bump_version.py +30 -3
  259. package/tools/cache_resolver.py +248 -14
  260. package/tools/check_env.py +55 -14
  261. package/tools/check_version_sync.py +171 -0
  262. package/tools/ci_healing_hook.py +1 -1
  263. package/tools/cli.py +454 -42
  264. package/tools/count_tokens.py +1257 -0
  265. package/tools/dashboard_generator.py +2638 -0
  266. package/tools/db_sandbox.py +198 -20
  267. package/tools/e2e_flow_prober.ps1 +12 -64
  268. package/tools/e2e_flow_prober.py +99 -0
  269. package/tools/e2e_flow_prober.sh +4 -0
  270. package/tools/flaky_detector.py +4 -3
  271. package/tools/generate_allure_report.ps1 +12 -29
  272. package/tools/generate_allure_report.py +77 -0
  273. package/tools/generate_allure_report.sh +4 -0
  274. package/tools/generate_jmx_plan.py +257 -58
  275. package/tools/generate_test_reports.ps1 +12 -134
  276. package/tools/generate_test_reports.py +133 -0
  277. package/tools/generate_test_reports.sh +4 -0
  278. package/tools/gherkin_suite.py +758 -0
  279. package/tools/git_pre_commit_guard.py +12 -6
  280. package/tools/goldfish_review.py +366 -0
  281. package/tools/heal_pr_automator.py +1 -1
  282. package/tools/heuristic_locator_matcher.py +170 -21
  283. package/tools/infer_linter.py +612 -70
  284. package/tools/lint_ai_docs.py +64 -0
  285. package/tools/matrix_sharder.py +1 -1
  286. package/tools/mcp_excel_server.ps1 +12 -250
  287. package/tools/mcp_excel_server.py +249 -0
  288. package/tools/mcp_excel_server.sh +4 -0
  289. package/tools/mcp_server.py +368 -144
  290. package/tools/md_to_xlsx.py +307 -0
  291. package/tools/micro_mutator.py +302 -69
  292. package/tools/omni_transpiler.py +2 -2
  293. package/tools/output_formatter.py +128 -0
  294. package/tools/pinpoint_failure.py +88 -88
  295. package/tools/project_state.py +2 -2
  296. package/tools/repo_map.py +1 -1
  297. package/tools/safety_firewall.py +196 -45
  298. package/tools/setup_project.py +295 -31
  299. package/tools/skillspector.py +31 -0
  300. package/tools/spec_drift_sentinel.py +439 -0
  301. package/tools/sync_agent_rules.py +248 -0
  302. package/tools/telemetry_correlator.py +45 -0
  303. package/tools/test_impact.py +51 -12
  304. package/tools/tms_sync_bridge.py +21 -5
  305. package/tools/universal_ir.py +3 -0
  306. package/tools/update_sentinel.py +87 -15
  307. package/tools/verify_all.ps1 +13 -0
  308. package/tools/verify_all.py +479 -85
  309. package/tools/visual_diff_canvas.py +1 -0
  310. package/tools/visual_som_helper.py +1 -1
  311. package/tools/watch_mode.py +305 -0
  312. package/tools/welcome_page.py +291 -0
@@ -1,155 +1,155 @@
1
- # Katalon Built-in Keywords API Reference
2
-
3
- This document provides a reference for Katalon Studio's most commonly used built-in keywords.
4
-
5
- ## WebUI Keywords
6
-
7
- Katalon's WebUI keywords are accessed via `com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords` (commonly imported as `WebUI`).
8
-
9
- ### Navigation Keywords
10
-
11
- - `WebUI.openBrowser(url)` - Open a browser and navigate to URL
12
- - `WebUI.navigateToUrl(url)` - Navigate to a URL in the current browser
13
- - `WebUI.closeBrowser()` - Close the current browser
14
- - `WebUI.back()` - Navigate back in browser history
15
- - `WebUI.forward()` - Navigate forward in browser history
16
- - `WebUI.refresh()` - Refresh the current page
17
- - `WebUI.switchToWindowIndex(index)` - Switch to a browser window by index
18
- - `WebUI.switchToWindowTitle(title)` - Switch to a browser window by title
19
- - `WebUI.switchToWindowUrl(url)` - Switch to a browser window by URL
20
-
21
- ### Element Interaction Keywords
22
-
23
- - `WebUI.click(testObject)` - Click on an element
24
- - `WebUI.doubleClick(testObject)` - Double-click on an element
25
- - `WebUI.rightClick(testObject)` - Right-click on an element
26
- - `WebUI.setText(testObject, text)` - Set text for an input field
27
- - `WebUI.sendKeys(testObject, text)` - Send keyboard input to an element
28
- - `WebUI.clearText(testObject)` - Clear text from an input field
29
- - `WebUI.selectOptionByValue(testObject, value, isRegex)` - Select dropdown option by value
30
- - `WebUI.selectOptionByLabel(testObject, label, isRegex)` - Select dropdown option by label
31
- - `WebUI.selectOptionByIndex(testObject, index)` - Select dropdown option by index
32
- - `WebUI.check(testObject)` - Check a checkbox
33
- - `WebUI.uncheck(testObject)` - Uncheck a checkbox
34
- - `WebUI.uploadFile(testObject, filePath)` - Upload a file to a file input
35
-
36
- ### Wait Keywords
37
-
38
- - `WebUI.waitForElementPresent(testObject, timeoutInSeconds)` - Wait for element to be present in DOM
39
- - `WebUI.waitForElementVisible(testObject, timeoutInSeconds)` - Wait for element to be visible
40
- - `WebUI.waitForElementClickable(testObject, timeoutInSeconds)` - Wait for element to be clickable
41
- - `WebUI.waitForElementNotPresent(testObject, timeoutInSeconds)` - Wait for element to not be present
42
- - `WebUI.waitForElementNotVisible(testObject, timeoutInSeconds)` - Wait for element to not be visible
43
- - `WebUI.waitForPageLoad(timeoutInSeconds)` - Wait for page to fully load
44
- - `WebUI.delay(timeInSeconds)` - Pause execution for specified seconds
45
-
46
- ### Verification Keywords
47
-
48
- - `WebUI.verifyElementPresent(testObject, timeoutInSeconds)` - Verify element is present
49
- - `WebUI.verifyElementVisible(testObject)` - Verify element is visible
50
- - `WebUI.verifyElementClickable(testObject)` - Verify element is clickable
51
- - `WebUI.verifyElementNotPresent(testObject, timeoutInSeconds)` - Verify element is not present
52
- - `WebUI.verifyElementText(testObject, expectedText)` - Verify element contains expected text
53
- - `WebUI.verifyTextPresent(text, isRegex)` - Verify text is present on the page
54
- - `WebUI.verifyElementAttributeValue(testObject, attribute, expectedValue, timeoutInSeconds)` - Verify element attribute value
55
-
56
- ### Get Keywords
57
-
58
- - `WebUI.getText(testObject)` - Get text content of an element
59
- - `WebUI.getAttribute(testObject, attribute)` - Get attribute value of an element
60
- - `WebUI.getCSSValue(testObject, propertyName)` - Get CSS property value
61
- - `WebUI.getUrl()` - Get current page URL
62
- - `WebUI.getWindowTitle()` - Get current window title
63
-
64
- ### Screenshot Keywords
65
-
66
- - `WebUI.takeScreenshot(filePath)` - Take a screenshot and save to file
67
- - `WebUI.takeFullPageScreenshot(filePath)` - Take a full-page screenshot
68
-
69
- ## Mobile Keywords
70
-
71
- Katalon's Mobile keywords are accessed via `com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords` (commonly imported as `Mobile`).
72
-
73
- ### Common Mobile Keywords
74
-
75
- - `Mobile.startApplication(appPath)` - Start a mobile application
76
- - `Mobile.closeApplication()` - Close the current application
77
- - `Mobile.tap(testObject, timeout)` - Tap on a mobile element
78
- - `Mobile.setText(testObject, text, timeout)` - Set text in a mobile input
79
- - `Mobile.getText(testObject, timeout)` - Get text from a mobile element
80
- - `Mobile.verifyElementExist(testObject, timeout)` - Verify mobile element exists
81
- - `Mobile.scrollToText(text)` - Scroll until specified text is visible
82
- - `Mobile.swipe(startX, startY, endX, endY)` - Perform a swipe gesture
83
-
84
- ## Web Service (API) Keywords
85
-
86
- Katalon's Web Service keywords are accessed via `com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords` (commonly imported as `WS`).
87
-
88
- ### API Keywords
89
-
90
- - `WS.sendRequest(requestObject)` - Send a web service request
91
- - `WS.verifyResponseStatusCode(response, statusCode)` - Verify HTTP response status code
92
- - `WS.verifyElementPropertyValue(response, locator, expectedValue)` - Verify JSON/XML element value
93
- - `WS.getElementPropertyValue(response, locator)` - Get value from JSON/XML response
94
- - `WS.verifyElementsCount(response, locator, expectedCount)` - Verify count of elements in response
95
-
96
- ## Utility Keywords
97
-
98
- ### Checkpoint Keywords
99
-
100
- - `findCheckpoint(checkpointName)` - Find a checkpoint by name
101
-
102
- ### Test Case Keywords
103
-
104
- - `findTestCase(testCasePath)` - Find a test case by path
105
- - `WebUI.callTestCase(testCase, variables)` - Call another test case
106
-
107
- ### Test Data Keywords
108
-
109
- - `findTestData(testDataName)` - Find test data by name
110
-
111
- ### Object Repository Keywords
112
-
113
- - `findTestObject(objectPath)` - Find a test object from Object Repository
114
- - `findTestObject(objectPath, variables)` - Find a test object with variable bindings
115
-
116
- ## Global Variables
117
-
118
- Access global variables defined in profiles using `internal.GlobalVariable`:
119
-
120
- ```groovy
121
- import internal.GlobalVariable
122
-
123
- // Access a global variable
124
- String url = GlobalVariable.baseUrl
125
- String username = GlobalVariable.username
126
- int timeout = GlobalVariable.waitTimeout
127
- ```
128
-
129
- ## Failure Handling
130
-
131
- Control how test execution handles failures using `com.kms.katalon.core.model.FailureHandling`:
132
-
133
- - `FailureHandling.STOP_ON_FAILURE` - Stop test execution on failure (default)
134
- - `FailureHandling.CONTINUE_ON_FAILURE` - Continue execution even if step fails
135
- - `FailureHandling.OPTIONAL` - Mark step as optional, continue regardless of result
136
-
137
- Example:
138
- ```groovy
139
- WebUI.verifyElementPresent(findTestObject('optionalElement'), 5, FailureHandling.OPTIONAL)
140
- ```
141
-
142
- ## Annotations for Custom Keywords
143
-
144
- When creating custom keywords, use the `@Keyword` annotation:
145
-
146
- ```groovy
147
- import com.kms.katalon.core.annotation.Keyword
148
-
149
- class MyKeywords {
150
- @Keyword
151
- def myCustomKeyword(String param) {
152
- // Implementation
153
- }
154
- }
155
- ```
1
+ # Katalon Built-in Keywords API Reference
2
+
3
+ This document provides a reference for Katalon Studio's most commonly used built-in keywords.
4
+
5
+ ## WebUI Keywords
6
+
7
+ Katalon's WebUI keywords are accessed via `com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords` (commonly imported as `WebUI`).
8
+
9
+ ### Navigation Keywords
10
+
11
+ - `WebUI.openBrowser(url)` - Open a browser and navigate to URL
12
+ - `WebUI.navigateToUrl(url)` - Navigate to a URL in the current browser
13
+ - `WebUI.closeBrowser()` - Close the current browser
14
+ - `WebUI.back()` - Navigate back in browser history
15
+ - `WebUI.forward()` - Navigate forward in browser history
16
+ - `WebUI.refresh()` - Refresh the current page
17
+ - `WebUI.switchToWindowIndex(index)` - Switch to a browser window by index
18
+ - `WebUI.switchToWindowTitle(title)` - Switch to a browser window by title
19
+ - `WebUI.switchToWindowUrl(url)` - Switch to a browser window by URL
20
+
21
+ ### Element Interaction Keywords
22
+
23
+ - `WebUI.click(testObject)` - Click on an element
24
+ - `WebUI.doubleClick(testObject)` - Double-click on an element
25
+ - `WebUI.rightClick(testObject)` - Right-click on an element
26
+ - `WebUI.setText(testObject, text)` - Set text for an input field
27
+ - `WebUI.sendKeys(testObject, text)` - Send keyboard input to an element
28
+ - `WebUI.clearText(testObject)` - Clear text from an input field
29
+ - `WebUI.selectOptionByValue(testObject, value, isRegex)` - Select dropdown option by value
30
+ - `WebUI.selectOptionByLabel(testObject, label, isRegex)` - Select dropdown option by label
31
+ - `WebUI.selectOptionByIndex(testObject, index)` - Select dropdown option by index
32
+ - `WebUI.check(testObject)` - Check a checkbox
33
+ - `WebUI.uncheck(testObject)` - Uncheck a checkbox
34
+ - `WebUI.uploadFile(testObject, filePath)` - Upload a file to a file input
35
+
36
+ ### Wait Keywords
37
+
38
+ - `WebUI.waitForElementPresent(testObject, timeoutInSeconds)` - Wait for element to be present in DOM
39
+ - `WebUI.waitForElementVisible(testObject, timeoutInSeconds)` - Wait for element to be visible
40
+ - `WebUI.waitForElementClickable(testObject, timeoutInSeconds)` - Wait for element to be clickable
41
+ - `WebUI.waitForElementNotPresent(testObject, timeoutInSeconds)` - Wait for element to not be present
42
+ - `WebUI.waitForElementNotVisible(testObject, timeoutInSeconds)` - Wait for element to not be visible
43
+ - `WebUI.waitForPageLoad(timeoutInSeconds)` - Wait for page to fully load
44
+ - `WebUI.delay(timeInSeconds)` - Pause execution for specified seconds
45
+
46
+ ### Verification Keywords
47
+
48
+ - `WebUI.verifyElementPresent(testObject, timeoutInSeconds)` - Verify element is present
49
+ - `WebUI.verifyElementVisible(testObject)` - Verify element is visible
50
+ - `WebUI.verifyElementClickable(testObject)` - Verify element is clickable
51
+ - `WebUI.verifyElementNotPresent(testObject, timeoutInSeconds)` - Verify element is not present
52
+ - `WebUI.verifyElementText(testObject, expectedText)` - Verify element contains expected text
53
+ - `WebUI.verifyTextPresent(text, isRegex)` - Verify text is present on the page
54
+ - `WebUI.verifyElementAttributeValue(testObject, attribute, expectedValue, timeoutInSeconds)` - Verify element attribute value
55
+
56
+ ### Get Keywords
57
+
58
+ - `WebUI.getText(testObject)` - Get text content of an element
59
+ - `WebUI.getAttribute(testObject, attribute)` - Get attribute value of an element
60
+ - `WebUI.getCSSValue(testObject, propertyName)` - Get CSS property value
61
+ - `WebUI.getUrl()` - Get current page URL
62
+ - `WebUI.getWindowTitle()` - Get current window title
63
+
64
+ ### Screenshot Keywords
65
+
66
+ - `WebUI.takeScreenshot(filePath)` - Take a screenshot and save to file
67
+ - `WebUI.takeFullPageScreenshot(filePath)` - Take a full-page screenshot
68
+
69
+ ## Mobile Keywords
70
+
71
+ Katalon's Mobile keywords are accessed via `com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords` (commonly imported as `Mobile`).
72
+
73
+ ### Common Mobile Keywords
74
+
75
+ - `Mobile.startApplication(appPath)` - Start a mobile application
76
+ - `Mobile.closeApplication()` - Close the current application
77
+ - `Mobile.tap(testObject, timeout)` - Tap on a mobile element
78
+ - `Mobile.setText(testObject, text, timeout)` - Set text in a mobile input
79
+ - `Mobile.getText(testObject, timeout)` - Get text from a mobile element
80
+ - `Mobile.verifyElementExist(testObject, timeout)` - Verify mobile element exists
81
+ - `Mobile.scrollToText(text)` - Scroll until specified text is visible
82
+ - `Mobile.swipe(startX, startY, endX, endY)` - Perform a swipe gesture
83
+
84
+ ## Web Service (API) Keywords
85
+
86
+ Katalon's Web Service keywords are accessed via `com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords` (commonly imported as `WS`).
87
+
88
+ ### API Keywords
89
+
90
+ - `WS.sendRequest(requestObject)` - Send a web service request
91
+ - `WS.verifyResponseStatusCode(response, statusCode)` - Verify HTTP response status code
92
+ - `WS.verifyElementPropertyValue(response, locator, expectedValue)` - Verify JSON/XML element value
93
+ - `WS.getElementPropertyValue(response, locator)` - Get value from JSON/XML response
94
+ - `WS.verifyElementsCount(response, locator, expectedCount)` - Verify count of elements in response
95
+
96
+ ## Utility Keywords
97
+
98
+ ### Checkpoint Keywords
99
+
100
+ - `findCheckpoint(checkpointName)` - Find a checkpoint by name
101
+
102
+ ### Test Case Keywords
103
+
104
+ - `findTestCase(testCasePath)` - Find a test case by path
105
+ - `WebUI.callTestCase(testCase, variables)` - Call another test case
106
+
107
+ ### Test Data Keywords
108
+
109
+ - `findTestData(testDataName)` - Find test data by name
110
+
111
+ ### Object Repository Keywords
112
+
113
+ - `findTestObject(objectPath)` - Find a test object from Object Repository
114
+ - `findTestObject(objectPath, variables)` - Find a test object with variable bindings
115
+
116
+ ## Global Variables
117
+
118
+ Access global variables defined in profiles using `internal.GlobalVariable`:
119
+
120
+ ```groovy
121
+ import internal.GlobalVariable
122
+
123
+ // Access a global variable
124
+ String url = GlobalVariable.baseUrl
125
+ String username = GlobalVariable.username
126
+ int timeout = GlobalVariable.waitTimeout
127
+ ```
128
+
129
+ ## Failure Handling
130
+
131
+ Control how test execution handles failures using `com.kms.katalon.core.model.FailureHandling`:
132
+
133
+ - `FailureHandling.STOP_ON_FAILURE` - Stop test execution on failure (default)
134
+ - `FailureHandling.CONTINUE_ON_FAILURE` - Continue execution even if step fails
135
+ - `FailureHandling.OPTIONAL` - Mark step as optional, continue regardless of result
136
+
137
+ Example:
138
+ ```groovy
139
+ WebUI.verifyElementPresent(findTestObject('optionalElement'), 5, FailureHandling.OPTIONAL)
140
+ ```
141
+
142
+ ## Annotations for Custom Keywords
143
+
144
+ When creating custom keywords, use the `@Keyword` annotation:
145
+
146
+ ```groovy
147
+ import com.kms.katalon.core.annotation.Keyword
148
+
149
+ class MyKeywords {
150
+ @Keyword
151
+ def myCustomKeyword(String param) {
152
+ // Implementation
153
+ }
154
+ }
155
+ ```
@@ -1,67 +1,67 @@
1
- # CLI Runner Commands & Enterprise Test Suites Registry
2
-
3
- Reference documentation for the `katalon-cli-runner` skill.
4
-
5
- ---
6
-
7
- ## 1. Environment Variable Configuration (.env)
8
- ```bash
9
- KATALON_API_KEY="your_actual_api_key_here"
10
- KATALON_PROJECT_PATH="/path/to/project"
11
- TELEGRAM_BOT_TOKEN="your_bot_token"
12
- TELEGRAM_CHAT_ID="your_chat_id"
13
- ```
14
-
15
- ---
16
-
17
- ## 2. Platform-Specific Execution Commands (KRE CLI)
18
-
19
- ### 2.1. Windows Environment (PowerShell Runner)
20
- ```powershell
21
- # Run Test Suite with API Key
22
- powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/07_QuanTriDuLieu" -ApiKey $env:KATALON_API_KEY
23
-
24
- # Run single Test Suite for debugging:
25
- powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/Group_07_01_CumCongNghiep"
26
- ```
27
-
28
- ### 2.2. macOS / Linux CLI (Headless Full HD)
29
- ```bash
30
- # Run Test Suite
31
- katalonc \
32
- -noSplash \
33
- -runMode=console \
34
- -projectPath="$(pwd)/project.prj" \
35
- -retry=0 \
36
- -testSuitePath="Test Suites/07_QuanTriDuLieu" \
37
- -browserType="Chrome (headless)" \
38
- -executionProfile="default" \
39
- -apiKey="$KATALON_API_KEY" \
40
- --args="-headless --window-size=1920,1080 --disable-gpu --no-sandbox --disable-dev-shm-usage"
41
-
42
- # Run single Test Case (Debug Mode):
43
- katalonc \
44
- -noSplash \
45
- -runMode=console \
46
- -projectPath="$(pwd)/project.prj" \
47
- -testCasePath="Test Cases/TC-1 Kiểm tra tạo mới thành công" \
48
- -browserType="Chrome (headless)" \
49
- -apiKey="$KATALON_API_KEY"
50
- ```
51
-
52
- ---
53
-
54
- ## 3. Standard Enterprise Test Suite Registry
55
-
56
- | Test Suite Name | Scale | Target Functional Module |
57
- | :--- | :---: | :--- |
58
- | `Test Suites/All_Tests` | Full Suite | All functional modules |
59
- | `Test Suites/01_QuanLyChiTieu` | 7 TCs | Target Planning |
60
- | `Test Suites/02_XacThucNguoiDung` | 5 TCs | User Authentication & Profiles |
61
- | `Test Suites/03_QuanTriHeThong` | 4 TCs | System Administration & Users |
62
- | `Test Suites/04_DanhMucDungChung` | 12 TCs | Common Categories (Departments, Roles) |
63
- | `Test Suites/05_DanhMucNganhCongThuong` | 64 TCs | 16 Industry Sub-Categories |
64
- | `Test Suites/06_QuyHoachCongThuong` | 30 TCs | Sector Planning |
65
- | `Test Suites/07_QuanTriDuLieu` | 125 TCs | Data Mining & GIS Maps |
66
- | `Test Suites/08_BaoCaoThongKe` | 2 TCs | Statistical Reports (Data & Permits) |
67
- | `Test Suites/09_ChiaSeDuLieu` | 10 TCs | Data Sharing & API Token Lifecycle |
1
+ # CLI Runner Commands & Enterprise Test Suites Registry
2
+
3
+ Reference documentation for the `katalon-cli-runner` skill.
4
+
5
+ ---
6
+
7
+ ## 1. Environment Variable Configuration (.env)
8
+ ```bash
9
+ KATALON_API_KEY="your_actual_api_key_here"
10
+ KATALON_PROJECT_PATH="/path/to/project"
11
+ TELEGRAM_BOT_TOKEN="your_bot_token"
12
+ TELEGRAM_CHAT_ID="your_chat_id"
13
+ ```
14
+
15
+ ---
16
+
17
+ ## 2. Platform-Specific Execution Commands (KRE CLI)
18
+
19
+ ### 2.1. Windows Environment (PowerShell Runner)
20
+ ```powershell
21
+ # Run Test Suite with API Key
22
+ powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/07_QuanTriDuLieu" -ApiKey $env:KATALON_API_KEY
23
+
24
+ # Run single Test Suite for debugging:
25
+ powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/Group_07_01_CumCongNghiep"
26
+ ```
27
+
28
+ ### 2.2. macOS / Linux CLI (Headless Full HD)
29
+ ```bash
30
+ # Run Test Suite
31
+ katalonc \
32
+ -noSplash \
33
+ -runMode=console \
34
+ -projectPath="$(pwd)/project.prj" \
35
+ -retry=0 \
36
+ -testSuitePath="Test Suites/07_QuanTriDuLieu" \
37
+ -browserType="Chrome (headless)" \
38
+ -executionProfile="default" \
39
+ -apiKey="$KATALON_API_KEY" \
40
+ --args="-headless --window-size=1920,1080 --disable-gpu --no-sandbox --disable-dev-shm-usage"
41
+
42
+ # Run single Test Case (Debug Mode):
43
+ katalonc \
44
+ -noSplash \
45
+ -runMode=console \
46
+ -projectPath="$(pwd)/project.prj" \
47
+ -testCasePath="Test Cases/TC-1 Kiểm tra tạo mới thành công" \
48
+ -browserType="Chrome (headless)" \
49
+ -apiKey="$KATALON_API_KEY"
50
+ ```
51
+
52
+ ---
53
+
54
+ ## 3. Standard Enterprise Test Suite Registry
55
+
56
+ | Test Suite Name | Scale | Target Functional Module |
57
+ | :--- | :---: | :--- |
58
+ | `Test Suites/All_Tests` | Full Suite | All functional modules |
59
+ | `Test Suites/01_QuanLyChiTieu` | 7 TCs | Target Planning |
60
+ | `Test Suites/02_XacThucNguoiDung` | 5 TCs | User Authentication & Profiles |
61
+ | `Test Suites/03_QuanTriHeThong` | 4 TCs | System Administration & Users |
62
+ | `Test Suites/04_DanhMucDungChung` | 12 TCs | Common Categories (Departments, Roles) |
63
+ | `Test Suites/05_DanhMucNganhCongThuong` | 64 TCs | 16 Industry Sub-Categories |
64
+ | `Test Suites/06_QuyHoachCongThuong` | 30 TCs | Sector Planning |
65
+ | `Test Suites/07_QuanTriDuLieu` | 125 TCs | Data Mining & GIS Maps |
66
+ | `Test Suites/08_BaoCaoThongKe` | 2 TCs | Statistical Reports (Data & Permits) |
67
+ | `Test Suites/09_ChiaSeDuLieu` | 10 TCs | Data Sharing & API Token Lifecycle |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lam-script-generator
3
- description: "Transform user stories and acceptance criteria into Clean POM automation scripts."
3
+ description: "Transform user stories and acceptance criteria into Clean POM automation scripts. Use when the user provides a user story, acceptance criteria, or requirement document that must become a runnable script."
4
4
  ---
5
5
 
6
6
  # LAM Script Generator — Large Action Model for Test Automation
@@ -80,3 +80,44 @@ IndustryDataPage.deleteRecordByCode(uniqueCode)
80
80
  - Zero raw XPaths, CSS selectors, or `findTestObject` in the generated script.
81
81
  - Always generate dynamic identifiers with prefixes via `BasePage.uniqueCode()`.
82
82
  - Always generate mandatory teardown cleanup for created entities.
83
+
84
+ ## 4. Proven-vs-Owed Traceability Pipeline
85
+
86
+ > *Borrowed and adapted from the Kane CLI generate→execute→prove workflow (Apache-2.0, lambdatest/kane-cli).*
87
+
88
+ Generated scripts must be traceable to the acceptance criteria they prove.
89
+ For every user story, maintain the chain:
90
+
91
+ ```mermaid
92
+ flowchart LR
93
+ Story["<b>User Story</b>"] --> UC["<b>Use Cases</b><br/>(each cites its source line)"]
94
+ UC --> AC["<b>Acceptance Criteria</b><br/>(Given/When/Then, testable)"]
95
+ AC --> SC["<b>Scenarios</b><br/>(happy + negative + boundary)"]
96
+ SC --> TC["<b>Automation Scripts</b><br/>(Clean POM, 0 raw XPath)"]
97
+ TC --> EV["<b>Proven vs Owed</b><br/>coverage per criterion"]
98
+ ```
99
+
100
+ Rules:
101
+
102
+ 1. **Every generated script cites its criterion** — keep the AC id in the test
103
+ case name or a comment header; a script nobody can trace back is a liability.
104
+ 2. **Report coverage as proven vs owed, not test counts** — a criterion with no
105
+ passing automated script is *owed*; N scripts proving one criterion is waste.
106
+ 3. **Reconcile on requirement change** — when a story changes, re-run the chain
107
+ and mark stale scripts before trusting any green run.
108
+ 4. For BDD inputs, the `gherkin-to-suite` skill performs the AC→scenario
109
+ expansion deterministically (0-token); feed its Universal IR here for
110
+ codification.
111
+
112
+ ---
113
+
114
+ ## 5. Boundary vs `clean-pom-crafter` and `gherkin-to-suite`
115
+
116
+ - **This skill** = natural-language story → action-sequence script skeleton
117
+ (the "what steps, in what order" reasoning layer).
118
+ - **`clean-pom-crafter`** owns the Page Classes and locator discipline that the
119
+ skeleton's business-flow calls resolve against — never inline raw selectors
120
+ here.
121
+ - **`gherkin-to-suite`** is the deterministic (0-token) alternative when
122
+ requirements already exist as `.feature` files; use it first, and feed its
123
+ Universal IR here only when story-level reasoning must fill the gaps.
@@ -0,0 +1,8 @@
1
+ # User Story: User Password Reset Flow
2
+ As a registered customer,
3
+ I want to request a password reset email,
4
+ So that I can regain access if I forget my password.
5
+
6
+ ## Acceptance Criteria:
7
+ 1. Submitting registered email displays "Reset link dispatched".
8
+ 2. Submitting empty email highlights field in red with validation error.
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: lean-code-ladder
3
+ description: "Apply a 7-rung reuse-first ladder so every new test-automation code path is the smallest complete change that fully solves the task. Use when adding helpers, Page Class methods, dependencies, or any new code where a shorter existing option might already exist."
4
+ ---
5
+
6
+ # Lean Code Ladder — Enterprise Reuse-First Standard
7
+
8
+ Specialized skill for minimizing newly written code in test automation projects: solve the whole problem with the least new code, then finish the change completely (callers, fixtures, and the small test that proves it).
9
+
10
+ ---
11
+
12
+ ## 1. The 7-Rung Ladder
13
+
14
+ Before writing any new code, descend the ladder and take the **first rung that fully works**:
15
+
16
+ | Rung | Question | Action |
17
+ |:---:|---|---|
18
+ | 0 | Does it need to exist? | Skip features, options, and flexibility nobody asked for; name what you skipped in one line. A vague request gets the smallest version that does the core job. |
19
+ | 1 | Already in the codebase? | A helper, Page Class method, or fixture exists? Use it the way the surrounding code does. |
20
+ | 2 | Standard library? | Use the language stdlib unless the project has its own equivalent. |
21
+ | 3 | Platform / framework native? | A built-in of the test framework beats a hand-rolled widget (e.g. Playwright auto-waiting, `expect` web-first assertions). |
22
+ | 4 | Installed dependency? | Use it. Never add a new dependency for a few lines. |
23
+ | 5 | One line? | Can it be one line a reader gets at a glance? Then one line. |
24
+ | 6 | Minimum new code | Write the minimum that works, and no more. |
25
+
26
+ ## 2. Reading Order Before Writing
27
+
28
+ - Read the task and the code it touches. List every place the change must reach: callers, tests, fixtures, config, exports.
29
+ - Check what the change could break: data it would destroy or expose, callers that stop working. That is scope. Extra features are not.
30
+
31
+ ## 3. Completeness Rules (Be Lazy About the Solution, Never About the Change)
32
+
33
+ - Finish every part the task needs, including the callers, tests, and fixtures the change affects.
34
+ - No abstraction, wrapper, option, config, or "for later" code nobody asked for. Keep values in the form the platform already gives. Deletion beats addition; keep the structure the codebase already has.
35
+ - The shortest working diff wins, once everything it must touch is known. A one-liner that needs decoding is not short.
36
+ - Comment only the "why" the code cannot show, in one line.
37
+ - Bug fix: grep every caller of the touched function first, then fix the root cause once in the shared code (pair with `systematic-debugging`).
38
+ - Code that is moved or merged keeps its error handling and validation.
39
+ - Between options of equal size, take the one that is correct on edge cases.
40
+ - New non-trivial logic (a branch, loop, parser, money/security path, or a whole new script) leaves one small test or assert-based self-check before it counts as finished; trivial changes need none.
41
+ - A shortcut with a known limit gets a code comment: `shortcut: <the limit>, <when to upgrade>`.
42
+
43
+ ## 4. Never Cut (Hard Floor)
44
+
45
+ The ladder minimizes code, never safety. The following are never removed or skipped in the name of leanness:
46
+
47
+ - Validation at trust boundaries
48
+ - Error handling that prevents data loss
49
+ - Security checks (credential handling, authorization assertions)
50
+ - Accessibility behavior
51
+ - Anything the user explicitly asked for
52
+
53
+ ## 5. Evidence of Leanness
54
+
55
+ - Run `python3 tools/infer_linter.py` after the change: zero fake-pass findings confirms the lean diff did not trade rigor for brevity.
56
+ - Run the affected subset from `python3 tools/test_impact.py --git-diff` to prove the shortest diff still reaches everything it had to reach.
57
+ - Lean code without its check is unfinished: Gate 8 (`tools/micro_mutator.py`, Mutation Score >= 80%) remains the floor for any assertion logic written on this ladder.
58
+
59
+ ## 6. Worked Comparison
60
+
61
+ | Situation | Bloated answer | Lean answer |
62
+ |---|---|---|
63
+ | Need a date picker in a form test | 300-line custom calendar component | Native `<input type="date">` via the existing form helper (Rung 3) |
64
+ | Need retry around a flaky API call | New generic retry framework with policy classes | The installed HTTP client's retry option (Rung 4) + one test |
65
+ | Need a formatted timestamp in test data | New utility module | One line with the stdlib formatter (Rung 2) |
66
+
67
+ ## 7. Boundary vs Sibling Skills (Do Not Confuse)
68
+
69
+ | Sibling | Owns | Hand-off |
70
+ |---|---|---|
71
+ | `surgical-coding-principles` | Diff discipline (every line traces to the request) | The ladder chooses the solution shape; surgical principles keep the diff clean |
72
+ | `code-refactoring-refactor-clean` | Deliberate SOLID refactors of existing debt | Refactoring is not ladder work; only new/changed code descends the ladder |
73
+ | `clean-pom-crafter` | Page Class architecture and locator tiers | Ladder applies inside and around Page Classes, not to their architecture contract |
74
+
75
+ ## 8. Reference Documentation
76
+
77
+ - `python3 tools/infer_linter.py` — fake-pass scan for the new logic.
78
+ - `python3 tools/test_impact.py --git-diff` — confirm the lean diff still covers all impacted tests.
79
+ - `python3 tools/micro_mutator.py` — Gate 8 mutation floor (>= 80%) for non-trivial new logic.
80
+
81
+ ## 9. Attribution
82
+
83
+ Adapted from **ponytail** (https://github.com/DietrichGebert/ponytail) — MIT License, Copyright (c) 2026 DietrichGebert. The lazy-senior ladder, completeness rules, and never-cut floor are re-scoped for enterprise test automation in Synapse Hub; wording, structure, and examples modified.
@@ -0,0 +1,37 @@
1
+ # Example: Walking the Ladder for a Real Request
2
+
3
+ Request: "In the login test suite, when login fails we need a readable message that includes the actual error returned by the app."
4
+
5
+ ## Descent
6
+
7
+ | Rung | Checked | Result |
8
+ |:---:|---|---|
9
+ | 0 | Does it need to exist? | Yes — failure messages currently say only `Login failed`, which hides the app's actual error. Core job: include the returned error text. |
10
+ | 1 | Already in the codebase? | YES — the login Page Class already builds an error context object with the app message; the assertion just never prints it. |
11
+ | 2-4 | stdlib / platform / dependency | Not needed — rung 1 already solves it. |
12
+ | 5-6 | One line / minimum | The fix becomes a one-line assertion change reusing the existing context object. |
13
+
14
+ ## Lean diff (the whole change)
15
+
16
+ ```text
17
+ - expect(page).toHaveText('Login failed');
18
+ + expect(page).toHaveText(`Login failed: ${errorContext.message}`);
19
+ ```
20
+
21
+ Plus the completeness rule: one new test asserts the message embeds the app
22
+ error for a rejected-credentials fixture, so the non-trivial path is covered.
23
+
24
+ ## Anti-example (what the ladder forbids)
25
+
26
+ ```text
27
+ + class RetryableErrorContextFormatterFactory { ... } // Rung 0 violation
28
+ + npm install fancy-string-utils // Rung 4 violation
29
+ + config option: errorMessageTemplateStyle: 'verbose' | 'compact' // nobody asked
30
+ ```
31
+
32
+ ## Never-cut check (Rung floor)
33
+
34
+ The shorter assertion still validates at the trust boundary (the app's
35
+ returned error is rendered before being asserted), leaks no credentials into
36
+ the failure message, and the fixture error text is sanitized synthetic data.
37
+ Leanness changed the size of the diff, not the safety of the test.