@reticlehq/server 2.4.0 → 2.5.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 (416) hide show
  1. package/SKILL.md +702 -0
  2. package/dist/bridge/auth-failure-reason.d.ts +19 -0
  3. package/dist/bridge/auth-failure-reason.js +29 -0
  4. package/dist/{bridge-security.d.ts → bridge/bridge-security.d.ts} +1 -1
  5. package/dist/{bridge-security.js → bridge/bridge-security.js} +1 -1
  6. package/dist/{bridge.d.ts → bridge/bridge.d.ts} +1 -1
  7. package/dist/{bridge.js → bridge/bridge.js} +63 -13
  8. package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +1 -11
  9. package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +9 -9
  10. package/dist/{pairing-token.js → bridge/pairing-token.js} +1 -1
  11. package/dist/capsule/capsule-store.d.ts +8 -3
  12. package/dist/capsule/capsule-store.js +7 -2
  13. package/dist/capsule/capsule.js +3 -3
  14. package/dist/capsule/causal-summary.d.ts +8 -0
  15. package/dist/capsule/causal-summary.js +22 -12
  16. package/dist/capsule/divergence.d.ts +9 -4
  17. package/dist/capsule/divergence.js +8 -8
  18. package/dist/capsule/predicate-to-links.js +11 -8
  19. package/dist/{cli-doctor.js → cli/cli-doctor.js} +9 -2
  20. package/dist/{cli-flow-commands.d.ts → cli/cli-flow-commands.d.ts} +2 -2
  21. package/dist/{cli-flow-commands.js → cli/cli-flow-commands.js} +15 -15
  22. package/dist/{cli-launch.d.ts → cli/cli-launch.d.ts} +32 -3
  23. package/dist/cli/cli-launch.js +171 -0
  24. package/dist/{cli-parse.d.ts → cli/cli-parse.d.ts} +2 -11
  25. package/dist/{cli-parse.js → cli/cli-parse.js} +113 -60
  26. package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +12 -0
  27. package/dist/{cli-port.js → cli/cli-port.js} +9 -9
  28. package/dist/cli/cli-update-commands.d.ts +4 -0
  29. package/dist/cli/cli-update-commands.js +93 -0
  30. package/dist/{cli-verify.js → cli/cli-verify.js} +14 -14
  31. package/dist/{cloud-cli.js → cli/cloud-cli.js} +29 -24
  32. package/dist/cli.d.ts +2 -2
  33. package/dist/cli.js +174 -92
  34. package/dist/cloud/cloud-config.d.ts +0 -1
  35. package/dist/cloud/cloud-config.js +9 -9
  36. package/dist/cloud/cloud-sync.d.ts +1 -7
  37. package/dist/cloud/cloud-sync.js +12 -12
  38. package/dist/crawl/crawl-empty.d.ts +16 -0
  39. package/dist/crawl/crawl-empty.js +24 -0
  40. package/dist/crawl/crawl-tools.js +4 -1
  41. package/dist/crawl/crawl.js +26 -7
  42. package/dist/daemon/daemon-resilience.d.ts +49 -0
  43. package/dist/daemon/daemon-resilience.js +191 -0
  44. package/dist/daemon/daemon-usefulness.d.ts +61 -0
  45. package/dist/daemon/daemon-usefulness.js +62 -0
  46. package/dist/{daemon.d.ts → daemon/daemon.d.ts} +33 -8
  47. package/dist/{daemon.js → daemon/daemon.js} +80 -48
  48. package/dist/daemon/idle-grace.d.ts +32 -0
  49. package/dist/daemon/idle-grace.js +41 -0
  50. package/dist/{idle-shutdown.d.ts → daemon/idle-shutdown.d.ts} +13 -0
  51. package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +27 -4
  52. package/dist/domain/domain-model.js +2 -2
  53. package/dist/events/body-failures.js +8 -8
  54. package/dist/events/contradictions.d.ts +1 -1
  55. package/dist/events/contradictions.js +60 -10
  56. package/dist/events/echo-mismatch.js +10 -10
  57. package/dist/events/event-filters.js +6 -6
  58. package/dist/events/json-salvage.d.ts +2 -1
  59. package/dist/events/json-salvage.js +6 -6
  60. package/dist/events/observed-in-window.d.ts +12 -0
  61. package/dist/events/observed-in-window.js +21 -0
  62. package/dist/events/predicate-eval.d.ts +43 -20
  63. package/dist/events/predicate-eval.js +159 -55
  64. package/dist/events/predicate.d.ts +2 -2
  65. package/dist/events/predicate.js +112 -35
  66. package/dist/events/reconcile.js +5 -5
  67. package/dist/events/ring-buffer.js +1 -1
  68. package/dist/events/stale-response.js +6 -6
  69. package/dist/events/testid-near-miss.d.ts +22 -0
  70. package/dist/events/testid-near-miss.js +33 -0
  71. package/dist/events/unit-mismatch.js +8 -8
  72. package/dist/flows/affected-tools.js +19 -4
  73. package/dist/flows/affected.js +1 -1
  74. package/dist/flows/annotate-target.d.ts +1 -0
  75. package/dist/flows/annotate-target.js +20 -0
  76. package/dist/flows/annotate-tools.js +25 -3
  77. package/dist/flows/annotate.js +17 -4
  78. package/dist/flows/assertion-integrity.d.ts +2 -1
  79. package/dist/flows/assertion-tiers-store.d.ts +3 -66
  80. package/dist/flows/assertion-tiers-store.js +2 -2
  81. package/dist/flows/attributed-failure.d.ts +17 -0
  82. package/dist/flows/attributed-failure.js +20 -0
  83. package/dist/flows/buddy-status.d.ts +2 -1
  84. package/dist/flows/buddy-status.js +2 -2
  85. package/dist/flows/coverage.d.ts +3 -2
  86. package/dist/flows/coverage.js +2 -2
  87. package/dist/flows/decision.js +24 -9
  88. package/dist/flows/empty-flow.d.ts +6 -0
  89. package/dist/flows/empty-flow.js +24 -0
  90. package/dist/flows/flake-store.d.ts +0 -1
  91. package/dist/flows/flake-store.js +1 -1
  92. package/dist/flows/flake.d.ts +2 -1
  93. package/dist/flows/flake.js +2 -2
  94. package/dist/flows/flow-classify.js +12 -0
  95. package/dist/flows/flow-replay-run.js +4 -4
  96. package/dist/flows/flow-replay.d.ts +5 -7
  97. package/dist/flows/flow-replay.js +114 -47
  98. package/dist/flows/flow-report.js +1 -1
  99. package/dist/flows/flow-scope.d.ts +1 -6
  100. package/dist/flows/flow-step-runners.d.ts +26 -6
  101. package/dist/flows/flow-step-runners.js +157 -6
  102. package/dist/flows/flow-success.js +20 -15
  103. package/dist/flows/flow-tools.js +53 -7
  104. package/dist/flows/flows.js +15 -11
  105. package/dist/flows/gate.d.ts +4 -3
  106. package/dist/flows/gate.js +1 -1
  107. package/dist/flows/heal-run.d.ts +0 -8
  108. package/dist/flows/heal-run.js +5 -5
  109. package/dist/flows/heal.js +3 -3
  110. package/dist/flows/predicate-to-expect.d.ts +38 -0
  111. package/dist/flows/predicate-to-expect.js +95 -0
  112. package/dist/flows/replay.d.ts +16 -1
  113. package/dist/flows/replay.js +58 -22
  114. package/dist/flows/role-anchor-nearest.d.ts +6 -0
  115. package/dist/flows/role-anchor-nearest.js +45 -0
  116. package/dist/flows/server-verify.d.ts +1 -1
  117. package/dist/flows/server-verify.js +5 -5
  118. package/dist/flows/verify-change-tools.js +32 -10
  119. package/dist/flows/verify-change-verdict.d.ts +15 -0
  120. package/dist/flows/verify-change-verdict.js +25 -0
  121. package/dist/flows/watch-batcher.d.ts +3 -2
  122. package/dist/honesty/already-true.d.ts +2 -0
  123. package/dist/honesty/already-true.js +31 -0
  124. package/dist/honesty/blind-spots.d.ts +16 -3
  125. package/dist/honesty/blind-spots.js +24 -12
  126. package/dist/honesty/honesty.d.ts +3 -2
  127. package/dist/honesty/honesty.js +4 -4
  128. package/dist/honesty/uncaptured-bodies.js +1 -1
  129. package/dist/honesty/unread-outcome.js +2 -2
  130. package/dist/honesty/verified.d.ts +22 -3
  131. package/dist/honesty/verified.js +48 -8
  132. package/dist/http-server.js +14 -7
  133. package/dist/hunt/hunt-report.d.ts +2 -1
  134. package/dist/hunt/hunt-report.js +2 -2
  135. package/dist/index.d.ts +8 -6
  136. package/dist/index.js +32 -25
  137. package/dist/init/agent-rules.d.ts +2 -1
  138. package/dist/init/agent-rules.js +45 -7
  139. package/dist/init/app-choice.d.ts +20 -0
  140. package/dist/init/app-choice.js +25 -0
  141. package/dist/init/astro-host.d.ts +21 -0
  142. package/dist/init/astro-host.js +27 -0
  143. package/dist/init/astro-patch.d.ts +16 -0
  144. package/dist/init/astro-patch.js +240 -0
  145. package/dist/init/capabilities.js +4 -1
  146. package/dist/init/cra.d.ts +37 -0
  147. package/dist/init/cra.js +90 -0
  148. package/dist/init/cursor.js +39 -4
  149. package/dist/init/desktop-doctor.d.ts +3 -2
  150. package/dist/init/desktop-doctor.js +4 -4
  151. package/dist/init/detect.d.ts +3 -2
  152. package/dist/init/detect.js +16 -5
  153. package/dist/init/mcp-registered.d.ts +12 -0
  154. package/dist/init/mcp-registered.js +14 -0
  155. package/dist/init/mcp.d.ts +27 -2
  156. package/dist/init/mcp.js +40 -4
  157. package/dist/init/next-patch.d.ts +2 -4
  158. package/dist/init/next-patch.js +109 -19
  159. package/dist/init/node-io.js +23 -6
  160. package/dist/init/plan-framework.d.ts +16 -1
  161. package/dist/init/plan-framework.js +132 -8
  162. package/dist/init/plan.d.ts +73 -8
  163. package/dist/init/plan.js +133 -34
  164. package/dist/init/project-id.d.ts +5 -9
  165. package/dist/init/project-id.js +10 -22
  166. package/dist/init/run.d.ts +5 -0
  167. package/dist/init/run.js +210 -36
  168. package/dist/init/slash-command.d.ts +9 -0
  169. package/dist/init/slash-command.js +10 -1
  170. package/dist/init/snippets.d.ts +7 -10
  171. package/dist/init/snippets.js +44 -15
  172. package/dist/init/vite-config.js +1 -1
  173. package/dist/init/workspace-apps.d.ts +23 -0
  174. package/dist/init/workspace-apps.js +68 -0
  175. package/dist/input/driven-redaction.js +1 -1
  176. package/dist/input/network-detail.js +8 -8
  177. package/dist/input/network-mock-tools.js +2 -2
  178. package/dist/input/network-mock.js +4 -4
  179. package/dist/input/real-input.js +8 -3
  180. package/dist/input/scroll-find.js +2 -2
  181. package/dist/input/scroll-tools.d.ts +0 -5
  182. package/dist/input/scroll-tools.js +11 -4
  183. package/dist/input/viewport-tools.js +2 -2
  184. package/dist/journal/ambient-store.d.ts +0 -2
  185. package/dist/journal/ambient-store.js +1 -1
  186. package/dist/journal/ambient.js +1 -1
  187. package/dist/journal/attach-journal.d.ts +2 -1
  188. package/dist/journal/deviation-report.js +6 -6
  189. package/dist/journal/deviation-service.js +1 -1
  190. package/dist/journal/envelope-store.d.ts +0 -2
  191. package/dist/journal/envelope-store.js +1 -1
  192. package/dist/journal/envelope.d.ts +2 -3
  193. package/dist/journal/envelope.js +3 -3
  194. package/dist/journal/journal-query.js +1 -1
  195. package/dist/journal/journal-recorder.d.ts +2 -1
  196. package/dist/journal/journal-recorder.js +2 -2
  197. package/dist/journal/rollups.js +9 -9
  198. package/dist/journal/session-end.d.ts +2 -1
  199. package/dist/journal/session-journal.js +4 -4
  200. package/dist/license/license.d.ts +0 -14
  201. package/dist/license/license.js +8 -8
  202. package/dist/log.d.ts +10 -0
  203. package/dist/log.js +11 -1
  204. package/dist/mcp/mcp-is-error.d.ts +13 -0
  205. package/dist/mcp/mcp-is-error.js +18 -0
  206. package/dist/mcp/mcp-outage.d.ts +31 -0
  207. package/dist/mcp/mcp-outage.js +48 -0
  208. package/dist/mcp/mcp-proxy.d.ts +124 -0
  209. package/dist/mcp/mcp-proxy.js +697 -0
  210. package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
  211. package/dist/{mcp.js → mcp/mcp.js} +110 -35
  212. package/dist/mcp/proxy-handshake.d.ts +3 -0
  213. package/dist/mcp/proxy-handshake.js +54 -0
  214. package/dist/mcp/proxy-lifecycle.d.ts +64 -0
  215. package/dist/mcp/proxy-lifecycle.js +70 -0
  216. package/dist/mcp/tool-catalog-cache.d.ts +29 -0
  217. package/dist/mcp/tool-catalog-cache.js +55 -0
  218. package/dist/oracles/propose-consequences.d.ts +2 -1
  219. package/dist/oracles/propose-consequences.js +16 -11
  220. package/dist/oracles/self-instrument.d.ts +2 -1
  221. package/dist/oracles/self-instrument.js +1 -1
  222. package/dist/phenomena/phenomena.js +3 -3
  223. package/dist/platform.d.ts +16 -0
  224. package/dist/platform.js +16 -0
  225. package/dist/pool/playwright-launcher.d.ts +15 -2
  226. package/dist/pool/playwright-launcher.js +21 -2
  227. package/dist/project/fs-port.js +1 -1
  228. package/dist/project/project-tools.js +2 -2
  229. package/dist/runs/build-verification-run.js +1 -1
  230. package/dist/runs/repair-prompt.d.ts +0 -6
  231. package/dist/runs/repair-prompt.js +3 -3
  232. package/dist/runs/risk-classify.js +1 -1
  233. package/dist/runs/run-diff.d.ts +0 -2
  234. package/dist/runs/run-diff.js +3 -3
  235. package/dist/runs/run-tools.js +2 -2
  236. package/dist/runs/verification-sync.js +2 -2
  237. package/dist/runs/verify-http.js +1 -1
  238. package/dist/runs/verify-server.js +1 -1
  239. package/dist/session/command-timeout.d.ts +11 -3
  240. package/dist/session/command-timeout.js +2 -2
  241. package/dist/session/control-envelope.d.ts +6 -0
  242. package/dist/session/control-envelope.js +7 -1
  243. package/dist/session/dev-server-probe.d.ts +13 -0
  244. package/dist/session/dev-server-probe.js +52 -0
  245. package/dist/session/last-act.d.ts +17 -3
  246. package/dist/session/last-act.js +16 -4
  247. package/dist/session/live-control-tools.js +7 -2
  248. package/dist/session/live-control.js +1 -1
  249. package/dist/session/looks-like-dev-server.d.ts +14 -0
  250. package/dist/session/looks-like-dev-server.js +25 -0
  251. package/dist/session/no-session-diagnosis.d.ts +38 -0
  252. package/dist/session/no-session-diagnosis.js +70 -0
  253. package/dist/session/no-session-watch.d.ts +19 -0
  254. package/dist/session/no-session-watch.js +61 -0
  255. package/dist/session/observed-state.d.ts +4 -0
  256. package/dist/session/observed-state.js +19 -1
  257. package/dist/session/output-budget.js +1 -1
  258. package/dist/session/session-health.d.ts +8 -1
  259. package/dist/session/session-health.js +8 -7
  260. package/dist/session/session-info.d.ts +26 -7
  261. package/dist/session/session-info.js +42 -1
  262. package/dist/session/session-lease.d.ts +0 -11
  263. package/dist/session/session-lease.js +1 -1
  264. package/dist/session/session-manager.d.ts +3 -0
  265. package/dist/session/session-manager.js +52 -9
  266. package/dist/session/session-readiness.d.ts +1 -1
  267. package/dist/session/session-readiness.js +6 -1
  268. package/dist/session/session-reaper.js +1 -1
  269. package/dist/session/session-reconnect.d.ts +32 -0
  270. package/dist/session/session-reconnect.js +42 -0
  271. package/dist/session/session.d.ts +14 -2
  272. package/dist/session/session.js +69 -26
  273. package/dist/session/state-select.d.ts +1 -1
  274. package/dist/session/state-select.js +1 -1
  275. package/dist/status-payload.d.ts +19 -0
  276. package/dist/status-payload.js +11 -0
  277. package/dist/telemetry/argument-shape.js +10 -1
  278. package/dist/telemetry/browser-mode.d.ts +27 -0
  279. package/dist/telemetry/browser-mode.js +33 -0
  280. package/dist/telemetry/bug-found.d.ts +17 -21
  281. package/dist/telemetry/bug-found.js +120 -8
  282. package/dist/telemetry/cli-telemetry.d.ts +2 -12
  283. package/dist/telemetry/cli-telemetry.js +27 -4
  284. package/dist/telemetry/daemon-telemetry.d.ts +19 -0
  285. package/dist/telemetry/daemon-telemetry.js +12 -2
  286. package/dist/telemetry/dev-repo.js +4 -4
  287. package/dist/telemetry/error-fingerprint.js +21 -2
  288. package/dist/telemetry/feedback-cli.d.ts +1 -1
  289. package/dist/telemetry/feedback-cli.js +4 -4
  290. package/dist/telemetry/feedback-context.d.ts +22 -0
  291. package/dist/telemetry/feedback-context.js +41 -1
  292. package/dist/telemetry/feedback-delivery.d.ts +20 -0
  293. package/dist/telemetry/feedback-delivery.js +30 -0
  294. package/dist/telemetry/feedback-outbox.d.ts +22 -0
  295. package/dist/telemetry/feedback-outbox.js +87 -0
  296. package/dist/telemetry/feedback.d.ts +22 -1
  297. package/dist/telemetry/feedback.js +67 -8
  298. package/dist/telemetry/git-facts.js +1 -1
  299. package/dist/telemetry/session-metrics.d.ts +2 -0
  300. package/dist/telemetry/session-metrics.js +68 -6
  301. package/dist/telemetry/telemetry.d.ts +27 -2
  302. package/dist/telemetry/telemetry.js +119 -29
  303. package/dist/telemetry/verification-of.d.ts +22 -0
  304. package/dist/telemetry/verification-of.js +84 -0
  305. package/dist/tools/act-capsule.js +2 -2
  306. package/dist/tools/act-danger.d.ts +12 -0
  307. package/dist/tools/act-danger.js +20 -3
  308. package/dist/tools/act-helpers.js +4 -4
  309. package/dist/tools/act-tools.d.ts +0 -8
  310. package/dist/tools/act-tools.js +84 -115
  311. package/dist/tools/act-view.js +7 -7
  312. package/dist/tools/alias-args.d.ts +17 -0
  313. package/dist/tools/alias-args.js +25 -0
  314. package/dist/tools/assert-grade.js +9 -9
  315. package/dist/tools/assert-verdict.d.ts +3 -1
  316. package/dist/tools/assert-verdict.js +8 -5
  317. package/dist/tools/browser-tools.js +30 -11
  318. package/dist/tools/contract-tools.js +1 -1
  319. package/dist/tools/coverage-identity.d.ts +34 -0
  320. package/dist/tools/coverage-identity.js +46 -0
  321. package/dist/tools/coverage-tools.js +10 -14
  322. package/dist/tools/dynamic-tools.d.ts +2 -1
  323. package/dist/tools/dynamic-tools.js +90 -18
  324. package/dist/tools/error-recovery.d.ts +20 -2
  325. package/dist/tools/error-recovery.js +179 -4
  326. package/dist/tools/feedback-tools.d.ts +12 -1
  327. package/dist/tools/feedback-tools.js +28 -5
  328. package/dist/tools/invoke-tool.d.ts +0 -6
  329. package/dist/tools/invoke-tool.js +57 -32
  330. package/dist/tools/lease-hint.d.ts +17 -0
  331. package/dist/tools/lease-hint.js +24 -0
  332. package/dist/tools/lease-tools.js +6 -5
  333. package/dist/tools/merge-tools.d.ts +10 -1
  334. package/dist/tools/merge-tools.js +9 -3
  335. package/dist/tools/merged-name-redirect.d.ts +13 -0
  336. package/dist/tools/merged-name-redirect.js +55 -0
  337. package/dist/tools/navigate-result.d.ts +17 -0
  338. package/dist/tools/navigate-result.js +31 -0
  339. package/dist/tools/observe-tools.js +54 -20
  340. package/dist/tools/observed-nothing.d.ts +25 -0
  341. package/dist/tools/observed-nothing.js +33 -0
  342. package/dist/tools/query-paginate.js +2 -2
  343. package/dist/tools/query-shape.d.ts +18 -0
  344. package/dist/tools/query-shape.js +39 -0
  345. package/dist/tools/read-tools.js +81 -20
  346. package/dist/tools/real-input-attempt.d.ts +28 -0
  347. package/dist/tools/real-input-attempt.js +88 -0
  348. package/dist/tools/reconcile-tools.js +7 -7
  349. package/dist/tools/reload-result.d.ts +14 -0
  350. package/dist/tools/reload-result.js +29 -0
  351. package/dist/tools/snapshot-delta.d.ts +4 -5
  352. package/dist/tools/snapshot-delta.js +0 -0
  353. package/dist/tools/tool-kit.d.ts +8 -0
  354. package/dist/tools/tool-surface.d.ts +83 -0
  355. package/dist/tools/tool-surface.js +204 -0
  356. package/dist/tools/tools-helpers.js +6 -6
  357. package/dist/tools/tools.d.ts +15 -0
  358. package/dist/tools/tools.js +53 -17
  359. package/dist/tools/unadvertised-help.d.ts +5 -0
  360. package/dist/tools/unadvertised-help.js +39 -0
  361. package/dist/trace.d.ts +69 -0
  362. package/dist/trace.js +150 -0
  363. package/dist/update/nudge-credit.d.ts +4 -0
  364. package/dist/update/nudge-credit.js +53 -0
  365. package/dist/update/sdk-sync.d.ts +21 -0
  366. package/dist/update/sdk-sync.js +42 -0
  367. package/dist/update/update-checker.js +3 -3
  368. package/dist/update/update-nudge.d.ts +63 -6
  369. package/dist/update/update-nudge.js +128 -15
  370. package/dist/update/updater.d.ts +1 -9
  371. package/dist/update/updater.js +13 -8
  372. package/dist/version/peer-announce.d.ts +4 -0
  373. package/dist/version/peer-announce.js +30 -0
  374. package/dist/{server-version.js → version/server-version.js} +5 -1
  375. package/dist/version/version-nudge.d.ts +28 -0
  376. package/dist/version/version-nudge.js +40 -0
  377. package/dist/version/version-skew.d.ts +66 -0
  378. package/dist/version/version-skew.js +71 -0
  379. package/dist/visual/visual-diff.js +2 -2
  380. package/dist/visual/visual-tools.js +4 -4
  381. package/docs/agent-cheatsheet.md +85 -0
  382. package/docs/architecture.md +113 -0
  383. package/docs/benchmarks.md +255 -0
  384. package/docs/debugging.md +102 -0
  385. package/docs/deploy-checks.md +69 -0
  386. package/docs/desktop-apps.md +256 -0
  387. package/docs/enterprise.md +62 -0
  388. package/docs/fixtures.md +28 -0
  389. package/docs/flows.md +166 -0
  390. package/docs/getting-started.md +469 -0
  391. package/docs/human-control.md +63 -0
  392. package/docs/integration-patterns.md +171 -0
  393. package/docs/local-registry.md +126 -0
  394. package/docs/mint.json +61 -0
  395. package/docs/multi-agent-testing.md +55 -0
  396. package/docs/platform-integration.md +122 -0
  397. package/docs/telemetry-contract.md +214 -0
  398. package/docs/telemetry.md +184 -0
  399. package/docs/testing.md +82 -0
  400. package/docs/token-efficiency.md +80 -0
  401. package/docs/usage.md +1046 -0
  402. package/package.json +8 -5
  403. package/dist/cli-launch.js +0 -112
  404. package/dist/daemon-resilience.d.ts +0 -22
  405. package/dist/daemon-resilience.js +0 -85
  406. package/dist/mcp-proxy.d.ts +0 -67
  407. package/dist/mcp-proxy.js +0 -337
  408. package/dist/tools/profiles.d.ts +0 -37
  409. package/dist/tools/profiles.js +0 -139
  410. /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
  411. /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
  412. /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
  413. /package/dist/{cli-doctor.d.ts → cli/cli-doctor.d.ts} +0 -0
  414. /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
  415. /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
  416. /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
