@jevitate/cli 0.6.0 → 0.8.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 (250) hide show
  1. package/dist/ai-cli.d.ts +3 -1
  2. package/dist/ai-cli.js +60 -16
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/approval-provenance.d.ts +120 -0
  5. package/dist/approval-provenance.js +300 -0
  6. package/dist/approval-provenance.js.map +1 -0
  7. package/dist/author-journey-cli.js +11 -18
  8. package/dist/author-journey-cli.js.map +1 -1
  9. package/dist/bin.js +29012 -20685
  10. package/dist/build-info.generated.js +2 -2
  11. package/dist/builtin-analyzers.d.ts +7 -0
  12. package/dist/builtin-analyzers.js +19 -0
  13. package/dist/builtin-analyzers.js.map +1 -0
  14. package/dist/campaign-cli.d.ts +6 -0
  15. package/dist/campaign-cli.js +9 -4
  16. package/dist/campaign-cli.js.map +1 -1
  17. package/dist/catalog-analysis.d.ts +70 -0
  18. package/dist/catalog-analysis.js +507 -0
  19. package/dist/catalog-analysis.js.map +1 -0
  20. package/dist/catalog-api.d.ts +73 -0
  21. package/dist/catalog-api.js +97 -0
  22. package/dist/catalog-api.js.map +1 -0
  23. package/dist/catalog-cli.d.ts +12 -0
  24. package/dist/catalog-cli.js +224 -0
  25. package/dist/catalog-cli.js.map +1 -0
  26. package/dist/catalog-review.d.ts +29 -0
  27. package/dist/catalog-review.js +290 -0
  28. package/dist/catalog-review.js.map +1 -0
  29. package/dist/catalog.d.ts +133 -0
  30. package/dist/catalog.js +352 -0
  31. package/dist/catalog.js.map +1 -0
  32. package/dist/check-api.js +24 -2
  33. package/dist/check-api.js.map +1 -1
  34. package/dist/check-cli.d.ts +3 -0
  35. package/dist/check-cli.js +18 -4
  36. package/dist/check-cli.js.map +1 -1
  37. package/dist/check-execute.js +25 -9
  38. package/dist/check-execute.js.map +1 -1
  39. package/dist/check-plan.js +4 -1
  40. package/dist/check-plan.js.map +1 -1
  41. package/dist/check-suite.js +6 -3
  42. package/dist/check-suite.js.map +1 -1
  43. package/dist/check-types.d.ts +12 -1
  44. package/dist/check-types.js.map +1 -1
  45. package/dist/cli-output.js +86 -4
  46. package/dist/cli-output.js.map +1 -1
  47. package/dist/cli-shared.d.ts +22 -2
  48. package/dist/cli-shared.js +34 -5
  49. package/dist/cli-shared.js.map +1 -1
  50. package/dist/demo-aspect-api.d.ts +21 -5
  51. package/dist/demo-aspect-api.js +30 -1
  52. package/dist/demo-aspect-api.js.map +1 -1
  53. package/dist/demo-aspect-cli.js +64 -5
  54. package/dist/demo-aspect-cli.js.map +1 -1
  55. package/dist/environments.js +6 -1
  56. package/dist/environments.js.map +1 -1
  57. package/dist/exit-codes.js +4 -0
  58. package/dist/exit-codes.js.map +1 -1
  59. package/dist/explore-adversarial.d.ts +3 -1
  60. package/dist/explore-adversarial.js +3 -3
  61. package/dist/explore-adversarial.js.map +1 -1
  62. package/dist/explore-author.js +5 -2
  63. package/dist/explore-author.js.map +1 -1
  64. package/dist/explore-cli.js +162 -13
  65. package/dist/explore-cli.js.map +1 -1
  66. package/dist/explore-coverage.d.ts +6 -2
  67. package/dist/explore-coverage.js +5 -4
  68. package/dist/explore-coverage.js.map +1 -1
  69. package/dist/explore-feature.d.ts +3 -1
  70. package/dist/explore-feature.js +2 -2
  71. package/dist/explore-feature.js.map +1 -1
  72. package/dist/explore-goal.d.ts +37 -6
  73. package/dist/explore-goal.js +70 -52
  74. package/dist/explore-goal.js.map +1 -1
  75. package/dist/explore-shared.d.ts +12 -7
  76. package/dist/explore-shared.js +9 -1
  77. package/dist/explore-shared.js.map +1 -1
  78. package/dist/goal-run-flags.d.ts +2 -0
  79. package/dist/goal-run-flags.js +8 -1
  80. package/dist/goal-run-flags.js.map +1 -1
  81. package/dist/http-5xx-outcome.d.ts +8 -3
  82. package/dist/http-5xx-outcome.js +5 -15
  83. package/dist/http-5xx-outcome.js.map +1 -1
  84. package/dist/init-cli.d.ts +7 -0
  85. package/dist/init-cli.js +79 -9
  86. package/dist/init-cli.js.map +1 -1
  87. package/dist/init-codeowners.d.ts +39 -0
  88. package/dist/init-codeowners.js +91 -0
  89. package/dist/init-codeowners.js.map +1 -0
  90. package/dist/init-keys.d.ts +3 -1
  91. package/dist/init-keys.js +20 -8
  92. package/dist/init-keys.js.map +1 -1
  93. package/dist/init-skills.d.ts +85 -7
  94. package/dist/init-skills.js +303 -36
  95. package/dist/init-skills.js.map +1 -1
  96. package/dist/jev-advisor.d.ts +72 -0
  97. package/dist/jev-advisor.js +172 -0
  98. package/dist/jev-advisor.js.map +1 -0
  99. package/dist/journey-api.d.ts +104 -5
  100. package/dist/journey-api.js +165 -23
  101. package/dist/journey-api.js.map +1 -1
  102. package/dist/journey-cli.d.ts +1 -1
  103. package/dist/journey-cli.js +320 -13
  104. package/dist/journey-cli.js.map +1 -1
  105. package/dist/journey-demo-api.d.ts +7 -1
  106. package/dist/journey-demo-api.js +8 -3
  107. package/dist/journey-demo-api.js.map +1 -1
  108. package/dist/journey-demo-cli.js +3 -0
  109. package/dist/journey-demo-cli.js.map +1 -1
  110. package/dist/journey-lint-sarif.d.ts +19 -0
  111. package/dist/journey-lint-sarif.js +48 -0
  112. package/dist/journey-lint-sarif.js.map +1 -0
  113. package/dist/journey-network-checks.d.ts +45 -9
  114. package/dist/journey-network-checks.js +117 -30
  115. package/dist/journey-network-checks.js.map +1 -1
  116. package/dist/journey-prefix.d.ts +24 -15
  117. package/dist/journey-prefix.js +53 -7
  118. package/dist/journey-prefix.js.map +1 -1
  119. package/dist/journey-review-api.d.ts +19 -0
  120. package/dist/journey-review-api.js +46 -0
  121. package/dist/journey-review-api.js.map +1 -0
  122. package/dist/journey-review-store.d.ts +16 -0
  123. package/dist/journey-review-store.js +95 -0
  124. package/dist/journey-review-store.js.map +1 -0
  125. package/dist/journey-review.d.ts +47 -0
  126. package/dist/journey-review.js +499 -0
  127. package/dist/journey-review.js.map +1 -0
  128. package/dist/journey-verify.d.ts +61 -0
  129. package/dist/journey-verify.js +144 -0
  130. package/dist/journey-verify.js.map +1 -0
  131. package/dist/key-report.d.ts +20 -5
  132. package/dist/key-report.js +32 -9
  133. package/dist/key-report.js.map +1 -1
  134. package/dist/kill-signal.js +10 -2
  135. package/dist/kill-signal.js.map +1 -1
  136. package/dist/load-api.js +9 -3
  137. package/dist/load-api.js.map +1 -1
  138. package/dist/load-cli.js +4 -2
  139. package/dist/load-cli.js.map +1 -1
  140. package/dist/log-classes.d.ts +73 -0
  141. package/dist/log-classes.js +167 -0
  142. package/dist/log-classes.js.map +1 -0
  143. package/dist/log-correlation.d.ts +29 -10
  144. package/dist/log-correlation.js +44 -21
  145. package/dist/log-correlation.js.map +1 -1
  146. package/dist/login-cli.d.ts +15 -0
  147. package/dist/login-cli.js +116 -0
  148. package/dist/login-cli.js.map +1 -0
  149. package/dist/logs-cli.js +3 -1
  150. package/dist/logs-cli.js.map +1 -1
  151. package/dist/mcp-api.d.ts +1 -0
  152. package/dist/mcp-api.js +61 -12
  153. package/dist/mcp-api.js.map +1 -1
  154. package/dist/mcp-cli-runner.d.ts +2 -0
  155. package/dist/mcp-cli-runner.js +3 -1
  156. package/dist/mcp-cli-runner.js.map +1 -1
  157. package/dist/mcp-cli-tools.d.ts +6 -0
  158. package/dist/mcp-cli-tools.js +182 -23
  159. package/dist/mcp-cli-tools.js.map +1 -1
  160. package/dist/mission-cli.js +8 -4
  161. package/dist/mission-cli.js.map +1 -1
  162. package/dist/mission-journal.d.ts +4 -1
  163. package/dist/mission-journal.js +9 -3
  164. package/dist/mission-journal.js.map +1 -1
  165. package/dist/mission-queue-cli.js +21 -2
  166. package/dist/mission-queue-cli.js.map +1 -1
  167. package/dist/mission-queue-runner.d.ts +6 -0
  168. package/dist/mission-queue-runner.js +33 -3
  169. package/dist/mission-queue-runner.js.map +1 -1
  170. package/dist/multi-run-cli.d.ts +7 -1
  171. package/dist/multi-run-cli.js +10 -3
  172. package/dist/multi-run-cli.js.map +1 -1
  173. package/dist/multi-run.d.ts +38 -3
  174. package/dist/multi-run.js +115 -23
  175. package/dist/multi-run.js.map +1 -1
  176. package/dist/persona-login.d.ts +199 -0
  177. package/dist/persona-login.js +574 -0
  178. package/dist/persona-login.js.map +1 -0
  179. package/dist/pre-approval.d.ts +98 -0
  180. package/dist/pre-approval.js +175 -0
  181. package/dist/pre-approval.js.map +1 -0
  182. package/dist/program.js +10 -0
  183. package/dist/program.js.map +1 -1
  184. package/dist/project-dir.d.ts +2 -1
  185. package/dist/project-dir.js +3 -1
  186. package/dist/project-dir.js.map +1 -1
  187. package/dist/promotions.d.ts +15 -0
  188. package/dist/promotions.js +52 -0
  189. package/dist/promotions.js.map +1 -0
  190. package/dist/readiness.d.ts +29 -0
  191. package/dist/readiness.js +291 -0
  192. package/dist/readiness.js.map +1 -0
  193. package/dist/regression-cli.js +4 -2
  194. package/dist/regression-cli.js.map +1 -1
  195. package/dist/report-api.d.ts +24 -2
  196. package/dist/report-api.js +33 -5
  197. package/dist/report-api.js.map +1 -1
  198. package/dist/report-cli.js +8 -1
  199. package/dist/report-cli.js.map +1 -1
  200. package/dist/result-schema.d.ts +12 -0
  201. package/dist/result-schema.js +8 -0
  202. package/dist/result-schema.js.map +1 -1
  203. package/dist/run-index.d.ts +4 -2
  204. package/dist/run-index.js +3 -1
  205. package/dist/run-index.js.map +1 -1
  206. package/dist/run-key-preflight.d.ts +2 -1
  207. package/dist/run-key-preflight.js +3 -2
  208. package/dist/run-key-preflight.js.map +1 -1
  209. package/dist/run-metadata.d.ts +26 -0
  210. package/dist/run-metadata.js +41 -0
  211. package/dist/run-metadata.js.map +1 -0
  212. package/dist/run-tags-cli.d.ts +12 -0
  213. package/dist/run-tags-cli.js +35 -0
  214. package/dist/run-tags-cli.js.map +1 -0
  215. package/dist/self-heal-adapter.js +3 -1
  216. package/dist/self-heal-adapter.js.map +1 -1
  217. package/dist/site-cli.d.ts +1 -1
  218. package/dist/site-cli.js +24 -1
  219. package/dist/site-cli.js.map +1 -1
  220. package/dist/source-cli.js +4 -2
  221. package/dist/source-cli.js.map +1 -1
  222. package/dist/source-run-api.js +17 -7
  223. package/dist/source-run-api.js.map +1 -1
  224. package/dist/suite-explore-options.d.ts +14 -0
  225. package/dist/suite-explore-options.js +7 -0
  226. package/dist/suite-explore-options.js.map +1 -1
  227. package/dist/sweep-api.d.ts +266 -0
  228. package/dist/sweep-api.js +828 -0
  229. package/dist/sweep-api.js.map +1 -0
  230. package/dist/sweep-cli.d.ts +9 -0
  231. package/dist/sweep-cli.js +115 -0
  232. package/dist/sweep-cli.js.map +1 -0
  233. package/dist/target-config.d.ts +5 -2
  234. package/dist/target-config.js +15 -0
  235. package/dist/target-config.js.map +1 -1
  236. package/dist/usability-capture.js +6 -0
  237. package/dist/usability-capture.js.map +1 -1
  238. package/dist/ux-cli.js +3 -1
  239. package/dist/ux-cli.js.map +1 -1
  240. package/dist/ux-usability.d.ts +9 -3
  241. package/dist/ux-usability.js +6 -4
  242. package/dist/ux-usability.js.map +1 -1
  243. package/dist/verify-fix-cli.js +4 -2
  244. package/dist/verify-fix-cli.js.map +1 -1
  245. package/package.json +13 -13
  246. package/skills/jevitate-demo/SKILL.md +5 -2
  247. package/skills/jevitate-explore/SKILL.md +6 -2
  248. package/skills/jevitate-getting-started/SKILL.md +12 -0
  249. package/skills/jevitate-run-journey/SKILL.md +17 -4
  250. package/skills/jevitate-test-campaign/SKILL.md +26 -5
