@reticlehq/server 3.6.0 → 3.7.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 (614) hide show
  1. package/SKILL.md +122 -123
  2. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  3. package/dist/command/cli/adhoc-suite.js +42 -7
  4. package/dist/command/cli/adhoc-verdict.d.ts +18 -2
  5. package/dist/command/cli/adhoc-verdict.js +70 -6
  6. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  7. package/dist/command/cli/answers/gate-exit.js +45 -0
  8. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  9. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  10. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  11. package/dist/command/cli/auth/device-flow.js +17 -0
  12. package/dist/command/cli/cli-doctor.js +14 -0
  13. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  14. package/dist/command/cli/cli-flow-commands.js +28 -105
  15. package/dist/command/cli/cli-kill.js +3 -2
  16. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  17. package/dist/command/cli/cli-parse-grammar.js +75 -0
  18. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  19. package/dist/command/cli/cli-parse-verify.js +18 -0
  20. package/dist/command/cli/cli-parse.d.ts +19 -28
  21. package/dist/command/cli/cli-parse.js +82 -182
  22. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  23. package/dist/command/cli/cli-update-commands.js +61 -9
  24. package/dist/command/cli/cli-usage.d.ts +33 -0
  25. package/dist/command/cli/cli-usage.js +287 -0
  26. package/dist/command/cli/cli-verify.d.ts +34 -4
  27. package/dist/command/cli/cli-verify.js +81 -12
  28. package/dist/command/cli/cloud-cli.d.ts +13 -0
  29. package/dist/command/cli/cloud-cli.js +145 -333
  30. package/dist/command/cli/cloud-kit.d.ts +12 -0
  31. package/dist/command/cli/cloud-kit.js +41 -2
  32. package/dist/command/cli/cloud-link.d.ts +57 -0
  33. package/dist/command/cli/cloud-link.js +308 -0
  34. package/dist/command/cli/cloud-login.d.ts +15 -1
  35. package/dist/command/cli/cloud-login.js +67 -13
  36. package/dist/command/cli/context-command.d.ts +1 -0
  37. package/dist/command/cli/context-command.js +33 -0
  38. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  39. package/dist/command/cli/daemon-start-options.js +24 -3
  40. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  41. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  42. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  43. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  44. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  45. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  46. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  47. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  48. package/dist/command/cli/known-regression.d.ts +13 -0
  49. package/dist/command/cli/known-regression.js +34 -0
  50. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  51. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  52. package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
  53. package/dist/command/cli/mcp-command.d.ts +6 -0
  54. package/dist/command/cli/mcp-command.js +13 -5
  55. package/dist/command/cli/ports/port-holder.js +1 -1
  56. package/dist/command/cli/project-name.d.ts +29 -1
  57. package/dist/command/cli/project-name.js +107 -2
  58. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  59. package/dist/command/cli/setup-mcp-cli.js +29 -8
  60. package/dist/command/cli/status/status-lines.d.ts +1 -0
  61. package/dist/command/cli/status/status-lines.js +47 -2
  62. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  63. package/dist/command/cli/status/workspace-links.js +29 -0
  64. package/dist/command/cli/try-command.d.ts +96 -0
  65. package/dist/command/cli/try-command.js +362 -0
  66. package/dist/command/cli/tutorial.d.ts +0 -100
  67. package/dist/command/cli/tutorial.js +0 -178
  68. package/dist/command/cli/verify-results.d.ts +19 -0
  69. package/dist/command/cli/verify-results.js +29 -0
  70. package/dist/command/cli-onboarding.d.ts +0 -11
  71. package/dist/command/cli-onboarding.js +0 -15
  72. package/dist/command/cli.d.ts +14 -0
  73. package/dist/command/cli.js +103 -83
  74. package/dist/command/daemon/daemon-resilience.js +4 -4
  75. package/dist/command/daemon/daemon-resolve.d.ts +9 -1
  76. package/dist/command/daemon/daemon-resolve.js +49 -10
  77. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  78. package/dist/command/setup/bringup/bridge-port.js +13 -3
  79. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  80. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  81. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  82. package/dist/command/setup/init/agent-restart.js +28 -0
  83. package/dist/command/setup/init/init-port.d.ts +10 -1
  84. package/dist/command/setup/init/init-port.js +22 -2
  85. package/dist/command/setup/init/init-runtime.d.ts +12 -2
  86. package/dist/command/setup/init/init-runtime.js +96 -37
  87. package/dist/command/setup/node-effects.d.ts +2 -0
  88. package/dist/command/setup/node-effects.js +36 -8
  89. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  90. package/dist/command/setup/probe/existing-app.js +14 -0
  91. package/dist/command/setup/remaining-steps.js +1 -1
  92. package/dist/command/setup/run-setup.d.ts +29 -9
  93. package/dist/command/setup/run-setup.js +34 -28
  94. package/dist/command/setup/setup-command.d.ts +23 -0
  95. package/dist/command/setup/setup-command.js +57 -4
  96. package/dist/command/setup/setup-mcp.js +25 -2
  97. package/dist/command/setup/tauri-signing.d.ts +19 -0
  98. package/dist/command/setup/tauri-signing.js +79 -0
  99. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  100. package/dist/command/setup/terminal/listeners.js +37 -6
  101. package/dist/command/update/update-nudge.d.ts +9 -0
  102. package/dist/command/update/update-nudge.js +1 -1
  103. package/dist/command/update/updater.js +11 -15
  104. package/dist/command/version/version-nudge.js +3 -0
  105. package/dist/command/version/version-skew.d.ts +20 -1
  106. package/dist/command/version/version-skew.js +38 -2
  107. package/dist/features/crawl/crawl.js +14 -1
  108. package/dist/features/exhaust/ledger.d.ts +14 -14
  109. package/dist/features/harness/drive-report.d.ts +39 -5
  110. package/dist/features/harness/drive-report.js +271 -54
  111. package/dist/features/harness/drive-runs.d.ts +120 -0
  112. package/dist/features/harness/drive-runs.js +289 -0
  113. package/dist/features/harness/drivers.d.ts +1 -1
  114. package/dist/features/harness/drivers.js +1 -1
  115. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  116. package/dist/features/harness/explore/console-pages.js +146 -0
  117. package/dist/features/harness/explore/disparity.d.ts +19 -0
  118. package/dist/features/harness/explore/disparity.js +71 -0
  119. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  120. package/dist/features/harness/explore/fake-app.js +49 -0
  121. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  122. package/dist/features/harness/explore/goal-search.js +144 -0
  123. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  124. package/dist/features/harness/explore/page-tree.js +148 -0
  125. package/dist/features/harness/explore/site-map.d.ts +34 -0
  126. package/dist/features/harness/explore/site-map.js +150 -0
  127. package/dist/features/harness/goals.d.ts +68 -7
  128. package/dist/features/harness/goals.js +289 -36
  129. package/dist/features/harness/harness.d.ts +30 -1
  130. package/dist/features/harness/harness.js +141 -7
  131. package/dist/features/harness/platform/local-apps.d.ts +36 -3
  132. package/dist/features/harness/platform/local-apps.js +81 -5
  133. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  134. package/dist/features/harness/platform/persona-credentials.js +69 -0
  135. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  136. package/dist/features/harness/platform/platform-drives.js +114 -0
  137. package/dist/features/harness/platform/refusal.d.ts +52 -0
  138. package/dist/features/harness/platform/refusal.js +71 -0
  139. package/dist/features/harness/platform/remote-drive.d.ts +8 -2
  140. package/dist/features/harness/platform/remote-drive.js +22 -9
  141. package/dist/features/harness/platform/script.d.ts +57 -11
  142. package/dist/features/harness/platform/script.js +144 -12
  143. package/dist/features/harness/platform/server-driver.d.ts +17 -4
  144. package/dist/features/harness/platform/server-driver.js +29 -26
  145. package/dist/features/harness/platform-config.d.ts +38 -5
  146. package/dist/features/harness/platform-config.js +93 -8
  147. package/dist/features/harness/route-guess.d.ts +13 -0
  148. package/dist/features/harness/route-guess.js +49 -0
  149. package/dist/features/harness/script/script-run.d.ts +30 -1
  150. package/dist/features/harness/script/script-run.js +355 -48
  151. package/dist/features/license/license.d.ts +2 -2
  152. package/dist/features/visual/step-shots.d.ts +31 -0
  153. package/dist/features/visual/step-shots.js +231 -0
  154. package/dist/features/visual/visual-tools.js +22 -14
  155. package/dist/hooks/client-directory.d.ts +18 -0
  156. package/dist/hooks/client-directory.js +57 -0
  157. package/dist/hooks/coding-agents.d.ts +34 -0
  158. package/dist/hooks/coding-agents.js +117 -0
  159. package/dist/hooks/driven-by.d.ts +21 -2
  160. package/dist/hooks/driven-by.js +42 -2
  161. package/dist/hooks/hook-bus.d.ts +4 -0
  162. package/dist/hooks/hook-bus.js +18 -0
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.js +26 -183
  165. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  166. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  167. package/dist/judgement/capsule/causal-summary.js +33 -0
  168. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  169. package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
  170. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  171. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  172. package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
  173. package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
  174. package/dist/judgement/runs/artifact/run-store.js +175 -8
  175. package/dist/judgement/runs/context-tools.js +59 -1
  176. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  177. package/dist/judgement/runs/default-run-id.js +16 -0
  178. package/dist/judgement/runs/drive-run.d.ts +53 -5
  179. package/dist/judgement/runs/drive-run.js +234 -20
  180. package/dist/judgement/runs/resume.d.ts +44 -0
  181. package/dist/judgement/runs/resume.js +137 -0
  182. package/dist/judgement/runs/reticle-runner.js +5 -2
  183. package/dist/judgement/runs/runner-port.d.ts +5 -1
  184. package/dist/judgement/runs/runner-port.js +8 -2
  185. package/dist/judgement/runs/verification-sync.d.ts +2 -0
  186. package/dist/judgement/runs/verification-sync.js +36 -15
  187. package/dist/language/flows/decision.js +2 -1
  188. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  189. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  190. package/dist/language/flows/flow-anchor.d.ts +7 -2
  191. package/dist/language/flows/flow-anchor.js +10 -3
  192. package/dist/language/flows/flow-intent.d.ts +1 -0
  193. package/dist/language/flows/flow-journey.d.ts +6 -0
  194. package/dist/language/flows/flow-journey.js +20 -0
  195. package/dist/language/flows/flow-learning.d.ts +4 -0
  196. package/dist/language/flows/flow-learning.js +37 -3
  197. package/dist/language/flows/flow-replay-run.js +16 -18
  198. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  199. package/dist/language/flows/flow-replay.d.ts +18 -1
  200. package/dist/language/flows/flow-replay.js +22 -7
  201. package/dist/language/flows/flow-result.d.ts +22 -1
  202. package/dist/language/flows/flow-result.js +47 -2
  203. package/dist/language/flows/flow-step-runners.d.ts +2 -0
  204. package/dist/language/flows/flow-step-runners.js +12 -6
  205. package/dist/language/flows/flow-store-for-session.js +5 -1
  206. package/dist/language/flows/flow-tools.d.ts +10 -0
  207. package/dist/language/flows/flow-tools.js +61 -62
  208. package/dist/language/flows/flows.d.ts +16 -1
  209. package/dist/language/flows/flows.js +69 -10
  210. package/dist/language/flows/narrow-write.d.ts +7 -0
  211. package/dist/language/flows/narrow-write.js +36 -1
  212. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  213. package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
  214. package/dist/language/flows/recording/tape/recordings.js +60 -10
  215. package/dist/language/flows/replay.js +29 -6
  216. package/dist/language/flows/single-replay.d.ts +7 -0
  217. package/dist/language/flows/single-replay.js +26 -0
  218. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  219. package/dist/language/flows/verify-change-tools.js +200 -193
  220. package/dist/memory/cloud/cloud-config.d.ts +10 -1
  221. package/dist/memory/cloud/cloud-config.js +19 -5
  222. package/dist/memory/cloud/cloud-sync.js +3 -3
  223. package/dist/memory/cloud/harness-config.d.ts +49 -0
  224. package/dist/memory/cloud/harness-config.js +16 -20
  225. package/dist/memory/cloud/memory-scope.d.ts +17 -0
  226. package/dist/memory/cloud/memory-scope.js +22 -0
  227. package/dist/memory/cloud/sync-cycle.d.ts +32 -4
  228. package/dist/memory/cloud/sync-cycle.js +113 -12
  229. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  230. package/dist/memory/cloud/sync-daemon.js +114 -4
  231. package/dist/memory/cloud/sync-disk.js +26 -2
  232. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  233. package/dist/memory/cloud/sync-screenshots.js +105 -0
  234. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  235. package/dist/memory/cloud/unsynced-roots.js +166 -0
  236. package/dist/memory/impact/account-watch.d.ts +16 -1
  237. package/dist/memory/impact/account-watch.js +26 -1
  238. package/dist/memory/impact/impact-store.d.ts +1 -4
  239. package/dist/memory/impact/impact-store.js +32 -42
  240. package/dist/memory/intent/inline-intent.d.ts +1 -0
  241. package/dist/memory/intent/intent-shard-store.js +16 -4
  242. package/dist/memory/intent/intent-shard.d.ts +12 -0
  243. package/dist/memory/intent/intent-store.d.ts +1 -0
  244. package/dist/memory/intent/intent-tools.js +42 -2
  245. package/dist/memory/intent/open-intents.d.ts +6 -0
  246. package/dist/memory/intent/open-intents.js +10 -1
  247. package/dist/memory/intent/settled-words.d.ts +24 -0
  248. package/dist/memory/intent/settled-words.js +130 -0
  249. package/dist/memory/journal/drive-flow.d.ts +16 -0
  250. package/dist/memory/journal/drive-flow.js +34 -2
  251. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  252. package/dist/memory/journal/drive-run-flush.js +20 -5
  253. package/dist/memory/journal/journal-recorder.js +46 -3
  254. package/dist/memory/journal/on-disk/retention.d.ts +5 -0
  255. package/dist/memory/journal/on-disk/retention.js +27 -2
  256. package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
  257. package/dist/memory/journal/session-end.d.ts +15 -1
  258. package/dist/memory/journal/session-end.js +38 -7
  259. package/dist/memory/project/artifact-root-resolver.js +33 -5
  260. package/dist/memory/project/artifact-root.d.ts +4 -3
  261. package/dist/memory/project/artifact-root.js +2 -2
  262. package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
  263. package/dist/memory/project/dir/reticle-dir.js +23 -2
  264. package/dist/memory/project/link-directory.d.ts +15 -0
  265. package/dist/memory/project/link-directory.js +44 -0
  266. package/dist/memory/project/root-claims.d.ts +6 -0
  267. package/dist/memory/project/root-claims.js +39 -0
  268. package/dist/memory/project/session-root.d.ts +2 -0
  269. package/dist/memory/project/session-root.js +9 -1
  270. package/dist/memory/project/sync-status.d.ts +46 -0
  271. package/dist/memory/project/sync-status.js +135 -1
  272. package/dist/memory/recall/memory-tools.js +46 -3
  273. package/dist/memory/recall/platform-memory.d.ts +34 -0
  274. package/dist/memory/recall/platform-memory.js +139 -0
  275. package/dist/memory/recall/project-memory.js +36 -8
  276. package/dist/portal/bridge/bridge.d.ts +9 -5
  277. package/dist/portal/bridge/bridge.js +66 -23
  278. package/dist/portal/bridge/harness-request.d.ts +23 -0
  279. package/dist/portal/bridge/harness-request.js +27 -0
  280. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  281. package/dist/portal/bridge/wrong-path.js +35 -0
  282. package/dist/portal/input/network-mock-tools.js +11 -2
  283. package/dist/portal/input/real-input.d.ts +2 -0
  284. package/dist/portal/input/real-input.js +13 -10
  285. package/dist/portal/pool/browser-pool.d.ts +48 -0
  286. package/dist/portal/pool/browser-pool.js +120 -2
  287. package/dist/portal/pool/context-permissions.d.ts +33 -0
  288. package/dist/portal/pool/context-permissions.js +33 -0
  289. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  290. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  291. package/dist/portal/pool/playwright-launcher.d.ts +27 -5
  292. package/dist/portal/pool/playwright-launcher.js +59 -14
  293. package/dist/portal/pool/pool-contract.d.ts +21 -1
  294. package/dist/portal/session/agent-link.d.ts +8 -0
  295. package/dist/portal/session/agent-link.js +17 -0
  296. package/dist/portal/session/command-payload.js +6 -1
  297. package/dist/portal/session/daemon-answers.d.ts +3 -3
  298. package/dist/portal/session/daemon-answers.js +4 -2
  299. package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
  300. package/dist/portal/session/dev-server/dev-command.js +27 -1
  301. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  302. package/dist/portal/session/facts/observed-state.js +46 -3
  303. package/dist/portal/session/human/live-control.d.ts +9 -2
  304. package/dist/portal/session/human/live-control.js +12 -3
  305. package/dist/portal/session/live-control-tools.js +82 -13
  306. package/dist/portal/session/narration-args.d.ts +5 -0
  307. package/dist/portal/session/narration-args.js +17 -0
  308. package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
  309. package/dist/portal/session/no-session-diagnosis.js +31 -9
  310. package/dist/portal/session/no-session-next-action.d.ts +20 -0
  311. package/dist/portal/session/no-session-next-action.js +134 -61
  312. package/dist/portal/session/no-session-watch.js +179 -22
  313. package/dist/portal/session/presence/session-lease.js +1 -1
  314. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  315. package/dist/portal/session/recorded-gaps.js +251 -0
  316. package/dist/portal/session/session-health.d.ts +11 -0
  317. package/dist/portal/session/session-health.js +3 -1
  318. package/dist/portal/session/session-info.js +2 -1
  319. package/dist/portal/session/session-manager.d.ts +18 -0
  320. package/dist/portal/session/session-manager.js +54 -3
  321. package/dist/portal/session/session-successor.d.ts +8 -0
  322. package/dist/portal/session/session-successor.js +1 -1
  323. package/dist/portal/session/session.d.ts +15 -28
  324. package/dist/portal/session/session.js +60 -61
  325. package/dist/portal/session/timing/command-timeout.js +25 -1
  326. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  327. package/dist/portal/session/timing/wall-clock.js +1 -1
  328. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  329. package/dist/portal/session/zero-install-first-call.js +88 -0
  330. package/dist/start-options.d.ts +7 -1
  331. package/dist/start-wiring.d.ts +63 -0
  332. package/dist/start-wiring.js +169 -0
  333. package/dist/status-payload.d.ts +13 -1
  334. package/dist/status-payload.js +13 -1
  335. package/dist/surface/http-server.js +7 -1
  336. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  337. package/dist/surface/mcp/attach-memory.js +12 -1
  338. package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
  339. package/dist/surface/mcp/mcp-proxy.js +29 -8
  340. package/dist/surface/mcp/mcp.d.ts +23 -0
  341. package/dist/surface/mcp/mcp.js +34 -4
  342. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  343. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  344. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  345. package/dist/surface/mcp/server-instructions.js +22 -14
  346. package/dist/surface/mcp/shared-params.js +1 -1
  347. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  348. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  349. package/dist/surface/tools/account-tool.d.ts +22 -0
  350. package/dist/surface/tools/account-tool.js +157 -0
  351. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  352. package/dist/surface/tools/act/act-danger.js +38 -1
  353. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  354. package/dist/surface/tools/act/act-observation.js +57 -0
  355. package/dist/surface/tools/act/act-preflight.js +25 -2
  356. package/dist/surface/tools/act/act-target.js +8 -3
  357. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  358. package/dist/surface/tools/act/resolve-target.js +18 -3
  359. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  360. package/dist/surface/tools/act/screen-request.js +113 -0
  361. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  362. package/dist/surface/tools/act/sequence-grade.js +13 -2
  363. package/dist/surface/tools/act-sequence-tool.js +136 -27
  364. package/dist/surface/tools/act-tools.d.ts +0 -9
  365. package/dist/surface/tools/act-tools.js +48 -34
  366. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  367. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  368. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  369. package/dist/surface/tools/agent/app-notes.js +48 -0
  370. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  371. package/dist/surface/tools/agent/build-staleness.js +62 -0
  372. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  373. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  374. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  375. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  376. package/dist/surface/tools/agent/notices.d.ts +50 -0
  377. package/dist/surface/tools/agent/notices.js +152 -0
  378. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  379. package/dist/surface/tools/agent/reteach.js +50 -0
  380. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  381. package/dist/surface/tools/args/alias-args.js +10 -0
  382. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  383. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  384. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  385. package/dist/surface/tools/assert/assert-source.js +40 -0
  386. package/dist/surface/tools/assert/assert-verdict.js +25 -15
  387. package/dist/surface/tools/browser-tools.js +43 -1
  388. package/dist/surface/tools/chat-drives.d.ts +75 -0
  389. package/dist/surface/tools/chat-drives.js +265 -21
  390. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  391. package/dist/surface/tools/coverage-tools.js +2 -53
  392. package/dist/surface/tools/dynamic-tools.js +29 -1
  393. package/dist/surface/tools/empty-session-list.d.ts +10 -0
  394. package/dist/surface/tools/empty-session-list.js +45 -5
  395. package/dist/surface/tools/error-recovery.d.ts +8 -0
  396. package/dist/surface/tools/error-recovery.js +69 -5
  397. package/dist/surface/tools/explore-tools.d.ts +23 -2
  398. package/dist/surface/tools/explore-tools.js +377 -74
  399. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  400. package/dist/surface/tools/feedback-tools.js +4 -3
  401. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  402. package/dist/surface/tools/gap-novelty.js +8 -1
  403. package/dist/surface/tools/harness-explore.d.ts +52 -73
  404. package/dist/surface/tools/harness-explore.js +177 -146
  405. package/dist/surface/tools/harness-gate.d.ts +88 -0
  406. package/dist/surface/tools/harness-gate.js +235 -0
  407. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  408. package/dist/surface/tools/harness-hunt.js +215 -0
  409. package/dist/surface/tools/harness-plan.d.ts +5 -0
  410. package/dist/surface/tools/harness-plan.js +7 -0
  411. package/dist/surface/tools/harness-script.d.ts +22 -0
  412. package/dist/surface/tools/harness-script.js +256 -38
  413. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  414. package/dist/surface/tools/harness-tab-guard.js +27 -0
  415. package/dist/surface/tools/harness-toolset.d.ts +8 -0
  416. package/dist/surface/tools/harness-toolset.js +27 -4
  417. package/dist/surface/tools/human-notes.d.ts +16 -0
  418. package/dist/surface/tools/human-notes.js +27 -0
  419. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  420. package/dist/surface/tools/invoke-tool.js +220 -93
  421. package/dist/surface/tools/lease-hint.js +26 -5
  422. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  423. package/dist/surface/tools/lease-permissions.js +73 -0
  424. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  425. package/dist/surface/tools/lease-readiness.js +57 -0
  426. package/dist/surface/tools/lease-seed.d.ts +20 -0
  427. package/dist/surface/tools/lease-seed.js +45 -1
  428. package/dist/surface/tools/lease-tools.d.ts +10 -1
  429. package/dist/surface/tools/lease-tools.js +119 -69
  430. package/dist/surface/tools/live-call-text.js +2 -2
  431. package/dist/surface/tools/merge-tools.js +42 -2
  432. package/dist/surface/tools/merged-name-redirect.js +4 -0
  433. package/dist/surface/tools/next-step.d.ts +11 -1
  434. package/dist/surface/tools/next-step.js +73 -18
  435. package/dist/surface/tools/observe-tools.js +43 -5
  436. package/dist/surface/tools/platform-moment.d.ts +60 -0
  437. package/dist/surface/tools/platform-moment.js +132 -4
  438. package/dist/surface/tools/read-tools.js +65 -14
  439. package/dist/surface/tools/reticle-result.d.ts +120 -0
  440. package/dist/surface/tools/reticle-result.js +364 -0
  441. package/dist/surface/tools/tool-kit.d.ts +68 -2
  442. package/dist/surface/tools/tool-kit.js +73 -1
  443. package/dist/surface/tools/tools.js +25 -13
  444. package/dist/telemetry/account-envelope.d.ts +7 -0
  445. package/dist/telemetry/account-envelope.js +61 -0
  446. package/dist/telemetry/agent-client.d.ts +15 -0
  447. package/dist/telemetry/agent-client.js +57 -0
  448. package/dist/telemetry/app-instrumented.js +9 -2
  449. package/dist/telemetry/argument-shape.d.ts +7 -0
  450. package/dist/telemetry/argument-shape.js +86 -1
  451. package/dist/telemetry/automation-hint.d.ts +2 -3
  452. package/dist/telemetry/automation-hint.js +33 -8
  453. package/dist/telemetry/cli-telemetry.js +7 -2
  454. package/dist/telemetry/daemon-telemetry.js +3 -0
  455. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  456. package/dist/telemetry/error-fingerprint.js +61 -5
  457. package/dist/telemetry/feedback-cli.d.ts +0 -13
  458. package/dist/telemetry/feedback-cli.js +0 -77
  459. package/dist/telemetry/feedback.d.ts +13 -0
  460. package/dist/telemetry/feedback.js +183 -17
  461. package/dist/telemetry/harness-run.d.ts +18 -0
  462. package/dist/telemetry/harness-run.js +80 -0
  463. package/dist/telemetry/hud-events.d.ts +16 -0
  464. package/dist/telemetry/hud-events.js +27 -0
  465. package/dist/telemetry/hud-metrics.d.ts +27 -6
  466. package/dist/telemetry/hud-metrics.js +99 -25
  467. package/dist/telemetry/init-telemetry.js +2 -2
  468. package/dist/telemetry/install-source.d.ts +13 -25
  469. package/dist/telemetry/install-source.js +44 -3
  470. package/dist/telemetry/mcp-connection.d.ts +0 -14
  471. package/dist/telemetry/mcp-connection.js +5 -1
  472. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  473. package/dist/telemetry/onboarding-firsts.js +81 -6
  474. package/dist/telemetry/platform-linked.d.ts +5 -0
  475. package/dist/telemetry/platform-linked.js +32 -0
  476. package/dist/telemetry/project-profile.js +5 -3
  477. package/dist/telemetry/proxy-telemetry.js +4 -1
  478. package/dist/telemetry/session-metrics.d.ts +15 -4
  479. package/dist/telemetry/session-metrics.js +88 -52
  480. package/dist/telemetry/telemetry.d.ts +26 -2
  481. package/dist/telemetry/telemetry.js +102 -21
  482. package/dist/telemetry/verification-of.d.ts +3 -1
  483. package/dist/telemetry/verification-of.js +12 -4
  484. package/dist/wire-journal.d.ts +2 -2
  485. package/dist/wire-journal.js +16 -5
  486. package/docs/README.md +2 -2
  487. package/docs/actions.mdx +6 -3
  488. package/docs/adapters.md +1 -1
  489. package/docs/agent-cheatsheet.md +24 -27
  490. package/docs/architecture.md +5 -5
  491. package/docs/autodrive.md +13 -12
  492. package/docs/benchmarks.md +5 -5
  493. package/docs/best-practices.mdx +27 -9
  494. package/docs/capabilities.mdx +14 -16
  495. package/docs/cli/affected.mdx +1 -1
  496. package/docs/cli/cloud.mdx +54 -75
  497. package/docs/cli/doctor.mdx +8 -3
  498. package/docs/cli/drive.mdx +12 -12
  499. package/docs/cli/feedback.mdx +3 -3
  500. package/docs/cli/gate.mdx +7 -2
  501. package/docs/cli/help.mdx +50 -55
  502. package/docs/cli/init.mdx +32 -15
  503. package/docs/cli/license.mdx +12 -8
  504. package/docs/cli/mcp.mdx +4 -4
  505. package/docs/cli/open.mdx +3 -3
  506. package/docs/cli/report.mdx +4 -2
  507. package/docs/cli/restart.mdx +2 -2
  508. package/docs/cli/rollback.mdx +14 -8
  509. package/docs/cli/serve.mdx +4 -4
  510. package/docs/cli/setup.mdx +23 -0
  511. package/docs/cli/status.mdx +13 -4
  512. package/docs/cli/stop.mdx +67 -8
  513. package/docs/cli/try.mdx +62 -0
  514. package/docs/cli/update.mdx +4 -3
  515. package/docs/cli/verify.mdx +17 -6
  516. package/docs/cli/version.mdx +3 -2
  517. package/docs/cli.mdx +110 -41
  518. package/docs/debugging.md +3 -3
  519. package/docs/deploy-checks.md +1 -1
  520. package/docs/desktop.mdx +5 -3
  521. package/docs/enterprise.md +11 -10
  522. package/docs/environment.mdx +5 -2
  523. package/docs/faq.mdx +3 -3
  524. package/docs/first-drive.md +5 -4
  525. package/docs/flows.md +35 -27
  526. package/docs/for-agents.md +4 -5
  527. package/docs/frameworks.mdx +32 -21
  528. package/docs/getting-started.md +66 -64
  529. package/docs/human-control.md +15 -14
  530. package/docs/index.mdx +15 -43
  531. package/docs/install-agentic.mdx +22 -37
  532. package/docs/install-manual.mdx +22 -12
  533. package/docs/instrumentation.mdx +5 -3
  534. package/docs/integration-patterns.md +7 -7
  535. package/docs/license-activation.mdx +1 -1
  536. package/docs/multi-agent-testing.md +24 -6
  537. package/docs/packages/babel-plugin.mdx +4 -2
  538. package/docs/packages/browser.mdx +16 -10
  539. package/docs/packages/core.mdx +12 -5
  540. package/docs/packages/electron.mdx +3 -2
  541. package/docs/packages/engine.mdx +1 -1
  542. package/docs/packages/eslint-plugin.mdx +18 -12
  543. package/docs/packages/next.mdx +8 -7
  544. package/docs/packages/open-verification.mdx +1 -1
  545. package/docs/packages/server.mdx +5 -5
  546. package/docs/packages/tauri.mdx +8 -8
  547. package/docs/packages/test.mdx +4 -10
  548. package/docs/packages/vite-plugin.mdx +11 -4
  549. package/docs/packages.mdx +11 -15
  550. package/docs/platform-integration.md +6 -5
  551. package/docs/predicates.mdx +40 -24
  552. package/docs/quickstart.mdx +58 -29
  553. package/docs/required-checks.md +8 -7
  554. package/docs/reticle-manual.md +15 -5
  555. package/docs/skill-file.mdx +17 -79
  556. package/docs/skill-setup.md +9 -9
  557. package/docs/skill.md +200 -0
  558. package/docs/system-map.md +7 -7
  559. package/docs/telemetry.md +22 -24
  560. package/docs/testing.md +4 -4
  561. package/docs/token-efficiency.md +12 -12
  562. package/docs/tools/act-and-wait.mdx +9 -2
  563. package/docs/tools/act-sequence.mdx +6 -7
  564. package/docs/tools/act.mdx +2 -2
  565. package/docs/tools/assert.mdx +18 -17
  566. package/docs/tools/console.mdx +9 -9
  567. package/docs/tools/inspect.mdx +16 -7
  568. package/docs/tools/look.mdx +24 -0
  569. package/docs/tools/navigate.mdx +5 -3
  570. package/docs/tools/network.mdx +2 -2
  571. package/docs/tools/observe.mdx +6 -6
  572. package/docs/tools/overview.mdx +34 -33
  573. package/docs/tools/query.mdx +5 -5
  574. package/docs/tools/session-and-feedback.mdx +13 -4
  575. package/docs/tools/sessions.mdx +8 -8
  576. package/docs/tools/snapshot.mdx +6 -5
  577. package/docs/tools/state.mdx +9 -9
  578. package/docs/tools/tools-and-run.mdx +26 -24
  579. package/docs/tools/verify.mdx +28 -0
  580. package/docs/tools/wait-for.mdx +8 -4
  581. package/docs/troubleshooting.mdx +21 -6
  582. package/docs/usage.md +51 -45
  583. package/docs/use-cases.mdx +3 -3
  584. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  585. package/docs/vs-playwright-mcp.mdx +3 -1
  586. package/docs/what-is-recorded.md +7 -5
  587. package/docs/what-is-reticle.mdx +2 -2
  588. package/docs/why-reticle.mdx +1 -1
  589. package/package.json +6 -5
  590. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  591. package/dist/command/cli/demo/demo-page.js +0 -249
  592. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  593. package/dist/command/cli/demo/demo-run.js +0 -138
  594. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  595. package/dist/judgement/hunt/hunt-report.js +0 -84
  596. package/dist/language/flows/buddy-status.d.ts +0 -25
  597. package/dist/language/flows/buddy-status.js +0 -32
  598. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  599. package/dist/language/flows/change/watch-batcher.js +0 -19
  600. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  601. package/dist/memory/cloud/harness-offer.js +0 -145
  602. package/dist/surface/tools/feature-capture.d.ts +0 -151
  603. package/dist/surface/tools/feature-capture.js +0 -235
  604. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  605. package/dist/surface/tools/tool-hit-rate.js +0 -90
  606. package/dist/telemetry/harness-drive.d.ts +0 -4
  607. package/dist/telemetry/harness-drive.js +0 -35
  608. package/dist/telemetry/identify.d.ts +0 -22
  609. package/dist/telemetry/identify.js +0 -73
  610. package/docs/cli/capsules.mdx +0 -70
  611. package/docs/cli/hunt.mdx +0 -73
  612. package/docs/cli/identify.mdx +0 -76
  613. package/docs/cli/kill.mdx +0 -91
  614. package/docs/cli/watch.mdx +0 -62