package/dist/init/plan.js CHANGED
@@ -6,10 +6,10 @@
6
6
  import { Framework, PackageManager, UiLibrary, installCommand, installCommandParts, } from './detect.js';
7
7
  import { claudeAddCommand, mcpManual } from './mcp.js';
8
8
  import { mergeCursorConfig, CursorMergeStatus, cursorServerEntry } from './cursor.js';
9
- import { CLAUDE_COMMAND_PATH, CURSOR_COMMAND_PATH, SLASH_COMMAND_BODY, } from './slash-command.js';
9
+ import { CLAUDE_COMMAND_PATH, CURSOR_COMMAND_PATH, SLASH_COMMAND_BODY, SLASH_COMMAND_SIGNATURE, } from './slash-command.js';
10
10
  import { mergeMarkedInstruction, cursorRuleFile, AgentRuleStatus, CLAUDE_MD_PATH, AGENTS_MD_PATH, CURSOR_RULE_PATH, } from './agent-rules.js';
11
- import { viteSteps, nextSteps, svelteKitSteps, VITE_PLUGIN_DETAIL } from './plan-framework.js';
12
- import { htmlManual, reticleConfigContent, unverifiedUiLibraryNote, astroManual, } from './snippets.js';
11
+ import { viteSteps, nextSteps, craSteps, svelteKitSteps, astroSteps, VITE_PLUGIN_DETAIL, } from './plan-framework.js';
12
+ import { htmlManual, reticleConfigContent, unverifiedUiLibraryNote } from './snippets.js';
13
13
  // An app dev installs exactly the audience-scoped browser-side dependencies — never the retired
