swipium 1.0.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 (387) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/appMap/automationLink.js +74 -0
  4. package/dist/appMap/automationLink.js.map +1 -0
  5. package/dist/appMap/build.js +193 -0
  6. package/dist/appMap/build.js.map +1 -0
  7. package/dist/appMap/codeIndex.js +73 -0
  8. package/dist/appMap/codeIndex.js.map +1 -0
  9. package/dist/appMap/featureModel.js +83 -0
  10. package/dist/appMap/featureModel.js.map +1 -0
  11. package/dist/appMap/firstRunApply.js +131 -0
  12. package/dist/appMap/firstRunApply.js.map +1 -0
  13. package/dist/appMap/fsWalk.js +75 -0
  14. package/dist/appMap/fsWalk.js.map +1 -0
  15. package/dist/appMap/issues.js +227 -0
  16. package/dist/appMap/issues.js.map +1 -0
  17. package/dist/appMap/migrations.js +87 -0
  18. package/dist/appMap/migrations.js.map +1 -0
  19. package/dist/appMap/prelaunch.js +66 -0
  20. package/dist/appMap/prelaunch.js.map +1 -0
  21. package/dist/appMap/projectRegistry.js +70 -0
  22. package/dist/appMap/projectRegistry.js.map +1 -0
  23. package/dist/appMap/provenance.js +52 -0
  24. package/dist/appMap/provenance.js.map +1 -0
  25. package/dist/appMap/query.js +118 -0
  26. package/dist/appMap/query.js.map +1 -0
  27. package/dist/appMap/runtimeMerge.js +207 -0
  28. package/dist/appMap/runtimeMerge.js.map +1 -0
  29. package/dist/appMap/schema.js +65 -0
  30. package/dist/appMap/schema.js.map +1 -0
  31. package/dist/appMap/screenMatch.js +75 -0
  32. package/dist/appMap/screenMatch.js.map +1 -0
  33. package/dist/appMap/staticScan.js +614 -0
  34. package/dist/appMap/staticScan.js.map +1 -0
  35. package/dist/appMap/store.js +173 -0
  36. package/dist/appMap/store.js.map +1 -0
  37. package/dist/appMap/tsAstScan.js +184 -0
  38. package/dist/appMap/tsAstScan.js.map +1 -0
  39. package/dist/artifacts/bundletool.js +199 -0
  40. package/dist/artifacts/bundletool.js.map +1 -0
  41. package/dist/artifacts/resolve.js +388 -0
  42. package/dist/artifacts/resolve.js.map +1 -0
  43. package/dist/automationGen/appiumModel.js +129 -0
  44. package/dist/automationGen/appiumModel.js.map +1 -0
  45. package/dist/automationGen/ciEmitter.js +80 -0
  46. package/dist/automationGen/ciEmitter.js.map +1 -0
  47. package/dist/automationGen/jsEmitter.js +440 -0
  48. package/dist/automationGen/jsEmitter.js.map +1 -0
  49. package/dist/automationGen/packagePatch.js +56 -0
  50. package/dist/automationGen/packagePatch.js.map +1 -0
  51. package/dist/automationGen/projectProfile.js +317 -0
  52. package/dist/automationGen/projectProfile.js.map +1 -0
  53. package/dist/automationGen/pythonEmitter.js +386 -0
  54. package/dist/automationGen/pythonEmitter.js.map +1 -0
  55. package/dist/automationGen/readmeEmitter.js +66 -0
  56. package/dist/automationGen/readmeEmitter.js.map +1 -0
  57. package/dist/automationGen/suitePlan.js +94 -0
  58. package/dist/automationGen/suitePlan.js.map +1 -0
  59. package/dist/automationGen/validation.js +150 -0
  60. package/dist/automationGen/validation.js.map +1 -0
  61. package/dist/build/parseBuildLog.js +119 -0
  62. package/dist/build/parseBuildLog.js.map +1 -0
  63. package/dist/build/plan.js +150 -0
  64. package/dist/build/plan.js.map +1 -0
  65. package/dist/ci/preflight.js +85 -0
  66. package/dist/ci/preflight.js.map +1 -0
  67. package/dist/cli/init.js +105 -0
  68. package/dist/cli/init.js.map +1 -0
  69. package/dist/cli/scan.js +85 -0
  70. package/dist/cli/scan.js.map +1 -0
  71. package/dist/cli/suite.js +85 -0
  72. package/dist/cli/suite.js.map +1 -0
  73. package/dist/cli/verify.js +62 -0
  74. package/dist/cli/verify.js.map +1 -0
  75. package/dist/consent/consent.js +43 -0
  76. package/dist/consent/consent.js.map +1 -0
  77. package/dist/context/detect.js +156 -0
  78. package/dist/context/detect.js.map +1 -0
  79. package/dist/context/findApps.js +198 -0
  80. package/dist/context/findApps.js.map +1 -0
  81. package/dist/context/projectRoot.js +41 -0
  82. package/dist/context/projectRoot.js.map +1 -0
  83. package/dist/context/scan.js +167 -0
  84. package/dist/context/scan.js.map +1 -0
  85. package/dist/core/target.js +115 -0
  86. package/dist/core/target.js.map +1 -0
  87. package/dist/core/targetPlan.js +140 -0
  88. package/dist/core/targetPlan.js.map +1 -0
  89. package/dist/drivers/DirectDriver.js +228 -0
  90. package/dist/drivers/DirectDriver.js.map +1 -0
  91. package/dist/drivers/Driver.js +4 -0
  92. package/dist/drivers/Driver.js.map +1 -0
  93. package/dist/drivers/SimctlDriver.js +127 -0
  94. package/dist/drivers/SimctlDriver.js.map +1 -0
  95. package/dist/drivers/WdaDriver.js +250 -0
  96. package/dist/drivers/WdaDriver.js.map +1 -0
  97. package/dist/explore/candidates.js +93 -0
  98. package/dist/explore/candidates.js.map +1 -0
  99. package/dist/explore/graph.js +116 -0
  100. package/dist/explore/graph.js.map +1 -0
  101. package/dist/explore/memory.js +35 -0
  102. package/dist/explore/memory.js.map +1 -0
  103. package/dist/explore/planner.js +105 -0
  104. package/dist/explore/planner.js.map +1 -0
  105. package/dist/explore/policy.js +85 -0
  106. package/dist/explore/policy.js.map +1 -0
  107. package/dist/explore/runner.js +475 -0
  108. package/dist/explore/runner.js.map +1 -0
  109. package/dist/explore/signatures.js +35 -0
  110. package/dist/explore/signatures.js.map +1 -0
  111. package/dist/explore/suite.js +55 -0
  112. package/dist/explore/suite.js.map +1 -0
  113. package/dist/featureTesting/executionBootstrap.js +140 -0
  114. package/dist/featureTesting/executionBootstrap.js.map +1 -0
  115. package/dist/firstRun/authStateMachine.js +83 -0
  116. package/dist/firstRun/authStateMachine.js.map +1 -0
  117. package/dist/firstRun/classifyScreen.js +201 -0
  118. package/dist/firstRun/classifyScreen.js.map +1 -0
  119. package/dist/firstRun/firstRunPlanner.js +207 -0
  120. package/dist/firstRun/firstRunPlanner.js.map +1 -0
  121. package/dist/firstRun/firstRunRunner.js +331 -0
  122. package/dist/firstRun/firstRunRunner.js.map +1 -0
  123. package/dist/firstRun/generatedDataPolicy.js +215 -0
  124. package/dist/firstRun/generatedDataPolicy.js.map +1 -0
  125. package/dist/firstRun/inputPlanner.js +67 -0
  126. package/dist/firstRun/inputPlanner.js.map +1 -0
  127. package/dist/firstRun/onboardingStateMachine.js +46 -0
  128. package/dist/firstRun/onboardingStateMachine.js.map +1 -0
  129. package/dist/firstRun/paywallPolicy.js +54 -0
  130. package/dist/firstRun/paywallPolicy.js.map +1 -0
  131. package/dist/firstRun/types.js +7 -0
  132. package/dist/firstRun/types.js.map +1 -0
  133. package/dist/fixtures/catalog.js +131 -0
  134. package/dist/fixtures/catalog.js.map +1 -0
  135. package/dist/flows/discover.js +18 -0
  136. package/dist/flows/discover.js.map +1 -0
  137. package/dist/flows/generate.js +211 -0
  138. package/dist/flows/generate.js.map +1 -0
  139. package/dist/flows/lint.js +97 -0
  140. package/dist/flows/lint.js.map +1 -0
  141. package/dist/flows/pack.js +68 -0
  142. package/dist/flows/pack.js.map +1 -0
  143. package/dist/flows/run.js +738 -0
  144. package/dist/flows/run.js.map +1 -0
  145. package/dist/flows/schema.js +240 -0
  146. package/dist/flows/schema.js.map +1 -0
  147. package/dist/flows/seedExec.js +108 -0
  148. package/dist/flows/seedExec.js.map +1 -0
  149. package/dist/flows/templates.js +155 -0
  150. package/dist/flows/templates.js.map +1 -0
  151. package/dist/flows/waitGuards.js +12 -0
  152. package/dist/flows/waitGuards.js.map +1 -0
  153. package/dist/index.js +33 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/ios/signing.js +182 -0
  156. package/dist/ios/signing.js.map +1 -0
  157. package/dist/issues/classify.js +186 -0
  158. package/dist/issues/classify.js.map +1 -0
  159. package/dist/issues/fingerprint.js +130 -0
  160. package/dist/issues/fingerprint.js.map +1 -0
  161. package/dist/issues/index.js +240 -0
  162. package/dist/issues/index.js.map +1 -0
  163. package/dist/issues/metrics.js +155 -0
  164. package/dist/issues/metrics.js.map +1 -0
  165. package/dist/issues/recurrence.js +193 -0
  166. package/dist/issues/recurrence.js.map +1 -0
  167. package/dist/issues/report.js +110 -0
  168. package/dist/issues/report.js.map +1 -0
  169. package/dist/issues/reportBridge.js +119 -0
  170. package/dist/issues/reportBridge.js.map +1 -0
  171. package/dist/issues/schema.js +90 -0
  172. package/dist/issues/schema.js.map +1 -0
  173. package/dist/issues/sourceRevision.js +108 -0
  174. package/dist/issues/sourceRevision.js.map +1 -0
  175. package/dist/issues/store.js +155 -0
  176. package/dist/issues/store.js.map +1 -0
  177. package/dist/lib/android.js +278 -0
  178. package/dist/lib/android.js.map +1 -0
  179. package/dist/lib/commandTemplate.js +55 -0
  180. package/dist/lib/commandTemplate.js.map +1 -0
  181. package/dist/lib/coordSpace.js +23 -0
  182. package/dist/lib/coordSpace.js.map +1 -0
  183. package/dist/lib/device.js +87 -0
  184. package/dist/lib/device.js.map +1 -0
  185. package/dist/lib/gitignore.js +22 -0
  186. package/dist/lib/gitignore.js.map +1 -0
  187. package/dist/lib/image.js +97 -0
  188. package/dist/lib/image.js.map +1 -0
  189. package/dist/lib/logger.js +8 -0
  190. package/dist/lib/logger.js.map +1 -0
  191. package/dist/lib/metroState.js +45 -0
  192. package/dist/lib/metroState.js.map +1 -0
  193. package/dist/lib/needsInput.js +201 -0
  194. package/dist/lib/needsInput.js.map +1 -0
  195. package/dist/lib/png.js +103 -0
  196. package/dist/lib/png.js.map +1 -0
  197. package/dist/lib/redact.js +21 -0
  198. package/dist/lib/redact.js.map +1 -0
  199. package/dist/lib/result.js +87 -0
  200. package/dist/lib/result.js.map +1 -0
  201. package/dist/lib/schemaHash.js +65 -0
  202. package/dist/lib/schemaHash.js.map +1 -0
  203. package/dist/lib/sensitive.js +13 -0
  204. package/dist/lib/sensitive.js.map +1 -0
  205. package/dist/lib/simctl.js +149 -0
  206. package/dist/lib/simctl.js.map +1 -0
  207. package/dist/lib/spawn.js +144 -0
  208. package/dist/lib/spawn.js.map +1 -0
  209. package/dist/lib/wda.js +347 -0
  210. package/dist/lib/wda.js.map +1 -0
  211. package/dist/lib/wdaConfig.js +69 -0
  212. package/dist/lib/wdaConfig.js.map +1 -0
  213. package/dist/lib/wdaTune.js +58 -0
  214. package/dist/lib/wdaTune.js.map +1 -0
  215. package/dist/oracle/auth.js +22 -0
  216. package/dist/oracle/auth.js.map +1 -0
  217. package/dist/oracle/failures.js +193 -0
  218. package/dist/oracle/failures.js.map +1 -0
  219. package/dist/oracle/health.js +123 -0
  220. package/dist/oracle/health.js.map +1 -0
  221. package/dist/oracle/record.js +36 -0
  222. package/dist/oracle/record.js.map +1 -0
  223. package/dist/orchestration/envelope.js +52 -0
  224. package/dist/orchestration/envelope.js.map +1 -0
  225. package/dist/orchestration/goal.js +98 -0
  226. package/dist/orchestration/goal.js.map +1 -0
  227. package/dist/plan/plan.js +124 -0
  228. package/dist/plan/plan.js.map +1 -0
  229. package/dist/prompts/index.js +63 -0
  230. package/dist/prompts/index.js.map +1 -0
  231. package/dist/report/artifactManifest.js +44 -0
  232. package/dist/report/artifactManifest.js.map +1 -0
  233. package/dist/report/coverage.js +60 -0
  234. package/dist/report/coverage.js.map +1 -0
  235. package/dist/report/evidence.js +84 -0
  236. package/dist/report/evidence.js.map +1 -0
  237. package/dist/report/export.js +447 -0
  238. package/dist/report/export.js.map +1 -0
  239. package/dist/report/flake.js +61 -0
  240. package/dist/report/flake.js.map +1 -0
  241. package/dist/report/history.js +564 -0
  242. package/dist/report/history.js.map +1 -0
  243. package/dist/report/policy.js +98 -0
  244. package/dist/report/policy.js.map +1 -0
  245. package/dist/report/qaLevel.js +96 -0
  246. package/dist/report/qaLevel.js.map +1 -0
  247. package/dist/report/readiness.js +213 -0
  248. package/dist/report/readiness.js.map +1 -0
  249. package/dist/report/summary.js +42 -0
  250. package/dist/report/summary.js.map +1 -0
  251. package/dist/report/testCatalog.js +93 -0
  252. package/dist/report/testCatalog.js.map +1 -0
  253. package/dist/report/timing.js +37 -0
  254. package/dist/report/timing.js.map +1 -0
  255. package/dist/server.js +180 -0
  256. package/dist/server.js.map +1 -0
  257. package/dist/services/automationGenerate.js +60 -0
  258. package/dist/services/automationGenerate.js.map +1 -0
  259. package/dist/services/build.js +66 -0
  260. package/dist/services/build.js.map +1 -0
  261. package/dist/services/preflight.js +51 -0
  262. package/dist/services/preflight.js.map +1 -0
  263. package/dist/services/prepareAndroid.js +183 -0
  264. package/dist/services/prepareAndroid.js.map +1 -0
  265. package/dist/services/prepareIos.js +162 -0
  266. package/dist/services/prepareIos.js.map +1 -0
  267. package/dist/services/report.js +537 -0
  268. package/dist/services/report.js.map +1 -0
  269. package/dist/services/smoke.js +120 -0
  270. package/dist/services/smoke.js.map +1 -0
  271. package/dist/services/suiteGenerate.js +123 -0
  272. package/dist/services/suiteGenerate.js.map +1 -0
  273. package/dist/services/testSuiteKnowledge.js +150 -0
  274. package/dist/services/testSuiteKnowledge.js.map +1 -0
  275. package/dist/session/attach.js +47 -0
  276. package/dist/session/attach.js.map +1 -0
  277. package/dist/session/progress.js +56 -0
  278. package/dist/session/progress.js.map +1 -0
  279. package/dist/session/store.js +329 -0
  280. package/dist/session/store.js.map +1 -0
  281. package/dist/snapshot/overlays.js +132 -0
  282. package/dist/snapshot/overlays.js.map +1 -0
  283. package/dist/snapshot/parse.js +204 -0
  284. package/dist/snapshot/parse.js.map +1 -0
  285. package/dist/snapshot/present.js +12 -0
  286. package/dist/snapshot/present.js.map +1 -0
  287. package/dist/snapshot/settle.js +36 -0
  288. package/dist/snapshot/settle.js.map +1 -0
  289. package/dist/state/profile.js +318 -0
  290. package/dist/state/profile.js.map +1 -0
  291. package/dist/suite/compile.js +176 -0
  292. package/dist/suite/compile.js.map +1 -0
  293. package/dist/suite/lint.js +45 -0
  294. package/dist/suite/lint.js.map +1 -0
  295. package/dist/suite/pom.js +285 -0
  296. package/dist/suite/pom.js.map +1 -0
  297. package/dist/suite/testcase.js +87 -0
  298. package/dist/suite/testcase.js.map +1 -0
  299. package/dist/testSuite/generator.js +222 -0
  300. package/dist/testSuite/generator.js.map +1 -0
  301. package/dist/testSuite/history.js +44 -0
  302. package/dist/testSuite/history.js.map +1 -0
  303. package/dist/testSuite/issueLinks.js +96 -0
  304. package/dist/testSuite/issueLinks.js.map +1 -0
  305. package/dist/testSuite/merge.js +190 -0
  306. package/dist/testSuite/merge.js.map +1 -0
  307. package/dist/testSuite/schema.js +86 -0
  308. package/dist/testSuite/schema.js.map +1 -0
  309. package/dist/testSuite/store.js +116 -0
  310. package/dist/testSuite/store.js.map +1 -0
  311. package/dist/testSuite/traceability.js +55 -0
  312. package/dist/testSuite/traceability.js.map +1 -0
  313. package/dist/tools/act.js +457 -0
  314. package/dist/tools/act.js.map +1 -0
  315. package/dist/tools/agent.js +225 -0
  316. package/dist/tools/agent.js.map +1 -0
  317. package/dist/tools/appMap.js +317 -0
  318. package/dist/tools/appMap.js.map +1 -0
  319. package/dist/tools/assertVisual.js +74 -0
  320. package/dist/tools/assertVisual.js.map +1 -0
  321. package/dist/tools/automationGenerate.js +394 -0
  322. package/dist/tools/automationGenerate.js.map +1 -0
  323. package/dist/tools/capabilities.js +114 -0
  324. package/dist/tools/capabilities.js.map +1 -0
  325. package/dist/tools/clearOverlay.js +150 -0
  326. package/dist/tools/clearOverlay.js.map +1 -0
  327. package/dist/tools/detectContext.js +41 -0
  328. package/dist/tools/detectContext.js.map +1 -0
  329. package/dist/tools/doctor.js +116 -0
  330. package/dist/tools/doctor.js.map +1 -0
  331. package/dist/tools/explore.js +289 -0
  332. package/dist/tools/explore.js.map +1 -0
  333. package/dist/tools/firstRun.js +136 -0
  334. package/dist/tools/firstRun.js.map +1 -0
  335. package/dist/tools/flow.js +331 -0
  336. package/dist/tools/flow.js.map +1 -0
  337. package/dist/tools/flowGenerate.js +55 -0
  338. package/dist/tools/flowGenerate.js.map +1 -0
  339. package/dist/tools/getArtifact.js +39 -0
  340. package/dist/tools/getArtifact.js.map +1 -0
  341. package/dist/tools/health.js +41 -0
  342. package/dist/tools/health.js.map +1 -0
  343. package/dist/tools/ios.js +492 -0
  344. package/dist/tools/ios.js.map +1 -0
  345. package/dist/tools/jobs.js +20 -0
  346. package/dist/tools/jobs.js.map +1 -0
  347. package/dist/tools/network.js +50 -0
  348. package/dist/tools/network.js.map +1 -0
  349. package/dist/tools/note.js +69 -0
  350. package/dist/tools/note.js.map +1 -0
  351. package/dist/tools/plan.js +49 -0
  352. package/dist/tools/plan.js.map +1 -0
  353. package/dist/tools/prepareIosTarget.js +99 -0
  354. package/dist/tools/prepareIosTarget.js.map +1 -0
  355. package/dist/tools/prepareTarget.js +257 -0
  356. package/dist/tools/prepareTarget.js.map +1 -0
  357. package/dist/tools/report.js +42 -0
  358. package/dist/tools/report.js.map +1 -0
  359. package/dist/tools/screenRecord.js +24 -0
  360. package/dist/tools/screenRecord.js.map +1 -0
  361. package/dist/tools/screenshot.js +63 -0
  362. package/dist/tools/screenshot.js.map +1 -0
  363. package/dist/tools/smoke.js +39 -0
  364. package/dist/tools/smoke.js.map +1 -0
  365. package/dist/tools/snapshot.js +129 -0
  366. package/dist/tools/snapshot.js.map +1 -0
  367. package/dist/tools/startSession.js +169 -0
  368. package/dist/tools/startSession.js.map +1 -0
  369. package/dist/tools/state.js +87 -0
  370. package/dist/tools/state.js.map +1 -0
  371. package/dist/tools/suite.js +412 -0
  372. package/dist/tools/suite.js.map +1 -0
  373. package/dist/tools/testThis.js +774 -0
  374. package/dist/tools/testThis.js.map +1 -0
  375. package/dist/tools/wda.js +477 -0
  376. package/dist/tools/wda.js.map +1 -0
  377. package/dist/version.js +62 -0
  378. package/dist/version.js.map +1 -0
  379. package/dist/visual/ocr.js +72 -0
  380. package/dist/visual/ocr.js.map +1 -0
  381. package/dist/visual/provider.js +75 -0
  382. package/dist/visual/provider.js.map +1 -0
  383. package/docs/README.md +19 -0
  384. package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
  385. package/docs/mcp-server.md +135 -0
  386. package/docs/tools.md +130 -0
  387. package/package.json +70 -0