@@ -34,6 +34,10 @@ const EXPLORE_FLAG = '--explore';
34
34
  const PERSONA_FLAG = '--persona';
35
35
  /** Narrow the suite to flows carrying this label. Repeatable — a set is the union of what you name. */
36
36
  const SELECT_FLAG = '--select';
37
+ /** Write the per-journey verdicts to this file as JSON, for a CI step that posts them. */
38
+ const RESULTS_JSON_FLAG = '--results-json';
39
+ /** Acknowledge, for this run only, the steps the replay guard holds as destructive ("Place order"). */
40
+ const CONFIRM_DANGEROUS_FLAG = '--confirm-dangerous';
37
41
  /**
38
42
  * Parse `verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>]
39
43
  * [--session-id <id>]`. The first non-flag token is the preview URL. `defaultPort` is already
@@ -90,6 +94,8 @@ export function parseVerifySuffix(args, defaultPort) {
90
94
  let explore = false;
91
95
  let persona;
92
96
  const select = [];
97
+ let resultsJson;
98
+ let confirmDangerous = false;
93
99
  let port = defaultPort;
94
100
  let i = 0;
95
101
  while (i < args.length) {
@@ -142,9 +148,19 @@ export function parseVerifySuffix(args, defaultPort) {
142
148
  // silently become two selections that match nothing.
143
149
  select.push(v);
144
150
  }
151
+ else if (arg === RESULTS_JSON_FLAG) {
152
+ i++;
153
+ const v = args[i];
154
+ if (v === undefined)
155
+ return missingValue(RESULTS_JSON_FLAG);
156
+ resultsJson = v;
157
+ }
145
158
  else if (arg === EXPLORE_FLAG) {
146
159
  explore = true;
147
160
  }
161
+ else if (arg === CONFIRM_DANGEROUS_FLAG) {
162
+ confirmDangerous = true;
163
+ }
148
164
  else if (arg === PERSONA_FLAG) {
149
165
  i++;
150
166
  const v = args[i];
@@ -212,5 +228,7 @@ export function parseVerifySuffix(args, defaultPort) {
212
228
  ...(explore ? { explore } : {}),
213
229
  ...(persona !== undefined ? { persona } : {}),
214
230
  ...(select.length > 0 ? { select } : {}),
231
+ ...(resultsJson !== undefined ? { resultsJson } : {}),
232
+ ...(confirmDangerous ? { confirmDangerous } : {}),
215
233
  };
216
234
  }
@@ -3,19 +3,12 @@
3
3
  * The parser stays pure and unit-testable; `cli.ts` owns the side-effecting handlers and dispatch,
4
4
  * and re-exports this surface.
5
5
  */
