retestkit 1.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 (327) hide show
  1. package/.claude/commands/openspec/apply.md +23 -0
  2. package/.claude/commands/openspec/archive.md +27 -0
  3. package/.claude/commands/openspec/proposal.md +28 -0
  4. package/.gemini/commands/openspec/apply.toml +21 -0
  5. package/.gemini/commands/openspec/archive.toml +25 -0
  6. package/.gemini/commands/openspec/proposal.toml +26 -0
  7. package/.github/prompts/openspec-apply.prompt.md +22 -0
  8. package/.github/prompts/openspec-archive.prompt.md +26 -0
  9. package/.github/prompts/openspec-proposal.prompt.md +27 -0
  10. package/.github/workflows/release.yml +33 -0
  11. package/.kilocode/workflows/openspec-apply.md +17 -0
  12. package/.kilocode/workflows/openspec-archive.md +21 -0
  13. package/.kilocode/workflows/openspec-proposal.md +22 -0
  14. package/.mcp.json +23 -0
  15. package/.opencode/command/openspec-apply.md +25 -0
  16. package/.opencode/command/openspec-archive.md +28 -0
  17. package/.opencode/command/openspec-proposal.md +30 -0
  18. package/.roo/commands/openspec-apply.md +20 -0
  19. package/.roo/commands/openspec-archive.md +24 -0
  20. package/.roo/commands/openspec-proposal.md +25 -0
  21. package/.vscode/mcp.json +23 -0
  22. package/AGENTS.md +18 -0
  23. package/CLAUDE.md +18 -0
  24. package/LICENSE +65 -0
  25. package/README.md +303 -0
  26. package/dist/config.d.ts +4 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +27 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/elicitation/index.d.ts +17 -0
  31. package/dist/elicitation/index.d.ts.map +1 -0
  32. package/dist/elicitation/index.js +118 -0
  33. package/dist/elicitation/index.js.map +1 -0
  34. package/dist/elicitation/types.d.ts +35 -0
  35. package/dist/elicitation/types.d.ts.map +1 -0
  36. package/dist/elicitation/types.js +39 -0
  37. package/dist/elicitation/types.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +76 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lifecycle/index.d.ts +31 -0
  43. package/dist/lifecycle/index.d.ts.map +1 -0
  44. package/dist/lifecycle/index.js +61 -0
  45. package/dist/lifecycle/index.js.map +1 -0
  46. package/dist/logger.d.ts +21 -0
  47. package/dist/logger.d.ts.map +1 -0
  48. package/dist/logger.js +182 -0
  49. package/dist/logger.js.map +1 -0
  50. package/dist/playwright-client/index.d.ts +29 -0
  51. package/dist/playwright-client/index.d.ts.map +1 -0
  52. package/dist/playwright-client/index.js +288 -0
  53. package/dist/playwright-client/index.js.map +1 -0
  54. package/dist/playwright-client/types.d.ts +44 -0
  55. package/dist/playwright-client/types.d.ts.map +1 -0
  56. package/dist/playwright-client/types.js +49 -0
  57. package/dist/playwright-client/types.js.map +1 -0
  58. package/dist/progress/index.d.ts +39 -0
  59. package/dist/progress/index.d.ts.map +1 -0
  60. package/dist/progress/index.js +106 -0
  61. package/dist/progress/index.js.map +1 -0
  62. package/dist/progress/types.d.ts +24 -0
  63. package/dist/progress/types.d.ts.map +1 -0
  64. package/dist/progress/types.js +2 -0
  65. package/dist/progress/types.js.map +1 -0
  66. package/dist/prompts/index.d.ts +19 -0
  67. package/dist/prompts/index.d.ts.map +1 -0
  68. package/dist/prompts/index.js +207 -0
  69. package/dist/prompts/index.js.map +1 -0
  70. package/dist/prompts/loader.d.ts +20 -0
  71. package/dist/prompts/loader.d.ts.map +1 -0
  72. package/dist/prompts/loader.js +47 -0
  73. package/dist/prompts/loader.js.map +1 -0
  74. package/dist/resources/index.d.ts +27 -0
  75. package/dist/resources/index.d.ts.map +1 -0
  76. package/dist/resources/index.js +186 -0
  77. package/dist/resources/index.js.map +1 -0
  78. package/dist/resources/subscriptions.d.ts +10 -0
  79. package/dist/resources/subscriptions.d.ts.map +1 -0
  80. package/dist/resources/subscriptions.js +23 -0
  81. package/dist/resources/subscriptions.js.map +1 -0
  82. package/dist/sampling/index.d.ts +11 -0
  83. package/dist/sampling/index.d.ts.map +1 -0
  84. package/dist/sampling/index.js +201 -0
  85. package/dist/sampling/index.js.map +1 -0
  86. package/dist/sampling/prompts.d.ts +56 -0
  87. package/dist/sampling/prompts.d.ts.map +1 -0
  88. package/dist/sampling/prompts.js +124 -0
  89. package/dist/sampling/prompts.js.map +1 -0
  90. package/dist/sampling/types.d.ts +57 -0
  91. package/dist/sampling/types.d.ts.map +1 -0
  92. package/dist/sampling/types.js +2 -0
  93. package/dist/sampling/types.js.map +1 -0
  94. package/dist/schemas/config.d.ts +40 -0
  95. package/dist/schemas/config.d.ts.map +1 -0
  96. package/dist/schemas/config.js +30 -0
  97. package/dist/schemas/config.js.map +1 -0
  98. package/dist/security/index.d.ts +38 -0
  99. package/dist/security/index.d.ts.map +1 -0
  100. package/dist/security/index.js +281 -0
  101. package/dist/security/index.js.map +1 -0
  102. package/dist/server.d.ts +9 -0
  103. package/dist/server.d.ts.map +1 -0
  104. package/dist/server.js +142 -0
  105. package/dist/server.js.map +1 -0
  106. package/dist/test-utils/index.d.ts +6 -0
  107. package/dist/test-utils/index.d.ts.map +1 -0
  108. package/dist/test-utils/index.js +6 -0
  109. package/dist/test-utils/index.js.map +1 -0
  110. package/dist/test-utils/mock-context.d.ts +64 -0
  111. package/dist/test-utils/mock-context.d.ts.map +1 -0
  112. package/dist/test-utils/mock-context.js +347 -0
  113. package/dist/test-utils/mock-context.js.map +1 -0
  114. package/dist/test-utils/mock-playwright-client.d.ts +62 -0
  115. package/dist/test-utils/mock-playwright-client.d.ts.map +1 -0
  116. package/dist/test-utils/mock-playwright-client.js +315 -0
  117. package/dist/test-utils/mock-playwright-client.js.map +1 -0
  118. package/dist/tools/index.d.ts +4 -0
  119. package/dist/tools/index.d.ts.map +1 -0
  120. package/dist/tools/index.js +8 -0
  121. package/dist/tools/index.js.map +1 -0
  122. package/dist/tools/webtest/crawl.d.ts +46 -0
  123. package/dist/tools/webtest/crawl.d.ts.map +1 -0
  124. package/dist/tools/webtest/crawl.js +678 -0
  125. package/dist/tools/webtest/crawl.js.map +1 -0
  126. package/dist/tools/webtest/discover-features.d.ts +30 -0
  127. package/dist/tools/webtest/discover-features.d.ts.map +1 -0
  128. package/dist/tools/webtest/discover-features.js +343 -0
  129. package/dist/tools/webtest/discover-features.js.map +1 -0
  130. package/dist/tools/webtest/discover-flows.d.ts +29 -0
  131. package/dist/tools/webtest/discover-flows.d.ts.map +1 -0
  132. package/dist/tools/webtest/discover-flows.js +341 -0
  133. package/dist/tools/webtest/discover-flows.js.map +1 -0
  134. package/dist/tools/webtest/generate-tests.d.ts +54 -0
  135. package/dist/tools/webtest/generate-tests.d.ts.map +1 -0
  136. package/dist/tools/webtest/generate-tests.js +364 -0
  137. package/dist/tools/webtest/generate-tests.js.map +1 -0
  138. package/dist/tools/webtest/index.d.ts +8 -0
  139. package/dist/tools/webtest/index.d.ts.map +1 -0
  140. package/dist/tools/webtest/index.js +8 -0
  141. package/dist/tools/webtest/index.js.map +1 -0
  142. package/dist/tools/webtest/run-test-case.d.ts +28 -0
  143. package/dist/tools/webtest/run-test-case.d.ts.map +1 -0
  144. package/dist/tools/webtest/run-test-case.js +420 -0
  145. package/dist/tools/webtest/run-test-case.js.map +1 -0
  146. package/dist/tools/webtest/schemas.d.ts +175 -0
  147. package/dist/tools/webtest/schemas.d.ts.map +1 -0
  148. package/dist/tools/webtest/schemas.js +156 -0
  149. package/dist/tools/webtest/schemas.js.map +1 -0
  150. package/dist/tools/webtest/start-analysis.d.ts +16 -0
  151. package/dist/tools/webtest/start-analysis.d.ts.map +1 -0
  152. package/dist/tools/webtest/start-analysis.js +137 -0
  153. package/dist/tools/webtest/start-analysis.js.map +1 -0
  154. package/dist/transports/http.d.ts +8 -0
  155. package/dist/transports/http.d.ts.map +1 -0
  156. package/dist/transports/http.js +9 -0
  157. package/dist/transports/http.js.map +1 -0
  158. package/dist/transports/index.d.ts +14 -0
  159. package/dist/transports/index.d.ts.map +1 -0
  160. package/dist/transports/index.js +20 -0
  161. package/dist/transports/index.js.map +1 -0
  162. package/dist/transports/stdio.d.ts +4 -0
  163. package/dist/transports/stdio.d.ts.map +1 -0
  164. package/dist/transports/stdio.js +6 -0
  165. package/dist/transports/stdio.js.map +1 -0
  166. package/dist/types/capabilities.d.ts +18 -0
  167. package/dist/types/capabilities.d.ts.map +1 -0
  168. package/dist/types/capabilities.js +35 -0
  169. package/dist/types/capabilities.js.map +1 -0
  170. package/dist/types/context.d.ts +20 -0
  171. package/dist/types/context.d.ts.map +1 -0
  172. package/dist/types/context.js +2 -0
  173. package/dist/types/context.js.map +1 -0
  174. package/dist/types/tool.d.ts +10 -0
  175. package/dist/types/tool.d.ts.map +1 -0
  176. package/dist/types/tool.js +2 -0
  177. package/dist/types/tool.js.map +1 -0
  178. package/dist/workspace/index.d.ts +99 -0
  179. package/dist/workspace/index.d.ts.map +1 -0
  180. package/dist/workspace/index.js +648 -0
  181. package/dist/workspace/index.js.map +1 -0
  182. package/dist/workspace/markdown.d.ts +50 -0
  183. package/dist/workspace/markdown.d.ts.map +1 -0
  184. package/dist/workspace/markdown.js +210 -0
  185. package/dist/workspace/markdown.js.map +1 -0
  186. package/dist/workspace/types.d.ts +173 -0
  187. package/dist/workspace/types.d.ts.map +1 -0
  188. package/dist/workspace/types.js +2 -0
  189. package/dist/workspace/types.js.map +1 -0
  190. package/openspec/AGENTS.md +456 -0
  191. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/proposal.md +33 -0
  192. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/specs/webtest-resources/spec.md +27 -0
  193. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/specs/webtest-tools/spec.md +304 -0
  194. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/tasks.md +43 -0
  195. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/design.md +209 -0
  196. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/proposal.md +41 -0
  197. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/specs/mcp-server-core/spec.md +183 -0
  198. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/tasks.md +112 -0
  199. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/design.md +333 -0
  200. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/proposal.md +66 -0
  201. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/mcp-server-core/spec.md +129 -0
  202. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-lifecycle/spec.md +138 -0
  203. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-logging/spec.md +211 -0
  204. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-prompts/spec.md +157 -0
  205. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-resources/spec.md +213 -0
  206. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-sampling/spec.md +257 -0
  207. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-tools/spec.md +501 -0
  208. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/tasks.md +264 -0
  209. package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/proposal.md +24 -0
  210. package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/specs/webtest-tools/spec.md +80 -0
  211. package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/tasks.md +8 -0
  212. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/design.md +90 -0
  213. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/proposal.md +28 -0
  214. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/specs/webtest-sampling/spec.md +90 -0
  215. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/tasks.md +33 -0
  216. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/design.md +558 -0
  217. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/proposal.md +119 -0
  218. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/specs/webtest-resources/spec.md +109 -0
  219. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/specs/webtest-tools/spec.md +121 -0
  220. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/tasks.md +133 -0
  221. package/openspec/changes/extract-prompts-to-markdown/design.md +86 -0
  222. package/openspec/changes/extract-prompts-to-markdown/proposal.md +50 -0
  223. package/openspec/changes/extract-prompts-to-markdown/specs/webtest-prompts/spec.md +74 -0
  224. package/openspec/changes/extract-prompts-to-markdown/tasks.md +40 -0
  225. package/openspec/changes/refactor-webtest-naming/design.md +95 -0
  226. package/openspec/changes/refactor-webtest-naming/proposal.md +66 -0
  227. package/openspec/changes/refactor-webtest-naming/specs/webtest-prompts/spec.md +79 -0
  228. package/openspec/changes/refactor-webtest-naming/specs/webtest-resources/spec.md +80 -0
  229. package/openspec/changes/refactor-webtest-naming/specs/webtest-sampling/spec.md +122 -0
  230. package/openspec/changes/refactor-webtest-naming/specs/webtest-tools/spec.md +113 -0
  231. package/openspec/changes/refactor-webtest-naming/tasks.md +119 -0
  232. package/openspec/changes/rename-package-to-retest/proposal.md +52 -0
  233. package/openspec/changes/rename-package-to-retest/specs/mcp-server-core/spec.md +53 -0
  234. package/openspec/changes/rename-package-to-retest/specs/retest-lifecycle/spec.md +68 -0
  235. package/openspec/changes/rename-package-to-retest/specs/retest-logging/spec.md +35 -0
  236. package/openspec/changes/rename-package-to-retest/specs/retest-prompts/spec.md +159 -0
  237. package/openspec/changes/rename-package-to-retest/specs/retest-resources/spec.md +251 -0
  238. package/openspec/changes/rename-package-to-retest/specs/retest-sampling/spec.md +99 -0
  239. package/openspec/changes/rename-package-to-retest/specs/retest-tools/spec.md +295 -0
  240. package/openspec/changes/rename-package-to-retest/tasks.md +71 -0
  241. package/openspec/project.md +31 -0
  242. package/openspec/specs/mcp-server-core/spec.md +178 -0
  243. package/openspec/specs/webtest-lifecycle/spec.md +136 -0
  244. package/openspec/specs/webtest-logging/spec.md +209 -0
  245. package/openspec/specs/webtest-prompts/spec.md +155 -0
  246. package/openspec/specs/webtest-resources/spec.md +248 -0
  247. package/openspec/specs/webtest-sampling/spec.md +344 -0
  248. package/openspec/specs/webtest-tools/spec.md +282 -0
  249. package/package.json +54 -0
  250. package/release.config.js +9 -0
  251. package/src/config.test.ts +96 -0
  252. package/src/config.ts +32 -0
  253. package/src/elicitation/index.test.ts +399 -0
  254. package/src/elicitation/index.ts +171 -0
  255. package/src/elicitation/types.ts +68 -0
  256. package/src/index.ts +83 -0
  257. package/src/lifecycle/index.test.ts +260 -0
  258. package/src/lifecycle/index.ts +101 -0
  259. package/src/logger.redaction.test.ts +322 -0
  260. package/src/logger.test.ts +123 -0
  261. package/src/logger.ts +229 -0
  262. package/src/playwright-client/index.ts +392 -0
  263. package/src/playwright-client/types.ts +99 -0
  264. package/src/progress/index.test.ts +327 -0
  265. package/src/progress/index.ts +170 -0
  266. package/src/progress/types.ts +25 -0
  267. package/src/prompts/index.test.ts +451 -0
  268. package/src/prompts/index.ts +246 -0
  269. package/src/prompts/loader.test.ts +100 -0
  270. package/src/prompts/loader.ts +59 -0
  271. package/src/prompts/templates/mcp/webtest-crawl.md +7 -0
  272. package/src/prompts/templates/mcp/webtest-discover-flows.md +11 -0
  273. package/src/prompts/templates/mcp/webtest-discover.md +12 -0
  274. package/src/prompts/templates/mcp/webtest-full-workflow.md +12 -0
  275. package/src/prompts/templates/mcp/webtest-generate-tests.md +11 -0
  276. package/src/prompts/templates/mcp/webtest-run-test.md +11 -0
  277. package/src/prompts/templates/mcp/webtest-start.md +8 -0
  278. package/src/prompts/templates/sampling/crawl-action.md +35 -0
  279. package/src/prompts/templates/sampling/feature-discovery.md +27 -0
  280. package/src/prompts/templates/sampling/flow-discovery.md +29 -0
  281. package/src/prompts/templates/sampling/page-content-wrapper.md +5 -0
  282. package/src/prompts/templates/sampling/system-prefix.md +12 -0
  283. package/src/prompts/templates/sampling/test-evaluation.md +17 -0
  284. package/src/prompts/templates/sampling/test-generation.md +31 -0
  285. package/src/resources/index.ts +250 -0
  286. package/src/resources/subscriptions.ts +37 -0
  287. package/src/sampling/index.test.ts +414 -0
  288. package/src/sampling/index.ts +286 -0
  289. package/src/sampling/prompts.ts +194 -0
  290. package/src/sampling/types.ts +60 -0
  291. package/src/schemas/config.ts +39 -0
  292. package/src/security/index.test.ts +441 -0
  293. package/src/security/index.ts +361 -0
  294. package/src/security/security-scenarios.test.ts +468 -0
  295. package/src/server.ts +211 -0
  296. package/src/test-utils/index.ts +6 -0
  297. package/src/test-utils/mock-context.ts +426 -0
  298. package/src/test-utils/mock-playwright-client.ts +422 -0
  299. package/src/tools/index.ts +11 -0
  300. package/src/tools/webtest/crawl.test.ts +834 -0
  301. package/src/tools/webtest/crawl.ts +901 -0
  302. package/src/tools/webtest/discover-features.ts +412 -0
  303. package/src/tools/webtest/discover-flows.ts +408 -0
  304. package/src/tools/webtest/generate-tests.test.ts +532 -0
  305. package/src/tools/webtest/generate-tests.ts +425 -0
  306. package/src/tools/webtest/index.ts +7 -0
  307. package/src/tools/webtest/integration.test.ts +536 -0
  308. package/src/tools/webtest/run-test-case.test.ts +659 -0
  309. package/src/tools/webtest/run-test-case.ts +508 -0
  310. package/src/tools/webtest/schemas.ts +201 -0
  311. package/src/tools/webtest/start-analysis.test.ts +151 -0
  312. package/src/tools/webtest/start-analysis.ts +158 -0
  313. package/src/transports/http.ts +19 -0
  314. package/src/transports/index.ts +30 -0
  315. package/src/transports/stdio.ts +7 -0
  316. package/src/types/capabilities.test.ts +193 -0
  317. package/src/types/capabilities.ts +50 -0
  318. package/src/types/context.ts +21 -0
  319. package/src/types/tool.ts +11 -0
  320. package/src/workspace/index.ts +945 -0
  321. package/src/workspace/markdown.ts +272 -0
  322. package/src/workspace/types.ts +186 -0
  323. package/tests/integration/server.test.ts +89 -0
  324. package/tests/integration/tools.test.ts +99 -0
  325. package/tsconfig.json +20 -0
  326. package/vitest.config.ts +9 -0
  327. package/vitest.integration.config.ts +10 -0