14
14
  // `@reticlehq/core` umbrella (which dragged the Node MCP server + ws into every app). The kit is the
15
15
  // framework adapter (it re-exports the browser sensor), paired with that framework's dev-only build
@@ -27,12 +27,12 @@ const RETICLE_NEXT_PLUGIN = '@reticlehq/next';
27
27
  * irrelevant, and a skewed pair impossible to install by accident.
28
28
  */
29
29
  export function pinnedPackages(packages, version) {
30
- if (version === undefined || version.length === 0)
30
+ if (version === undefined || 0 === version.length)
31
31
  return packages;
32
32
  return packages.map((p) => `${p}@${version}`);
33
33
  }
34
34
  /** The dev-dependencies `reticle init` installs for a given framework — kit first, build plugin next. */
35
- export function frameworkPackages(framework) {
35
+ function frameworkPackages(framework) {
36
36
  switch (framework) {
37
37
  case Framework.NEXT:
38
38
  return [RETICLE_REACT_KIT, RETICLE_NEXT_PLUGIN];
@@ -44,6 +44,10 @@ export function frameworkPackages(framework) {
44
44
  // Astro owns its own Vite instance and renders its own HTML, so there is no config for the
45
45
  // plugin to attach to — the kit alone, connected from a page <script> (see astroManual).
46
46
  return [RETICLE_REACT_KIT];
47
+ case Framework.CRA:
48
+ // react-scripts owns its webpack config and cannot be extended without ejecting, so there is
49
+ // no build plugin — the kit alone, imported from src/index.tsx (see cra.ts).
50
+ return [RETICLE_REACT_KIT];
47
51
  case Framework.HTML:
48
52
  // No bundler plugin to install — just the kit; connect is wired by hand (see htmlManual).
49
53
  return [RETICLE_REACT_KIT];
@@ -51,6 +55,27 @@ export function frameworkPackages(framework) {
51
55
  }
52
56
  /** Exported so the init telemetry can tell an MCP-registration failure from a dependency install. */
53
57
  export const MCP_TARGET = 'global (claude user scope)';
58
+ /**
59
+ * Titles of the steps WITHOUT which no session ever appears.
60
+ *
61
+ * A ⚠ on one of these is not a warning, it is a guaranteed failure: nothing performs the manual step,
62
+ * so the app will not connect and every Reticle tool will answer "no browser session connected".
63
+ * Reported from a field sweep, where the ⚠ count and "did it connect" were treated as independent
64
+ * signals and are not.
65
+ */
66
+ const CONNECT_STEP_TITLES = new Set([
67
+ 'Connect snippet',
68
+ 'Connect snippet (CRA)',
69
+ 'Connect snippet (Astro)',
70
+ 'Reticle client hook',
71
+ 'Reticle connect module',
72
+ 'ReticleDev component',
73
+ 'Vite plugin',
74
+ ]);
75
+ /** True when this step is what makes the app dial the daemon. */
76
+ export function isConnectStep(title) {
77
+ return CONNECT_STEP_TITLES.has(title);
78
+ }
54
79
  /** The step that runs the package manager — the other thing that commonly fails on a user's machine. */
55
80
  export const DEPS_TARGET = 'package.json';
56
81
  const RETICLE_CONFIG_FILE = '.reticle.json';
@@ -125,14 +150,19 @@ function mcpSteps(input) {
125
150
  title: 'MCP server (global)',
126
151
  target: MCP_TARGET,
127
152
  status: StepStatus.SKIP,
128
- detail: '--no-mcp',
153
+ // Names everything it turns off. `--no-mcp` reads like "skip one step" and skips three: the
154
+ // registration, the agent rule files, and the /reticle command. A gate running with this flag
155
+ // therefore covers far less than its name suggests, which is worth saying out loud.
156
+ detail: '--no-mcp — also skips the agent rule files (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command',
129
157
  },
130
158
  ];
131
159
  }
132
- const steps = [claudeMcpStep(input), cursorMcpStep(input)].filter((s) => s !== null);
160
+ const steps = stepsForAgents(input, (a) => a.mcpStep);
133
161
  if (steps.length > 0)
134
162
  return steps;
135
- // No supported agent detected — print the one-time global instructions.
163
+ // No supported agent detected — print the one-time global instructions. Reached when the `claude`
164
+ // CLI is absent AND ~/.cursor does not exist, which includes Cursor installed with a fresh profile
165
+ // that has not written its config directory yet, so the manual text covers both agents.
136
166
  return [
137
167
  {
138
168
  title: 'MCP server (global)',
@@ -143,35 +173,50 @@ function mcpSteps(input) {
143
173
  ];
144
174
  }
145
175
  const SLASH_COMMAND_TITLE = 'The /reticle command';
176
+ /**
177
+ * Nothing to do for this command file: it already holds the CURRENT body, or it is not ours at all.
178
+ *
179
+ * Gating on mere existence froze the command at whatever release wrote it. Rewriting anything found
180
+ * there would be worse — a human may have claimed `/reticle` for their own prompt — so a file without
181
+ * our signature is left exactly as it is.
182
+ */
183
+ function commandIsSettled(content) {
184
+ if (null === content || content === undefined)
185
+ return false;
186
+ return content === SLASH_COMMAND_BODY || !content.includes(SLASH_COMMAND_SIGNATURE);
187
+ }
146
188
  /**
147
189
  * `/reticle` — the entry point SKILL.md promises in three places and nothing ever created, so it
148
- * silently did nothing in every tool. One file per agent that supports custom commands.
190
+ * silently did nothing in every tool.
191
+ *
192
+ * CURRENT, not merely present — same reason as the Cursor rule: a command file frozen at whatever
193
+ * release created it is a command that can never be improved for anyone who already ran init. The
194
+ * whole file is Reticle's, so a stale one is rewritten.
149
195
  */
150
- function slashCommandSteps(input) {
151
- const targets = [
152
- { path: CLAUDE_COMMAND_PATH, when: input.claudeCli, exists: input.claudeCommandExists === true },
153
- {
154
- path: CURSOR_COMMAND_PATH,
155
- when: input.cursorProjectPresent === true || (input.cursorPresent && !input.claudeCli),
156
- exists: input.cursorCommandExists === true,
157
- },
158
- ];
159
- return targets
160
- .filter((t) => t.when)
161
- .map((t) => t.exists
196
+ function commandStepFor(path, present, content) {
197
+ if (!present)
198
+ return null;
199
+ return commandIsSettled(content)
162
200
  ? {
163
201
  title: SLASH_COMMAND_TITLE,
164
- target: t.path,
202
+ target: path,
165
203
  status: StepStatus.ALREADY,
166
204
  detail: 'command already exists',
167
205
  }
168
206
  : {
169
207
  title: SLASH_COMMAND_TITLE,
170
- target: t.path,
208
+ target: path,
171
209
  status: StepStatus.APPLY,
172
210
  detail: 'type /reticle to verify one flow in the browser',
173
- write: { path: t.path, content: SLASH_COMMAND_BODY },
174
- });
211
+ write: { path, content: SLASH_COMMAND_BODY },
212
+ };
213
+ }
214
+ function claudeCommandStep(input) {
215
+ return commandStepFor(CLAUDE_COMMAND_PATH, input.claudeCli, input.claudeCommandContent);
216
+ }
217
+ function cursorCommandStep(input) {
218
+ const present = true === input.cursorProjectPresent || (input.cursorPresent && !input.claudeCli);
219
+ return commandStepFor(CURSOR_COMMAND_PATH, present, input.cursorCommandContent);
175
220
  }
176
221
  const AGENT_RULE_TITLE = 'Agent verification rule';
177
222
  const AGENT_RULE_DETAIL = 'teach the agent to verify features with Reticle after building them';
@@ -206,7 +251,9 @@ function cursorRuleStep(input) {
206
251
  return null;
207
252
  if (input.cursorProjectPresent !== true && input.claudeCli)
208
253
  return null;
209
- if (input.cursorRuleExists === true) {
254
+ // The whole file is Reticle's — init created it — so a stale one is REWRITTEN rather than merged.
255
+ // Comparing content is what makes the rule updatable; comparing existence made it permanent.
256
+ if (input.cursorRuleContent === cursorRuleFile()) {
210
257
  return {
211
258
  title: AGENT_RULE_TITLE,
212
259
  target: CURSOR_RULE_PATH,
@@ -222,6 +269,46 @@ function cursorRuleStep(input) {
222
269
  write: { path: CURSOR_RULE_PATH, content: cursorRuleFile() },
223
270
  };
224
271
  }
272
+ /**
273
+ * Every coding agent `reticle init` knows how to wire itself into, and the three surfaces it wires:
274
+ * the global MCP registration, the project rule file that makes the agent USE Reticle, and the
275
+ * `/reticle` command.
276
+ *
277
+ * One list, because those three surfaces used to enumerate Claude and Cursor separately in three
278
+ * places — so supporting a fourth agent meant finding all three and getting each right. Adding one
279
+ * is now an entry here plus its builders; each builder answers null when that agent is not present
280
+ * for this user or this project, which is also how "no agent detected" falls through to the
281
+ * cross-agent AGENTS.md.
282
+ *
283
+ * Deliberately functions rather than data: registering with Claude runs its CLI while Cursor merges
284
+ * a JSON file, and pretending those are the same shape would cost more than it saves.
285
+ */
286
+ const AgentId = {
287
+ CLAUDE: 'claude',
288
+ CURSOR: 'cursor',
289
+ };
290
+ const AGENT_INTEGRATIONS = [
291
+ {
292
+ id: AgentId.CLAUDE,
293
+ mcpStep: claudeMcpStep,
294
+ ruleStep: claudeRuleStep,
295
+ commandStep: claudeCommandStep,
296
+ },
297
+ {
298
+ id: AgentId.CURSOR,
299
+ mcpStep: cursorMcpStep,
300
+ ruleStep: cursorRuleStep,
301
+ commandStep: cursorCommandStep,
302
+ },
303
+ ];
304
+ /** The steps one surface contributes across every known agent, in registry order. */
305
+ function stepsForAgents(input, surface) {
306
+ return AGENT_INTEGRATIONS.map((a) => surface(a)(input)).filter((s) => s !== null);
307
+ }
308
+ /** The `/reticle` command file for every agent that has a command surface and is present here. */
309
+ function slashCommandSteps(input) {
310
+ return stepsForAgents(input, (a) => a.commandStep);
311
+ }
225
312
  /**
226
313
  * The behavioral rule that makes the agent actually USE Reticle. Written into the detected agent's
227
314
  * instruction file (Claude / Cursor, or both), falling back to the cross-agent AGENTS.md when neither
@@ -230,7 +317,7 @@ function cursorRuleStep(input) {
230
317
  function agentRuleSteps(input) {
231
318
  if (!input.options.mcp)
232
319
  return [];
233
- const detected = [claudeRuleStep(input), cursorRuleStep(input)].filter((s) => s !== null);
320
+ const detected = stepsForAgents(input, (a) => a.ruleStep);
234
321
  if (detected.length > 0)
235
322
  return detected;
236
323
  const r = mergeMarkedInstruction(input.agentsMdContent);
@@ -261,6 +348,14 @@ function agentRuleSteps(input) {
261
348
  * with nothing naming a version. Pinning turns that into this loud failure, which is the better
262
349
  * trade — but only if the message says what to do about it.
263
350
  */
351
+ /** Said out loud when the exact-version install was refused and the unpinned one worked. */
352
+ function unpinnedRetryNote(version) {
353
+ const wanted = version === undefined ? 'the exact version' : version;
354
+ return (`the registry refused ${wanted} (pnpm's minimumReleaseAge holds new releases back), so the ` +
355
+ `newest ACCEPTED version was installed instead. That may not match the daemon — if the agent ` +
356
+ `reports protocol errors, check \`versionSkew\` in reticle_sessions, then either wait out the ` +
357
+ `window or allow these packages: pnpm config set minimumReleaseAgeExclude "@reticlehq/*"`);
358
+ }
264
359
  function installFailureHint(pm) {
265
360
  if (pm !== PackageManager.PNPM)
266
361
  return 'If the version was refused, install the SDK yourself.';
@@ -293,10 +388,16 @@ function installStep(input) {
293
388
  args: parts.args,
294
389
  fallback: `${command}\n\n${installFailureHint(pm)}`,
295
390
  },
391
+ // Unpinned. pnpm resolves the newest MATURE version there, which is how a project with a
392
+ // release-age hold gets a working install instead of no install.
393
+ retry: {
394
+ ...installCommandParts(pm, frameworkPackages(input.detection.framework)),
395
+ note: unpinnedRetryNote(input.options.sdkVersion),
396
+ },
296
397
  };
297
398
  }
298
399
  function reticleConfigStep(input) {
299
- if (input.reticleConfigExists === true) {
400
+ if (true === input.reticleConfigExists) {
300
401
  return {
301
402
  title: 'Reticle config',
302
403
  target: RETICLE_CONFIG_FILE,
@@ -348,12 +449,10 @@ export function buildPlan(input) {
348
449
  steps.push(...nextSteps(input));
349
450
  }
350
451
  else if (input.detection.framework === Framework.ASTRO) {
351
- steps.push({
352
- title: 'Connect snippet (Astro)',
353
- target: 'astro.config + layout',
354
- status: StepStatus.MANUAL,
355
- detail: astroManual(input.options.port, input.options.projectId),
356
- });
452
+ steps.push(...astroSteps(input));
453
+ }
454
+ else if (input.detection.framework === Framework.CRA) {
455
+ steps.push(...craSteps(input));
357
456
  }
358
457
  else if (input.detection.framework === Framework.SVELTEKIT) {
359
458
  steps.push(...svelteKitSteps(input));
@@ -1,16 +1,12 @@
1
1
  /**
2
- * Project-identity derivation for `reticle init` — the Next/HTML/.reticle.json side of the same scheme the
3
- * Vite plugin uses at build time. Kept algorithmically identical (slug of package.json name + 8-char
4
- * hash of the absolute root) so a Vite app's plugin-stamped projectId matches what init records.
2
+ * Project-identity for `reticle init` — the `.reticle.json` side of the scheme the Vite plugin
3
+ * stamps at build time. The RULE lives in `@reticlehq/core` (projectIdFrom) so both sides spell the
4
+ * id the same way by construction; this file supplies only the Node-only hashing it needs.
5
5
  */
6
- /** `@acme/web` → `acme-web`; non-alphanumerics collapse to single dashes; edges trimmed. */
7
- export declare function slugifyPackageName(name: string): string;
6
+ export { slugifyPackageName } from '@reticlehq/core';
8
7
  /** Short, stable hex fingerprint of the absolute project root. */
9
8
  export declare function shortHash(input: string): string;
10
- /**
11
- * Derive the stable projectId from the package name (may be undefined) and the absolute root path.
12
- * Falls back to the root folder name, then "app". Pure.
13
- */
9
+ /** Derive the stable projectId from the package name (may be undefined) and the absolute root path. */
14
10
  export declare function deriveProjectId(pkgName: string | undefined, rootPath: string): string;
15
11
  /** Pull a string `name` out of an already-parsed package.json object, or undefined. */
16
12
  export declare function packageName(pkg: unknown): string | undefined;
@@ -1,36 +1,24 @@
1
1
  /**
2
- * Project-identity derivation for `reticle init` — the Next/HTML/.reticle.json side of the same scheme the
3
- * Vite plugin uses at build time. Kept algorithmically identical (slug of package.json name + 8-char
4
- * hash of the absolute root) so a Vite app's plugin-stamped projectId matches what init records.
2
+ * Project-identity for `reticle init` — the `.reticle.json` side of the scheme the Vite plugin
3
+ * stamps at build time. The RULE lives in `@reticlehq/core` (projectIdFrom) so both sides spell the
4
+ * id the same way by construction; this file supplies only the Node-only hashing it needs.
5
5
  */
6
6
  import { createHash } from 'node:crypto';
7
- import { basename } from 'node:path';
8
- /** `@acme/web` → `acme-web`; non-alphanumerics collapse to single dashes; edges trimmed. */
9
- export function slugifyPackageName(name) {
10
- return name
11
- .toLowerCase()
12
- .replace(/^@/, '')
13
- .replace(/[^a-z0-9]+/g, '-')
14
- .replace(/^-+|-+$/g, '');
15
- }
7
+ import { PROJECT_ID_HASH_LENGTH, projectIdFrom } from '@reticlehq/core';
8
+ export { slugifyPackageName } from '@reticlehq/core';
16
9
  /** Short, stable hex fingerprint of the absolute project root. */
17
10
  export function shortHash(input) {
18
- return createHash('sha1').update(input).digest('hex').slice(0, 8);
11
+ return createHash('sha1').update(input).digest('hex').slice(0, PROJECT_ID_HASH_LENGTH);
19
12
  }
20
- /**
21
- * Derive the stable projectId from the package name (may be undefined) and the absolute root path.
22
- * Falls back to the root folder name, then "app". Pure.
23
- */
13
+ /** Derive the stable projectId from the package name (may be undefined) and the absolute root path. */
24
14
  export function deriveProjectId(pkgName, rootPath) {
25
- const fromName = pkgName !== undefined ? slugifyPackageName(pkgName) : '';
26
- const base = fromName.length > 0 ? fromName : slugifyPackageName(basename(rootPath)) || 'app';
27
- return `${base}-${shortHash(rootPath)}`;
15
+ return projectIdFrom(pkgName, rootPath, shortHash);
28
16
  }
29
17
  /** Pull a string `name` out of an already-parsed package.json object, or undefined. */
30
18
  export function packageName(pkg) {
31
- if (typeof pkg === 'object' && pkg !== null) {
19
+ if ('object' === typeof pkg && pkg !== null) {
32
20
  const name = pkg['name'];
33
- if (typeof name === 'string' && name.length > 0)
21
+ if ('string' === typeof name && name.length > 0)
34
22
  return name;
35
23
  }
36
24
  return undefined;
@@ -15,6 +15,11 @@ export interface InitOptions {
15
15
  mcp: boolean;
16
16
  dryRun: boolean;
17
17
  install: boolean;
18
+ /**
19
+ * Which app in a monorepo to wire, when several are found. Without it `init` refuses to guess, and
20
+ * "re-run inside the one you want" is not an instruction a script or an agent can follow.
21
+ */
22
+ app?: string;
18
23
  /** Set on the recursive call after a workspace redirect, so the search happens at most once. */
19
24
  redirected?: boolean;
20
25
  }