@jevitate/cli 0.1.0 → 0.3.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 (410) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.d.ts +31 -11
  3. package/dist/ai-cli.js +131 -88
  4. package/dist/ai-cli.js.map +1 -1
  5. package/dist/author-journey-cli.d.ts +4 -0
  6. package/dist/author-journey-cli.js +111 -0
  7. package/dist/author-journey-cli.js.map +1 -0
  8. package/dist/bin.js +60349 -16477
  9. package/dist/bin.js.map +1 -1
  10. package/dist/browser-run-options.d.ts +89 -0
  11. package/dist/browser-run-options.js +175 -0
  12. package/dist/browser-run-options.js.map +1 -0
  13. package/dist/build-info.generated.d.ts +2 -0
  14. package/dist/build-info.generated.js +10 -0
  15. package/dist/build-info.generated.js.map +1 -0
  16. package/dist/campaign-api.d.ts +151 -0
  17. package/dist/campaign-api.js +446 -0
  18. package/dist/campaign-api.js.map +1 -0
  19. package/dist/campaign-cli.d.ts +6 -0
  20. package/dist/campaign-cli.js +66 -0
  21. package/dist/campaign-cli.js.map +1 -0
  22. package/dist/check-api.d.ts +5 -0
  23. package/dist/check-api.js +234 -0
  24. package/dist/check-api.js.map +1 -0
  25. package/dist/check-budget.d.ts +26 -0
  26. package/dist/check-budget.js +90 -0
  27. package/dist/check-budget.js.map +1 -0
  28. package/dist/check-cli.d.ts +31 -0
  29. package/dist/check-cli.js +109 -0
  30. package/dist/check-cli.js.map +1 -0
  31. package/dist/check-execute.d.ts +29 -0
  32. package/dist/check-execute.js +420 -0
  33. package/dist/check-execute.js.map +1 -0
  34. package/dist/check-plan.d.ts +118 -0
  35. package/dist/check-plan.js +516 -0
  36. package/dist/check-plan.js.map +1 -0
  37. package/dist/check-suite.d.ts +184 -0
  38. package/dist/check-suite.js +540 -0
  39. package/dist/check-suite.js.map +1 -0
  40. package/dist/check-types.d.ts +181 -0
  41. package/dist/check-types.js +35 -0
  42. package/dist/check-types.js.map +1 -0
  43. package/dist/cli-args.d.ts +26 -0
  44. package/dist/cli-args.js +50 -0
  45. package/dist/cli-args.js.map +1 -0
  46. package/dist/cli-output.d.ts +106 -0
  47. package/dist/cli-output.js +563 -0
  48. package/dist/cli-output.js.map +1 -0
  49. package/dist/cli-reference.d.ts +3 -0
  50. package/dist/cli-reference.js +81 -0
  51. package/dist/cli-reference.js.map +1 -0
  52. package/dist/cli-refusal.d.ts +12 -0
  53. package/dist/cli-refusal.js +52 -0
  54. package/dist/cli-refusal.js.map +1 -0
  55. package/dist/cli-shared.d.ts +340 -0
  56. package/dist/cli-shared.js +537 -0
  57. package/dist/cli-shared.js.map +1 -0
  58. package/dist/cli-surface.d.ts +33 -0
  59. package/dist/cli-surface.js +48 -0
  60. package/dist/cli-surface.js.map +1 -0
  61. package/dist/conversation-options.d.ts +15 -0
  62. package/dist/conversation-options.js +10 -0
  63. package/dist/conversation-options.js.map +1 -0
  64. package/dist/credentials-file.d.ts +15 -0
  65. package/dist/credentials-file.js +56 -0
  66. package/dist/credentials-file.js.map +1 -0
  67. package/dist/data-dir.d.ts +1 -1
  68. package/dist/data-dir.js +1 -1
  69. package/dist/defect-evidence.d.ts +141 -0
  70. package/dist/defect-evidence.js +505 -0
  71. package/dist/defect-evidence.js.map +1 -0
  72. package/dist/demo-aspect-api.d.ts +209 -0
  73. package/dist/demo-aspect-api.js +398 -0
  74. package/dist/demo-aspect-api.js.map +1 -0
  75. package/dist/demo-aspect-cli.d.ts +3 -0
  76. package/dist/demo-aspect-cli.js +243 -0
  77. package/dist/demo-aspect-cli.js.map +1 -0
  78. package/dist/demo-capture.d.ts +142 -0
  79. package/dist/demo-capture.js +537 -0
  80. package/dist/demo-capture.js.map +1 -0
  81. package/dist/engine.d.ts +35 -0
  82. package/dist/engine.js +25 -0
  83. package/dist/engine.js.map +1 -0
  84. package/dist/environments.d.ts +155 -0
  85. package/dist/environments.js +364 -0
  86. package/dist/environments.js.map +1 -0
  87. package/dist/exit-codes.d.ts +46 -0
  88. package/dist/exit-codes.js +91 -0
  89. package/dist/exit-codes.js.map +1 -0
  90. package/dist/explore-adversarial.d.ts +144 -0
  91. package/dist/explore-adversarial.js +227 -0
  92. package/dist/explore-adversarial.js.map +1 -0
  93. package/dist/explore-api.d.ts +7 -187
  94. package/dist/explore-api.js +7 -301
  95. package/dist/explore-api.js.map +1 -1
  96. package/dist/explore-author.d.ts +79 -0
  97. package/dist/explore-author.js +86 -0
  98. package/dist/explore-author.js.map +1 -0
  99. package/dist/explore-cli.d.ts +7 -0
  100. package/dist/explore-cli.js +1199 -0
  101. package/dist/explore-cli.js.map +1 -0
  102. package/dist/explore-coverage.d.ts +173 -0
  103. package/dist/explore-coverage.js +246 -0
  104. package/dist/explore-coverage.js.map +1 -0
  105. package/dist/explore-feature.d.ts +125 -0
  106. package/dist/explore-feature.js +218 -0
  107. package/dist/explore-feature.js.map +1 -0
  108. package/dist/explore-goal.d.ts +271 -0
  109. package/dist/explore-goal.js +417 -0
  110. package/dist/explore-goal.js.map +1 -0
  111. package/dist/explore-shared.d.ts +177 -0
  112. package/dist/explore-shared.js +149 -0
  113. package/dist/explore-shared.js.map +1 -0
  114. package/dist/explore-specs.d.ts +53 -0
  115. package/dist/explore-specs.js +333 -0
  116. package/dist/explore-specs.js.map +1 -0
  117. package/dist/findings-filing.d.ts +64 -0
  118. package/dist/findings-filing.js +108 -0
  119. package/dist/findings-filing.js.map +1 -0
  120. package/dist/fixture-auth.d.ts +63 -0
  121. package/dist/fixture-auth.js +95 -0
  122. package/dist/fixture-auth.js.map +1 -0
  123. package/dist/fixture-cli.d.ts +99 -0
  124. package/dist/fixture-cli.js +292 -0
  125. package/dist/fixture-cli.js.map +1 -0
  126. package/dist/github-issue-filer.d.ts +62 -0
  127. package/dist/github-issue-filer.js +189 -0
  128. package/dist/github-issue-filer.js.map +1 -0
  129. package/dist/host-health-run.d.ts +25 -0
  130. package/dist/host-health-run.js +33 -0
  131. package/dist/host-health-run.js.map +1 -0
  132. package/dist/http-5xx-outcome.d.ts +6 -0
  133. package/dist/http-5xx-outcome.js +39 -0
  134. package/dist/http-5xx-outcome.js.map +1 -0
  135. package/dist/inbox-cli.d.ts +7 -0
  136. package/dist/inbox-cli.js +197 -0
  137. package/dist/inbox-cli.js.map +1 -0
  138. package/dist/index.d.ts +1 -0
  139. package/dist/index.js +1 -0
  140. package/dist/index.js.map +1 -1
  141. package/dist/init-cli.d.ts +4 -0
  142. package/dist/init-cli.js +156 -0
  143. package/dist/init-cli.js.map +1 -0
  144. package/dist/init-keys.d.ts +30 -2
  145. package/dist/init-keys.js +19 -5
  146. package/dist/init-keys.js.map +1 -1
  147. package/dist/init-next-steps.d.ts +35 -0
  148. package/dist/init-next-steps.js +79 -0
  149. package/dist/init-next-steps.js.map +1 -0
  150. package/dist/invariants-file.d.ts +34 -0
  151. package/dist/invariants-file.js +68 -0
  152. package/dist/invariants-file.js.map +1 -0
  153. package/dist/invariants-validate.d.ts +30 -0
  154. package/dist/invariants-validate.js +105 -0
  155. package/dist/invariants-validate.js.map +1 -0
  156. package/dist/journey-annotate-api.d.ts +76 -0
  157. package/dist/journey-annotate-api.js +269 -0
  158. package/dist/journey-annotate-api.js.map +1 -0
  159. package/dist/journey-annotate-cli.d.ts +9 -0
  160. package/dist/journey-annotate-cli.js +181 -0
  161. package/dist/journey-annotate-cli.js.map +1 -0
  162. package/dist/journey-api.d.ts +104 -2
  163. package/dist/journey-api.js +163 -20
  164. package/dist/journey-api.js.map +1 -1
  165. package/dist/journey-cli.d.ts +4 -0
  166. package/dist/journey-cli.js +411 -0
  167. package/dist/journey-cli.js.map +1 -0
  168. package/dist/journey-demo-api.d.ts +114 -0
  169. package/dist/journey-demo-api.js +405 -0
  170. package/dist/journey-demo-api.js.map +1 -0
  171. package/dist/journey-demo-cli.d.ts +10 -0
  172. package/dist/journey-demo-cli.js +158 -0
  173. package/dist/journey-demo-cli.js.map +1 -0
  174. package/dist/journey-prefix.d.ts +194 -0
  175. package/dist/journey-prefix.js +279 -0
  176. package/dist/journey-prefix.js.map +1 -0
  177. package/dist/key-report.d.ts +49 -0
  178. package/dist/key-report.js +101 -0
  179. package/dist/key-report.js.map +1 -0
  180. package/dist/kill-signal.d.ts +193 -0
  181. package/dist/kill-signal.js +283 -0
  182. package/dist/kill-signal.js.map +1 -0
  183. package/dist/launch-armed.d.ts +37 -0
  184. package/dist/launch-armed.js +31 -0
  185. package/dist/launch-armed.js.map +1 -0
  186. package/dist/ledger-api.d.ts +106 -0
  187. package/dist/ledger-api.js +239 -0
  188. package/dist/ledger-api.js.map +1 -0
  189. package/dist/ledger-cli.d.ts +18 -0
  190. package/dist/ledger-cli.js +107 -0
  191. package/dist/ledger-cli.js.map +1 -0
  192. package/dist/load-api.d.ts +29 -11
  193. package/dist/load-api.js +23 -15
  194. package/dist/load-api.js.map +1 -1
  195. package/dist/load-cli.d.ts +4 -0
  196. package/dist/load-cli.js +97 -0
  197. package/dist/load-cli.js.map +1 -0
  198. package/dist/log-correlation.d.ts +200 -0
  199. package/dist/log-correlation.js +394 -0
  200. package/dist/log-correlation.js.map +1 -0
  201. package/dist/log-lines.d.ts +131 -0
  202. package/dist/log-lines.js +389 -0
  203. package/dist/log-lines.js.map +1 -0
  204. package/dist/log-sources.d.ts +71 -0
  205. package/dist/log-sources.js +236 -0
  206. package/dist/log-sources.js.map +1 -0
  207. package/dist/log-trace.d.ts +80 -0
  208. package/dist/log-trace.js +210 -0
  209. package/dist/log-trace.js.map +1 -0
  210. package/dist/logs-cli.d.ts +3 -0
  211. package/dist/logs-cli.js +51 -0
  212. package/dist/logs-cli.js.map +1 -0
  213. package/dist/logs-retention.d.ts +28 -0
  214. package/dist/logs-retention.js +85 -0
  215. package/dist/logs-retention.js.map +1 -0
  216. package/dist/masked-input.d.ts +22 -0
  217. package/dist/masked-input.js +99 -0
  218. package/dist/masked-input.js.map +1 -0
  219. package/dist/mcp-api.d.ts +91 -1
  220. package/dist/mcp-api.js +514 -18
  221. package/dist/mcp-api.js.map +1 -1
  222. package/dist/mcp-args.d.ts +50 -0
  223. package/dist/mcp-args.js +164 -0
  224. package/dist/mcp-args.js.map +1 -0
  225. package/dist/mcp-cli-bridge.d.ts +34 -0
  226. package/dist/mcp-cli-bridge.js +62 -0
  227. package/dist/mcp-cli-bridge.js.map +1 -0
  228. package/dist/mcp-cli-runner.d.ts +29 -0
  229. package/dist/mcp-cli-runner.js +44 -0
  230. package/dist/mcp-cli-runner.js.map +1 -0
  231. package/dist/mcp-cli-tools.d.ts +129 -0
  232. package/dist/mcp-cli-tools.js +737 -0
  233. package/dist/mcp-cli-tools.js.map +1 -0
  234. package/dist/mcp-paths.d.ts +28 -0
  235. package/dist/mcp-paths.js +76 -0
  236. package/dist/mcp-paths.js.map +1 -0
  237. package/dist/mission-actors.d.ts +40 -0
  238. package/dist/mission-actors.js +72 -0
  239. package/dist/mission-actors.js.map +1 -0
  240. package/dist/mission-api.d.ts +35 -0
  241. package/dist/mission-api.js +60 -3
  242. package/dist/mission-api.js.map +1 -1
  243. package/dist/mission-cli.d.ts +4 -0
  244. package/dist/mission-cli.js +248 -0
  245. package/dist/mission-cli.js.map +1 -0
  246. package/dist/mission-exit.d.ts +22 -0
  247. package/dist/mission-exit.js +26 -0
  248. package/dist/mission-exit.js.map +1 -0
  249. package/dist/mission-fixtures.d.ts +234 -0
  250. package/dist/mission-fixtures.js +862 -0
  251. package/dist/mission-fixtures.js.map +1 -0
  252. package/dist/mission-journal.d.ts +60 -0
  253. package/dist/mission-journal.js +115 -0
  254. package/dist/mission-journal.js.map +1 -0
  255. package/dist/mission-queue-cli.d.ts +10 -0
  256. package/dist/mission-queue-cli.js +198 -0
  257. package/dist/mission-queue-cli.js.map +1 -0
  258. package/dist/mission-queue-runner.d.ts +126 -0
  259. package/dist/mission-queue-runner.js +406 -0
  260. package/dist/mission-queue-runner.js.map +1 -0
  261. package/dist/multi-run-cli.d.ts +37 -0
  262. package/dist/multi-run-cli.js +116 -0
  263. package/dist/multi-run-cli.js.map +1 -0
  264. package/dist/multi-run.d.ts +339 -0
  265. package/dist/multi-run.js +619 -0
  266. package/dist/multi-run.js.map +1 -0
  267. package/dist/openrouter-call.d.ts +22 -0
  268. package/dist/openrouter-call.js +64 -0
  269. package/dist/openrouter-call.js.map +1 -0
  270. package/dist/profile-cli.d.ts +4 -0
  271. package/dist/profile-cli.js +57 -0
  272. package/dist/profile-cli.js.map +1 -0
  273. package/dist/program.d.ts +3 -75
  274. package/dist/program.js +123 -1921
  275. package/dist/program.js.map +1 -1
  276. package/dist/project-dir.d.ts +96 -0
  277. package/dist/project-dir.js +221 -0
  278. package/dist/project-dir.js.map +1 -0
  279. package/dist/record-api.d.ts +13 -7
  280. package/dist/record-api.js +44 -30
  281. package/dist/record-api.js.map +1 -1
  282. package/dist/record-cli.d.ts +4 -0
  283. package/dist/record-cli.js +76 -0
  284. package/dist/record-cli.js.map +1 -0
  285. package/dist/recording-cli.d.ts +4 -0
  286. package/dist/recording-cli.js +248 -0
  287. package/dist/recording-cli.js.map +1 -0
  288. package/dist/regression-api.d.ts +107 -0
  289. package/dist/regression-api.js +387 -6
  290. package/dist/regression-api.js.map +1 -1
  291. package/dist/regression-cli.d.ts +4 -0
  292. package/dist/regression-cli.js +284 -0
  293. package/dist/regression-cli.js.map +1 -0
  294. package/dist/report-api.d.ts +146 -0
  295. package/dist/report-api.js +431 -0
  296. package/dist/report-api.js.map +1 -0
  297. package/dist/report-cli.d.ts +12 -0
  298. package/dist/report-cli.js +147 -0
  299. package/dist/report-cli.js.map +1 -0
  300. package/dist/resource-preflight.d.ts +87 -0
  301. package/dist/resource-preflight.js +160 -0
  302. package/dist/resource-preflight.js.map +1 -0
  303. package/dist/result-schema.d.ts +22 -0
  304. package/dist/result-schema.js +28 -0
  305. package/dist/result-schema.js.map +1 -0
  306. package/dist/run-index.d.ts +29 -0
  307. package/dist/run-index.js +70 -0
  308. package/dist/run-index.js.map +1 -0
  309. package/dist/run-key-preflight.d.ts +42 -0
  310. package/dist/run-key-preflight.js +82 -0
  311. package/dist/run-key-preflight.js.map +1 -0
  312. package/dist/run-screenshots.d.ts +123 -0
  313. package/dist/run-screenshots.js +235 -0
  314. package/dist/run-screenshots.js.map +1 -0
  315. package/dist/runtime-env.d.ts +8 -0
  316. package/dist/runtime-env.js +23 -0
  317. package/dist/runtime-env.js.map +1 -0
  318. package/dist/secret-args.d.ts +23 -0
  319. package/dist/secret-args.js +45 -0
  320. package/dist/secret-args.js.map +1 -0
  321. package/dist/serve-cli.d.ts +4 -0
  322. package/dist/serve-cli.js +95 -0
  323. package/dist/serve-cli.js.map +1 -0
  324. package/dist/server-log-verify.d.ts +36 -0
  325. package/dist/server-log-verify.js +120 -0
  326. package/dist/server-log-verify.js.map +1 -0
  327. package/dist/session-check.d.ts +14 -0
  328. package/dist/session-check.js +44 -0
  329. package/dist/session-check.js.map +1 -0
  330. package/dist/site-cli.d.ts +4 -0
  331. package/dist/site-cli.js +127 -0
  332. package/dist/site-cli.js.map +1 -0
  333. package/dist/site-gate-cli.d.ts +28 -0
  334. package/dist/site-gate-cli.js +59 -0
  335. package/dist/site-gate-cli.js.map +1 -0
  336. package/dist/source-api.js +20 -4
  337. package/dist/source-api.js.map +1 -1
  338. package/dist/source-cli.d.ts +4 -0
  339. package/dist/source-cli.js +284 -0
  340. package/dist/source-cli.js.map +1 -0
  341. package/dist/source-run-api.d.ts +27 -1
  342. package/dist/source-run-api.js +22 -11
  343. package/dist/source-run-api.js.map +1 -1
  344. package/dist/storage-state-snapshot.d.ts +50 -0
  345. package/dist/storage-state-snapshot.js +87 -0
  346. package/dist/storage-state-snapshot.js.map +1 -0
  347. package/dist/suite-explore-options.d.ts +321 -0
  348. package/dist/suite-explore-options.js +162 -0
  349. package/dist/suite-explore-options.js.map +1 -0
  350. package/dist/target-config.d.ts +115 -0
  351. package/dist/target-config.js +225 -0
  352. package/dist/target-config.js.map +1 -0
  353. package/dist/transcript-file.d.ts +12 -0
  354. package/dist/transcript-file.js +23 -0
  355. package/dist/transcript-file.js.map +1 -0
  356. package/dist/type-fixture-file.d.ts +9 -0
  357. package/dist/type-fixture-file.js +48 -0
  358. package/dist/type-fixture-file.js.map +1 -0
  359. package/dist/ui-api.d.ts +3 -0
  360. package/dist/ui-api.js +11 -4
  361. package/dist/ui-api.js.map +1 -1
  362. package/dist/usability-capture.d.ts +43 -0
  363. package/dist/usability-capture.js +327 -0
  364. package/dist/usability-capture.js.map +1 -0
  365. package/dist/usage-config.d.ts +36 -0
  366. package/dist/usage-config.js +114 -0
  367. package/dist/usage-config.js.map +1 -0
  368. package/dist/ux-api.d.ts +3 -75
  369. package/dist/ux-api.js +3 -220
  370. package/dist/ux-api.js.map +1 -1
  371. package/dist/ux-claim-probe.d.ts +45 -0
  372. package/dist/ux-claim-probe.js +386 -0
  373. package/dist/ux-claim-probe.js.map +1 -0
  374. package/dist/ux-cli.d.ts +4 -0
  375. package/dist/ux-cli.js +109 -0
  376. package/dist/ux-cli.js.map +1 -0
  377. package/dist/ux-config.d.ts +29 -0
  378. package/dist/ux-config.js +103 -0
  379. package/dist/ux-config.js.map +1 -0
  380. package/dist/ux-evidence.d.ts +54 -0
  381. package/dist/ux-evidence.js +197 -0
  382. package/dist/ux-evidence.js.map +1 -0
  383. package/dist/ux-product.d.ts +14 -0
  384. package/dist/ux-product.js +39 -0
  385. package/dist/ux-product.js.map +1 -0
  386. package/dist/ux-review.d.ts +116 -0
  387. package/dist/ux-review.js +171 -0
  388. package/dist/ux-review.js.map +1 -0
  389. package/dist/ux-usability.d.ts +263 -0
  390. package/dist/ux-usability.js +580 -0
  391. package/dist/ux-usability.js.map +1 -0
  392. package/dist/verify-fix-api.d.ts +194 -0
  393. package/dist/verify-fix-api.js +506 -0
  394. package/dist/verify-fix-api.js.map +1 -0
  395. package/dist/verify-fix-cli.d.ts +4 -0
  396. package/dist/verify-fix-cli.js +115 -0
  397. package/dist/verify-fix-cli.js.map +1 -0
  398. package/package.json +23 -18
  399. package/skills/jevitate-ci-check/SKILL.md +77 -0
  400. package/skills/jevitate-demo/SKILL.md +61 -0
  401. package/skills/jevitate-explore/SKILL.md +96 -87
  402. package/skills/jevitate-getting-started/SKILL.md +89 -0
  403. package/skills/jevitate-load-test/SKILL.md +11 -2
  404. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  405. package/skills/jevitate-record/SKILL.md +23 -5
  406. package/skills/jevitate-run-journey/SKILL.md +61 -17
  407. package/skills/jevitate-sources/SKILL.md +57 -14
  408. package/skills/jevitate-test-campaign/SKILL.md +203 -0
  409. package/skills/jevitate-ux-review/SKILL.md +106 -16
  410. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-health-run.js","sourceRoot":"","sources":["../src/host-health-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAElF,OAAO,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,wFAAwF;AACxF,MAAM,SAAS,GAAG,IAAI,OAAO,EAA6B,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAA4B;IAChE,MAAM,MAAM,GAAG,CAAC,QAAQ,IAAI,IAAI,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACnC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,OAAU,EACV,OAAyD,EAAE,EAC3D,WAA6B,sBAAsB,EAAE;IAErD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,kGAAkG;IAClG,MAAM,UAAU,GAAsB,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACxH,MAAM,OAAO,GAAG,0BAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtE,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,MAAM,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;KAC/D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { GoalBasedOutcome, Http5xxDefect } from "@jevitate/explore";