@@ -0,0 +1,364 @@
1
+ import { z } from "zod";
2
+ import matter from "gray-matter";
3
+ import { buildTestGenerationPrompt } from "../../sampling/prompts.js";
4
+ import { TestGenerationSchema, AnalysisIdSchema } from "./schemas.js";
5
+ export const generateTestsInputSchema = z.object({
6
+ analysisId: AnalysisIdSchema,
7
+ appAnalysisUri: z
8
+ .string()
9
+ .optional()
10
+ .describe("URI of the app analysis resource. If not provided, uses the latest analysis."),
11
+ testStrategy: z
12
+ .enum(["comprehensive", "happy_path", "edge_cases", "critical_paths"])
13
+ .default("comprehensive")
14
+ .describe("Test generation strategy"),
15
+ focusFlows: z
16
+ .array(z.string())
17
+ .optional()
18
+ .describe("Specific flow IDs to focus test generation on"),
19
+ maxTests: z
20
+ .number()
21
+ .int()
22
+ .min(1)
23
+ .max(50)
24
+ .default(20)
25
+ .describe("Maximum number of test cases to generate"),
26
+ manualTests: z
27
+ .object({
28
+ tests: z.array(z.object({
29
+ id: z.string(),
30
+ name: z.string(),
31
+ purpose: z.string(),
32
+ category: z.enum(["happy_path", "edge_case", "error_handling", "boundary"]),
33
+ preconditions: z.array(z.string()),
34
+ steps: z.array(z.object({
35
+ stepNumber: z.number().int(),
36
+ action: z.string(),
37
+ target: z.string().optional(),
38
+ value: z.string().optional(),
39
+ expected: z.string().optional(),
40
+ element: z.string().optional(),
41
+ ref: z.string().optional(),
42
+ })),
43
+ expectedOutcomes: z.array(z.string()),
44
+ tags: z.array(z.string()).optional(),
45
+ })),
46
+ coverage: z.object({
47
+ flowsCovered: z.array(z.string()),
48
+ estimatedCoverage: z.string(),
49
+ }),
50
+ })
51
+ .optional()
52
+ .describe("Manual test generation result when sampling is unavailable. Provide this after executing the returned prompt."),
53
+ });
54
+ export function createGenerateTestsTool(getContext) {
55
+ return {
56
+ name: "webtest_generate_tests",
57
+ description: `Generate test cases from application analysis.
58
+
59
+ This tool creates structured test cases based on the app analysis:
60
+ - Generates tests for identified user flows
61
+ - Covers happy paths, edge cases, and error conditions
62
+ - Creates step-by-step test instructions
63
+ - Defines expected outcomes for each test
64
+
65
+ Requires a completed app analysis. If sampling is unavailable, returns a prompt for manual execution.`,
66
+ inputSchema: generateTestsInputSchema,
67
+ async handler(input) {
68
+ const ctx = getContext();
69
+ const { logger, workspaceManager, samplingClient, resourceManager } = ctx;
70
+ const testLogger = logger.withCorrelation({
71
+ analysisId: input.analysisId,
72
+ });
73
+ testLogger.info("Starting test generation", {
74
+ strategy: input.testStrategy,
75
+ maxTests: input.maxTests,
76
+ });
77
+ try {
78
+ // Validate workspace exists
79
+ if (!(await workspaceManager.workspaceExists(input.analysisId))) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: `Error: Analysis workspace "${input.analysisId}" not found.`,
85
+ },
86
+ ],
87
+ isError: true,
88
+ };
89
+ }
90
+ const workspace = await workspaceManager.readWorkspaceIndex(input.analysisId);
91
+ // Check for features
92
+ if (!workspace.features) {
93
+ return {
94
+ content: [
95
+ {
96
+ type: "text",
97
+ text: "Error: No features found. Run webtest_discover_features first.",
98
+ },
99
+ ],
100
+ isError: true,
101
+ };
102
+ }
103
+ // Load features data
104
+ const featuresUri = input.appAnalysisUri || workspace.features.featuresUri;
105
+ let featuresContent;
106
+ let allFlows = [];
107
+ try {
108
+ const featuresData = await resourceManager.readResource(featuresUri);
109
+ featuresContent = featuresData.text || "";
110
+ // Load flows from all feature flow files
111
+ if (workspace.featureFlows) {
112
+ for (const flowRef of workspace.featureFlows) {
113
+ try {
114
+ const flowsContent = await resourceManager.readResource(flowRef.flowsUri);
115
+ const { data } = matter(flowsContent.text || "");
116
+ allFlows.push({
117
+ featureSlug: flowRef.featureSlug,
118
+ flows: data.flows || [],
119
+ });
120
+ }
121
+ catch {
122
+ // Flow file might not exist, skip
123
+ }
124
+ }
125
+ }
126
+ }
127
+ catch (error) {
128
+ return {
129
+ content: [
130
+ {
131
+ type: "text",
132
+ text: `Error loading features data: ${error instanceof Error ? error.message : "Unknown error"}`,
133
+ },
134
+ ],
135
+ isError: true,
136
+ };
137
+ }
138
+ // Flatten flows for backward compatibility
139
+ const flowsData = {
140
+ flows: allFlows.flatMap(f => f.flows),
141
+ entities: workspace.features.features.flatMap(f => f.entities),
142
+ };
143
+ // Filter flows if specific ones requested
144
+ let targetFlows = flowsData.flows;
145
+ if (input.focusFlows && input.focusFlows.length > 0) {
146
+ targetFlows = flowsData.flows.filter((f) => input.focusFlows.includes(f.id));
147
+ }
148
+ testLogger.info("Generating tests", {
149
+ flowCount: targetFlows.length,
150
+ strategy: input.testStrategy,
151
+ });
152
+ // Build strategy description
153
+ let strategyDescription;
154
+ switch (input.testStrategy) {
155
+ case "happy_path":
156
+ strategyDescription =
157
+ "Focus on successful user journeys. Test the main flows with valid inputs.";
158
+ break;
159
+ case "edge_cases":
160
+ strategyDescription =
161
+ "Focus on boundary conditions, unusual inputs, and corner cases.";
162
+ break;
163
+ case "critical_paths":
164
+ strategyDescription =
165
+ "Focus on business-critical functionality and high-risk areas.";
166
+ break;
167
+ case "comprehensive":
168
+ default:
169
+ strategyDescription =
170
+ "Generate a comprehensive test suite covering happy paths, edge cases, and error handling.";
171
+ }
172
+ // Determine test source: manual input, sampling, or fallback prompt
173
+ let testGeneration;
174
+ if (input.manualTests) {
175
+ // Use manually provided tests (from fallback mode)
176
+ testLogger.info("Using manual tests input");
177
+ testGeneration = input.manualTests;
178
+ }
179
+ else if (!samplingClient.hasSampling()) {
180
+ // No sampling available and no manual input - return prompt for manual execution
181
+ const prompt = buildTestGenerationPrompt({
182
+ appAnalysis: featuresContent,
183
+ flows: JSON.stringify(targetFlows, null, 2),
184
+ strategy: strategyDescription,
185
+ });
186
+ return {
187
+ content: [
188
+ {
189
+ type: "text",
190
+ text: JSON.stringify({
191
+ needsManualInput: true,
192
+ analysisId: input.analysisId,
193
+ prompt,
194
+ expectedResponseSchema: TestGenerationSchema._def,
195
+ instructions: "Execute this prompt with your LLM, then call webtest_generate_tests again with the result in the 'manualTests' parameter",
196
+ }, null, 2),
197
+ },
198
+ ],
199
+ };
200
+ }
201
+ else {
202
+ // Request test generation via sampling
203
+ const samplingResult = await samplingClient.createMessage({
204
+ systemPrompt: `You are a QA engineer generating test cases for a web application.
205
+ Generate ${input.maxTests} or fewer high-quality test cases based on the analysis.
206
+ Each test case should be actionable and specific.`,
207
+ userPrompt: buildTestGenerationPrompt({
208
+ appAnalysis: featuresContent,
209
+ flows: JSON.stringify(targetFlows, null, 2),
210
+ strategy: strategyDescription,
211
+ }),
212
+ schema: TestGenerationSchema,
213
+ maxTokens: 8192,
214
+ });
215
+ if (!samplingResult.success || !samplingResult.data) {
216
+ testLogger.error("Test generation sampling failed", {
217
+ error: samplingResult.error,
218
+ });
219
+ return {
220
+ content: [
221
+ {
222
+ type: "text",
223
+ text: `Error during test generation: ${samplingResult.error}`,
224
+ },
225
+ ],
226
+ isError: true,
227
+ };
228
+ }
229
+ testGeneration = samplingResult.data;
230
+ }
231
+ // Limit to maxTests
232
+ const tests = testGeneration.tests.slice(0, input.maxTests);
233
+ // Generate markdown report
234
+ const markdownReport = generateTestsMarkdown(tests, workspace, input.testStrategy);
235
+ // Create frontmatter with test data
236
+ const testsFrontmatter = {
237
+ tests,
238
+ coverage: testGeneration.coverage,
239
+ strategy: input.testStrategy,
240
+ generatedAt: new Date().toISOString(),
241
+ };
242
+ // Save tests as single markdown file with frontmatter
243
+ const { testsFilePath, testsUri, testCount } = await workspaceManager.saveTests(input.analysisId, {
244
+ markdown: markdownReport,
245
+ frontmatter: testsFrontmatter,
246
+ });
247
+ await resourceManager.notifyListChanged();
248
+ // Categorize tests
249
+ const categories = {
250
+ happy_path: tests.filter((t) => t.category === "happy_path").length,
251
+ edge_case: tests.filter((t) => t.category === "edge_case").length,
252
+ error_handling: tests.filter((t) => t.category === "error_handling").length,
253
+ boundary: tests.filter((t) => t.category === "boundary").length,
254
+ };
255
+ const result = {
256
+ analysisId: input.analysisId,
257
+ testsFilePath,
258
+ testsUri,
259
+ testCount,
260
+ strategy: input.testStrategy,
261
+ categories,
262
+ coverage: testGeneration.coverage,
263
+ testSummary: tests.map((t) => ({
264
+ id: t.id,
265
+ name: t.name,
266
+ category: t.category,
267
+ stepCount: t.steps.length,
268
+ })),
269
+ nextSteps: [
270
+ `Use webtest_run_tests to execute individual tests`,
271
+ `Review generated tests at ${testsUri}`,
272
+ tests.length > 0
273
+ ? `First test to run: ${tests[0].id} - ${tests[0].name}`
274
+ : "",
275
+ ].filter(Boolean),
276
+ };
277
+ testLogger.info("Test generation completed", {
278
+ testCount,
279
+ categories,
280
+ });
281
+ return {
282
+ content: [
283
+ {
284
+ type: "text",
285
+ text: JSON.stringify(result, null, 2),
286
+ },
287
+ ],
288
+ };
289
+ }
290
+ catch (error) {
291
+ const message = error instanceof Error ? error.message : "Unknown error";
292
+ testLogger.error("Test generation failed", { error: message });
293
+ return {
294
+ content: [
295
+ {
296
+ type: "text",
297
+ text: `Error during test generation: ${message}`,
298
+ },
299
+ ],
300
+ isError: true,
301
+ };
302
+ }
303
+ },
304
+ };
305
+ }
306
+ function generateTestsMarkdown(tests, workspace, strategy) {
307
+ let md = `# Test Cases: ${workspace.domain}
308
+
309
+ ## Overview
310
+
311
+ - **Target URL**: ${workspace.url}
312
+ - **Strategy**: ${strategy}
313
+ - **Total Tests**: ${tests.length}
314
+
315
+ ## Test Cases
316
+
317
+ `;
318
+ for (const test of tests) {
319
+ md += `### ${test.id}: ${test.name}
320
+
321
+ **Category**: ${test.category}
322
+ **Purpose**: ${test.purpose}
323
+
324
+ `;
325
+ if (test.preconditions.length > 0) {
326
+ md += `**Preconditions**:
327
+ `;
328
+ for (const pre of test.preconditions) {
329
+ md += `- ${pre}\n`;
330
+ }
331
+ md += "\n";
332
+ }
333
+ md += `**Steps**:
334
+ `;
335
+ for (const step of test.steps) {
336
+ let stepText = `${step.stepNumber}. ${step.action}`;
337
+ if (step.target) {
338
+ stepText += ` on "${step.target}"`;
339
+ }
340
+ if (step.value) {
341
+ stepText += ` with value "${step.value}"`;
342
+ }
343
+ md += stepText + "\n";
344
+ if (step.expected) {
345
+ md += ` - *Expected*: ${step.expected}\n`;
346
+ }
347
+ }
348
+ md += `
349
+ **Expected Outcomes**:
350
+ `;
351
+ for (const outcome of test.expectedOutcomes) {
352
+ md += `- ${outcome}\n`;
353
+ }
354
+ if (test.tags && test.tags.length > 0) {
355
+ md += `\n**Tags**: ${test.tags.join(", ")}\n`;
356
+ }
357
+ md += "\n---\n\n";
358
+ }
359
+ md += `
360
+ *Generated by testing-mcp*
361
+ `;
362
+ return md;
363
+ }
364
+ //# sourceMappingURL=generate-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../../src/tools/webtest/generate-tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./schemas.js";
2
+ export * from "./start-analysis.js";
3
+ export * from "./crawl.js";
4
+ export * from "./discover-features.js";
5
+ export * from "./discover-flows.js";
6
+ export * from "./generate-tests.js";
7
+ export * from "./run-test-case.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/webtest/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./schemas.js";
2
+ export * from "./start-analysis.js";
3
+ export * from "./crawl.js";
4
+ export * from "./discover-features.js";
5
+ export * from "./discover-flows.js";
6
+ export * from "./generate-tests.js";
7
+ export * from "./run-test-case.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/webtest/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import type { McpTool } from "../../types/tool.js";
3
+ import type { ServerContext } from "../../types/context.js";
4
+ import type { WorkspaceManager } from "../../workspace/index.js";
5
+ import type { PlaywrightClient } from "../../playwright-client/index.js";
6
+ import type { SamplingClient } from "../../sampling/index.js";
7
+ import type { CancellationRegistry, ProgressEmitter } from "../../progress/index.js";
8
+ import type { ResourceManager } from "../../resources/index.js";
9
+ export declare const runTestCaseInputSchema: z.ZodObject<{
10
+ analysisId: z.ZodString;
11
+ testCaseId: z.ZodString;
12
+ testsUri: z.ZodOptional<z.ZodString>;
13
+ runOptions: z.ZodOptional<z.ZodObject<{
14
+ captureEvidence: z.ZodDefault<z.ZodBoolean>;
15
+ stopOnFailure: z.ZodDefault<z.ZodBoolean>;
16
+ retryFailedSteps: z.ZodDefault<z.ZodBoolean>;
17
+ }, z.core.$strip>>;
18
+ }, z.core.$strip>;
19
+ export type RunTestCaseInput = z.infer<typeof runTestCaseInputSchema>;
20
+ export declare function createRunTestCaseTool(getContext: () => ServerContext & {
21
+ workspaceManager: WorkspaceManager;
22
+ playwrightClient: PlaywrightClient;
23
+ samplingClient: SamplingClient;
24
+ cancellationRegistry: CancellationRegistry;
25
+ progressEmitter: ProgressEmitter;
26
+ resourceManager: ResourceManager;
27
+ }): McpTool<RunTestCaseInput>;
28
+ //# sourceMappingURL=run-test-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-test-case.d.ts","sourceRoot":"","sources":["../../../src/tools/webtest/run-test-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAA4B,MAAM,0BAA0B,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE,eAAO,MAAM,sBAAsB;;;;;;;;;iBAejC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,aAAa,GAAG;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,cAAc,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;CAClC,GACA,OAAO,CAAC,gBAAgB,CAAC,CAoZ3B"}