6
- import { TutorialAudience } from './tutorial.js';
7
6
  import { type ParsedFeedback } from './cli-parse-feedback.js';
8
7
  import { HEADED_FLAG, PORT_FLAG } from './cli-parse-grammar.js';
9
8
  export { HEADED_FLAG, PORT_FLAG };
10
9
  export { AGENT_FLAG, BUG_FLAG, FEEDBACK_KINDS, KIND_FLAG, RATING_FLAG, } from './cli-parse-feedback.js';
11
- /**
12
- * The lines below say `reticle <command>`, which is the bin this package installs and is correct
13
- * once it is on PATH. Copied into `npx`, it is not: `npx reticle` resolves the PACKAGE named
14
- * `reticle`, which belongs to somebody else, and npx will happily fetch and run it. The docs were
15
- * telling readers to do exactly that on 110 lines before it was caught, so the invocation now leads
16
- * the usage block rather than being a footnote somewhere else.
17
- */
18
- export declare const CLI_USAGE = "usage: npx @reticlehq/server <command> (or `reticle <command>` once the bin is on your PATH)\n\n reticle tutorial [--run] [--headless] [--port N] (watch Reticle verify a demo app, in seconds)\n reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]\n [--env KEY=VALUE]... [--files-only] [--hooks] (wire Reticle into the project in this directory)\n init is ONBOARDING: it wires the project, boots the app and proves a session\n connected. It does not drive. The FIRST RUN is the stage that proves a flow:\n an agent drives one journey with reticle_act_and_wait and an `until` on its last\n step; with a linked project, reticle_verify { action: \"explore\", persona: \"\u2026\" }\n (or reticle verify <url> --explore --persona \"\u2026\") drives it instead\n --app picks WHICH app in a monorepo, when several are found\n --env is what the app needs to reach a usable state: the key from\n .env.example, the mock backend, the variable that skips an auth wall.\n Repeatable, and a value may contain spaces and equals signs\n --files-only writes the files and stops, which is what init did before it\n learned to boot the app and prove the install works\n --relaunch prints the exact command that restarts THIS conversation with\n the tools loaded, so the restart is not a chore handed to a human. It\n refuses when the session id has no transcript behind it, because\n --resume on an empty id opens a blank conversation that looks like\n success. Works with --files-only\n --license writes the key to .env and keeps .env out of git\n --json puts the result on stdout, so an agent reads one object\n --no-open / --no-agents / --url / --timeout are the runtime dials: CI, a\n headless box, or an app you already run\n --no-mcp skips MORE than the server registration: also the agent rule files\n (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three\n only make sense once the tools are reachable.\n reticle serve [--port N] [--drive <url>] [--headless] [--http] [--http-port N] [--http-token T]\n reticle stop [--port N] [--quiet] (stop the daemon we started, by its recorded pid)\n reticle kill [--port N] [--force] (free the port by its LISTENER, never the agent's mcp proxy)\n reticle restart [--port N] [--force] (kill, then start a daemon and wait for a real bind)\n reticle status [--port N] [--json] (a readable block; --json for the event)\n reticle doctor [--port N] (one command to diagnose setup: Chromium, daemon, port)\n reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)\n reticle verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>] [--session-id <id>] (one-shot: drive the URL, verify saved flows, exit 0=pass)\n [--explore] [--persona <who>] (no saved flows? let Reticle drive the app itself and record them)\n [--select <label>] (repeatable: verify only flows carrying these labels \u2014 no model, exit 0=pass)\n [--expect '<json predicate>' | --expect-file <path>] (one verdict, no saved\n flows needed. --expect-file avoids cmd.exe and PowerShell quote mangling. It\n asks an existing daemon, never binds or stops one; with none, it refuses.\n Cannot combine with --storage-state. Use when the client lacks reticle_*\n tools. exit 0 ONLY on verified:\"yes\" \u2014 \"unknown\" is not a pass. For an\n action --expect cannot do, drive the daemon's HTTP MCP transport instead \u2014 see\n https://docs.reticle.sh/http-transport.md)\n reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)\n reticle gate [--since <ref>] [--accept-coverage] [file...] (exit non-zero unless passing artifacts cover the affected flows)\n reticle report [--session <id>] [--hook] (what the latest session claimed, and what held)\n reticle setup mcp (register the MCP server with your agents; the installer's registration half)\n reticle capsules (list the saved fail-to-pass bug capsules in .reticle/capsules)\n reticle hunt <dir> (aggregate a directory of crawl reports into one false-green rate)\n reticle watch [url] (on save, report which saved flows must re-verify)\n reticle drive <url> [--headless] (foreground mode, for debugging)\n reticle mcp [--port N] [--drive <url>] [--headless] (MCP stdio proxy; auto-starts daemon if needed)\n reticle update (install the latest server version and restart)\n reticle rollback (restore the previous server version and restart)\n reticle license (show enterprise license status: active | eval | missing)\n reticle telemetry [status|enable|disable] (anonymous usage metrics; status shows what's sent + the policy)\n reticle feedback [--rating 1-5] [--bug] \"message\" (tell us what worked and what didn't; prints exactly what it sends)\n reticle feedback --agent --kind <bug|gap|ambiguity|feature_request|improvement|experience> \"message\"\n (agents: file from anywhere, including a setup that never finished)\n reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]\n (OPT-IN: tell us who you are, e.g. for support or an enterprise trial)\n\nCloud (link this project to Reticle; runs/flows recorded on the dashboard):\n reticle connect [--project <name|id>] [--url <cloud origin>]\n (wire this app if needed, sign in, link, send local history)\n reticle login [--url <u>] [--email <e>] [--code <c>] [--org <n>]\n (browser device flow by default; --email mails a code)\n reticle logout [--url <u>] (sign out of ONE host; others stay signed in)\n reticle link [--project <name|id>] (bind this repo: mints a scoped key, writes .reticle/cloud.json)\n reticle whoami (who am I signed in as, and is this repo attached?)\n reticle project <ls|create <name>> (list or create cloud projects)\n reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]\n reticle push | sync [--watch] (one sync cycle: send the difference, collect decisions)\n reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)\n\n'drive' shows the browser; everything else is hidden (serve/mcp own the pool behind leases, replay\nand the spec runner: batch work). --headed opts any of them in, --headless hides drive, CI hides it.";
10
+ import { CLI_USAGE } from './cli-usage.js';
11
+ export { CLI_USAGE };
19
12
  /** The `reticle telemetry` sub-actions. Bare `reticle telemetry` means `status`. */