@@ -0,0 +1,412 @@
1
+ // qa_suite_generate / qa_testcase_generate / qa_suite_compile.
2
+ //
3
+ // These turn the actions recorded during a session (qa_act) into a MAINTAINABLE POM suite under
4
+ // .swipium/ — page objects (selectors), tests (reference elements by name), a suite, a test-case
5
+ // catalog, and a locator audit — and lint the result for brittle/coordinate-only locators.
6
+ import { z } from 'zod';
7
+ import { createHash } from 'node:crypto';
8
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
9
+ import { join, dirname } from 'node:path';
10
+ import { qaOk, qaError } from '../lib/result.js';
11
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
12
+ import { generatePom } from '../suite/pom.js';
13
+ import { generateTestCases } from '../suite/testcase.js';
14
+ import { compileSuite } from '../suite/compile.js';
15
+ import { parseFlow } from '../flows/schema.js';
16
+ import { runFlow } from '../flows/run.js';
17
+ import { loadProjectConfig } from '../cli/scan.js';
18
+ import { generateAndCompileSuite } from '../services/suiteGenerate.js';
19
+ import { getDriver } from '../session/attach.js';
20
+ import { readinessForSession } from '../report/readiness.js';
21
+ import { loadStateProfile, prepareStateProfile, teardownStateProfile, verifyStateProfile } from '../state/profile.js';
22
+ import { hasStateProfileMutation, stateProfileAffects, stateRisk } from './state.js';
23
+ function stable(value) {
24
+ if (Array.isArray(value))
25
+ return value.map(stable);
26
+ if (value && typeof value === 'object') {
27
+ return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([k, v]) => [k, stable(v)]));
28
+ }
29
+ return value;
30
+ }
31
+ function hash(value) {
32
+ return createHash('sha256').update(JSON.stringify(stable(value))).digest('hex');
33
+ }
34
+ function hashFile(path) {
35
+ if (!path)
36
+ return null;
37
+ try {
38
+ return createHash('sha256').update(readFileSync(path)).digest('hex');
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ function compiledFlowIdentity(c) {
45
+ return {
46
+ name: c.name,
47
+ ok: c.ok,
48
+ flowPath: c.flowPath ?? null,
49
+ compiledPath: c.compiledPath ?? null,
50
+ flowHash: hashFile(c.flowPath),
51
+ compiledHash: hashFile(c.compiledPath),
52
+ errors: c.errors,
53
+ };
54
+ }
55
+ function appIdOf(session) {
56
+ return session.appId ?? (loadProjectConfig(session.root)?.appId ?? undefined);
57
+ }
58
+ /** Map the replay outcome to the test-case catalog's replay status (Deliverable 4 — honest plumbing). */
59
+ function catalogReplayStatus(mode, results, passed) {
60
+ if (mode === 'none' || results.length === 0)
61
+ return 'not_replayed';
62
+ if (results.some((r) => r.status === 'blocked'))
63
+ return 'blocked';
64
+ if (results.some((r) => r.status === 'failed'))
65
+ return 'failed';
66
+ if (!passed)
67
+ return 'not_replayed';
68
+ if (mode === 'dry_run')
69
+ return 'dry_run';
70
+ if (mode === 'same_session')
71
+ return 'same_session';
72
+ if (mode === 'fresh_state')
73
+ return 'fresh_state';
74
+ return 'not_replayed';
75
+ }
76
+ function suiteDir(session) {
77
+ return join(session.root, '.swipium');
78
+ }
79
+ /** Write generated files under .swipium/, returning absolute paths written. */
80
+ function writeFiles(session, files) {
81
+ const base = suiteDir(session);
82
+ const written = [];
83
+ for (const f of files) {
84
+ const abs = join(base, f.path);
85
+ mkdirSync(dirname(abs), { recursive: true });
86
+ writeFileSync(abs, f.content);
87
+ written.push(abs);
88
+ }
89
+ return written;
90
+ }
91
+ function requireActions(session) {
92
+ if (!session.recordedActions.length) {
93
+ return qaError({
94
+ what: 'No actions recorded in this session yet',
95
+ changedState: false,
96
+ retrySafe: true,
97
+ nextSteps: ['Drive the app with qa_act first (each action is recorded), then regenerate the suite.'],
98
+ });
99
+ }
100
+ return null;
101
+ }
102
+ function pomFor(session, name) {
103
+ const appId = appIdOf(session);
104
+ const flowName = (name ?? `${(appId ?? 'app').split('.').pop()}-smoke`).replace(/[^\w.-]+/g, '-');
105
+ const pom = generatePom(session.recordedActions, { name: flowName, appId, budgetProfile: session.budgetProfile });
106
+ return { pom, flowName };
107
+ }
108
+ export function registerSuite(server, sessions) {
109
+ // ---- qa_suite_generate ----
110
+ server.registerTool('qa_suite_generate', {
111
+ title: 'Generate an automation suite',
112
+ description: 'Generate a full, committed-ready automation suite under .swipium/ from this session\'s recorded actions: page objects (pages/), a POM test (tests/), a suite (suites/), a test case catalog (testcases/), a locator audit (locators/), AND — unless compile:false — runnable Flow V2 compiled into flows/ + compiled/. Reports durability, brittle locators, and whether the suite is runnable. Pass save:false to preview without writing.',
113
+ inputSchema: {
114
+ sessionId: z.string(),
115
+ name: z.string().optional(),
116
+ save: z.boolean().optional().describe('Write files under .swipium/ (default true).'),
117
+ compile: z.boolean().optional().describe('Also compile to runnable Flow V2 (default true).'),
118
+ replay: z.enum(['none', 'dry_run', 'same_session', 'fresh_state']).optional().describe('Replay gate: dry_run validates compiled flows; same_session executes compiled flows now; fresh_state requires a state profile and is reported as blocked when absent. Default dry_run.'),
119
+ stateProfile: z.string().optional().describe('Required for replay:"fresh_state" so CI-ready means replay from declared state.'),
120
+ consentId: z.string().optional().describe('Required when replay:"fresh_state" applies a mutating state profile.'),
121
+ approve: z.boolean().optional().describe('Approve the exact fresh-state replay consent request.'),
122
+ },
123
+ }, async ({ sessionId, name, save, compile, replay, stateProfile, consentId, approve }) => {
124
+ const session = sessions.get(sessionId);
125
+ if (!session)
126
+ return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
127
+ const noActions = requireActions(session);
128
+ if (noActions)
129
+ return noActions;
130
+ const res = generateAndCompileSuite(sessions, session, { name, save: save !== false, compile: compile !== false });
131
+ const audit = res.audit;
132
+ const ranOk = res.compiledFlows.filter((c) => c.ok).length;
133
+ const replayMode = replay ?? 'dry_run';
134
+ const replayResults = [];
135
+ const replayEvidence = {
136
+ stateLedgerUris: [],
137
+ consentRequired: false,
138
+ consentApproved: false,
139
+ };
140
+ if (replayMode === 'dry_run') {
141
+ for (const c of res.compiledFlows)
142
+ replayResults.push({ name: c.name, mode: replayMode, status: c.ok ? 'validated' : 'failed', reason: c.errors.join('; ') || undefined });
143
+ }
144
+ else if (replayMode === 'same_session') {
145
+ const { driver } = await getDriver(session);
146
+ if (!driver)
147
+ replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: 'no driver attached for same-session replay' });
148
+ else {
149
+ for (const c of res.compiledFlows.filter((f) => f.ok && f.flowPath)) {
150
+ const parsed = parseFlow(readFileSync(c.flowPath, 'utf8'));
151
+ if (!parsed.flow) {
152
+ replayResults.push({ name: c.name, mode: replayMode, status: 'failed', reason: parsed.errors.join('; ') });
153
+ continue;
154
+ }
155
+ const r = await runFlow(sessions, session, driver, parsed.flow, { variables: sessions.inputVariables(session) });
156
+ replayResults.push({ name: c.name, mode: replayMode, status: r.passed ? 'passed' : 'failed', reason: r.reason });
157
+ }
158
+ }
159
+ }
160
+ else if (replayMode === 'fresh_state') {
161
+ const { driver } = await getDriver(session);
162
+ if (!stateProfile)
163
+ replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: 'stateProfile is required for fresh_state replay' });
164
+ else if (!driver)
165
+ replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: 'no driver attached for fresh-state replay' });
166
+ else {
167
+ const loaded = loadStateProfile(session.root, stateProfile);
168
+ if (!loaded.profile)
169
+ replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: loaded.error ?? 'could not load state profile' });
170
+ else {
171
+ replayEvidence.stateProfile = loaded.profile.name;
172
+ replayEvidence.stateProfilePath = loaded.path ?? null;
173
+ const mutatingProfile = hasStateProfileMutation('prepare', loaded.profile, session) || hasStateProfileMutation('teardown', loaded.profile, session);
174
+ replayEvidence.consentRequired = mutatingProfile;
175
+ let mutationPayloadHash;
176
+ if (mutatingProfile) {
177
+ const prepareAffects = stateProfileAffects(session, 'prepare', loaded.profile, loaded.path);
178
+ const teardownAffects = stateProfileAffects(session, 'teardown', loaded.profile, loaded.path);
179
+ const affects = {
180
+ suite: res.name ?? 'suite',
181
+ replayMode,
182
+ compiledFlows: res.compiledFlows.map(compiledFlowIdentity),
183
+ suiteManifestPath: res.manifestPath ?? null,
184
+ suiteManifestHash: hashFile(res.manifestPath),
185
+ statePrepare: prepareAffects,
186
+ stateTeardown: teardownAffects,
187
+ };
188
+ mutationPayloadHash = hash(affects);
189
+ const risk = stateRisk('prepare', loaded.profile, session) === 'high' || stateRisk('teardown', loaded.profile, session) === 'high'
190
+ ? 'high'
191
+ : stateRisk('prepare', loaded.profile, session) === 'medium' || stateRisk('teardown', loaded.profile, session) === 'medium'
192
+ ? 'medium'
193
+ : 'low';
194
+ const gate = consumeConsent(consentId, approve, { action: 'suite_fresh_state_replay', affects });
195
+ if (!gate.approved) {
196
+ sessions.recordMutation(session, {
197
+ tool: 'qa_suite_generate',
198
+ action: 'suite_fresh_state_replay',
199
+ risk,
200
+ target: affects,
201
+ consent: { required: true, approved: false, payloadHash: mutationPayloadHash },
202
+ status: 'requested',
203
+ });
204
+ return requireConsent({
205
+ action: 'suite_fresh_state_replay',
206
+ risk,
207
+ exactCommand: `qa_suite_generate replay=fresh_state stateProfile=${loaded.profile.name}`,
208
+ affects,
209
+ explain: `Replay generated suite "${res.name ?? 'suite'}" from state profile "${loaded.profile.name}"? This can mutate app/device state through prepare/teardown before proving CI readiness.`,
210
+ });
211
+ }
212
+ replayEvidence.consentApproved = true;
213
+ sessions.recordMutation(session, {
214
+ tool: 'qa_suite_generate',
215
+ action: 'suite_fresh_state_replay',
216
+ risk,
217
+ target: affects,
218
+ consent: { required: true, consentId, approved: true, payloadHash: mutationPayloadHash },
219
+ status: 'approved',
220
+ });
221
+ }
222
+ const ledgers = [];
223
+ const saveLedger = (action, ledger) => {
224
+ const uri = sessions.saveArtifact(session, 'state', `suite-${action}-${loaded.profile.name}-${Date.now()}.json`, JSON.stringify(ledger, null, 2), 'application/json', `suite fresh-state ${action} ledger`);
225
+ ledgers.push(uri);
226
+ replayEvidence.stateLedgerUris.push(uri);
227
+ };
228
+ const prepared = await prepareStateProfile(sessions, session, driver, loaded.profile);
229
+ saveLedger('prepare', prepared);
230
+ if (prepared.status === 'state_refused' || prepared.status === 'state_blocked') {
231
+ replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: `state prepare ${prepared.status}; ledgers=${ledgers.join(',')}` });
232
+ }
233
+ else {
234
+ const verified = await verifyStateProfile(driver, loaded.profile);
235
+ saveLedger('verify', verified);
236
+ if (verified.status === 'state_blocked') {
237
+ replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: `state verify blocked; ledgers=${ledgers.join(',')}` });
238
+ }
239
+ else {
240
+ for (const c of res.compiledFlows.filter((f) => f.ok && f.flowPath)) {
241
+ const parsed = parseFlow(readFileSync(c.flowPath, 'utf8'));
242
+ if (!parsed.flow) {
243
+ replayResults.push({ name: c.name, mode: replayMode, status: 'failed', reason: parsed.errors.join('; ') });
244
+ continue;
245
+ }
246
+ const r = await runFlow(sessions, session, driver, parsed.flow, { variables: sessions.inputVariables(session) });
247
+ replayResults.push({ name: c.name, mode: replayMode, status: r.passed ? 'passed' : 'failed', reason: r.reason });
248
+ }
249
+ }
250
+ }
251
+ const tornDown = await teardownStateProfile(sessions, session, driver, loaded.profile);
252
+ saveLedger('teardown', tornDown);
253
+ if (mutatingProfile) {
254
+ const ok = replayResults.length > 0 && replayResults.every((r) => r.status === 'passed');
255
+ sessions.recordMutation(session, {
256
+ tool: 'qa_suite_generate',
257
+ action: 'suite_fresh_state_replay',
258
+ risk: stateRisk('prepare', loaded.profile, session),
259
+ target: { stateProfile: loaded.profile.name, suite: res.name ?? 'suite', ledgerUris: ledgers },
260
+ consent: { required: true, consentId, approved: true, payloadHash: mutationPayloadHash },
261
+ status: ok ? 'executed' : 'blocked',
262
+ ledgerUri: ledgers[0],
263
+ detail: ok ? 'fresh_state replay passed' : 'fresh_state replay did not pass',
264
+ });
265
+ }
266
+ }
267
+ }
268
+ }
269
+ const replayPassed = replayResults.length > 0 && replayResults.every((r) => r.status === 'passed' || r.status === 'validated');
270
+ const ciReadyGate = {
271
+ compiled: res.suiteRunnable,
272
+ freshStateReplay: replayMode === 'fresh_state' && replayResults.length > 0 && replayResults.every((r) => r.status === 'passed'),
273
+ declaredStateProfile: replayMode === 'fresh_state' && !!stateProfile,
274
+ stateEvidence: replayMode === 'fresh_state' && replayEvidence.stateLedgerUris.length >= 2,
275
+ stableEvidence: replayMode === 'fresh_state' && replayResults.length > 0 && replayResults.every((r) => r.status === 'passed') && replayEvidence.stateLedgerUris.length >= 2,
276
+ };
277
+ const ciReady = Object.values(ciReadyGate).every(Boolean);
278
+ const suiteReplayed = (replayMode === 'same_session' || replayMode === 'fresh_state') && replayPassed;
279
+ const readinessLabels = readinessForSession(session, { suiteRunnable: res.suiteRunnable, suiteReplayed, ciReady });
280
+ if (!readinessLabels.includes('generated'))
281
+ readinessLabels.push('generated');
282
+ if (res.suiteRunnable && !readinessLabels.includes('compiled'))
283
+ readinessLabels.push('compiled');
284
+ if (suiteReplayed && !readinessLabels.includes('replayed'))
285
+ readinessLabels.push('replayed');
286
+ if (ciReady && !readinessLabels.includes('ci_ready'))
287
+ readinessLabels.push('ci_ready');
288
+ const readiness = readinessLabels.at(-1) ?? 'generated';
289
+ const written = res.manifestPath ? [...res.written] : res.written;
290
+ if (res.manifestPath) {
291
+ writeFileSync(res.manifestPath, JSON.stringify({
292
+ schema: 'swipium.suite.manifest.v1',
293
+ generatedAt: new Date(session.createdAt).toISOString(),
294
+ name: res.name,
295
+ suiteFile: 'suites/smoke.yaml',
296
+ readinessLabels,
297
+ readiness,
298
+ suiteRunnable: res.suiteRunnable,
299
+ replay: { mode: replayMode, results: replayResults, passed: replayPassed, evidence: replayEvidence },
300
+ ciReady,
301
+ ciReadyGate,
302
+ compiledFlows: res.compiledFlows.map((f) => ({ name: f.name, slug: f.slug, ok: f.ok, errors: f.errors, flowPath: f.flowPath ?? null, compiledPath: f.compiledPath ?? null })),
303
+ audit,
304
+ variables: res.variables ?? [],
305
+ }, null, 2));
306
+ }
307
+ // Plumb the ACTUAL replay outcome back into the written catalog (review item #5): the suite
308
+ // service writes the catalog before replay (honest `not_replayed`); once we have a real replay
309
+ // result, rewrite the YAML/MD so the committed test cases reflect proven replay status.
310
+ let finalTestCases = res.testCases;
311
+ if (res.manifestPath) {
312
+ const replayStatus = catalogReplayStatus(replayMode, replayResults, replayPassed);
313
+ if (replayStatus !== 'not_replayed') {
314
+ const { pom, flowName } = pomFor(session, name);
315
+ const tc = generateTestCases(pom, {
316
+ appId: appIdOf(session),
317
+ fixtures: session.fixtures,
318
+ notes: session.notes,
319
+ budgetProfile: session.budgetProfile,
320
+ replayStatus,
321
+ });
322
+ writeFiles(session, [
323
+ { path: `testcases/${flowName}.cases.yaml`, content: tc.yaml },
324
+ { path: `testcases/${flowName}.cases.md`, content: tc.markdown },
325
+ ]);
326
+ finalTestCases = tc.cases;
327
+ }
328
+ }
329
+ const summary = `✅ Suite "${res.name}" generated (${res.pages?.length ?? 0} pages, ${res.testCases?.length ?? 0} test case, suite + audit).\n` +
330
+ `durability: ${audit.durable} durable / ${audit.semi} semi / ${audit.brittle} brittle (${audit.brittlePct}% brittle)` +
331
+ (res.variables?.length ? `\nvariables: ${res.variables.join(', ')}` : '') +
332
+ (audit.brittle ? `\n⚠ ${audit.brittle} brittle locator(s) — see locators/locator-audit.json for app-code fixes.` : '') +
333
+ (written.length ? `\nwrote ${written.length} files under ${suiteDir(session)}` : `\n(preview — pass save:true to write)`) +
334
+ (res.compiledFlows.length ? `\ncompiled ${ranOk}/${res.compiledFlows.length} runnable flow(s) → run: swipium suite run (or qa_flow_run).` : `\nNext: qa_suite_compile to produce runnable Flow V2.`) +
335
+ `\nreplay gate (${replayMode}): ${replayPassed ? 'passed' : replayResults.length ? 'not proven' : 'not run'}; readiness=${readiness}; labels=${readinessLabels.join(' → ')}` +
336
+ (ciReady ? '\nci_ready: compiled + fresh-state replay + state evidence proved' : replayMode === 'fresh_state' ? `\nci_ready missing: ${Object.entries(ciReadyGate).filter(([, ok]) => !ok).map(([k]) => k).join(', ') || 'none'}` : '');
337
+ return qaOk({ name: res.name, pages: res.pages, audit, variables: res.variables, testCases: finalTestCases, written, manifestPath: res.manifestPath ?? null, compiledFlows: res.compiledFlows, suiteRunnable: res.suiteRunnable, replay: { mode: replayMode, results: replayResults, passed: replayPassed, evidence: replayEvidence }, readiness, readinessLabels, ciReady, ciReadyGate }, summary);
338
+ });
339
+ // ---- qa_testcase_generate ----
340
+ server.registerTool('qa_testcase_generate', {
341
+ title: 'Generate test case docs',
342
+ description: 'Generate an industry-style test case catalog (TC-xxx: purpose, priority, preconditions, steps, expected, automation status, known blockers, evidence) from this session\'s recorded actions + observed outcomes. Returns YAML + Markdown. Pass save:true to write under .swipium/testcases.',
343
+ inputSchema: {
344
+ sessionId: z.string(),
345
+ name: z.string().optional(),
346
+ format: z.enum(['yaml', 'markdown', 'both']).optional(),
347
+ save: z.boolean().optional(),
348
+ },
349
+ }, async ({ sessionId, name, format, save }) => {
350
+ const session = sessions.get(sessionId);
351
+ if (!session)
352
+ return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
353
+ const noActions = requireActions(session);
354
+ if (noActions)
355
+ return noActions;
356
+ const { pom, flowName } = pomFor(session, name);
357
+ const tc = generateTestCases(pom, { appId: appIdOf(session), fixtures: session.fixtures, notes: session.notes, budgetProfile: session.budgetProfile });
358
+ const fmt = format ?? 'both';
359
+ const files = [];
360
+ if (fmt !== 'markdown')
361
+ files.push({ path: `testcases/${flowName}.cases.yaml`, content: tc.yaml });
362
+ if (fmt !== 'yaml')
363
+ files.push({ path: `testcases/${flowName}.cases.md`, content: tc.markdown });
364
+ const written = save ? writeFiles(session, files) : [];
365
+ const summary = `Generated ${tc.cases.length} test case(s): ${tc.cases.map((c) => `${c.id} ${c.title}`).join('; ')}` + (written.length ? `\nsaved under .swipium/testcases` : '');
366
+ return qaOk({ cases: tc.cases, yaml: fmt !== 'markdown' ? tc.yaml : undefined, markdown: fmt !== 'yaml' ? tc.markdown : undefined, written }, summary);
367
+ });
368
+ // ---- qa_suite_compile ----
369
+ server.registerTool('qa_suite_compile', {
370
+ title: 'Compile a POM suite to runnable flows',
371
+ description: 'Compile the generated POM suite (.swipium/suites/<suite>.yaml → its POM tests) into Flow V2 YAML that qa_flow_run and `swipium ci` can execute. Resolves page-object element refs to selectors, carries variables/secrets, and writes runnable flows to .swipium/flows/ (+ a readable copy under .swipium/compiled/). Validates each compiled flow through parseFlow and reports any errors. This is the step that makes a generated suite runnable, not just documentation.',
372
+ inputSchema: {
373
+ sessionId: z.string().optional(),
374
+ projectRoot: z.string().optional(),
375
+ suite: z.string().optional().describe('Suite file relative to .swipium/ (default suites/smoke.yaml).'),
376
+ },
377
+ }, async ({ sessionId, projectRoot, suite }) => {
378
+ let root;
379
+ if (sessionId)
380
+ root = sessions.get(sessionId)?.root;
381
+ root = root ?? projectRoot;
382
+ if (!root)
383
+ return qaError({ what: 'No project root', changedState: false, retrySafe: true, nextSteps: ['Pass sessionId or projectRoot.'] });
384
+ const result = compileSuite(root, suite ?? 'suites/smoke.yaml');
385
+ if (result.errors.length && result.flows.length === 0) {
386
+ return qaError({ what: `Could not compile suite: ${result.errors.join('; ')}`, changedState: false, retrySafe: true, nextSteps: ['Generate a suite first: qa_suite_generate, then qa_suite_compile.'] });
387
+ }
388
+ const flowsDir = join(root, '.swipium', 'flows');
389
+ const compiledDir = join(root, '.swipium', 'compiled');
390
+ mkdirSync(flowsDir, { recursive: true });
391
+ mkdirSync(compiledDir, { recursive: true });
392
+ const compiled = result.flows.map((f) => {
393
+ const slug = f.name.replace(/[^\w.-]+/g, '-');
394
+ const parse = f.yaml ? parseFlow(f.yaml) : { errors: ['empty'] };
395
+ const ok = !!f.yaml && parse.errors.length === 0 && f.errors.length === 0;
396
+ let flowPath;
397
+ let compiledPath;
398
+ if (ok) {
399
+ flowPath = join(flowsDir, `${slug}.yaml`); // discoverable by `swipium ci --flow <slug>`
400
+ compiledPath = join(compiledDir, `${slug}.flow.yaml`);
401
+ writeFileSync(flowPath, f.yaml);
402
+ writeFileSync(compiledPath, f.yaml);
403
+ }
404
+ return { name: f.name, slug, ok, variables: f.variables, errors: [...f.errors, ...parse.errors], flowPath, compiledPath };
405
+ });
406
+ const okCount = compiled.filter((c) => c.ok).length;
407
+ const summary = `Compiled ${okCount}/${compiled.length} flow(s) from ${result.suite}.\n` +
408
+ compiled.map((c) => ` ${c.ok ? '✓' : '✗'} ${c.name}${c.ok ? ` → flows/${c.slug}.yaml (run: swipium ci --flow ${c.slug})` : `: ${c.errors.join('; ')}`}`).join('\n');
409
+ return qaOk({ suite: result.suite, flows: compiled, okCount }, summary);
410
+ });
411
+ }
412
+ //# sourceMappingURL=suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suite.js","sourceRoot":"","sources":["../../src/tools/suite.ts"],"names":[],"mappings":"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"}