2
+ export declare function applyHttp5xxGoalOutcome(outcome: GoalBasedOutcome, defects: readonly Http5xxDefect[]): GoalBasedOutcome;
3
+ /** `PUT /api/profile → 500` for each defect (first three), for a one-line `reason`. */
4
+ export declare function describeHttp5xx(defects: readonly Http5xxDefect[]): string;
5
+ /** The `reason` of a goal run that `applyHttp5xxGoalOutcome` turned into `defects-found`. */
6
+ export declare function http5xxGoalReason(defects: readonly Http5xxDefect[], assertionPassed: boolean): string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * How an HTTP 5xx hard-signal defect (#208, `Http5xxOracle`) folds into a run's outcome — the same
3
+ * rule a `server-log` defect follows (#142):
4
+ *
5
+ * - coverage/exploratory and feature runs count it with their own defects (a found defect wins
6
+ * over a thin run's `inconclusive`, exactly like a declared-invariant defect);
7
+ * - a goal run's own `GoalBasedOutcome`: `defects-found` over `succeeded` / `exhausted` /
8
+ * `blocked`. A goal whose checks held but whose run hit a server error is NOT a success: the
9
+ * checks' verdict stays on the result (`assertionPassed`, `checks`), and `reason` says both.
10
+ * A broken run (`inconclusive` / `crashed`) and a hang keep their outcome; the defect is still
11
+ * listed in `defects`, and `reason` names it.
12
+ */
13
+ const BROKEN_GOAL_OUTCOMES = new Set(["inconclusive", "crashed", "hang", "intermittent"]);
14
+ export function applyHttp5xxGoalOutcome(outcome, defects) {
15
+ return defects.length > 0 && !BROKEN_GOAL_OUTCOMES.has(outcome) ? "defects-found" : outcome;
16
+ }
17
+ /** `PUT /api/profile → 500` for each defect (first three), for a one-line `reason`. */
18
+ export function describeHttp5xx(defects) {
19
+ const shown = defects.slice(0, 3).map((d) => {
20
+ const s = d.signals[0];
21
+ let path = s?.url ?? d.route;
22
+ try {
23
+ path = new URL(path).pathname;
24
+ }
25
+ catch {
26
+ /* keep the raw (redacted) url */
27
+ }
28
+ return `${d.method} ${path} → ${s?.status ?? "5xx"}`;
29
+ });
30
+ const more = defects.length > 3 ? ` (+${defects.length - 3} more)` : "";
31
+ return `${shown.join(", ")}${more}`;
32
+ }
33
+ /** The `reason` of a goal run that `applyHttp5xxGoalOutcome` turned into `defects-found`. */
34
+ export function http5xxGoalReason(defects, assertionPassed) {
35
+ const n = defects.length;
36
+ const found = `${n} HTTP 5xx defect${n === 1 ? "" : "s"} found: ${describeHttp5xx(defects)}`;
37
+ return assertionPassed ? `${found} — the goal's success checks held, but the app answered with a server error` : found;
38
+ }
39
+ //# sourceMappingURL=http-5xx-outcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-5xx-outcome.js","sourceRoot":"","sources":["../src/http-5xx-outcome.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAAkC,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAEzH,MAAM,UAAU,uBAAuB,CAAC,OAAyB,EAAE,OAAiC;IAClG,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9F,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,OAAiC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE,eAAwB;IAC3F,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,6EAA6E,CAAC,CAAC,CAAC,KAAK,CAAC;AACzH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "commander";
2
+ import { type CliDeps } from "./cli-shared.js";
3
+ export declare function formatInboxListHuman(data: unknown): string;
4
+ export declare function formatInboxThreadHuman(id: string): (data: unknown) => string;
5
+ export declare function formatInboxCommandHuman(data: unknown): string;
6
+ export declare function formatInboxHealthHuman(data: unknown): string;
7
+ export declare function registerInboxCommands(program: Command, deps: CliDeps): void;
@@ -0,0 +1,197 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { Option } from "commander";
3
+ import { ok, fail } from "./envelope.js";
4
+ import { emitEnvelope } from "./cli-output.js";
5
+ import { emitJsonOrRefusal } from "./cli-refusal.js";
6
+ import { commandPath } from "./cli-refusal.js";
7
+ import { FsInboxStore } from "@jevitate/inbox";
8
+ import { resolveInboxDir } from "./cli-shared.js";
9
+ import { currentEngineInfo } from "./engine.js";
10
+ import { callMcpTool, mcpErrorOf, mcpToolDeps, refusalFor } from "./mcp-cli-bridge.js";
11
+ /**
12
+ * `jevitate inbox …` (#254): the HITL inbox from the CLI — one command per MCP inbox tool, each calling
13
+ * the SAME served handler (mcp-cli-bridge.ts) over the SAME store `jevitate mcp` and `jevitate ui`
14
+ * use (`~/.jevitate/inbox`, or `--inbox-dir`):
15
+ *
16
+ * list → list_incoming show <id> → get_thread
17
+ * command <id> → get_command health → get_site_health
18
+ * queue-retrieval → queue_retrieval queue-action → queue_action
19
+ * approve <id> → approve_action cancel <id> → cancel_command (both always refused)
20
+ *
21
+ * SM1: approving or cancelling is human-only, in the `jevitate ui` dashboard — `inbox approve` /
22
+ * `inbox cancel` refuse exactly as MCP does (E_HUMAN_APPROVAL_REQUIRED, exit 64).
23
+ * `inbox command` keeps get_command's burn-after-read. A human's unread input is consumed only with
24
+ * `--reveal`, which prints it exactly as MCP returns it; without it the command refuses
25
+ * (E_INBOX_INPUT_PENDING) and consumes nothing, so the input is never burned unseen.
26
+ */
27
+ const INBOX_DIR_HELP = "inbox store directory (default: ~/.jevitate/inbox — the dir `jevitate mcp` and `jevitate ui` use)";
28
+ const REDACTED = "***REDACTED***";
29
+ function withInboxFlags(cmd) {
30
+ return cmd.option("--inbox-dir <path>", INBOX_DIR_HELP).option("--json", "emit a JSON envelope");
31
+ }
32
+ function isRecord(v) {
33
+ return v !== null && typeof v === "object" && !Array.isArray(v);
34
+ }
35
+ function ageText(sec) {
36
+ const s = typeof sec === "number" && Number.isFinite(sec) ? sec : 0;
37
+ if (s < 90)
38
+ return `${s}s`;
39
+ if (s < 5400)
40
+ return `${Math.round(s / 60)}m`;
41
+ return `${Math.round(s / 3600)}h`;
42
+ }
43
+ export function formatInboxListHuman(data) {
44
+ const items = isRecord(data) && Array.isArray(data.items) ? data.items.filter(isRecord) : [];
45
+ if (items.length === 0)
46
+ return "no pending inbox items\n";
47
+ const lines = items.map((i) => `${String(i.id)} ${String(i.kind)} ${String(i.status)} ${ageText(i.ageSec)} ${String(i.run)} / ${String(i.journey)} / ${String(i.step)} (${String(i.agent)})`);
48
+ return `${lines.join("\n")}\nnext: jevitate inbox show <id> · approve or cancel in \`jevitate ui\`\n`;
49
+ }
50
+ export function formatInboxThreadHuman(id) {
51
+ return (data) => {
52
+ const thread = isRecord(data) && Array.isArray(data.thread) ? data.thread.filter(isRecord) : [];
53
+ if (thread.length === 0)
54
+ return `${id}: no messages yet\n`;
55
+ return `${thread.map((e) => `${String(e.at)} ${String(e.author)}: ${String(e.text)}`).join("\n")}\n`;
56
+ };
57
+ }
58
+ export function formatInboxCommandHuman(data) {
59
+ if (!isRecord(data))
60
+ return "";
61
+ const lines = [`${String(data.id)} ${String(data.kind)} ${String(data.status)}`, ` ${String(data.run)} / ${String(data.journey)} / ${String(data.step)}: ${String(data.reason)}`];
62
+ if (isRecord(data.resolution))
63
+ lines.push(` resolution: ${String(data.resolution.decision)} by ${String(data.resolution.by)} at ${String(data.resolution.at)}`);
64
+ if (data.humanInput === REDACTED)
65
+ lines.push(" human input: provided concurrently — consumed by this poll without --reveal; its value is not printed");
66
+ else if (data.humanInput !== undefined)
67
+ lines.push(` human input (consumed now, burn-after-read): ${String(data.humanInput)}`);
68
+ else if (data.secretConsumedAt !== undefined)
69
+ lines.push(` human input: already consumed at ${String(data.secretConsumedAt)}`);
70
+ return `${lines.join("\n")}\n`;
71
+ }
72
+ export function formatInboxHealthHuman(data) {
73
+ if (!isRecord(data))
74
+ return "";
75
+ const build = [data.version, data.commit].filter((v) => typeof v === "string").join(" ");
76
+ return `inbox ${data.ok === true ? "ok" : "NOT ok"}: ${String(data.pending)} pending, oldest ${ageText(data.oldestPendingAgeSec)} · build ${build}\n`;
77
+ }
78
+ function formatQueuedHuman(data) {
79
+ if (!isRecord(data))
80
+ return "";
81
+ return `queued inbox item ${String(data.id)} (${String(data.status)})\nnext: a human answers it in \`jevitate ui\`; poll with \`jevitate inbox command ${String(data.id)}\`\n`;
82
+ }
83
+ /** get_command's item with the input's VALUE replaced — only for a poll without --reveal that raced a human's answer. */
84
+ function withoutSecretValue(body) {
85
+ if (!isRecord(body) || body.humanInput === undefined)
86
+ return body;
87
+ return { ...body, humanInput: REDACTED };
88
+ }
89
+ export function registerInboxCommands(program, deps) {
90
+ const inbox = program.command("inbox").description("the HITL inbox from the CLI — the same tools `jevitate mcp` serves (approve/cancel stay human-only in `jevitate ui`)");
91
+ /** Calls MCP `tool` and prints its result (or its typed error as the matching CLI refusal). */
92
+ const run = async (cmd, tool, args, human, fallback, project = (b) => b) => {
93
+ const o = cmd.opts();
94
+ const json = o.json === true;
95
+ let envelope;
96
+ try {
97
+ const { body } = await callMcpTool(mcpToolDeps(deps, { inboxDir: resolveInboxDir(deps, o.inboxDir) }), tool, args);
98
+ const err = mcpErrorOf(body);
99
+ envelope = err === undefined ? ok(project(body)) : refusalFor(cmd, "INBOX", err, fallback);
100
+ }
101
+ catch (e) {
102
+ envelope = fail("E_INBOX_INTERNAL", e instanceof Error ? e.message : String(e));
103
+ }
104
+ if (envelope.ok)
105
+ emitEnvelope(program, envelope, { json, human, command: commandPath(cmd) });
106
+ else
107
+ emitJsonOrRefusal(program, envelope);
108
+ };
109
+ withInboxFlags(inbox.command("list").description("list pending inbox items (MCP list_incoming)")).action(async function () {
110
+ await run(this, "list_incoming", {}, formatInboxListHuman, "cannot list the inbox");
111
+ });
112
+ withInboxFlags(inbox.command("show <id>").description("an inbox item's conversation thread — never its secret input (MCP get_thread)")).action(async function (id) {
113
+ await run(this, "get_thread", { id }, formatInboxThreadHuman(id), `no inbox item '${id}'`);
114
+ });
115
+ withInboxFlags(inbox
116
+ .command("command <id>")
117
+ .description("poll one inbox item as the agent does (MCP get_command): burn-after-read — unread human input needs --reveal, which consumes and prints it")).option("--reveal", "consume the human's unread input and print it, exactly as MCP get_command returns it")
118
+ .action(async function (id) {
119
+ const o = this.opts();
120
+ if (o.reveal !== true) {
121
+ // Peek without consuming: a poll that would burn unread input needs --reveal. (A bad id falls
122
+ // through to get_command, which refuses it exactly as MCP does.)
123
+ const store = new FsInboxStore(resolveInboxDir(deps, o.inboxDir), currentEngineInfo());
124
+ const item = await store.get(id).catch(() => null);
125
+ if (item?.humanInput !== undefined && item.secretConsumedAt === undefined) {
126
+ emitJsonOrRefusal(program, fail("E_INBOX_INPUT_PENDING", `inbox item '${id}' has unread human input; reading it consumes it (burn-after-read). Rerun with --reveal to receive it`));
127
+ return;
128
+ }
129
+ }
130
+ await run(this, "get_command", { id }, formatInboxCommandHuman, `no inbox item '${id}'`, o.reveal === true ? (b) => b : withoutSecretValue);
131
+ });
132
+ withInboxFlags(inbox.command("health").description("inbox store health: pending count, oldest pending age, build (MCP get_site_health)")).action(async function () {
133
+ await run(this, "get_site_health", {}, formatInboxHealthHuman, "cannot read inbox health");
134
+ });
135
+ const queueFlags = (cmd) => withInboxFlags(cmd
136
+ .option("--run <id>", "the run this item belongs to (required)")
137
+ .option("--journey <id>", "the Journey (required)")
138
+ .option("--step <step>", "the step it stopped at (required)")
139
+ .option("--reason <text>", "what the human is asked for (required)")
140
+ .option("--agent <name>", "who is asking (required)")
141
+ .option("--target-url <url>", "the page it concerns")
142
+ .option("--has-screenshot", "a screenshot accompanies the item")
143
+ .option("--findings <file>", "a JSON file holding an array of {id, title, severity: low|med|high, evidence?}"));
144
+ const queueArgs = (cmd) => {
145
+ const o = cmd.opts();
146
+ let findings;
147
+ if (o.findings !== undefined) {
148
+ try {
149
+ findings = JSON.parse(readFileSync(o.findings, "utf8"));
150
+ }
151
+ catch (e) {
152
+ const code = `E_${commandPath(cmd).toUpperCase().replace(/[^A-Z0-9]+/g, "_")}_INPUT`;
153
+ emitJsonOrRefusal(program, fail(code, `cannot read --findings ${o.findings}: ${e instanceof Error ? e.message.split("\n")[0] : String(e)}`));
154
+ return undefined;
155
+ }
156
+ }
157
+ // Only what was given: the facade validates (required fields, finding shape) — never re-decided here.
158
+ return {
159
+ ...(o.run === undefined ? {} : { run: o.run }),
160
+ ...(o.journey === undefined ? {} : { journey: o.journey }),
161
+ ...(o.step === undefined ? {} : { step: o.step }),
162
+ ...(o.reason === undefined ? {} : { reason: o.reason }),
163
+ ...(o.agent === undefined ? {} : { agent: o.agent }),
164
+ ...(o.targetUrl === undefined ? {} : { targetUrl: o.targetUrl }),
165
+ ...(o.hasScreenshot === true ? { hasScreenshot: true } : {}),
166
+ ...(findings === undefined ? {} : { findings }),
167
+ ...(o.kind === undefined ? {} : { kind: o.kind }),
168
+ };
169
+ };
170
+ queueFlags(inbox.command("queue-retrieval").description("ask a human to provide something back to the agent — a 'handback' item; only queues (MCP queue_retrieval)")).action(async function () {
171
+ const args = queueArgs(this);
172
+ if (args !== undefined)
173
+ await run(this, "queue_retrieval", args, formatQueuedHuman, "cannot queue the item");
174
+ });
175
+ queueFlags(inbox
176
+ .command("queue-action")
177
+ .description("ask a human for a decision — an 'approval' item by default; only queues (MCP queue_action)")
178
+ .addOption(new Option("--kind <kind>", "approval (default) | handback | review").choices(["approval", "handback", "review"]))).action(async function () {
179
+ const args = queueArgs(this);
180
+ if (args !== undefined)
181
+ await run(this, "queue_action", args, formatQueuedHuman, "cannot queue the item");
182
+ });
183
+ // SM1: human-only. Registered so the CLI names the refusal (and where to go instead) rather than
184
+ // pretending the capability does not exist — they call the same always-refusing MCP handlers.
185
+ for (const [name, tool, verb] of [
186
+ ["approve", "approve_action", "approve"],
187
+ ["cancel", "cancel_command", "cancel"],
188
+ ]) {
189
+ withInboxFlags(inbox.command(`${name} <id>`).description(`always refused (MCP ${tool}): only a human can ${verb} an inbox item, in \`jevitate ui\``)).action(async function (id) {
190
+ const { body } = await callMcpTool(mcpToolDeps(deps), tool, { id });
191
+ const err = mcpErrorOf(body) ?? { error: "human_approval_required" };
192
+ const refusal = refusalFor(this, "INBOX", { error: err.error, message: `${err.message ?? `${verb} is human-only`} — run \`jevitate ui\`` }, "");
193
+ emitJsonOrRefusal(program, refusal);
194
+ });
195
+ }
196
+ }
197
+ //# sourceMappingURL=inbox-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-cli.js","sourceRoot":"","sources":["../src/inbox-cli.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from "./envelope.js";
2
2
  export * from "./program.js";
3
+ export * from "./result-schema.js";
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./envelope.js";
2
2
  export * from "./program.js";
3
+ export * from "./result-schema.js";
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import { type CliDeps } from "./cli-shared.js";
3
+ /** Registers `jevitate init` (API keys, skills/MCP wiring, the repo's .jevitate/). */
4
+ export declare function registerInitCommands(program: Command, deps: CliDeps): void;
@@ -0,0 +1,156 @@
1
+ import { envCredentialStore, FEATURE_KEYS } from "@jevitate/ai-core";
2
+ import { loadLocalCredentials } from "./credentials-file.js";
3
+ import { ok, fail } from "./envelope.js";
4
+ import { initProjectDir } from "./project-dir.js";
5
+ import { KeyCheckError, credentialInputs, enteredKeyCheck, realSecureIO } from "./ai-cli.js";
6
+ import { keySources, realVerifyFetch, shadowWarnings, verifyFeatureKeys } from "./key-report.js";
7
+ import { collectAllMissingKeys } from "./init-keys.js";
8
+ import { formatInitKeysHuman } from "./cli-output.js";
9
+ import { detectRuntimes, resolveInstallTargetPaths, installSkills } from "./init-skills.js";
10
+ import { registerMcp, resolveMcpTargetPaths } from "./init-mcp.js";
11
+ import { initNextSteps, environmentHint } from "./init-next-steps.js";
12
+ import { loadManifest } from "@jevitate/skills";
13
+ import { resolveDataDir } from "./data-dir.js";
14
+ import { emitJson, emitCommandResult } from "./cli-shared.js";
15
+ /** Registers `jevitate init` (API keys, skills/MCP wiring, the repo's .jevitate/). */
16
+ export function registerInitCommands(program, deps) {
17
+ program
18
+ .command("init")
19
+ .description("set up jevitate: collect API keys, install skills/MCP wiring, create the repo's .jevitate/")
20
+ .option("--json", "emit a JSON envelope")
21
+ .option("--skip-keys", "skip credential collection")
22
+ .option("--replace-keys", "prompt (masked) for a new value of every key, even one already stored, and store it")
23
+ .option("--no-verify", "skip the live auth check of each key (offline / CI): report presence and source only")
24
+ .option("--skip-skills", "skip skill installation")
25
+ .option("--skip-mcp", "skip registering the jevitate MCP server in detected harnesses")
26
+ .option("--targets <ids>", "comma-separated runtime ids to force-install to, overriding detection")
27
+ .option("--force", "overwrite a user-modified installed skill file/block or MCP config entry")
28
+ .option("--dry-run", "report planned skill-install/mcp-register actions without writing")
29
+ .option("--skip-project", "skip creating the repo's .jevitate/ (journeys, regressions, baselines, logs)")
30
+ .action(async function () {
31
+ const { json, skipKeys, skipSkills, skipMcp, skipProject, targets, force, dryRun, replaceKeys, verify } = this.opts();
32
+ try {
33
+ const data = { initialized: true };
34
+ // The repo's own .jevitate/ (0.2.0 layout): Journeys, regressions and baselines live with the
35
+ // app's code; logs stay local. Secrets and machine state stay in ~/.jevitate.
36
+ if (!skipProject)
37
+ data.project = initProjectDir(deps.init?.detection?.cwd?.() ?? process.cwd(), { ...(dryRun === true ? { dryRun: true } : {}) });
38
+ if (!skipKeys) {
39
+ // SECURITY: reuses the existing, already-guardrailed credential
40
+ // collection. The report holds only key NAMES (required/collected/missing),
41
+ // never a value — nothing here reads, echoes, logs, or returns a key.
42
+ const store = envCredentialStore(deps.ai?.env ?? process.env, deps.ai?.localConfig ?? loadLocalCredentials());
43
+ const io = deps.ai?.secureIO ?? realSecureIO();
44
+ // #230: never prompt a non-interactive stdin (no TTY — how coding agents and CI run
45
+ // `jevitate init`) — it would hang reading a 'line' event that never comes, or read EOF
46
+ // silently. Report what's still missing instead; the rest of init still completes.
47
+ const interactive = deps.init?.isInteractive?.() ?? process.stdin.isTTY === true;
48
+ if (replaceKeys === true && !interactive) {
49
+ throw new Error("--replace-keys needs an interactive terminal (stdin is not a TTY) — run `jevitate init --replace-keys` in a terminal");
50
+ }
51
+ const fetchFn = deps.ai?.verifyFetch ?? realVerifyFetch;
52
+ // #291: each entered key is checked with its provider BEFORE it is stored.
53
+ const gate = enteredKeyCheck(fetchFn);
54
+ const keys = await collectAllMissingKeys(store, io, {
55
+ interactive,
56
+ ...(replaceKeys === true ? { replace: true } : {}),
57
+ ...(verify ? { check: gate.check } : {}),
58
+ });
59
+ // #268: name every key's source; #291: verify every key the features use (env wins).
60
+ const { env, localConfig } = credentialInputs(deps.ai);
61
+ const nowLocal = { ...localConfig, ...Object.fromEntries(gate.entered) };
62
+ const nowStore = envCredentialStore(env, nowLocal);
63
+ for (const feature of Object.keys(keys)) {
64
+ const r = keys[feature];
65
+ const sources = keySources(feature, env, verify ? nowLocal : { ...localConfig, ...Object.fromEntries(r.collected.map((k) => [k, "set"])) });
66
+ const warnings = shadowWarnings(r.collected, sources);
67
+ r.sources = sources;
68
+ if (verify)
69
+ r.verification = await verifyFeatureKeys(feature, nowStore, fetchFn, gate.verdicts);
70
+ if (warnings.length > 0)
71
+ r.warnings = warnings;
72
+ }
73
+ data.keys = keys;
74
+ }
75
+ // Explicit `--targets` overrides detection entirely (the user takes
76
+ // full control); otherwise `detectRuntimes` decides, always including
77
+ // the always-on generic fallback. Shared by the skill install and the
78
+ // MCP registration so a single selection drives both.
79
+ const runtimes = targets
80
+ ? targets.split(",").map((t) => t.trim()).filter((t) => t.length > 0)
81
+ : detectRuntimes(deps.init?.detection);
82
+ if (!skipSkills) {
83
+ const paths = resolveInstallTargetPaths(deps.init?.detection);
84
+ const statePath = deps.init?.statePath ?? resolveDataDir(["skills-install-state.json"]);
85
+ const skills = loadManifest();
86
+ data.skills = await installSkills(runtimes, skills, paths, statePath, { force, dryRun });
87
+ }
88
+ if (!skipMcp) {
89
+ // Register the `jevitate mcp` server for each detected/selected
90
+ // harness, with the SAME never-clobber safety as skills: a user's
91
+ // conflicting or unparseable config is never overwritten without
92
+ // --force; each declined target reports a printable instruction
93
+ // instead (honest, never corrupts a config). `generic` has no MCP
94
+ // convention and is skipped inside `registerMcp`.
95
+ const mcpPaths = resolveMcpTargetPaths(deps.init?.detection);
96
+ data.mcp = await registerMcp(runtimes, mcpPaths, { force, dryRun });
97
+ }
98
+ // #230: exit 0 even when keys are still missing (the non-interactive path above) —
99
+ // init's other work (project dir, skills, MCP registration) genuinely succeeded, and a
100
+ // missing key is expected/normal for a fresh non-interactive install (CI, a coding
101
+ // agent) that configures keys separately. The warning lives in `data.keys[*].missing`
102
+ // (both here and in the --json envelope) rather than in the exit code, so a script that
103
+ // only checks the exit code still sees init as having done its job; a caller that cares
104
+ // about keys reads the summary/envelope, same as `jevitate ai status`.
105
+ // The "try this next" block, tailored to what is set up now (keys, MCP, the repo's
106
+ // environments). Additive in --json (`data.nextSteps`); keys are checked by NAME only.
107
+ const keysReady = data.keys !== undefined
108
+ ? Object.values(data.keys).every((r) => (r.missing ?? []).length === 0 && !(r.verification ?? []).some((v) => v.status === "invalid"))
109
+ : (() => {
110
+ const store = envCredentialStore(deps.ai?.env ?? process.env, deps.ai?.localConfig ?? loadLocalCredentials());
111
+ return Object.keys(FEATURE_KEYS).every((f) => FEATURE_KEYS[f].every((k) => store.detect(k)));
112
+ })();
113
+ const projectDir = data.project?.dir ?? null;
114
+ data.nextSteps = initNextSteps({
115
+ keysReady,
116
+ ...environmentHint(projectDir),
117
+ ...(data.mcp !== undefined ? { mcp: data.mcp } : {}),
118
+ skills: data.skills !== undefined,
119
+ dryRun: dryRun === true,
120
+ });
121
+ const envelope = ok(data);
122
+ if (json) {
123
+ emitJson(program, envelope);
124
+ }
125
+ else {
126
+ const out = program.configureOutput().writeOut;
127
+ // #213: --dry-run writes nothing — say "would" so the summary matches the disk.
128
+ out?.(dryRun === true ? "jevitate: dry run — nothing was written\n" : "jevitate initialized\n");
129
+ // #210/#230: per feature, "ready — n/n configured", or (no TTY on stdin) "not
130
+ // configured — set X or run `jevitate ai setup <feature>`" — never a raw `collected:
131
+ // []` that reads as "missing" when every key was already set.
132
+ if (data.keys)
133
+ out?.(`${formatInitKeysHuman(data.keys)}\n`);
134
+ if (data.skills)
135
+ out?.(`skills: ${data.skills.length} target/skill pairs ${dryRun === true ? "would be processed" : "processed"}\n`);
136
+ if (data.mcp)
137
+ out?.(`mcp: ${data.mcp.length} harness config(s) ${dryRun === true ? "would be processed" : "processed"}\n`);
138
+ const project = data.project;
139
+ if (project !== undefined) {
140
+ out?.(project.dir === null
141
+ ? `project: ${project.reason ?? "none"}\n`
142
+ : `project: ${project.dir} (${project.created.length} ${dryRun === true ? "would create" : "created"})\n`);
143
+ }
144
+ out?.(`next steps${data.project?.dir == null ? "" : " (app URLs: .jevitate/environments.json)"}:\n`);
145
+ for (const line of data.nextSteps)
146
+ out?.(` ${line}\n`);
147
+ process.exitCode = 0;
148
+ }
149
+ }
150
+ catch (err) {
151
+ const code = err instanceof KeyCheckError ? err.code : "E_INIT";
152
+ emitCommandResult(program, fail(code, String(err instanceof Error ? err.message : err)), { json: json === true, command: "init" });
153
+ }
154
+ });
155
+ }
156
+ //# sourceMappingURL=init-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-cli.js","sourceRoot":"","sources":["../src/init-cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAgB,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAA0B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAA4B,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAC5G,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAyB,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAgB,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,IAAa;IAClE,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4FAA4F,CAAC;SACzG,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC;SACxC,MAAM,CAAC,aAAa,EAAE,4BAA4B,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,qFAAqF,CAAC;SAC/G,MAAM,CAAC,aAAa,EAAE,sFAAsF,CAAC;SAC7G,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;SAClD,MAAM,CAAC,YAAY,EAAE,gEAAgE,CAAC;SACtF,MAAM,CAAC,iBAAiB,EAAE,uEAAuE,CAAC;SAClG,MAAM,CAAC,SAAS,EAAE,0EAA0E,CAAC;SAC7F,MAAM,CAAC,WAAW,EAAE,mEAAmE,CAAC;SACxF,MAAM,CAAC,gBAAgB,EAAE,8EAA8E,CAAC;SACxG,MAAM,CAAC,KAAK;QACX,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAW/G,CAAC;QACL,IAAI,CAAC;YACH,MAAM,IAAI,GAA4B,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAC5D,8FAA8F;YAC9F,8EAA8E;YAC9E,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClJ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,gEAAgE;gBAChE,4EAA4E;gBAC5E,sEAAsE;gBACtE,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,IAAI,oBAAoB,EAAE,CAAC,CAAC;gBAC9G,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,YAAY,EAAE,CAAC;gBAC/C,oFAAoF;gBACpF,wFAAwF;gBACxF,mFAAmF;gBACnF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;gBACjF,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,sHAAsH,CAAC,CAAC;gBAC1I,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,WAAW,IAAI,eAAe,CAAC;gBACxD,2EAA2E;gBAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE,EAAE,EAAE;oBAClD,WAAW;oBACX,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzC,CAAC,CAAC;gBACH,qFAAqF;gBACrF,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACnD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAc,EAAE,CAAC;oBACrD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC5I,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACtD,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;oBACpB,IAAI,MAAM;wBAAE,CAAC,CAAC,YAAY,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAChG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACjD,CAAC;gBACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,oEAAoE;YACpE,sEAAsE;YACtE,sEAAsE;YACtE,sDAAsD;YACtD,MAAM,QAAQ,GAAG,OAAO;gBACtB,CAAC,CAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAiB;gBACtF,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAEzC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,cAAc,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBACxF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,gEAAgE;gBAChE,kEAAkE;gBAClE,iEAAiE;gBACjE,gEAAgE;gBAChE,kEAAkE;gBAClE,kDAAkD;gBAClD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,mFAAmF;YACnF,uFAAuF;YACvF,mFAAmF;YACnF,sFAAsF;YACtF,wFAAwF;YACxF,wFAAwF;YACxF,uEAAuE;YACvE,mFAAmF;YACnF,uFAAuF;YACvF,MAAM,SAAS,GACb,IAAI,CAAC,IAAI,KAAK,SAAS;gBACrB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAA2B,CAAC,CAAC,KAAK,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CACrG;gBACH,CAAC,CAAC,CAAC,GAAG,EAAE;oBACJ,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,IAAI,oBAAoB,EAAE,CAAC,CAAC;oBAC9G,OAAQ,MAAM,CAAC,IAAI,CAAC,YAAY,CAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9G,CAAC,CAAC,EAAE,CAAC;YACX,MAAM,UAAU,GAAI,IAAI,CAAC,OAAyC,EAAE,GAAG,IAAI,IAAI,CAAC;YAChF,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;gBAC7B,SAAS;gBACT,GAAG,eAAe,CAAC,UAAU,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAyB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS;gBACjC,MAAM,EAAE,MAAM,KAAK,IAAI;aACxB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;gBAC/C,gFAAgF;gBAChF,GAAG,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAChG,8EAA8E;gBAC9E,qFAAqF;gBACrF,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,IAAI;oBAAE,GAAG,EAAE,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAA2B,CAAC,IAAI,CAAC,CAAC;gBACnF,IAAI,IAAI,CAAC,MAAM;oBAAE,GAAG,EAAE,CAAC,WAAY,IAAI,CAAC,MAAoB,CAAC,MAAM,uBAAuB,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBACpJ,IAAI,IAAI,CAAC,GAAG;oBAAE,GAAG,EAAE,CAAC,QAAS,IAAI,CAAC,GAAiB,CAAC,MAAM,sBAAsB,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC1I,MAAM,OAAO,GAAG,IAAI,CAAC,OAAwC,CAAC;gBAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,GAAG,EAAE,CACH,OAAO,CAAC,GAAG,KAAK,IAAI;wBAClB,CAAC,CAAC,YAAY,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI;wBAC1C,CAAC,CAAC,YAAY,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,KAAK,CAC5G,CAAC;gBACJ,CAAC;gBACD,GAAG,EAAE,CAAC,aAAc,IAAI,CAAC,OAAyC,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0CAA0C,KAAK,CAAC,CAAC;gBACxI,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAqB;oBAAE,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;gBACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,GAAG,YAAY,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChE,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrI,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,14 +1,42 @@
1
1
  import { type CredentialStore, type SecureKeyIO, type Feature, type CredentialKey } from "@jevitate/ai-core";
2
+ import type { KeySourceReport, KeyVerificationReport } from "./key-report.js";
2
3
  export interface FeatureKeyReport {
3
4
  required: CredentialKey[];
4
5
  collected: CredentialKey[];
6
+ /**
7
+ * #230: only set on the non-interactive path — the required keys still absent after this
8
+ * command ran (nothing was prompted for, nothing persisted). Undefined/empty on the
9
+ * interactive path: `collectMissingKeys` either leaves every required key configured or
10
+ * throws (fail-closed), so there is nothing left to report as missing.
11
+ */
12
+ missing?: CredentialKey[];
13
+ /** #268: where each key comes from — names and sources only (additive). */
14
+ sources?: KeySourceReport[];
15
+ /** #291: the live auth check per key (additive; absent with --no-verify). */
16
+ verification?: KeyVerificationReport[];
17
+ /** #268: an env var that overrides a key just stored. */
18
+ warnings?: string[];
5
19
  }
6
20
  export type KeyCollectionReport = Record<Feature, FeatureKeyReport>;
21
+ export interface CollectAllMissingKeysOptions {
22
+ /**
23
+ * #230: false when stdin is not a TTY (no key env vars, piped/redirected input — how coding
24
+ * agents and CI run `jevitate init`). `SecureKeyIO.promptSecret` reads a 'line' event that a
25
+ * closed/non-interactive stdin never emits, so prompting there would hang until the process is
26
+ * killed, or (observed) read EOF and exit 0 with nothing collected and no summary. Default true
27
+ * (a real terminal): unchanged prompting behavior.
28
+ */
29
+ interactive?: boolean;
30
+ /** #268 (`--replace-keys`): prompt for every key, even one already stored, and store the new value. */
31
+ replace?: boolean;
32
+ /** #291: checks each entered value before it is persisted (throws to refuse it). */
33
+ check?: (key: CredentialKey, value: string) => Promise<void>;
34
+ }
7
35
  /**
8
36
  * Thin orchestration over the existing, already-guardrailed `collectMissingKeys`
9
37
  * — collects every feature's missing keys in turn (never in parallel:
10
38
  * `SecureKeyIO.promptSecret` is a single shared stdin, so concurrent prompts
11
39
  * would interleave). Adds NO new key-handling logic: it never reads, echoes,
12
- * logs, or returns a key value — only the key NAMES (required/collected).
40
+ * logs, or returns a key value — only the key NAMES (required/collected/missing).
13
41
  */
14
- export declare function collectAllMissingKeys(store: CredentialStore, io: SecureKeyIO): Promise<KeyCollectionReport>;
42
+ export declare function collectAllMissingKeys(store: CredentialStore, io: SecureKeyIO, opts?: CollectAllMissingKeysOptions): Promise<KeyCollectionReport>;
package/dist/init-keys.js CHANGED
@@ -1,17 +1,31 @@
1
- import { collectMissingKeys, FEATURE_KEYS, } from "@jevitate/ai-core";
1
+ import { collectKeys, FEATURE_KEYS, } from "@jevitate/ai-core";
2
2
  const FEATURES = ["generation", "judgment"];
3
3
  /**
4
4
  * Thin orchestration over the existing, already-guardrailed `collectMissingKeys`
5
5
  * — collects every feature's missing keys in turn (never in parallel:
6
6
  * `SecureKeyIO.promptSecret` is a single shared stdin, so concurrent prompts
7
7
  * would interleave). Adds NO new key-handling logic: it never reads, echoes,
8
- * logs, or returns a key value — only the key NAMES (required/collected).
8
+ * logs, or returns a key value — only the key NAMES (required/collected/missing).
9
9
  */
10
- export async function collectAllMissingKeys(store, io) {
10
+ export async function collectAllMissingKeys(store, io, opts = {}) {
11
11
  const report = {};
12
+ const interactive = opts.interactive ?? true;
12
13
  for (const feature of FEATURES) {
13
- const collected = await collectMissingKeys(feature, store, io);
14
- report[feature] = { required: [...FEATURE_KEYS[feature]], collected };
14
+ const required = [...FEATURE_KEYS[feature]];
15
+ if (interactive) {
16
+ const collected = await collectKeys(feature, store, io, {
17
+ ...(opts.replace === true ? { replace: true } : {}),
18
+ ...(opts.check === undefined ? {} : { check: opts.check }),
19
+ });
20
+ report[feature] = { required, collected };
21
+ }
22
+ else {
23
+ // Never prompt: report what's still missing instead of hanging on a closed stdin. `missing`
24
+ // is omitted (not an empty array) when nothing is missing, so a fully-configured non-TTY
25
+ // run reads identically to the interactive path's `{ required, collected: [] }`.
26
+ const missing = required.filter((k) => !store.detect(k));
27
+ report[feature] = { required, collected: [], ...(missing.length > 0 ? { missing } : {}) };
28
+ }
15
29
  }
16
30
  return report;
17
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init-keys.js","sourceRoot":"","sources":["../src/init-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,YAAY,GAKb,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,QAAQ,GAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAsB,EACtB,EAAe;IAEf,MAAM,MAAM,GAAG,EAAyB,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"init-keys.js","sourceRoot":"","sources":["../src/init-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,YAAY,GAKb,MAAM,mBAAmB,CAAC;AAsB3B,MAAM,QAAQ,GAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAiBvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAsB,EACtB,EAAe,EACf,OAAqC,EAAE;IAEvC,MAAM,MAAM,GAAG,EAAyB,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;gBACtD,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;aAC3D,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,4FAA4F;YAC5F,yFAAyF;YACzF,iFAAiF;YACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { McpInstallReport } from "./init-mcp.js";
2
+ /** What `jevitate init` knows after setup that changes the "try this next" block. */
3
+ export interface InitNextStepsInput {
4
+ /** Both AI features (generation + judgment) have their keys configured. */
5
+ readonly keysReady: boolean;
6
+ /** The app URL to put in the commands, when the repo's environments file names a real one. */
7
+ readonly appUrl?: string;
8
+ /** A non-production environment name from `.jevitate/environments.json`, for `demo --env`. */
9
+ readonly env?: string;
10
+ /** The MCP registration report; undefined when `--skip-mcp`. */
11
+ readonly mcp?: readonly McpInstallReport[];
12
+ /** Whether skills were installed (false under `--skip-skills`). */
13
+ readonly skills: boolean;
14
+ readonly dryRun: boolean;
15
+ }
16
+ /**
17
+ * The ≤5 "try this next" lines `jevitate init` prints (and returns as `data.nextSteps`). Every
18
+ * command is a real one with real flags (skills-cli-drift.test.ts checks them against the CLI);
19
+ * placeholders are `<…>` so nothing reads as a value we guessed. Tailored, never silent:
20
+ * - keys ready → a goal run, an authored Journey and a demo (all need the model gateway);
21
+ * - keys missing → the key-free adversarial run (`--fake-ai`: misuse is planned in code, the
22
+ * findings are hard signals), a human-recorded flow, and how to add the keys;
23
+ * - the agent line says whether the MCP server was registered, declined (conflict), or skipped.
24
+ */
25
+ export declare function initNextSteps(input: InitNextStepsInput): string[];
26
+ /**
27
+ * Reads `.jevitate/environments.json` for the next-steps block: the first non-production
28
+ * environment's name, and its `baseUrl` only when it is not the untouched scaffold's (so the block
29
+ * never presents the example `http://localhost:3000` as "your app"). Unreadable → nothing: the
30
+ * block keeps its `<app-url>`/`<env>` placeholders.
31
+ */
32
+ export declare function environmentHint(projectDir: string | null): {
33
+ appUrl?: string;
34
+ env?: string;
35
+ };