20
13
  export declare const TelemetryAction: {
21
14
  readonly STATUS: "status";
@@ -34,8 +27,16 @@ export declare const DAEMON_INNER_COMMAND = "_daemon";
34
27
  * defined; a second list somewhere else would drift the first time a command is added.
35
28
  */
36
29
  export declare const UNKNOWN_COMMAND = "unknown";
30
+ /** Every command the typed parser below routes. The parser refuses any word not in this list. */
31
+ export declare const LOCAL_COMMANDS: readonly string[];
37
32
  /** The subcommand name if we recognize it, else `unknown`. Bare `reticle` reports `help`. */
38
33
  export declare function knownCommand(arg: string | undefined): string;
34
+ /**
35
+ * Force a hidden browser. The default is now HEADED: a run nobody can see is a run nobody trusts,
36
+ * and every "did it actually do anything?" question cost a round-trip. CI passes this (or just sets
37
+ * CI, which flips the default) because there is no display there to be headed on.
38
+ */
39
+ export declare const HEADLESS_FLAG = "--headless";
39
40
  export declare const DRIVE_FLAG = "--drive";
40
41
  export declare const HTTP_FLAG = "--http";
41
42
  export declare const HTTP_PORT_FLAG = "--http-port";
@@ -62,6 +63,7 @@ export type CliResult = {
62
63
  json: boolean;
63
64
  relaunch: boolean;
64
65
  open: boolean;
66
+ firstRun: boolean;
65
67
  agents: boolean;
66
68
  url: string | undefined;
67
69
  timeoutSeconds: number | undefined;
@@ -98,15 +100,13 @@ export type CliResult = {
98
100
  } | Extract<ParsedFeedback, {
99
101
  kind: 'feedback';
100
102
  }> | {
101
- kind: 'identify';
102
- context?: string;
103
- company?: string;
104
- email?: string;
105
- forget: boolean;
106
- } | {
107
103
  kind: 'version';
108
104
  } | {
109
105
  kind: 'help';
106
+ topic?: string;
107
+ } | {
108
+ kind: 'removed';
109
+ message: string;
110
110
  } | {
111
111
  kind: 'doctor';
112
112
  port: number;
@@ -117,12 +117,6 @@ export type CliResult = {
117
117
  runtimeSecs: number;
118
118
  installSecs: number;
119
119
  mcp: boolean;
120
- } | {
121
- kind: 'tutorial';
122
- audience: TutorialAudience;
123
- run: boolean;
124
- port: number;
125
- headless: boolean;
126
120
  } | {
127
121
  kind: 'open';
128
122
  port: number;
@@ -153,15 +147,12 @@ export type CliResult = {
153
147
  explore?: boolean;
154
148
  persona?: string;
155
149
  select?: string[];
150
+ resultsJson?: string;
151
+ confirmDangerous?: boolean;
156
152
  } | {
157
153
  kind: 'affected';
158
154
  files: string[];
159
155
  since?: string;
160
- } | {
161
- kind: 'hunt';
162
- dir: string;
163
- } | {
164
- kind: 'capsules';
165
156
  } | {
166
157
  kind: 'gate';
167
158
  files: string[];
@@ -173,8 +164,8 @@ export type CliResult = {
173
164
  session?: string;
174
165
  hook: boolean;
175
166
  } | {
176
- kind: 'watch';
177
- url?: string;
167
+ kind: 'context';
168
+ session?: string;
178
169
  } | {
179
170
  kind: 'update';
180
171
  } | {
@@ -3,102 +3,18 @@
3
3
  * The parser stays pure and unit-testable; `cli.ts` owns the side-effecting handlers and dispatch,
4
4
  * and re-exports this surface.
5
5
  */
6
- import { TutorialAudience } from './tutorial.js';
7
6
  import { parseFeedbackArgs } from './cli-parse-feedback.js';
8
7
  import { parseVerifySuffix } from './cli-parse-verify.js';
9
- import { HEADED_FLAG, PORT_FLAG, VERIFY_COMMAND, missingOperand, missingValue, notANumber, retiredFlag, unknownArgument, } from './cli-parse-grammar.js';
8
+ import { HEADED_FLAG, PORT_FLAG, VERIFY_COMMAND, missingOperand, missingValue, notANumber, retiredFlag, unknownArgument, CLOUD_COMMANDS, REMOVED_COMMANDS, removedNote, } from './cli-parse-grammar.js';
10
9
  // Re-exported because the daemon's own argv builder reaches for these through this module, which is
11
10
  // where the grammar has always lived as far as every caller is concerned.
12
11
  export { HEADED_FLAG, PORT_FLAG };
13
12
  import { FORCE_FLAG } from './cli-kill.js';
14
13
  // Re-exported so every existing importer of these flags is unaffected by the file split.
15
14
  export { AGENT_FLAG, BUG_FLAG, FEEDBACK_KINDS, KIND_FLAG, RATING_FLAG, } from './cli-parse-feedback.js';
16
- /**
17
- * The lines below say `reticle <command>`, which is the bin this package installs and is correct
18
- * once it is on PATH. Copied into `npx`, it is not: `npx reticle` resolves the PACKAGE named
19
- * `reticle`, which belongs to somebody else, and npx will happily fetch and run it. The docs were
20
- * telling readers to do exactly that on 110 lines before it was caught, so the invocation now leads
21
- * the usage block rather than being a footnote somewhere else.
22
- */
23
- export const CLI_USAGE = `usage: npx @reticlehq/server <command> (or \`reticle <command>\` once the bin is on your PATH)
24
-
25
- reticle tutorial [--run] [--headless] [--port N] (watch Reticle verify a demo app, in seconds)
26
- reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
27
- [--env KEY=VALUE]... [--files-only] [--hooks] (wire Reticle into the project in this directory)
28
- init is ONBOARDING: it wires the project, boots the app and proves a session
29
- connected. It does not drive. The FIRST RUN is the stage that proves a flow:
30
- an agent drives one journey with reticle_act_and_wait and an \`until\` on its last
31
- step; with a linked project, reticle_verify { action: "explore", persona: "…" }
32
- (or reticle verify <url> --explore --persona "…") drives it instead
33
- --app picks WHICH app in a monorepo, when several are found
34
- --env is what the app needs to reach a usable state: the key from
35
- .env.example, the mock backend, the variable that skips an auth wall.
36
- Repeatable, and a value may contain spaces and equals signs
37
- --files-only writes the files and stops, which is what init did before it
38
- learned to boot the app and prove the install works
39
- --relaunch prints the exact command that restarts THIS conversation with
40
- the tools loaded, so the restart is not a chore handed to a human. It
41
- refuses when the session id has no transcript behind it, because
42
- --resume on an empty id opens a blank conversation that looks like
43
- success. Works with --files-only
44
- --license writes the key to .env and keeps .env out of git
45
- --json puts the result on stdout, so an agent reads one object
46
- --no-open / --no-agents / --url / --timeout are the runtime dials: CI, a
47
- headless box, or an app you already run
48
- --no-mcp skips MORE than the server registration: also the agent rule files
49
- (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
50
- only make sense once the tools are reachable.
51
- reticle serve [--port N] [--drive <url>] [--headless] [--http] [--http-port N] [--http-token T]
52
- reticle stop [--port N] [--quiet] (stop the daemon we started, by its recorded pid)
53
- reticle kill [--port N] [--force] (free the port by its LISTENER, never the agent's mcp proxy)
54
- reticle restart [--port N] [--force] (kill, then start a daemon and wait for a real bind)
55
- reticle status [--port N] [--json] (a readable block; --json for the event)
56
- reticle doctor [--port N] (one command to diagnose setup: Chromium, daemon, port)
57
- reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)
58
- reticle verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>] [--session-id <id>] (one-shot: drive the URL, verify saved flows, exit 0=pass)
59
- [--explore] [--persona <who>] (no saved flows? let Reticle drive the app itself and record them)
60
- [--select <label>] (repeatable: verify only flows carrying these labels — no model, exit 0=pass)
61
- [--expect '<json predicate>' | --expect-file <path>] (one verdict, no saved
62
- flows needed. --expect-file avoids cmd.exe and PowerShell quote mangling. It
63
- asks an existing daemon, never binds or stops one; with none, it refuses.
64
- Cannot combine with --storage-state. Use when the client lacks reticle_*
65
- tools. exit 0 ONLY on verified:"yes" — "unknown" is not a pass. For an
66
- action --expect cannot do, drive the daemon's HTTP MCP transport instead — see
67
- https://docs.reticle.sh/http-transport.md)
68
- reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)
69
- reticle gate [--since <ref>] [--accept-coverage] [file...] (exit non-zero unless passing artifacts cover the affected flows)
70
- reticle report [--session <id>] [--hook] (what the latest session claimed, and what held)
71
- reticle setup mcp (register the MCP server with your agents; the installer's registration half)
72
- reticle capsules (list the saved fail-to-pass bug capsules in .reticle/capsules)
73
- reticle hunt <dir> (aggregate a directory of crawl reports into one false-green rate)
74
- reticle watch [url] (on save, report which saved flows must re-verify)
75
- reticle drive <url> [--headless] (foreground mode, for debugging)
76
- reticle mcp [--port N] [--drive <url>] [--headless] (MCP stdio proxy; auto-starts daemon if needed)
77
- reticle update (install the latest server version and restart)
78
- reticle rollback (restore the previous server version and restart)
79
- reticle license (show enterprise license status: active | eval | missing)
80
- reticle telemetry [status|enable|disable] (anonymous usage metrics; status shows what's sent + the policy)
81
- reticle feedback [--rating 1-5] [--bug] "message" (tell us what worked and what didn't; prints exactly what it sends)
82
- reticle feedback --agent --kind <bug|gap|ambiguity|feature_request|improvement|experience> "message"
83
- (agents: file from anywhere, including a setup that never finished)
84
- reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]
85
- (OPT-IN: tell us who you are, e.g. for support or an enterprise trial)
86
-
87
- Cloud (link this project to Reticle; runs/flows recorded on the dashboard):
88
- reticle connect [--project <name|id>] [--url <cloud origin>]
89
- (wire this app if needed, sign in, link, send local history)
90
- reticle login [--url <u>] [--email <e>] [--code <c>] [--org <n>]
91
- (browser device flow by default; --email mails a code)
92
- reticle logout [--url <u>] (sign out of ONE host; others stay signed in)
93
- reticle link [--project <name|id>] (bind this repo: mints a scoped key, writes .reticle/cloud.json)
94
- reticle whoami (who am I signed in as, and is this repo attached?)
95
- reticle project <ls|create <name>> (list or create cloud projects)
96
- reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
97
- reticle push | sync [--watch] (one sync cycle: send the difference, collect decisions)
98
- reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)
99
-
100
- 'drive' shows the browser; everything else is hidden (serve/mcp own the pool behind leases, replay
101
- and the spec runner: batch work). --headed opts any of them in, --headless hides drive, CI hides it.`;
15
+ // The help text lives on its own page; re-exported so every importer of it is unaffected.
16
+ import { CLI_USAGE } from './cli-usage.js';
17
+ export { CLI_USAGE };
102
18
  const INIT_COMMAND = 'init';
103
19
  const SERVE_COMMAND = 'serve';
104
20
  const STOP_COMMAND = 'stop';
@@ -108,16 +24,15 @@ const STATUS_COMMAND = 'status';
108
24
  const OPEN_COMMAND = 'open';
109
25
  const DRIVE_COMMAND = 'drive';
110
26
  const AFFECTED_COMMAND = 'affected';
111
- const HUNT_COMMAND = 'hunt';
112
- const CAPSULES_COMMAND = 'capsules';
113
27
  const GATE_COMMAND = 'gate';
114
28
  /** Hook mode: prose a human can read, and silence when there was simply nothing to check. */
115
29
  const HOOK_FLAG = '--hook';
116
30
  const ACCEPT_COVERAGE_FLAG = '--accept-coverage';
117
31
  /** `reticle report [--session <id>] [--hook]` — what the latest session claimed, and what held. */
118
32
  const REPORT_COMMAND = 'report';
33
+ /** `reticle context --compact`: the resume block, from disk. A SessionStart hook prints it. */
34
+ const CONTEXT_COMMAND = 'context';
119
35
  const SESSION_FLAG = '--session';
120
- const WATCH_COMMAND = 'watch';
121
36
  const UPDATE_COMMAND = 'update';
122
37
  const ROLLBACK_COMMAND = 'rollback';
123
38
  const MCP_COMMAND = 'mcp';
@@ -125,11 +40,8 @@ const LICENSE_COMMAND = 'license';
125
40
  const VERSION_COMMAND = 'version';
126
41
  const TELEMETRY_COMMAND = 'telemetry';
127
42
  const FEEDBACK_COMMAND = 'feedback';
128
- const IDENTIFY_COMMAND = 'identify';
129
- const COMPANY_FLAG = '--company';
130
- const EMAIL_FLAG = '--email';
131
- const CONTEXT_FLAG = '--context';
132
- const FORGET_FLAG = '--forget';
43
+ const DOCTOR_COMMAND = 'doctor';
44
+ const SETUP_COMMAND = 'setup';
133
45
  /** The `reticle telemetry` sub-actions. Bare `reticle telemetry` means `status`. */
134
46
  export const TelemetryAction = {
135
47
  STATUS: 'status',
@@ -147,7 +59,10 @@ export const DAEMON_INNER_COMMAND = '_daemon';
147
59
  * defined; a second list somewhere else would drift the first time a command is added.
148
60
  */
149
61
  export const UNKNOWN_COMMAND = 'unknown';
150
- const KNOWN_COMMANDS = new Set([
62
+ const HELP_COMMAND = 'help';
63
+ const HELP_FLAGS = new Set(['--help', '-h']);
64
+ /** Every command the typed parser below routes. The parser refuses any word not in this list. */
65
+ export const LOCAL_COMMANDS = [
151
66
  INIT_COMMAND,
152
67
  SERVE_COMMAND,
153
68
  STOP_COMMAND,
@@ -158,11 +73,9 @@ const KNOWN_COMMANDS = new Set([
158
73
  DRIVE_COMMAND,
159
74
  VERIFY_COMMAND,
160
75
  AFFECTED_COMMAND,
161
- HUNT_COMMAND,
162
- CAPSULES_COMMAND,
163
76
  GATE_COMMAND,
164
77
  REPORT_COMMAND,
165
- WATCH_COMMAND,
78
+ CONTEXT_COMMAND,
166
79
  UPDATE_COMMAND,
167
80
  ROLLBACK_COMMAND,
168
81
  MCP_COMMAND,
@@ -170,25 +83,23 @@ const KNOWN_COMMANDS = new Set([
170
83
  VERSION_COMMAND,
171
84
  TELEMETRY_COMMAND,
172
85
  FEEDBACK_COMMAND,
173
- IDENTIFY_COMMAND,
174
86
  DAEMON_INNER_COMMAND,
175
- 'connect',
176
- 'login',
177
- 'logout',
178
- 'whoami',
179
- 'link',
180
- 'project',
181
- 'config',
182
- 'push',
183
- 'runs',
184
- 'issues',
185
- 'memory',
186
- 'regression',
187
- 'share',
188
- 'doctor',
189
- 'setup',
190
- 'tutorial',
191
- 'help',
87
+ DOCTOR_COMMAND,
88
+ SETUP_COMMAND,
89
+ ];
90
+ const LOCAL_COMMAND_SET = new Set(LOCAL_COMMANDS);
91
+ const KNOWN_COMMANDS = new Set([
92
+ ...LOCAL_COMMANDS,
93
+ ...CLOUD_COMMANDS,
94
+ ...REMOVED_COMMANDS.keys(),
95
+ HELP_COMMAND,
96
+ ]);
97
+ /** The conventional flag spellings of two commands, reported as the command they ask for. */
98
+ const COMMAND_FLAG_ALIASES = new Map([
99
+ ['--version', VERSION_COMMAND],
100
+ ['-v', VERSION_COMMAND],
101
+ ['--help', HELP_COMMAND],
102
+ ['-h', HELP_COMMAND],
192
103
  ]);
193
104
  /**
194
105
  * A non-negative integer flag, or 0.
@@ -207,15 +118,15 @@ function numberFlag(args, name) {
207
118
  /** The subcommand name if we recognize it, else `unknown`. Bare `reticle` reports `help`. */
208
119
  export function knownCommand(arg) {
209
120
  if (arg === undefined || '' === arg)
210
- return 'help';
211
- return KNOWN_COMMANDS.has(arg) ? arg : UNKNOWN_COMMAND;
121
+ return HELP_COMMAND;
122
+ return KNOWN_COMMANDS.has(arg) ? arg : (COMMAND_FLAG_ALIASES.get(arg) ?? UNKNOWN_COMMAND);
212
123
  }
213
124
  /**
214
125
  * Force a hidden browser. The default is now HEADED: a run nobody can see is a run nobody trusts,
215
126
  * and every "did it actually do anything?" question cost a round-trip. CI passes this (or just sets
216
127
  * CI, which flips the default) because there is no display there to be headed on.
217
128
  */
218
- const HEADLESS_FLAG = '--headless';
129
+ export const HEADLESS_FLAG = '--headless';
219
130
  export const DRIVE_FLAG = '--drive';
220
131
  const QUIET_FLAG = '--quiet';
221
132
  const DRY_RUN_FLAG = '--dry-run';
@@ -236,6 +147,8 @@ const FLOW_FLAG = '--flow';
236
147
  const FIRST_RUN_MOVED = 'onboarding wires the project, the FIRST RUN proves a flow. Drive one with reticle_verify { action: "explore", persona: "<who does what>" }, or npx @reticlehq/server verify <url> --explore --persona "<who does what>"';
237
148
  const ENV_FLAG = '--env';
238
149
  const FILES_ONLY_FLAG = '--files-only';
150
+ /** With `--app`, also start the app: naming one app of a workspace otherwise writes its files only. */
151
+ const START_FLAG = '--start';
239
152
  /**
240
153
  * Write `captureNetworkBodies: true` into the app's config. OFF unless asked (#705).
241
154
  *
@@ -256,6 +169,8 @@ const HOOKS_FLAG = '--hooks';
256
169
  const JSON_FLAG = '--json';
257
170
  const NO_DRIVE_FLAG = '--no-drive';
258
171
  const NO_OPEN_FLAG = '--no-open';
172
+ /** Connect and stop: no coverage summary and no prompt at the end. */
173
+ const NO_FIRST_RUN_FLAG = '--no-first-run';
259
174
  const NO_AGENTS_FLAG = '--no-agents';
260
175
  /**
261
176
  * Restart the calling client so IT gets the tools.
@@ -281,12 +196,6 @@ const NO_INSTALL_FLAG = '--no-install';
281
196
  export const HTTP_FLAG = '--http';
282
197
  export const HTTP_PORT_FLAG = '--http-port';
283
198
  export const HTTP_TOKEN_FLAG = '--http-token';
284
- /**
285
- * `serve` / `mcp` / `_daemon` own the browser POOL, which backs automated work — leased contexts for
286
- * parallel agents, flow replay, the spec runner. Those are batch: nobody is watching, and launching
287
- * them headed changed timing enough to break four e2e specs. The headed default belongs to the
288
- * INTERACTIVE command (`drive`), where a human asked to see the run. `--headed` still opts in here.
289
- */
290
199
  /**
291
200
  * A usage error names the thing that was wrong.
292
201
  *
@@ -307,10 +216,10 @@ const unknownCommand = (command) => ({
307
216
  kind: 'error',
308
217
  message: `unknown command '${command}'`,
309
218
  });
310
- function parseServeFlags(args, defaultPort, _defaultHeadless) {
219
+ function parseServeFlags(args, defaultPort, defaultHeadless) {
311
220
  let port = defaultPort;
312
221
  let driveUrl;
313
- let headless = true;
222
+ let headless = defaultHeadless;
314
223
  let http = false;
315
224
  let httpPort;
316
225
  let httpToken;
@@ -427,10 +336,12 @@ function parseInitFlags(args) {
427
336
  // Repeatable: one variable per flag, so a value containing spaces or `=` needs no quoting rules.
428
337
  const env = [];
429
338
  let filesOnly = false;
339
+ let start = false;
430
340
  let captureBodies = false;
431
341
  let hooks = false;
432
342
  let json = false;
433
343
  let open = true;
344
+ let firstRun = true;
434
345
  let relaunch = false;
435
346
  let agents = true;
436
347
  let url;
@@ -473,6 +384,9 @@ function parseInitFlags(args) {
473
384
  else if (arg === FILES_ONLY_FLAG) {
474
385
  filesOnly = true;
475
386
  }
387
+ else if (arg === START_FLAG) {
388
+ start = true;
389
+ }
476
390
  else if (arg === CAPTURE_BODIES_FLAG) {
477
391
  captureBodies = true;
478
392
  }
@@ -485,6 +399,9 @@ function parseInitFlags(args) {
485
399
  else if (arg === NO_OPEN_FLAG) {
486
400
  open = false;
487
401
  }
402
+ else if (arg === NO_FIRST_RUN_FLAG) {
403
+ firstRun = false;
404
+ }
488
405
  else if (arg === RELAUNCH_FLAG) {
489
406
  relaunch = true;
490
407
  }
@@ -540,11 +457,14 @@ function parseInitFlags(args) {
540
457
  install,
541
458
  app,
542
459
  env,
543
- filesOnly,
460
+ // One app of a workspace, named: its files, and nothing started unless asked (`--start`). Its
461
+ // dev server is often run from the root, and a monorepo init started the daemon and failed it.
462
+ filesOnly: filesOnly || (app !== undefined && !start),
544
463
  captureBodies,
545
464
  hooks,
546
465
  json,
547
466
  open,
467
+ firstRun,
548
468
  relaunch,
549
469
  agents,
550
470
  url,
@@ -592,8 +512,6 @@ function parseTargetArgs(rest) {
592
512
  export function dialsTheDaemon(parsed) {
593
513
  if ('init' === parsed.kind)
594
514
  return false;
595
- if ('tutorial' === parsed.kind)
596
- return parsed.run;
597
515
  return 'port' in parsed;
598
516
  }
599
517
  /**
@@ -603,9 +521,9 @@ export function dialsTheDaemon(parsed) {
603
521
  * trustworthy, and asking people to opt into seeing their own app was backwards.
604
522
  */
605
523
  export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
606
- // Bare `reticle` is `serve` — a pool-owning command, so headless like the rest of that family.
524
+ // Bare `reticle` is `serve`.
607
525
  if (0 === argv.length)
608
- return { kind: 'serve', port: defaultPort, headless: true, http: false };
526
+ return { kind: 'serve', port: defaultPort, headless: defaultHeadless, http: false };
609
527
  const [cmd, ...rest] = argv;
610
528
  // Guaranteed by the bare-argv check above; restated so the unknown-command error can name it.
611
529
  if (cmd === undefined)
@@ -623,9 +541,22 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
623
541
  // `reticle_usage_error: unknown argument '--help'` on stderr with exit 1. The usage text was
624
542
  // printed underneath it, so the request was in fact answered; it was simply answered as a failure,
625
543
  // which is the wrong first impression to give somebody who has just asked a tool what it does.
626
- if ('help' === cmd || argv.some((arg) => '--help' === arg || '-h' === arg)) {
627
- return { kind: 'help' };
544
+ //
545
+ // Removed commands answer before help does: `reticle hunt --help` should say it is gone, not
546
+ // describe something that no longer runs.
547
+ const removed = REMOVED_COMMANDS.get(cmd);
548
+ if (removed !== undefined)
549
+ return { kind: 'removed', message: removedNote(cmd, removed) };
550
+ if (HELP_COMMAND === cmd || HELP_FLAGS.has(cmd)) {
551
+ // `reticle help all`, `reticle --help all`, `reticle help init`.
552
+ const topic = rest.find((arg) => !HELP_FLAGS.has(arg));
553
+ return topic === undefined ? { kind: 'help' } : { kind: 'help', topic };
628
554
  }
555
+ if (argv.some((arg) => HELP_FLAGS.has(arg)))
556
+ return { kind: 'help', topic: cmd };
557
+ // The list is the gate, so a command cannot be routed without also being named in telemetry.
558
+ if (!LOCAL_COMMAND_SET.has(cmd))
559
+ return unknownCommand(cmd);
629
560
  switch (cmd) {
630
561
  case INIT_COMMAND: {
631
562
  const r = parseInitFlags(rest);
@@ -644,6 +575,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
644
575
  hooks: r.hooks,
645
576
  json: r.json,
646
577
  open: r.open,
578
+ firstRun: r.firstRun,
647
579
  relaunch: r.relaunch,
648
580
  agents: r.agents,
649
581
  url: r.url,
@@ -667,6 +599,10 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
667
599
  }
668
600
  case STOP_COMMAND: {
669
601
  const port = parsePortFlag(rest, defaultPort);
602
+ // `stop --force` is what `kill` was: free the port by its listener, which must still be a
603
+ // Reticle daemon. Overriding that refusal stays on `restart --force` and the old `kill --force`.
604
+ if (rest.includes(FORCE_FLAG))
605
+ return { kind: 'kill', port, force: false };
670
606
  const quiet = rest.includes(QUIET_FLAG);
671
607
  return { kind: 'stop', port, quiet };
672
608
  }
@@ -685,22 +621,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
685
621
  // parsing it knows to ask for the object.
686
622
  return { kind: 'status', port, json: rest.includes(JSON_FLAG) };
687
623
  }
688
- case 'tutorial': {
689
- // `--agent` is the opt-in, because a person typing this is the common case and should not have
690
- // to ask for prose. An agent knows to pass the flag; a human would not know to avoid it.
691
- const audience = argv.includes('--agent') ? TutorialAudience.AGENT : TutorialAudience.HUMAN;
692
- // `--run` drives the demo instead of describing it. Opt-in rather than the default: the tour
693
- // starts a daemon and opens a browser, and a command that did that to somebody who typed it
694
- // expecting a page of text would be a surprise in the one place surprises are least welcome.
695
- return {
696
- kind: 'tutorial',
697
- audience,
698
- run: argv.includes('--run'),
699
- port: parsePortFlag(rest, defaultPort),
700
- headless: !argv.includes('--headed'),
701
- };
702
- }
703
- case 'doctor': {
624
+ case DOCTOR_COMMAND: {
704
625
  const port = parsePortFlag(rest, defaultPort);
705
626
  return { kind: 'doctor', port };
706
627
  }
@@ -716,7 +637,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
716
637
  * no flag: it tells a reader a confirmation exists. What this writes is stated before it runs
717
638
  * and printed after, which is the honest version of the same reassurance.
718
639
  */
719
- case 'setup': {
640
+ case SETUP_COMMAND: {
720
641
  const what = rest[0];
721
642
  /*
722
643
  * `setup install` — the Node half of the one-line installer.
@@ -737,7 +658,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
737
658
  // Only `mcp` today. A bare `reticle setup` falls to help rather than guessing, because the
738
659
  // next subcommand here will not be a synonym for this one.
739
660
  if (what !== 'mcp')
740
- return { kind: 'help' };
661
+ return { kind: 'help', topic: SETUP_COMMAND };
741
662
  return { kind: 'setup-mcp' };
742
663
  }
743
664
  case LICENSE_COMMAND:
@@ -751,22 +672,6 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
751
672
  }
752
673
  return { kind: 'telemetry', action };
753
674
  }
754
- case IDENTIFY_COMMAND: {
755
- const flag = (name) => {
756
- const at = rest.indexOf(name);
757
- return -1 === at ? undefined : rest[at + 1];
758
- };
759
- const context = flag(CONTEXT_FLAG);
760
- const company = flag(COMPANY_FLAG);
761
- const email = flag(EMAIL_FLAG);
762
- return {
763
- kind: 'identify',
764
- ...(context !== undefined ? { context } : {}),
765
- ...(company !== undefined ? { company } : {}),
766
- ...(email !== undefined ? { email } : {}),
767
- forget: rest.includes(FORGET_FLAG),
768
- };
769
- }
770
675
  case FEEDBACK_COMMAND:
771
676
  return parseFeedbackArgs(rest);
772
677
  case OPEN_COMMAND: {
@@ -812,16 +717,10 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
812
717
  ...(true === r.explore ? { explore: true } : {}),
813
718
  ...(r.persona !== undefined ? { persona: r.persona } : {}),
814
719
  ...(r.select !== undefined ? { select: r.select } : {}),
720
+ ...(r.resultsJson !== undefined ? { resultsJson: r.resultsJson } : {}),
721
+ ...(true === r.confirmDangerous ? { confirmDangerous: true } : {}),
815
722
  };
816
723
  }
817
- case CAPSULES_COMMAND:
818
- return { kind: 'capsules' };
819
- case HUNT_COMMAND: {
820
- const dir = rest.find((a) => !a.startsWith('-'));
821
- return dir === undefined
822
- ? { kind: 'error', message: 'usage: reticle hunt <dir-of-crawl-reports>' }
823
- : { kind: 'hunt', dir };
824
- }
825
724
  case AFFECTED_COMMAND: {
826
725
  const t = parseTargetArgs(rest);
827
726
  const since = t.since ?? implicitSince(t.files);
@@ -850,10 +749,11 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
850
749
  ...(session === undefined ? {} : { session }),
851
750
  };
852
751
  }
853
- case WATCH_COMMAND: {
854
- // `reticle watch [url]` — on file save, report which saved flows must re-verify.
855
- const url = rest.find((arg) => !arg.startsWith('-'));
856
- return url === undefined ? { kind: 'watch' } : { kind: 'watch', url };
752
+ case CONTEXT_COMMAND: {
753
+ // `--compact` is the only form; accepted so the hook line reads as what it does.
754
+ const at = rest.indexOf(SESSION_FLAG);
755
+ const session = -1 === at ? undefined : rest[at + 1];
756
+ return { kind: 'context', ...(session === undefined ? {} : { session }) };
857
757
  }
858
758
  case UPDATE_COMMAND:
859
759
  return { kind: 'update' };
@@ -1,4 +1,4 @@
1
1
  /** `reticle update` — install the latest server version, sync the app's SDK, and restart. */
2
- export declare function handleUpdate(): Promise<void>;
2
+ export declare function handleUpdate(cwd?: string): Promise<void>;
3
3
  /** `reticle rollback` — restore the previous server version and restart. */
4
4
  export declare function handleRollback(): Promise<void>;