@@ -1 +1 @@
1
- {"version":3,"file":"explore-author.js","sourceRoot":"","sources":["../src/explore-author.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,aAAa,EACb,6BAA6B,GAK9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAA6B,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAkFzD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA6B;IAClE,wEAAwE;IACxE,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;QACxB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3F,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAClF,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;QACtB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;KAC3D,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,4FAA4F;QAC5F,0FAA0F;QAC1F,MAAM,OAAO,GACX,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,KAAK,IAAI;YAC9E,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;YACrF,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACrB,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAA0B;IACxD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC7B,iGAAiG;IACjG,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3F,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAClF,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,GAAG;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE;YACzC,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC;gBAC7B,GAAG,CAAC;gBACJ,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;gBAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI;gBACJ,aAAa;gBACb,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK;gBACL,GAAG;gBACH,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1D,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACjG,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChE,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;aAChF,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,CAAuB,EAAE,IAAyC,EAAE;IAC9F,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC;IAC9C,MAAM,aAAa,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,WAAW,GAA0B;QACzC,OAAO,EAAE,CAAC,CAAC,WAAW;QACtB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACrG,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,CAAC;KAC3I,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"explore-author.js","sourceRoot":"","sources":["../src/explore-author.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
+ import { JEV_PROVIDER_FLAG_HELP, jevProviderArg } from "./cli-shared.js";
2
+ import { TAG_FLAG, TAG_HELP, collectTag, taggedAction } from "./run-tags-cli.js";
1
3
  import { existsSync } from "node:fs";
2
4
  import { envCredentialStore, MissingCredentialError } from "@jevitate/ai-core";
3
5
  import { loadLocalCredentials } from "./credentials-file.js";
4
- import { FixtureNotFoundError, ScopeUnderivableError, UnauthorizedExploreTargetError, resolveCoverageThresholds, TypeFixtureSpecError, validateDenyPatterns, } from "@jevitate/explore";
6
+ import { FixtureNotFoundError, ScopeUnderivableError, UnauthorizedExploreTargetError, resolveCoverageThresholds, TypeFixtureSpecError, validateAllowControlPatterns, validateDenyPatterns, } from "@jevitate/explore";
5
7
  import { loadTypeFixtures } from "./type-fixture-file.js";
6
8
  import { secretCommandRunner } from "./secret-command.js";
7
9
  import { ok, fail } from "./envelope.js";
@@ -24,14 +26,17 @@ import { runExploration, runCoverageMission, runAdversarialCliMission, CLI_ADVER
24
26
  import { parseLogSourceSpecs, LogSourceSpecError } from "./log-sources.js";
25
27
  import { triagedServerLog } from "./explore-shared.js";
26
28
  import { parseLogDefectSpecs, parseLogIgnoreSpecs, parseLogScopeSpecs } from "./log-correlation.js";
29
+ import { LogClassesError, loadLogClassRules } from "./log-classes.js";
27
30
  import { parseCorrelationHeaders, parseLogIdPatterns } from "./log-trace.js";
28
31
  import { LogSpecError } from "./log-lines.js";
29
- import { MultiRunArgsError, resolveMultiRunPlan, wantsMultiRun } from "./multi-run.js";
32
+ import { MultiRunArgsError, projectPersonaFor, resolveMultiRunPlan, wantsMultiRun } from "./multi-run.js";
33
+ import { authExpiredResult, ensurePersonaSession, LoginArgsError, parseAuthCheck } from "./persona-login.js";
30
34
  import { MultiRunAbortedError, runExploreMultiRun } from "./multi-run-cli.js";
31
35
  import { checkActorsAgainstSpec, resolveMissionActors } from "./mission-actors.js";
32
36
  import { runUsabilityMission, UsabilityInvariantsUnsupportedError } from "./ux-api.js";
33
37
  import { UxConfigError } from "./ux-config.js";
34
38
  import { MinConfidenceError, QualityPolicyError, MaxFindingsPerRouteError, ProductFactsError } from "@jevitate/ux";
39
+ import { PlaywrightBrowserPort } from "@jevitate/playwright";
35
40
  import { withBrowserLaunchFlags, withDemoFlags, withScreenshotsFlag, browserRunFromFlags, withEmulationFlags, emulationFromFlags, emitCommandResult, collectParam, environmentSeams, resolveDbPath, resolveJourneysDir, resolveMissionTargetsDir, stallTimeoutMs, EXPLORE_STRATEGIES, EXPLORE_OUTCOME_HELP, GatewaySelectionError, buildExploreGateways, } from "./cli-shared.js";
36
41
  import { allowWithExtensions, assertExtensionTargetLoaded, multiWindowWarning } from "./browser-run-options.js";
37
42
  import { ParamValidationError } from "@jevitate/journey";
@@ -46,6 +51,17 @@ import { forwardedArgv } from "./multi-run-cli.js";
46
51
  import { ANCHORED_STRATEGIES, JourneyPrefixArgsError, JourneyPrefixStaleError, journeyStaleResult, resolveJourneyPrefix, } from "./journey-prefix.js";
47
52
  import { clock } from "@jevitate/domain";
48
53
  import { GOAL_RUN_OPTIONS, GoalRunFlagError, conversationFromFlags, dialogsFromFlags, secretFieldsFromFlags, successWhenFromFlags, targetFlagsFromFlags, } from "./goal-run-flags.js";
54
+ /** #427: the app root of a start URL bound from --fixtures (`<origin>${setup.x}`), or undefined without an origin. */
55
+ function fixtureBoundUrlRoot(url) {
56
+ try {
57
+ return `${new URL(url.slice(0, url.indexOf("${"))).origin}/`;
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ /** #427: how long the pre-flight auth check (and a refresh's sign-in) may take to load a page. */
64
+ const AUTH_PREFLIGHT_TIMEOUT_MS = 30_000;
49
65
  /**
50
66
  * #293: the flags a sweep sets on each of its missions itself (the rest of the command line is
51
67
  * forwarded to every mission as given).
@@ -109,12 +125,20 @@ export function registerExploreCommands(program, deps, buildProgram) {
109
125
  .addOption(GOAL_RUN_OPTIONS.typeFixture())
110
126
  .addOption(GOAL_RUN_OPTIONS.fixture())
111
127
  .option("--storage-state <file>", "Playwright storageState JSON to start the session authenticated (deterministic login pre-step); must exist")
128
+ .option("--auth-check <mode>", "#427 pre-flight auth check before a run that starts from a session (--storage-state, --persona/--personas, --actor's primary): " +
129
+ "load the session, open --url and end the run fast (inconclusive, failure.kind auth-expired, exit 2) when it lands on a sign-in page — the login page is never explored. " +
130
+ "auto (default): a login-like URL (/login, /signin, /sign-in, /auth, …) or a visible password field, unless --url is itself such a route; " +
131
+ "urlExcludes:<text>: expired when the landed URL includes <text>; selector:<css>: alive only when this signed-in marker is visible; off. " +
132
+ "A persona with login parameters (a personas file entry's `login`, or .jevitate/personas.json) is signed in again once instead")
112
133
  .option("--actor <name=storageState>", "multi-actor mission (#147, goal only; repeatable): the FIRST actor is the primary (the only one the model drives, " +
113
134
  "from its own storageState); every other actor is an observer in its OWN fresh context that only runs the " +
114
135
  "--invariants' cross-actor checks (capture + probe as:/deniedAs) — never clicks or types. Replaces --storage-state", (v, prev) => [...prev, v], [])
115
136
  .addOption(GOAL_RUN_OPTIONS.saveStorageState())
116
137
  .option("--max-actions <n>", "hard cap on executed actions", positiveIntArg)
117
138
  .option("--max-decisions <n>", "hard cap on model decisions", positiveIntArg)
139
+ .option("--min-actions <n>", "--strategy goal (#424): the minimum actions before the model may conclude — until then an early report, blocked or answerless done is deferred and the run steered to breadth " +
140
+ "(unvisited tabs, detail views, primary forms). Default: 12 (at most half the budget) for an open-ended find-out goal (no --success; \"the main features\", \"what works\", \"every error\", \"explore\"…), none otherwise. Capped by --max-actions (with a warning)", positiveIntArg)
141
+ .option("--min-distinct-states <n>", "--strategy goal (#424): the minimum distinct page states (URL + visible controls) observed before the model may conclude. Default: 5 (scaled to the budget) for an open-ended find-out goal, none otherwise. Capped by the budget (with a warning)", positiveIntArg)
118
142
  .option("--stall-timeout <seconds>", "--strategy coverage/exploratory and --feature: end the run inconclusive (stalled) when no step completes within this many seconds (default 120)", positiveNumberArg)
119
143
  .addOption(GOAL_RUN_OPTIONS.replyWaitMs())
120
144
  .addOption(GOAL_RUN_OPTIONS.replyQuietMs())
@@ -123,6 +147,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
123
147
  .addOption(GOAL_RUN_OPTIONS.jobWaitMs())
124
148
  .addOption(GOAL_RUN_OPTIONS.deny())
125
149
  .addOption(GOAL_RUN_OPTIONS.paid())
150
+ .addOption(GOAL_RUN_OPTIONS.allowControl())
126
151
  .addOption(GOAL_RUN_OPTIONS.allowDestructive())
127
152
  .addOption(GOAL_RUN_OPTIONS.dialogs())
128
153
  .option("--allow-writes", "let a find-out goal (no --success check, ended by report) change the app. By default it is read-only: controls that start a write flow " +
@@ -133,6 +158,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
133
158
  .addOption(GOAL_RUN_OPTIONS.readRpc())
134
159
  .option("--real", "use live Jev + OpenRouter gateways (requires keys)", false)
135
160
  .option("--fake-ai", "use deterministic fake gateways (pipeline smoke only)", false)
161
+ .option("--jev-provider <provider>", JEV_PROVIDER_FLAG_HELP, jevProviderArg)
136
162
  .option("--out <dir>", "directory to write the emitted Recording")
137
163
  .option("--file-issues", "file findings as issues (needs a repo: --issue-repo or ~/.jevitate/filing.json); default: drafts only")
138
164
  .option("--issue-repo <owner/name>", "the system-under-test repo findings for THIS target are filed to")
@@ -151,7 +177,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
151
177
  .addOption(GOAL_RUN_OPTIONS.secretCmdAttempts())
152
178
  .option("--allow-log-cmd", "opt-in: a --log-source cmd:<command> may run as a subprocess (operator-declared only; refused otherwise)", false)
153
179
  .option("--log-defect <level|/regex/>", "backend log lines matching this (repeatable) become a server-log defect: a level (error|warn|info|debug, matched as level>=this) or a /regex/flags/ over the raw line. Its fingerprint is the normalized message (ids/numbers/uuids/timestamps stripped) plus the correlated route; verify-fix re-checks it by re-tailing the same --log-source(s)", (v, prev) => [...prev, v], [])
154
- .option("--log-quiet-ok <spec>", "declares a --log-source spec (exact match, repeatable) as legitimately quiet: zero lines from it does not make the --log-defect oracle unhealthy (#169). Without it, a declared source that opened but delivered not one line makes an otherwise-clean run inconclusive, same as one that failed to open", (v, prev) => [...prev, v], [])
180
+ .option("--log-quiet-ok <spec>", "compatibility only since 0.8.0 (#420): a --log-source that opens and reads zero lines is now always a healthy oracle (the silence is recorded as serverLogs.quietSources), so this flag no longer changes any outcome. Kept so existing invocations keep working", (v, prev) => [...prev, v], [])
155
181
  .option("--log-ignore <regex|substring>", "excludes known-noise backend log lines (repeatable, /regex/flags/ over the raw line or a plain substring) from BOTH correlation and the --log-defect oracle (#169 item 3) — e.g. a periodic background job's own expected error. Counted separately as serverLogs.ignoredLines; never makes --log-quiet-ok unnecessary, since an ignored line still proves the source is being tailed", (v, prev) => [...prev, v], [])
156
182
  .option("--log-scope <regex|substring>", "attributes only backend log lines matching this (repeatable, /regex/flags/ or a plain substring, e.g. a tenant id) to the run (#282); the rest count as serverLogs.ignoredLines. For concurrent runs tailing one log. A line carrying one of the run's own correlation ids is in scope", (v, prev) => [...prev, v], [])
157
183
  .option("--log-correlation-header <name>", "another request/response header that carries a correlation id (repeatable; built in: traceparent, x-request-id, x-correlation-id, request-id, x-amzn-trace-id, x-b3-traceid, x-cloud-trace-context). A log line carrying a request's id is attached to that exact request and the step that sent it, not by time (#204)", (v, prev) => [...prev, v], [])
@@ -163,7 +189,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
163
189
  .option("--repeat <n>", "run the mission N times, one after another, each in a fresh browser context, and vote (#141): findings seen in fewer than --min-agreement runs are reported as flaky, not counted")
164
190
  .option("--min-agreement <k>", "with --repeat: runs a finding (and the outcome) must recur in to count (default: a majority of N)")
165
191
  .option("--persona <name=storageState>", "run the same mission once per persona (repeatable), serially, each from its own storageState, and diff them (#143): requests, statuses (a 403 vs 200 is a candidate RBAC finding), controls, outcome", (v, prev) => [...prev, v], [])
166
- .option("--personas <file>", "personas JSON: {\"<name>\": \"<storageState>\"} or {\"personas\": [{\"name\", \"storageState\"}]}")
192
+ .option("--personas <file>", "personas JSON: {\"<name>\": \"<storageState>\"} or {\"personas\": [{\"name\", \"storageState\", \"login\"?}]} — #427: `login` " +
193
+ "({url, userEnv, passwordEnv, userField?, passwordField?, submit?, success?}, environment variable NAMES only) re-mints an expired session once. " +
194
+ "A bare --persona <name> is the project's persona of that name (.jevitate/personas.json, same format)")
167
195
  .option("--check-overflow", "check the horizontal-overflow (#149) and vertical-clipping (#302: text cut off by a fixed-height box or above the page top) hard signals even at a desktop (>=1024px) viewport — --strategy coverage/exploratory " +
168
196
  "(a defect), adversarial (a defect) or usability (a signal finding). " +
169
197
  "On by default whenever --viewport/--device emulates a viewport narrower than 1024px")
@@ -189,7 +217,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
189
217
  " verify-fix/regression replay reproduce under the SAME device by default.",
190
218
  ].join("\n"))
191
219
  .addHelpText("after", EXPLORE_OUTCOME_HELP)
192
- .action(async function () {
220
+ .option(TAG_FLAG, TAG_HELP, collectTag, [])
221
+ .action(taggedAction(program, "explore", async function () {
193
222
  const o = this.opts();
194
223
  // #210: one output rule for every strategy — the envelope with --json, a human summary without.
195
224
  const emitExplore = (envelope, exitCode, human = formatMissionHuman) => emitCommandResult(program, envelope, { json: o.json === true, command: "explore", human, ...(exitCode === undefined ? {} : { exitCode }) });
@@ -211,6 +240,17 @@ export function registerExploreCommands(program, deps, buildProgram) {
211
240
  emitExplore(fail(err.code, err.message));
212
241
  return;
213
242
  }
243
+ // #427: an unusable --auth-check is a usage error, refused before anything runs.
244
+ let authCheck;
245
+ try {
246
+ authCheck = parseAuthCheck(o.authCheck);
247
+ }
248
+ catch (err) {
249
+ if (!(err instanceof LoginArgsError))
250
+ throw err;
251
+ emitExplore(fail("E_EXPLORE_ARGS", err.message));
252
+ return;
253
+ }
214
254
  // #195: a session file never lands in the repo's .jevitate/ (refused before any run, multi-runs included).
215
255
  if (o.saveStorageState !== undefined) {
216
256
  try {
@@ -228,6 +268,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
228
268
  // refused, exit 64) before anything else — the start URL every later check uses is where the
229
269
  // Journey's prefix lands.
230
270
  let journeyPrefix;
271
+ /** #399: how the prefix was resolved — re-resolved once `${setup.x}` in a --param is bound (goal + --fixtures). */
272
+ let prefixRequest;
231
273
  const anchoredFlags = [o.fromJourney, o.atStep, o.journeysDir, o.env, o.baseUrl].some((v) => v !== undefined);
232
274
  if (anchoredFlags || Object.keys(o.param).length > 0) {
233
275
  const refuse = (message) => emitExplore(fail("E_EXPLORE_ARGS", message));
@@ -253,6 +295,10 @@ export function registerExploreCommands(program, deps, buildProgram) {
253
295
  // #312: one anchored step with a state restore (--fixtures/--before/--after) on a non-goal
254
296
  // strategy runs the same way — as a one-stop campaign, whose runner restores around the run.
255
297
  const restoredSingle = !isSweepMode(o.atStep) && strategy !== "goal" && (o.fixtures !== undefined || o.before !== undefined || o.after !== undefined);
298
+ if ((isSweepMode(o.atStep) || restoredSingle) && Object.values(o.param).some((v) => v.includes("${setup."))) {
299
+ refuse("a --param holding ${setup.x} is bound from --fixtures only by a single --strategy goal run; pass the value itself here");
300
+ return;
301
+ }
256
302
  if (isSweepMode(o.atStep) || restoredSingle) {
257
303
  if (o.real !== true && o.fakeAi !== true) {
258
304
  emitExplore(fail("E_AI_SETUP_REQUIRED", "a sweep's missions are model-driven: pass --real or --fake-ai"));
@@ -317,7 +363,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
317
363
  // The environment's own session applies when --storage-state names none (as `journey run`).
318
364
  if (o.storageState === undefined && environment?.storageState !== undefined)
319
365
  o.storageState = environment.storageState;
320
- journeyPrefix = await resolveJourneyPrefix({
366
+ prefixRequest = {
321
367
  dir: resolveJourneysDir(deps, o.journeysDir),
322
368
  id: o.fromJourney,
323
369
  atStep: o.atStep,
@@ -326,7 +372,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
326
372
  ...(o.storageState === undefined ? {} : { storageState: o.storageState }),
327
373
  dbPath: resolveDbPath(deps),
328
374
  environmentFlags: { ...(o.env === undefined ? {} : { env: o.env }), ...(o.baseUrl === undefined ? {} : { baseUrl: o.baseUrl }) },
329
- });
375
+ };
376
+ journeyPrefix = await resolveJourneyPrefix(prefixRequest);
330
377
  }
331
378
  catch (err) {
332
379
  if (isEnvironmentError(err) || err instanceof JourneyPrefixArgsError)
@@ -405,6 +452,35 @@ export function registerExploreCommands(program, deps, buildProgram) {
405
452
  if (browser?.headed === true && (wantsMultiRun(o) || o.actor.length > 1)) {
406
453
  program.configureOutput().writeErr?.(multiWindowWarning(o.actor.length > 1 ? "several --actor sessions" : "--repeat/--persona"));
407
454
  }
455
+ /**
456
+ * #427: the pre-flight auth check of one session — undefined when it is alive (or refreshed, or
457
+ * not checked: --auth-check off, no --url, a --from-journey run whose prefix replay is its own
458
+ * check), or the `auth-expired` result when it is not. Throws `UnauthorizedExploreTargetError`.
459
+ */
460
+ const sessionPreflight = async (storageState, persona) => {
461
+ if (authCheck.mode === "off" || o.url === undefined || journeyPrefix !== undefined)
462
+ return undefined;
463
+ const allowlist = resolveExploreAllowlist(o.url, o.allow);
464
+ // A start URL bound from --fixtures (`${setup.x}`) does not exist before the setup runs: the
465
+ // check opens the app's root instead (the mission itself starts after the setup, as before).
466
+ const checkUrl = o.url.includes("${") ? fixtureBoundUrlRoot(o.url) : o.url;
467
+ if (checkUrl === undefined)
468
+ return undefined; // no origin before the placeholder: the mission's own URL check refuses it
469
+ const r = await ensurePersonaSession({
470
+ ...(persona === undefined ? {} : { persona: persona.name }),
471
+ ...(persona?.login === undefined ? {} : { login: persona.login }),
472
+ storageState,
473
+ url: checkUrl,
474
+ allowlist,
475
+ check: authCheck,
476
+ port: (deps.explore?.browserPortFactory ?? (() => new PlaywrightBrowserPort()))(),
477
+ ...(browser === undefined ? {} : { browser }),
478
+ env: deps.explore?.env ?? process.env,
479
+ timeoutMs: AUTH_PREFLIGHT_TIMEOUT_MS,
480
+ note: (line) => program.configureOutput().writeErr?.(line),
481
+ });
482
+ return r.ok ? undefined : authExpiredResult(strategy, o.url, r, persona?.name);
483
+ };
408
484
  // Repeat-and-vote (#141) / persona matrix (#143): the same command, run sequentially and aggregated.
409
485
  if (wantsMultiRun(o)) {
410
486
  try {
@@ -417,12 +493,26 @@ export function registerExploreCommands(program, deps, buildProgram) {
417
493
  ...(o.out === undefined ? {} : { out: o.out }),
418
494
  // #220: a killed multi-run prints ITS partial summary, by this command's own output rule.
419
495
  killOutput: (partial) => (o.json === true ? `${JSON.stringify(ok(withEngine(partial)))}\n` : formatMultiRunHuman(partial)),
496
+ // #427: each run's session (its persona's, or the mission's own) is checked before it starts.
497
+ ...(authCheck.mode === "off"
498
+ ? {}
499
+ : {
500
+ authPreflight: async (p) => {
501
+ const state = p?.storageState ?? o.storageState;
502
+ if (state === undefined)
503
+ return undefined;
504
+ const r = await sessionPreflight(state, p ?? projectPersonaFor(state));
505
+ return r === undefined ? undefined : withEngine(r);
506
+ },
507
+ }),
420
508
  });
421
509
  emitExplore(ok(withEngine(result)), result.exitCode, formatMultiRunHuman);
422
510
  }
423
511
  catch (err) {
424
512
  if (err instanceof MultiRunArgsError)
425
513
  emitExplore(fail(err.code, err.message));
514
+ else if (err instanceof UnauthorizedExploreTargetError)
515
+ emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
426
516
  else if (err instanceof MultiRunAbortedError)
427
517
  emitExplore(fail(err.envelope.error.code, err.envelope.error.message));
428
518
  else
@@ -449,6 +539,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
449
539
  try {
450
540
  validateDenyPatterns(o.deny);
451
541
  validateDenyPatterns(o.paid, "--paid");
542
+ validateAllowControlPatterns(o.allowControl ?? []);
452
543
  }
453
544
  catch (err) {
454
545
  emitExplore(fail("E_EXPLORE_ARGS", err instanceof Error ? err.message : String(err)));
@@ -516,6 +607,11 @@ export function registerExploreCommands(program, deps, buildProgram) {
516
607
  // `--fixture` feeds the upload op, which only the explore loop (goal and
517
608
  // usability strategies) can issue. Refuse it elsewhere rather than
518
609
  // silently ignoring a file the user expected to be uploaded.
610
+ // #424: the minimum effort gates the goal loop's own endings (report / blocked / done) — a goal run's.
611
+ if ((o.minActions !== undefined || o.minDistinctStates !== undefined) && (o.feature !== undefined || strategy !== "goal")) {
612
+ emitExplore(fail("E_EXPLORE_ARGS", "--min-actions and --min-distinct-states are supported only with --strategy goal (a goal or find-out run)"));
613
+ return;
614
+ }
519
615
  if (o.fixture !== undefined && (o.feature !== undefined || (strategy !== "goal" && strategy !== "usability"))) {
520
616
  emitExplore(fail("E_EXPLORE_ARGS", "--fixture is supported only with --strategy goal or usability"));
521
617
  return;
@@ -538,7 +634,19 @@ export function registerExploreCommands(program, deps, buildProgram) {
538
634
  emitExplore(fail("E_EXPLORE_ARGS", "--action-deltas is not supported with --feature (goal, usability, coverage, exploratory and adversarial runs record deltas)"));
539
635
  return;
540
636
  }
541
- if (o.storageState !== undefined && !existsSync(o.storageState)) {
637
+ // #427: the project persona (.jevitate/personas.json) this --storage-state is, when it is one — its
638
+ // session may not exist yet: the pre-flight mints it from its login parameters.
639
+ let projectPersona;
640
+ try {
641
+ projectPersona = o.storageState === undefined ? undefined : projectPersonaFor(o.storageState);
642
+ }
643
+ catch (err) {
644
+ if (!(err instanceof MultiRunArgsError))
645
+ throw err;
646
+ emitExplore(fail(err.code, err.message));
647
+ return;
648
+ }
649
+ if (o.storageState !== undefined && !existsSync(o.storageState) && (authCheck.mode === "off" || projectPersona?.login === undefined)) {
542
650
  emitExplore(fail("E_EXPLORE_ARGS", `storage state not found: ${o.storageState}`));
543
651
  return;
544
652
  }
@@ -617,6 +725,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
617
725
  const logScope = parseLogScopeSpecs(o.logScope);
618
726
  const correlationHeaders = parseCorrelationHeaders(o.logCorrelationHeader);
619
727
  const idPatterns = parseLogIdPatterns(o.logIdPattern);
728
+ // #422: the project's .jevitate/log-classes.json, validated before any browser opens.
729
+ const logClasses = loadLogClassRules();
620
730
  serverLog = {
621
731
  sources,
622
732
  logDefect,
@@ -626,11 +736,12 @@ export function registerExploreCommands(program, deps, buildProgram) {
626
736
  logScope,
627
737
  correlationHeaders,
628
738
  idPatterns,
739
+ logClasses,
629
740
  ...(o.serverLogDrainMs === undefined ? {} : { drainMs: Number(o.serverLogDrainMs) }),
630
741
  };
631
742
  }
632
743
  catch (err) {
633
- if (err instanceof LogSourceSpecError || err instanceof LogSpecError) {
744
+ if (err instanceof LogSourceSpecError || err instanceof LogSpecError || err instanceof LogClassesError) {
634
745
  emitExplore(fail(err.code, err.message));
635
746
  return;
636
747
  }
@@ -687,6 +798,26 @@ export function registerExploreCommands(program, deps, buildProgram) {
687
798
  emitExplore(fail("E_EXPLORE_ARGS", "--fixtures, --before and --after are supported only with --strategy goal, or with --from-journey (any anchored strategy)"));
688
799
  return;
689
800
  }
801
+ // #427 pre-flight auth check: a run that starts from a session first proves the session is alive
802
+ // (re-minting it once from a persona's login parameters) — else it ends now, `auth-expired`.
803
+ if (primaryStorageState !== undefined) {
804
+ let expired;
805
+ try {
806
+ expired = await sessionPreflight(primaryStorageState, actors?.primary ?? projectPersona);
807
+ }
808
+ catch (err) {
809
+ if (err instanceof UnauthorizedExploreTargetError)
810
+ emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
811
+ // The check could not open its browser (the mission could not have either): the run did not start.
812
+ else
813
+ emitExplore(fail("E_EXPLORE_RUN", `the pre-flight auth check failed: ${err instanceof Error ? err.message : String(err)}`));
814
+ return;
815
+ }
816
+ if (expired !== undefined) {
817
+ emitExplore(ok(withEngine(expired)), EXIT_CODES.inconclusive);
818
+ return;
819
+ }
820
+ }
690
821
  // Additive coverage/exploratory strategy: proof-by-induction state coverage.
691
822
  // It takes no goal/success (the frontier itself is the objective), so it is
692
823
  // a distinct, goal-free path that leaves the goal strategy below unchanged.
@@ -720,6 +851,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
720
851
  ({ judge: covJudge, gen: covGen, usage: covUsage } = await buildExploreGateways(deps, {
721
852
  real: o.real ?? false,
722
853
  fakeAi: o.fakeAi ?? false,
854
+ jevProvider: o.jevProvider,
723
855
  }));
724
856
  }
725
857
  catch (err) {
@@ -791,6 +923,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
791
923
  ({ judge: advJudge, gen: advGen, usage: advUsage } = await buildExploreGateways(deps, {
792
924
  real: o.real ?? false,
793
925
  fakeAi: o.fakeAi ?? false,
926
+ jevProvider: o.jevProvider,
794
927
  }));
795
928
  }
796
929
  catch (err) {
@@ -911,6 +1044,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
911
1044
  ({ judge: uxJudge, gen: uxGen, usage: uxUsage } = await buildExploreGateways(deps, {
912
1045
  real: o.real ?? false,
913
1046
  fakeAi: o.fakeAi ?? false,
1047
+ jevProvider: o.jevProvider,
914
1048
  }));
915
1049
  }
916
1050
  catch (err) {
@@ -1087,7 +1221,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
1087
1221
  ...(target?.fixtures === undefined ? {} : { targetFixtures: target.fixtures }),
1088
1222
  ...(target?.personas === undefined ? {} : { personas: target.personas }),
1089
1223
  });
1090
- checkSetupRefs({ "--url": o.url, "--goal": o.goal, "--success": o.success, ...invariantSetupTexts(invariants) }, fx);
1224
+ checkSetupRefs({ "--url": o.url, "--goal": o.goal, "--success": o.success, ...invariantSetupTexts(invariants), ...(journeyPrefix === undefined ? {} : { "--param": Object.values(o.param) }) }, fx);
1091
1225
  }
1092
1226
  catch (err) {
1093
1227
  if (!(err instanceof FixtureSpecError || err instanceof UnboundSetupRefError))
@@ -1104,7 +1238,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
1104
1238
  let gen;
1105
1239
  let usage;
1106
1240
  try {
1107
- ({ judge, gen, usage } = await buildExploreGateways(deps, { real: o.real ?? false, fakeAi: o.fakeAi ?? false }));
1241
+ ({ judge, gen, usage } = await buildExploreGateways(deps, { real: o.real ?? false, fakeAi: o.fakeAi ?? false, jevProvider: o.jevProvider }));
1108
1242
  }
1109
1243
  catch (err) {
1110
1244
  if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError) {
@@ -1130,6 +1264,13 @@ export function registerExploreCommands(program, deps, buildProgram) {
1130
1264
  // #187: ${setup.x} in the invariants (probe paths, deniedAs.open, capture routes), origin-fixed.
1131
1265
  if (invariants !== undefined)
1132
1266
  runInvariants = { ...withInvariants, invariants: substituteSpecSetupRefs(invariants, b, url) };
1267
+ // #399: `--param name=${setup.x}` for the Journey prefix is bound to the fixture's output, and the
1268
+ // prefix re-resolved so its secret params (and so every redaction) hold the bound value.
1269
+ if (journeyPrefix !== undefined && prefixRequest !== undefined && Object.values(o.param).some((v) => v.includes("${setup."))) {
1270
+ const params = Object.fromEntries(Object.entries(o.param).map(([k, v]) => [k, substituteSetupRefs(v, b, { where: `--param ${k}` })]));
1271
+ journeyPrefix = await resolveJourneyPrefix({ ...prefixRequest, params });
1272
+ o.secret = [...new Set([...o.secret, ...journeyPrefix.secrets])];
1273
+ }
1133
1274
  }
1134
1275
  catch (err) {
1135
1276
  if (!(err instanceof FixtureSetupError || err instanceof UnboundSetupRefError)) {
@@ -1155,6 +1296,14 @@ export function registerExploreCommands(program, deps, buildProgram) {
1155
1296
  gen,
1156
1297
  usage,
1157
1298
  bounds: Object.keys(bounds).length > 0 ? bounds : undefined,
1299
+ ...(o.minActions === undefined && o.minDistinctStates === undefined
1300
+ ? {}
1301
+ : {
1302
+ minEffort: {
1303
+ ...(o.minActions === undefined ? {} : { minActions: Number(o.minActions) }),
1304
+ ...(o.minDistinctStates === undefined ? {} : { minDistinctStates: Number(o.minDistinctStates) }),
1305
+ },
1306
+ }),
1158
1307
  secrets: o.secret.length > 0 ? o.secret : undefined,
1159
1308
  ...(secretFields.length > 0 ? { secretFields } : {}),
1160
1309
  ...(secretCommand === undefined ? {} : { secretCommand }),
@@ -1176,7 +1325,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
1176
1325
  ...runInvariants,
1177
1326
  ...triagedServerLog(serverLog, judge, o.real === true),
1178
1327
  ...(fx === undefined ? {} : { fixtures: fx }),
1179
- ...withPrefix,
1328
+ ...(journeyPrefix === undefined ? {} : { journeyPrefix }), // #399: re-resolved when a --param was bound
1180
1329
  });
1181
1330
  // 0 succeeded · 1 assertion not met · 2 the run broke (inconclusive/crashed).
1182
1331
  emitExplore(ok(await withEvidence(result)), result.exitCode);
@@ -1198,6 +1347,6 @@ export function registerExploreCommands(program, deps, buildProgram) {
1198
1347
  // Every exit path restores the fixture state (a no-op when the mission already did).
1199
1348
  await fx?.restore();
1200
1349
  }
1201
- });
1350
+ }));
1202
1351
  }
1203
1352
  //# sourceMappingURL=explore-cli.js.map