@reticlehq/server 2.4.0 → 2.6.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 (472) hide show
  1. package/SKILL.md +719 -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} +13 -1
  7. package/dist/{bridge.js → bridge/bridge.js} +95 -15
  8. package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +9 -11
  9. package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +18 -10
  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/cli-doctor.d.ts +1 -0
  20. package/dist/cli/cli-doctor.js +135 -0
  21. package/dist/{cli-flow-commands.d.ts → cli/cli-flow-commands.d.ts} +2 -2
  22. package/dist/{cli-flow-commands.js → cli/cli-flow-commands.js} +15 -15
  23. package/dist/{cli-launch.d.ts → cli/cli-launch.d.ts} +32 -3
  24. package/dist/cli/cli-launch.js +171 -0
  25. package/dist/cli/cli-parse-feedback.d.ts +31 -0
  26. package/dist/cli/cli-parse-feedback.js +56 -0
  27. package/dist/{cli-parse.d.ts → cli/cli-parse.d.ts} +6 -19
  28. package/dist/{cli-parse.js → cli/cli-parse.js} +118 -81
  29. package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +12 -0
  30. package/dist/{cli-port.js → cli/cli-port.js} +9 -9
  31. package/dist/cli/cli-update-commands.d.ts +4 -0
  32. package/dist/cli/cli-update-commands.js +93 -0
  33. package/dist/{cli-verify.js → cli/cli-verify.js} +14 -14
  34. package/dist/{cloud-cli.js → cli/cloud-cli.js} +29 -24
  35. package/dist/cli/doctor-daemon-line.d.ts +37 -0
  36. package/dist/cli/doctor-daemon-line.js +35 -0
  37. package/dist/cli/port-holder.d.ts +43 -0
  38. package/dist/cli/port-holder.js +99 -0
  39. package/dist/cli.d.ts +2 -2
  40. package/dist/cli.js +302 -100
  41. package/dist/cloud/cloud-config.d.ts +0 -1
  42. package/dist/cloud/cloud-config.js +9 -9
  43. package/dist/cloud/cloud-sync.d.ts +1 -7
  44. package/dist/cloud/cloud-sync.js +12 -12
  45. package/dist/crawl/crawl-empty.d.ts +16 -0
  46. package/dist/crawl/crawl-empty.js +24 -0
  47. package/dist/crawl/crawl-tools.js +4 -1
  48. package/dist/crawl/crawl.js +26 -7
  49. package/dist/daemon/daemon-resilience.d.ts +73 -0
  50. package/dist/daemon/daemon-resilience.js +279 -0
  51. package/dist/daemon/daemon-usefulness.d.ts +61 -0
  52. package/dist/daemon/daemon-usefulness.js +62 -0
  53. package/dist/{daemon.d.ts → daemon/daemon.d.ts} +33 -8
  54. package/dist/{daemon.js → daemon/daemon.js} +105 -48
  55. package/dist/daemon/heartbeat.d.ts +115 -0
  56. package/dist/daemon/heartbeat.js +141 -0
  57. package/dist/daemon/idle-grace.d.ts +32 -0
  58. package/dist/daemon/idle-grace.js +41 -0
  59. package/dist/{idle-shutdown.d.ts → daemon/idle-shutdown.d.ts} +23 -2
  60. package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +37 -6
  61. package/dist/daemon/port-presence.d.ts +76 -0
  62. package/dist/daemon/port-presence.js +93 -0
  63. package/dist/daemon/state-dir.d.ts +7 -0
  64. package/dist/daemon/state-dir.js +59 -0
  65. package/dist/daemon/unclean-predecessor.d.ts +23 -0
  66. package/dist/daemon/unclean-predecessor.js +27 -0
  67. package/dist/domain/domain-model.js +2 -2
  68. package/dist/events/body-failures.js +8 -8
  69. package/dist/events/contradictions.d.ts +1 -1
  70. package/dist/events/contradictions.js +60 -10
  71. package/dist/events/echo-mismatch.js +10 -10
  72. package/dist/events/event-filters.js +6 -6
  73. package/dist/events/json-salvage.d.ts +2 -1
  74. package/dist/events/json-salvage.js +6 -6
  75. package/dist/events/observed-in-window.d.ts +12 -0
  76. package/dist/events/observed-in-window.js +21 -0
  77. package/dist/events/predicate-eval.d.ts +53 -20
  78. package/dist/events/predicate-eval.js +179 -55
  79. package/dist/events/predicate-parse.d.ts +23 -0
  80. package/dist/events/predicate-parse.js +54 -0
  81. package/dist/events/predicate.d.ts +7 -2
  82. package/dist/events/predicate.js +126 -35
  83. package/dist/events/reconcile.js +5 -5
  84. package/dist/events/ring-buffer.js +2 -17
  85. package/dist/events/stale-response.js +6 -6
  86. package/dist/events/testid-near-miss.d.ts +22 -0
  87. package/dist/events/testid-near-miss.js +33 -0
  88. package/dist/events/unit-mismatch.js +8 -8
  89. package/dist/flows/affected-tools.js +19 -4
  90. package/dist/flows/affected.js +1 -1
  91. package/dist/flows/annotate-target.d.ts +1 -0
  92. package/dist/flows/annotate-target.js +20 -0
  93. package/dist/flows/annotate-tools.js +25 -3
  94. package/dist/flows/annotate.js +17 -4
  95. package/dist/flows/assertion-integrity.d.ts +2 -1
  96. package/dist/flows/assertion-tiers-store.d.ts +3 -66
  97. package/dist/flows/assertion-tiers-store.js +2 -2
  98. package/dist/flows/attributed-failure.d.ts +17 -0
  99. package/dist/flows/attributed-failure.js +20 -0
  100. package/dist/flows/buddy-status.d.ts +2 -1
  101. package/dist/flows/buddy-status.js +2 -2
  102. package/dist/flows/coverage.d.ts +3 -2
  103. package/dist/flows/coverage.js +2 -2
  104. package/dist/flows/decision.js +24 -9
  105. package/dist/flows/empty-flow.d.ts +6 -0
  106. package/dist/flows/empty-flow.js +24 -0
  107. package/dist/flows/flake-store.d.ts +0 -1
  108. package/dist/flows/flake-store.js +1 -1
  109. package/dist/flows/flake.d.ts +2 -1
  110. package/dist/flows/flake.js +2 -2
  111. package/dist/flows/flow-classify.js +12 -0
  112. package/dist/flows/flow-replay-run.js +4 -4
  113. package/dist/flows/flow-replay.d.ts +6 -8
  114. package/dist/flows/flow-replay.js +132 -48
  115. package/dist/flows/flow-report.js +1 -1
  116. package/dist/flows/flow-scope.d.ts +1 -6
  117. package/dist/flows/flow-step-runners.d.ts +26 -6
  118. package/dist/flows/flow-step-runners.js +156 -6
  119. package/dist/flows/flow-success.js +20 -15
  120. package/dist/flows/flow-tools.js +63 -21
  121. package/dist/flows/flows.js +15 -11
  122. package/dist/flows/gate.d.ts +4 -3
  123. package/dist/flows/gate.js +1 -1
  124. package/dist/flows/heal-run.d.ts +0 -8
  125. package/dist/flows/heal-run.js +5 -5
  126. package/dist/flows/heal.js +3 -3
  127. package/dist/flows/predicate-to-expect.d.ts +38 -0
  128. package/dist/flows/predicate-to-expect.js +95 -0
  129. package/dist/flows/replay.d.ts +16 -1
  130. package/dist/flows/replay.js +58 -22
  131. package/dist/flows/role-anchor-nearest.d.ts +6 -0
  132. package/dist/flows/role-anchor-nearest.js +45 -0
  133. package/dist/flows/role-drift-reason.d.ts +20 -0
  134. package/dist/flows/role-drift-reason.js +39 -0
  135. package/dist/flows/server-verify.d.ts +1 -1
  136. package/dist/flows/server-verify.js +5 -5
  137. package/dist/flows/suite-flakes.d.ts +33 -0
  138. package/dist/flows/suite-flakes.js +32 -0
  139. package/dist/flows/verify-change-tools.js +32 -10
  140. package/dist/flows/verify-change-verdict.d.ts +15 -0
  141. package/dist/flows/verify-change-verdict.js +25 -0
  142. package/dist/flows/watch-batcher.d.ts +3 -2
  143. package/dist/honesty/already-true.d.ts +2 -0
  144. package/dist/honesty/already-true.js +31 -0
  145. package/dist/honesty/blind-spots.d.ts +35 -3
  146. package/dist/honesty/blind-spots.js +57 -12
  147. package/dist/honesty/honesty.d.ts +3 -2
  148. package/dist/honesty/honesty.js +4 -4
  149. package/dist/honesty/uncaptured-bodies.js +1 -1
  150. package/dist/honesty/unread-outcome.js +2 -2
  151. package/dist/honesty/verified.d.ts +31 -3
  152. package/dist/honesty/verified.js +64 -8
  153. package/dist/http-server.js +23 -7
  154. package/dist/hunt/hunt-report.d.ts +2 -1
  155. package/dist/hunt/hunt-report.js +2 -2
  156. package/dist/index.d.ts +9 -6
  157. package/dist/index.js +41 -25
  158. package/dist/init/agent-rules.d.ts +20 -1
  159. package/dist/init/agent-rules.js +64 -8
  160. package/dist/init/app-choice.d.ts +20 -0
  161. package/dist/init/app-choice.js +25 -0
  162. package/dist/init/astro-host.d.ts +21 -0
  163. package/dist/init/astro-host.js +27 -0
  164. package/dist/init/astro-patch.d.ts +16 -0
  165. package/dist/init/astro-patch.js +240 -0
  166. package/dist/init/capabilities.js +4 -1
  167. package/dist/init/cra.d.ts +50 -0
  168. package/dist/init/cra.js +106 -0
  169. package/dist/init/cursor.js +39 -4
  170. package/dist/init/desktop-doctor.d.ts +3 -2
  171. package/dist/init/desktop-doctor.js +4 -4
  172. package/dist/init/detect.d.ts +9 -2
  173. package/dist/init/detect.js +24 -5
  174. package/dist/init/mcp-clients.d.ts +81 -0
  175. package/dist/init/mcp-clients.js +248 -0
  176. package/dist/init/mcp-registered.d.ts +12 -0
  177. package/dist/init/mcp-registered.js +14 -0
  178. package/dist/init/mcp.d.ts +27 -2
  179. package/dist/init/mcp.js +40 -4
  180. package/dist/init/next-patch.d.ts +2 -4
  181. package/dist/init/next-patch.js +109 -19
  182. package/dist/init/node-io.js +29 -6
  183. package/dist/init/plan-framework.d.ts +16 -1
  184. package/dist/init/plan-framework.js +166 -8
  185. package/dist/init/plan.d.ts +85 -6
  186. package/dist/init/plan.js +196 -33
  187. package/dist/init/project-id.d.ts +5 -9
  188. package/dist/init/project-id.js +10 -22
  189. package/dist/init/run.d.ts +23 -1
  190. package/dist/init/run.js +338 -47
  191. package/dist/init/slash-command.d.ts +9 -0
  192. package/dist/init/slash-command.js +10 -1
  193. package/dist/init/snippets.d.ts +7 -10
  194. package/dist/init/snippets.js +44 -15
  195. package/dist/init/vite-config.js +1 -1
  196. package/dist/init/windows-quote.d.ts +38 -0
  197. package/dist/init/windows-quote.js +70 -0
  198. package/dist/init/workspace-apps.d.ts +23 -0
  199. package/dist/init/workspace-apps.js +68 -0
  200. package/dist/input/driven-redaction.js +1 -1
  201. package/dist/input/network-detail.js +8 -8
  202. package/dist/input/network-mock-tools.js +2 -2
  203. package/dist/input/network-mock.js +4 -4
  204. package/dist/input/real-input.js +8 -3
  205. package/dist/input/scroll-find.js +2 -2
  206. package/dist/input/scroll-tools.d.ts +0 -5
  207. package/dist/input/scroll-tools.js +11 -4
  208. package/dist/input/viewport-tools.js +2 -2
  209. package/dist/journal/ambient-store.d.ts +0 -2
  210. package/dist/journal/ambient-store.js +1 -1
  211. package/dist/journal/ambient.js +1 -1
  212. package/dist/journal/attach-journal.d.ts +2 -1
  213. package/dist/journal/deviation-report.js +6 -6
  214. package/dist/journal/deviation-service.js +1 -1
  215. package/dist/journal/envelope-store.d.ts +0 -2
  216. package/dist/journal/envelope-store.js +1 -1
  217. package/dist/journal/envelope.d.ts +2 -3
  218. package/dist/journal/envelope.js +3 -3
  219. package/dist/journal/journal-query.js +1 -1
  220. package/dist/journal/journal-recorder.d.ts +2 -1
  221. package/dist/journal/journal-recorder.js +2 -2
  222. package/dist/journal/rollups.js +9 -9
  223. package/dist/journal/session-end.d.ts +2 -1
  224. package/dist/journal/session-journal.js +4 -4
  225. package/dist/license/license.d.ts +0 -14
  226. package/dist/license/license.js +8 -8
  227. package/dist/log.d.ts +10 -0
  228. package/dist/log.js +11 -1
  229. package/dist/mcp/mcp-is-error.d.ts +13 -0
  230. package/dist/mcp/mcp-is-error.js +18 -0
  231. package/dist/mcp/mcp-outage.d.ts +32 -0
  232. package/dist/mcp/mcp-outage.js +55 -0
  233. package/dist/mcp/mcp-proxy.d.ts +134 -0
  234. package/dist/mcp/mcp-proxy.js +720 -0
  235. package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
  236. package/dist/{mcp.js → mcp/mcp.js} +139 -37
  237. package/dist/mcp/proxy-handshake.d.ts +3 -0
  238. package/dist/mcp/proxy-handshake.js +54 -0
  239. package/dist/mcp/proxy-lifecycle.d.ts +64 -0
  240. package/dist/mcp/proxy-lifecycle.js +70 -0
  241. package/dist/mcp/tool-catalog-cache.d.ts +29 -0
  242. package/dist/mcp/tool-catalog-cache.js +55 -0
  243. package/dist/oracles/propose-consequences.d.ts +2 -1
  244. package/dist/oracles/propose-consequences.js +16 -11
  245. package/dist/oracles/self-instrument.d.ts +2 -1
  246. package/dist/oracles/self-instrument.js +1 -1
  247. package/dist/phenomena/phenomena.js +3 -3
  248. package/dist/platform.d.ts +16 -0
  249. package/dist/platform.js +16 -0
  250. package/dist/pool/browser-pool.d.ts +9 -0
  251. package/dist/pool/browser-pool.js +38 -9
  252. package/dist/pool/playwright-launcher.d.ts +15 -2
  253. package/dist/pool/playwright-launcher.js +21 -2
  254. package/dist/project/fs-port.js +1 -1
  255. package/dist/project/project-tools.js +2 -2
  256. package/dist/runs/build-verification-run.js +1 -1
  257. package/dist/runs/repair-prompt.d.ts +0 -6
  258. package/dist/runs/repair-prompt.js +3 -3
  259. package/dist/runs/risk-classify.js +1 -1
  260. package/dist/runs/run-diff.d.ts +0 -2
  261. package/dist/runs/run-diff.js +3 -3
  262. package/dist/runs/run-tools.js +2 -2
  263. package/dist/runs/verification-sync.js +2 -2
  264. package/dist/runs/verify-http.js +1 -1
  265. package/dist/runs/verify-server.js +1 -1
  266. package/dist/session/attachment-history.d.ts +46 -0
  267. package/dist/session/attachment-history.js +65 -0
  268. package/dist/session/command-timeout.d.ts +11 -3
  269. package/dist/session/command-timeout.js +2 -2
  270. package/dist/session/control-envelope.d.ts +6 -0
  271. package/dist/session/control-envelope.js +7 -1
  272. package/dist/session/dev-server-probe.d.ts +13 -0
  273. package/dist/session/dev-server-probe.js +52 -0
  274. package/dist/session/last-act.d.ts +17 -3
  275. package/dist/session/last-act.js +16 -4
  276. package/dist/session/live-control-tools.js +7 -2
  277. package/dist/session/live-control.js +1 -1
  278. package/dist/session/looks-like-dev-server.d.ts +14 -0
  279. package/dist/session/looks-like-dev-server.js +25 -0
  280. package/dist/session/no-session-diagnosis.d.ts +45 -0
  281. package/dist/session/no-session-diagnosis.js +120 -0
  282. package/dist/session/no-session-watch.d.ts +21 -0
  283. package/dist/session/no-session-watch.js +69 -0
  284. package/dist/session/observed-state.d.ts +4 -0
  285. package/dist/session/observed-state.js +19 -1
  286. package/dist/session/output-budget.js +1 -1
  287. package/dist/session/pending-commands.js +1 -0
  288. package/dist/session/session-health.d.ts +8 -1
  289. package/dist/session/session-health.js +8 -7
  290. package/dist/session/session-info.d.ts +43 -8
  291. package/dist/session/session-info.js +46 -1
  292. package/dist/session/session-lease.d.ts +0 -11
  293. package/dist/session/session-lease.js +1 -1
  294. package/dist/session/session-manager.d.ts +6 -0
  295. package/dist/session/session-manager.js +124 -12
  296. package/dist/session/session-readiness.d.ts +1 -1
  297. package/dist/session/session-readiness.js +6 -1
  298. package/dist/session/session-reaper.js +1 -1
  299. package/dist/session/session-reconnect.d.ts +32 -0
  300. package/dist/session/session-reconnect.js +42 -0
  301. package/dist/session/session.d.ts +15 -2
  302. package/dist/session/session.js +77 -26
  303. package/dist/session/state-select.d.ts +1 -1
  304. package/dist/session/state-select.js +1 -1
  305. package/dist/status-payload.d.ts +19 -0
  306. package/dist/status-payload.js +11 -0
  307. package/dist/telemetry/argument-shape.js +10 -1
  308. package/dist/telemetry/browser-mode.d.ts +27 -0
  309. package/dist/telemetry/browser-mode.js +33 -0
  310. package/dist/telemetry/bug-found.d.ts +17 -21
  311. package/dist/telemetry/bug-found.js +120 -8
  312. package/dist/telemetry/cli-telemetry.d.ts +2 -12
  313. package/dist/telemetry/cli-telemetry.js +27 -4
  314. package/dist/telemetry/crash-cause.d.ts +47 -0
  315. package/dist/telemetry/crash-cause.js +104 -0
  316. package/dist/telemetry/daemon-telemetry.d.ts +38 -1
  317. package/dist/telemetry/daemon-telemetry.js +37 -12
  318. package/dist/telemetry/dev-repo.js +4 -4
  319. package/dist/telemetry/error-class.d.ts +26 -0
  320. package/dist/telemetry/error-class.js +52 -0
  321. package/dist/telemetry/error-fingerprint.js +21 -2
  322. package/dist/telemetry/feedback-cli.d.ts +8 -3
  323. package/dist/telemetry/feedback-cli.js +52 -8
  324. package/dist/telemetry/feedback-context.d.ts +23 -6
  325. package/dist/telemetry/feedback-context.js +105 -5
  326. package/dist/telemetry/feedback-delivery.d.ts +20 -0
  327. package/dist/telemetry/feedback-delivery.js +30 -0
  328. package/dist/telemetry/feedback-outbox.d.ts +22 -0
  329. package/dist/telemetry/feedback-outbox.js +87 -0
  330. package/dist/telemetry/feedback.d.ts +22 -1
  331. package/dist/telemetry/feedback.js +67 -8
  332. package/dist/telemetry/git-facts.d.ts +7 -0
  333. package/dist/telemetry/git-facts.js +5 -5
  334. package/dist/telemetry/project-profile.js +2 -1
  335. package/dist/telemetry/session-metrics.d.ts +47 -3
  336. package/dist/telemetry/session-metrics.js +315 -15
  337. package/dist/telemetry/telemetry.d.ts +45 -2
  338. package/dist/telemetry/telemetry.js +150 -37
  339. package/dist/telemetry/verification-of.d.ts +22 -0
  340. package/dist/telemetry/verification-of.js +84 -0
  341. package/dist/tools/act-capsule.js +2 -2
  342. package/dist/tools/act-danger.d.ts +12 -0
  343. package/dist/tools/act-danger.js +20 -3
  344. package/dist/tools/act-helpers.js +4 -4
  345. package/dist/tools/act-tools.d.ts +0 -8
  346. package/dist/tools/act-tools.js +114 -118
  347. package/dist/tools/act-view.js +7 -7
  348. package/dist/tools/alias-args.d.ts +17 -0
  349. package/dist/tools/alias-args.js +25 -0
  350. package/dist/tools/assert-grade.js +9 -9
  351. package/dist/tools/assert-verdict.d.ts +9 -1
  352. package/dist/tools/assert-verdict.js +21 -6
  353. package/dist/tools/browser-tools.js +36 -11
  354. package/dist/tools/contract-tools.d.ts +0 -5
  355. package/dist/tools/contract-tools.js +27 -1
  356. package/dist/tools/coverage-identity.d.ts +34 -0
  357. package/dist/tools/coverage-identity.js +46 -0
  358. package/dist/tools/coverage-tools.js +10 -14
  359. package/dist/tools/dynamic-tools.d.ts +2 -1
  360. package/dist/tools/dynamic-tools.js +96 -19
  361. package/dist/tools/error-recovery.d.ts +34 -2
  362. package/dist/tools/error-recovery.js +255 -4
  363. package/dist/tools/feedback-invite.d.ts +48 -0
  364. package/dist/tools/feedback-invite.js +71 -0
  365. package/dist/tools/feedback-tools.d.ts +12 -1
  366. package/dist/tools/feedback-tools.js +28 -5
  367. package/dist/tools/invoke-tool.d.ts +0 -12
  368. package/dist/tools/invoke-tool.js +126 -33
  369. package/dist/tools/lease-hint.d.ts +17 -0
  370. package/dist/tools/lease-hint.js +24 -0
  371. package/dist/tools/lease-tools.js +6 -5
  372. package/dist/tools/merge-tools.d.ts +10 -1
  373. package/dist/tools/merge-tools.js +9 -3
  374. package/dist/tools/merged-name-redirect.d.ts +13 -0
  375. package/dist/tools/merged-name-redirect.js +55 -0
  376. package/dist/tools/navigate-arrival.d.ts +26 -0
  377. package/dist/tools/navigate-arrival.js +60 -0
  378. package/dist/tools/navigate-result.d.ts +31 -0
  379. package/dist/tools/navigate-result.js +38 -0
  380. package/dist/tools/observe-tools.js +72 -20
  381. package/dist/tools/observed-nothing.d.ts +25 -0
  382. package/dist/tools/observed-nothing.js +33 -0
  383. package/dist/tools/query-paginate.js +2 -2
  384. package/dist/tools/query-shape.d.ts +18 -0
  385. package/dist/tools/query-shape.js +39 -0
  386. package/dist/tools/read-tools.js +81 -20
  387. package/dist/tools/real-input-attempt.d.ts +28 -0
  388. package/dist/tools/real-input-attempt.js +93 -0
  389. package/dist/tools/reconcile-tools.js +7 -7
  390. package/dist/tools/reload-result.d.ts +14 -0
  391. package/dist/tools/reload-result.js +29 -0
  392. package/dist/tools/snapshot-delta.d.ts +4 -5
  393. package/dist/tools/snapshot-delta.js +0 -0
  394. package/dist/tools/tool-kit.d.ts +16 -0
  395. package/dist/tools/tool-surface.d.ts +83 -0
  396. package/dist/tools/tool-surface.js +217 -0
  397. package/dist/tools/tools-helpers.js +6 -6
  398. package/dist/tools/tools.d.ts +15 -0
  399. package/dist/tools/tools.js +53 -17
  400. package/dist/tools/unadvertised-help.d.ts +5 -0
  401. package/dist/tools/unadvertised-help.js +39 -0
  402. package/dist/trace.d.ts +69 -0
  403. package/dist/trace.js +150 -0
  404. package/dist/update/nudge-credit.d.ts +4 -0
  405. package/dist/update/nudge-credit.js +53 -0
  406. package/dist/update/sdk-sync.d.ts +21 -0
  407. package/dist/update/sdk-sync.js +42 -0
  408. package/dist/update/update-checker.js +3 -3
  409. package/dist/update/update-nudge.d.ts +63 -6
  410. package/dist/update/update-nudge.js +128 -15
  411. package/dist/update/updater.d.ts +1 -9
  412. package/dist/update/updater.js +13 -8
  413. package/dist/version/peer-announce.d.ts +4 -0
  414. package/dist/version/peer-announce.js +30 -0
  415. package/dist/{server-version.js → version/server-version.js} +5 -1
  416. package/dist/version/version-nudge.d.ts +28 -0
  417. package/dist/version/version-nudge.js +40 -0
  418. package/dist/version/version-skew.d.ts +66 -0
  419. package/dist/version/version-skew.js +71 -0
  420. package/dist/visual/visual-diff.js +2 -2
  421. package/dist/visual/visual-tools.js +4 -4
  422. package/docs/README.md +55 -0
  423. package/docs/agent-cheatsheet.md +85 -0
  424. package/docs/architecture.md +113 -0
  425. package/docs/benchmarks.md +255 -0
  426. package/docs/debugging.md +102 -0
  427. package/docs/deploy-checks.md +69 -0
  428. package/docs/desktop-apps.md +256 -0
  429. package/docs/enterprise.md +62 -0
  430. package/docs/fixtures-dispatch-receiver.yml +76 -0
  431. package/docs/fixtures.md +45 -0
  432. package/docs/flows.md +166 -0
  433. package/docs/gate-plan.md +98 -0
  434. package/docs/gates.md +117 -0
  435. package/docs/getting-started.md +469 -0
  436. package/docs/human-control.md +63 -0
  437. package/docs/integration-patterns.md +171 -0
  438. package/docs/local-registry.md +126 -0
  439. package/docs/matrix/2.5.0/claude-code-machine.json +19 -0
  440. package/docs/matrix/2.5.0/codex-machine.json +20 -0
  441. package/docs/matrix/2.5.0/cursor-machine.json +22 -0
  442. package/docs/matrix/2.5.0/gemini-machine.json +22 -0
  443. package/docs/matrix/2.5.0/opencode-machine.json +22 -0
  444. package/docs/matrix/2.5.0/vscode-machine.json +22 -0
  445. package/docs/matrix/2.5.0/windsurf-machine.json +22 -0
  446. package/docs/matrix/MATRIX.md +26 -0
  447. package/docs/matrix/README.md +59 -0
  448. package/docs/mint.json +61 -0
  449. package/docs/multi-agent-testing.md +55 -0
  450. package/docs/platform-integration.md +122 -0
  451. package/docs/system-map.md +152 -0
  452. package/docs/telemetry-contract.md +214 -0
  453. package/docs/telemetry.md +191 -0
  454. package/docs/testing.md +82 -0
  455. package/docs/token-efficiency.md +80 -0
  456. package/docs/usage.md +1046 -0
  457. package/package.json +8 -5
  458. package/dist/cli-doctor.d.ts +0 -6
  459. package/dist/cli-doctor.js +0 -60
  460. package/dist/cli-launch.js +0 -112
  461. package/dist/daemon-resilience.d.ts +0 -22
  462. package/dist/daemon-resilience.js +0 -85
  463. package/dist/mcp-proxy.d.ts +0 -67
  464. package/dist/mcp-proxy.js +0 -337
  465. package/dist/tools/profiles.d.ts +0 -37
  466. package/dist/tools/profiles.js +0 -139
  467. /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
  468. /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
  469. /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
  470. /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
  471. /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
  472. /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
@@ -4,9 +4,33 @@
4
4
  * command, not the MCP stdio transport.
5
5
  */
6
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';
7
+ import { NodePlatform } from '../platform.js';
7
8
  import { join, dirname, isAbsolute } from 'node:path';
8
9
  import { homedir } from 'node:os';
9
10
  import { spawnSync } from 'node:child_process';
11
+ import { windowsShellArg } from './windows-quote.js';
12
+ /**
13
+ * `shell: true` ONLY where it earns its keep.
14
+ *
15
+ * It exists so package-manager shims (`pnpm.cmd`, `npx.cmd`) resolve on Windows. On POSIX it buys
16
+ * nothing and costs correctness: under a shell, arguments are re-parsed, so a path containing a
17
+ * space — `/Users/ada/My Projects/app` — silently becomes two arguments and registration fails with
18
+ * no error anyone can read.
19
+ */
20
+ function shellOpt() {
21
+ return NodePlatform.WINDOWS === process.platform ? { shell: true } : {};
22
+ }
23
+ /**
24
+ * Under a shell, quote what the shell would otherwise split or interpret. Windows only, where
25
+ * `shell: true` is required (see shellOpt). The rule itself lives in windows-quote.ts as a pure
26
+ * function so it can be tested on every platform — keeping it inside this branch is why it was
27
+ * wrong for as long as it was.
28
+ */
29
+ function shellSafe(args) {
30
+ if (process.platform !== NodePlatform.WINDOWS)
31
+ return [...args];
32
+ return args.map(windowsShellArg);
33
+ }
10
34
  export function buildNodeIo(cwd) {
11
35
  // Project-relative by default; absolute paths (e.g. ~/.cursor/mcp.json) pass through unchanged.
12
36
  const abs = (rel) => (isAbsolute(rel) ? rel : join(cwd, rel));
@@ -64,15 +88,14 @@ export function buildNodeIo(cwd) {
64
88
  return buildNodeIo(abs(rel));
65
89
  },
66
90
  exec(command, args) {
67
- // `shell: true` lets package-manager shims (pnpm.cmd, etc.) resolve on Windows; inherit
68
- // stdio so the install's own progress is visible to the user.
69
- const result = spawnSync(command, [...args], { cwd, stdio: 'inherit', shell: true });
70
- return result.status === 0;
91
+ // Inherit stdio so the install's own progress is visible to the user.
92
+ const result = spawnSync(command, shellSafe(args), { cwd, stdio: 'inherit', ...shellOpt() });
93
+ return 0 === result.status;
71
94
  },
72
95
  probe(command, args) {
73
96
  // Quiet yes/no check (CLI availability, existing registration). Never throws.
74
- const result = spawnSync(command, [...args], { cwd, stdio: 'ignore', shell: true });
75
- return result.status === 0;
97
+ const result = spawnSync(command, shellSafe(args), { cwd, stdio: 'ignore', ...shellOpt() });
98
+ return 0 === result.status;
76
99
  },
77
100
  print(line) {
78
101
  process.stdout.write(`${line}\n`);
@@ -16,7 +16,6 @@ export declare const VITE_PLUGIN_DETAIL: {
16
16
  */
17
17
  readonly SVELTEKIT: "add reticle() to plugins (stamps data-reticle-source in .svelte components)";
18
18
  };
19
- export declare const CAPABILITIES_TITLE = "Capabilities + store";
20
19
  export declare function viteSteps(input: PlanInput, detail?: string): Step[];
21
20
  /**
22
21
  * Next used to be the ONLY stack with hand edits left over — and both of them fail silently when
@@ -32,4 +31,20 @@ export declare function nextSteps(input: PlanInput): Step[];
32
31
  * wiring is real and may well work; what is missing is anything that would tell us when it stops.
33
32
  * Silently emitting it reads as a support claim, which is the thing this project exists to not do.
34
33
  */
34
+ /**
35
+ * Create React App: the connect goes in `src/index.tsx`, the token in `.env.development.local`.
36
+ *
37
+ * The previous plan pointed at `index.html`, which cannot work — CRA's is a static template the
38
+ * bundler never processes for modules. Reported from a real cra-redux-saga app.
39
+ */
40
+ export declare function craSteps(input: PlanInput): Step[];
35
41
  export declare function svelteKitSteps(input: PlanInput): Step[];
42
+ /**
43
+ * Astro: the config define + build target, and the connect script in ONE layout.
44
+ *
45
+ * Astro was the last gated stack left printing a recipe it did not apply. It still falls back to the
46
+ * printed one whenever the choice is not obvious — no config, no single layout, or a shape the
47
+ * patchers do not fully recognise — because which page or layout to instrument is a real decision
48
+ * and a half-edited build config is worse than a documented manual step.
49
+ */
50
+ export declare function astroSteps(input: PlanInput): Step[];
@@ -5,8 +5,10 @@
5
5
  */
6
6
  import { patchViteConfig, VitePatchKind } from './vite-config.js';
7
7
  import { patchNextConfig, patchRootLayout, patchPagesApp } from './next-patch.js';
8
+ import { patchAstroConfig, patchAstroLayout } from './astro-patch.js';
9
+ import { CRA_DEV_MODULE_IMPORT, CRA_DEV_MODULE_PATH, CRA_ENV_PATH, CRA_TOKEN_PER_MACHINE_NOTICE, TOKEN_VAR, craDevModuleFile, craEnvPatch, craImportPatch, } from './cra.js';
8
10
  import { PatchKind } from './patch-kind.js';
9
- import { viteManual, NEXT_LAYOUT_MANUAL, NEXT_LAYOUT_PATH, viteDevModuleFile, VITE_DEV_MODULE_PATH, nextReticleDevFile, NEXT_RETICLE_DEV_PATH, nextConfigManual, svelteKitHooksFile, SVELTEKIT_HOOKS_PATH, UNVERIFIED_FRAMEWORK_NOTE, } from './snippets.js';
11
+ import { viteManual, NEXT_LAYOUT_MANUAL, NEXT_LAYOUT_PATH, viteDevModuleFile, VITE_DEV_MODULE_PATH, nextReticleDevFile, NEXT_RETICLE_DEV_PATH, nextConfigManual, svelteKitHooksFile, SVELTEKIT_HOOKS_PATH, UNVERIFIED_FRAMEWORK_NOTE, astroManual, } from './snippets.js';
10
12
  import { StepStatus } from './plan.js';
11
13
  /** What adding `reticle()` to a Vite config buys, which differs by framework. */
12
14
  export const VITE_PLUGIN_DETAIL = {
@@ -20,7 +22,7 @@ export const VITE_PLUGIN_DETAIL = {
20
22
  */
21
23
  SVELTEKIT: 'add reticle() to plugins (stamps data-reticle-source in .svelte components)',
22
24
  };
23
- export const CAPABILITIES_TITLE = 'Capabilities + store';
25
+ const CAPABILITIES_TITLE = 'Capabilities + store';
24
26
  /**
25
27
  * The dev module carrying `registerCapabilities` / `registerStore`.
26
28
  *
@@ -29,7 +31,7 @@ export const CAPABILITIES_TITLE = 'Capabilities + store';
29
31
  * only when absent, because it is the one generated file a user is expected to EDIT.
30
32
  */
31
33
  function capabilitiesStep(input) {
32
- if (input.viteDevModuleExists === true) {
34
+ if (true === input.viteDevModuleExists) {
33
35
  return [
34
36
  {
35
37
  title: CAPABILITIES_TITLE,
@@ -41,7 +43,10 @@ function capabilitiesStep(input) {
41
43
  }
42
44
  const testids = input.testids ?? [];
43
45
  const stores = input.storeHints ?? [];
44
- const found = testids.length > 0 ? `${String(testids.length)} data-testid values` : 'no data-testid values yet';
46
+ const found = testids.length > 0
47
+ ? `${String(testids.length)} data-testid values`
48
+ : 'no data-testid values yet';
49
+ const nothingToRegister = 0 === testids.length && 0 === stores.length;
45
50
  return [
46
51
  {
47
52
  title: CAPABILITIES_TITLE,
@@ -51,6 +56,28 @@ function capabilitiesStep(input) {
51
56
  write: { path: VITE_DEV_MODULE_PATH, content: viteDevModuleFile(testids, stores) },
52
57
  dependsOnInstall: true,
53
58
  },
59
+ // The write is real; what it registers is not. `registerCapabilities({ testids: [], signals: [],
60
+ // stores: [] })` registers nothing, so `hasCapabilities` stays false — correctly — and the ✓
61
+ // above reads as if the feature is on. Reported as exactly that confusion: "hasCapabilities false
62
+ // on every session while init said ✓ Capabilities + store".
63
+ //
64
+ // Beside the write rather than replacing it, for two reasons: only APPLY steps are written
65
+ // (run.ts), and SKILL.md tells the reader to skip ✓ lines — so a caveat carried on the ✓ is a
66
+ // caveat nobody reads.
67
+ ...(nothingToRegister
68
+ ? [
69
+ {
70
+ title: 'Capabilities are empty until you edit that file',
71
+ target: VITE_DEV_MODULE_PATH,
72
+ status: StepStatus.NOTICE,
73
+ detail: 'the module was written but registers nothing — no data-testid values were found and ' +
74
+ 'no state library was detected, so `hasCapabilities` stays false and reticle_state ' +
75
+ 'has nothing to read. Add data-testid to the elements your main flow touches, or ' +
76
+ 'register a store in that file, and the agent gains what the app BELIEVES rather than ' +
77
+ 'only what it rendered.',
78
+ },
79
+ ]
80
+ : []),
54
81
  ];
55
82
  }
56
83
  export function viteSteps(input, detail = VITE_PLUGIN_DETAIL.VITE) {
@@ -61,7 +88,7 @@ export function viteSteps(input, detail = VITE_PLUGIN_DETAIL.VITE) {
61
88
  function viteConfigSteps(input, detail) {
62
89
  const cfg = input.viteConfig;
63
90
  const port = input.options.port;
64
- if (cfg === null) {
91
+ if (null === cfg) {
65
92
  return [
66
93
  {
67
94
  title: 'Vite plugin',
@@ -154,14 +181,14 @@ export function nextSteps(input) {
154
181
  },
155
182
  dependsOnInstall: true,
156
183
  };
157
- const configPatch = input.nextConfigSource === null || input.nextConfigSource === undefined
184
+ const configPatch = null === input.nextConfigSource || input.nextConfigSource === undefined
158
185
  ? { kind: PatchKind.MANUAL, reason: `no ${configFile} found` }
159
186
  : patchNextConfig(input.nextConfigSource);
160
187
  const layout = input.nextLayout ?? null;
161
188
  // Pages Router mounts through pages/_app, App Router through the root layout — different edits,
162
189
  // and picking by path is what stops a Pages app being handed the layout patch that cannot apply.
163
190
  const isPagesRouter = layout !== null && /(^|\/)pages\/_app\.[jt]sx?$/.test(layout.path);
164
- const layoutPatch = layout === null
191
+ const layoutPatch = null === layout
165
192
  ? { kind: PatchKind.MANUAL, reason: 'no root layout (app/layout.tsx) or pages/_app found' }
166
193
  : isPagesRouter
167
194
  ? patchPagesApp(layout.source, input.nextReticleDevImport)
@@ -180,6 +207,90 @@ export function nextSteps(input) {
180
207
  * wiring is real and may well work; what is missing is anything that would tell us when it stops.
181
208
  * Silently emitting it reads as a support claim, which is the thing this project exists to not do.
182
209
  */
210
+ /**
211
+ * Create React App: the connect goes in `src/index.tsx`, the token in `.env.development.local`.
212
+ *
213
+ * The previous plan pointed at `index.html`, which cannot work — CRA's is a static template the
214
+ * bundler never processes for modules. Reported from a real cra-redux-saga app.
215
+ */
216
+ export function craSteps(input) {
217
+ const entry = input.craEntry ?? null;
218
+ const steps = [
219
+ {
220
+ title: 'Reticle connect module',
221
+ target: CRA_DEV_MODULE_PATH,
222
+ status: StepStatus.APPLY,
223
+ detail: 'create the dev-only connect (CRA cannot inject through public/index.html)',
224
+ write: {
225
+ path: CRA_DEV_MODULE_PATH,
226
+ content: craDevModuleFile(input.options.port, input.options.projectId),
227
+ },
228
+ dependsOnInstall: true,
229
+ },
230
+ ];
231
+ const token = input.pairingToken ?? '';
232
+ const env = craEnvPatch(input.craEnv ?? null, token);
233
+ if (env !== null) {
234
+ steps.push({
235
+ title: 'Pairing token',
236
+ target: CRA_ENV_PATH,
237
+ status: StepStatus.APPLY,
238
+ // REACT_APP_* is the only thing CRA inlines into browser code; without the token the bridge
239
+ // refuses the connection and no session appears. Say the file is gitignored HERE, at the one
240
+ // moment someone is looking: the token is per-machine and cannot travel, so every teammate
241
+ // has to run init once or their clone is dead with no explanation.
242
+ detail: `set ${TOKEN_VAR} (the only channel CRA inlines) — ${CRA_ENV_PATH} is gitignored, so each teammate must run \`reticle init\` on their own machine`,
243
+ write: { path: CRA_ENV_PATH, content: env },
244
+ });
245
+ // Beside the write, not inside it. A ✓ line is one SKILL.md tells the reader to skip, and this
246
+ // is the fact that decides whether the install works for anyone but the person running it.
247
+ steps.push({
248
+ title: 'Pairing token is per-machine',
249
+ target: CRA_ENV_PATH,
250
+ status: StepStatus.NOTICE,
251
+ detail: CRA_TOKEN_PER_MACHINE_NOTICE,
252
+ });
253
+ }
254
+ else if ('' === token) {
255
+ // No daemon has ever run here, so there is no token to inline. Omitting the step entirely made
256
+ // init report all-green for an app that could never pair.
257
+ steps.push({
258
+ title: 'Pairing token',
259
+ target: CRA_ENV_PATH,
260
+ status: StepStatus.MANUAL,
261
+ // `reticle serve`, not `reticle start` — the latter is not a verb this CLI dispatches, and
262
+ // this message is read by someone whose app boots and never pairs. Handing them a command
263
+ // that errors is a second dead end on the first.
264
+ detail: `no pairing token yet — the daemon writes one on first run. Start it with \`reticle serve\` (or let your agent run \`reticle mcp\`), then \`reticle init\` again to write ${TOKEN_VAR}`,
265
+ });
266
+ }
267
+ if (null === entry) {
268
+ steps.push({
269
+ title: 'Connect snippet (CRA)',
270
+ target: 'src/index.tsx',
271
+ status: StepStatus.MANUAL,
272
+ detail: `Add \`${CRA_DEV_MODULE_IMPORT}\` to your app entry (src/index.tsx or src/index.js), after the existing imports.`,
273
+ });
274
+ return steps;
275
+ }
276
+ const patched = craImportPatch(entry.source);
277
+ steps.push(null === patched
278
+ ? {
279
+ title: 'Connect snippet (CRA)',
280
+ target: entry.path,
281
+ status: StepStatus.ALREADY,
282
+ detail: 'already imported',
283
+ }
284
+ : {
285
+ title: 'Connect snippet (CRA)',
286
+ target: entry.path,
287
+ status: StepStatus.APPLY,
288
+ detail: 'import the dev-only connect module',
289
+ write: { path: entry.path, content: patched },
290
+ dependsOnInstall: true,
291
+ });
292
+ return steps;
293
+ }
183
294
  export function svelteKitSteps(input) {
184
295
  const unverified = {
185
296
  title: 'SvelteKit is UNVERIFIED',
@@ -189,7 +300,7 @@ export function svelteKitSteps(input) {
189
300
  };
190
301
  // SvelteKit can't use the Vite-plugin injection (it renders via app.html) — wire a client hook
191
302
  // that SvelteKit runs on startup, which is the path that can register a session at all.
192
- if (input.svelteKitHooksExists === true) {
303
+ if (true === input.svelteKitHooksExists) {
193
304
  return [
194
305
  unverified,
195
306
  {
@@ -215,3 +326,50 @@ export function svelteKitSteps(input) {
215
326
  },
216
327
  ];
217
328
  }
329
+ /**
330
+ * Astro: the config define + build target, and the connect script in ONE layout.
331
+ *
332
+ * Astro was the last gated stack left printing a recipe it did not apply. It still falls back to the
333
+ * printed one whenever the choice is not obvious — no config, no single layout, or a shape the
334
+ * patchers do not fully recognise — because which page or layout to instrument is a real decision
335
+ * and a half-edited build config is worse than a documented manual step.
336
+ */
337
+ export function astroSteps(input) {
338
+ const config = input.astroConfig ?? null;
339
+ const layout = input.astroLayout ?? null;
340
+ const manual = astroManual(input.options.port, input.options.projectId, layout?.path);
341
+ if (null === config || null === layout) {
342
+ return [
343
+ {
344
+ title: 'Connect snippet (Astro)',
345
+ // Name what is actually there. `astro.config + layout` pointed at a layout this project may
346
+ // not have — reported on a fixture with only src/pages/index.astro.
347
+ target: null === layout ? 'astro.config + a page (no layout found)' : 'astro.config + layout',
348
+ status: StepStatus.MANUAL,
349
+ detail: manual,
350
+ },
351
+ ];
352
+ }
353
+ // ATOMIC. The connect snippet is useless without the config: the token is inlined by the config,
354
+ // so a layout patched on its own gives an app that dials the bridge and is refused. Measured on a
355
+ // real fixture — config ⚠, layout ✓ — which reads as one step done and one caveat when it is
356
+ // actually a guaranteed non-connection. If either half cannot be applied, BOTH go manual with the
357
+ // single recipe that does the whole job.
358
+ const manualWithLayout = astroManual(input.options.port, input.options.projectId, layout.path);
359
+ const configPatch = patchAstroConfig(config.source);
360
+ const layoutPatch = patchAstroLayout(layout.source, input.options.port, input.options.projectId);
361
+ if (configPatch.kind === PatchKind.MANUAL || layoutPatch.kind === PatchKind.MANUAL) {
362
+ return [
363
+ {
364
+ title: 'Connect snippet (Astro)',
365
+ target: `${config.path} + ${layout.path}`,
366
+ status: StepStatus.MANUAL,
367
+ detail: manualWithLayout,
368
+ },
369
+ ];
370
+ }
371
+ return [
372
+ patchStep('Astro config (token + build target)', config.path, configPatch, 'inline the pairing token and raise build.target to es2022', manualWithLayout),
373
+ patchStep('Connect snippet (Astro)', layout.path, layoutPatch, 'add the dev-only connect <script> before </body>', manualWithLayout),
374
+ ];
375
+ }
@@ -4,6 +4,7 @@
4
4
  * runner performs the `write` side-effects; this module decides *what* should happen.
5
5
  */
6
6
  import { Framework, type Detection } from './detect.js';
7
+ import { type McpClient } from './mcp-clients.js';
7
8
  /**
8
9
  * Pin the SDK to the CLI's own version.
9
10
  *
@@ -18,6 +19,8 @@ export declare function pinnedPackages(packages: readonly string[], version: str
18
19
  export declare function frameworkPackages(framework: Framework): readonly string[];
19
20
  /** Exported so the init telemetry can tell an MCP-registration failure from a dependency install. */
20
21
  export declare const MCP_TARGET = "global (claude user scope)";
22
+ /** True when this step is what makes the app dial the daemon. */
23
+ export declare function isConnectStep(title: string): boolean;
21
24
  /** The step that runs the package manager — the other thing that commonly fails on a user's machine. */
22
25
  export declare const DEPS_TARGET = "package.json";
23
26
  export declare const StepStatus: {
@@ -50,6 +53,20 @@ export interface Step {
50
53
  args: string[];
51
54
  fallback: string;
52
55
  };
56
+ /**
57
+ * A second, weaker attempt to run when `exec` fails, with what to tell the user if it succeeds.
58
+ *
59
+ * The pinned install is refused outright by pnpm's `minimumReleaseAge` for as long as its window
60
+ * lasts — so for ~48 hours after every release, a project with that setting could not install
61
+ * Reticle at all. An unpinned install still works there (it resolves the newest MATURE version), so
62
+ * the fallback trades an exact version for a working install and says which it did. It must never
63
+ * be silent: an older SDK against a newer daemon is the skew this pin exists to prevent.
64
+ */
65
+ retry?: {
66
+ command: string;
67
+ args: string[];
68
+ note: string;
69
+ };
53
70
  /**
54
71
  * This step wires the app to a package the install step provides. If that install fails, applying
55
72
  * it anyway leaves the app importing a module that is not there — `next.config.ts` importing
@@ -76,11 +93,38 @@ export interface PlanInput {
76
93
  cursorConfig: string | null;
77
94
  /** Absolute path of ~/.cursor/mcp.json (the write target). */
78
95
  cursorConfigPath: string;
96
+ /**
97
+ * Every OTHER MCP client detected on this machine, with its config path and current content.
98
+ *
99
+ * Claude Code and Cursor keep their own steps — Claude registers through its CLI, and Cursor's
100
+ * predates this. Everything else is uniform: read the file, merge, write.
101
+ */
102
+ detectedClients?: readonly {
103
+ id: McpClient;
104
+ configPath: string;
105
+ existing: string | null;
106
+ }[] | undefined;
79
107
  /** Discovered Vite config: its path + source, or null if none found. */
80
108
  viteConfig: {
81
109
  path: string;
82
110
  source: string;
83
111
  } | null;
112
+ /** Discovered Astro config: its path + source, or null if none found. */
113
+ astroConfig?: {
114
+ path: string;
115
+ source: string;
116
+ } | null | undefined;
117
+ /**
118
+ * The single layout to instrument, or null when the choice is not obvious.
119
+ *
120
+ * WHICH page or layout to instrument is a real decision — so `init` only makes it when there is
121
+ * exactly one candidate. Zero or several falls back to the printed recipe rather than guessing at
122
+ * the file every page of the user's site inherits from.
123
+ */
124
+ astroLayout?: {
125
+ path: string;
126
+ source: string;
127
+ } | null | undefined;
84
128
  /** Discovered Next config filename (e.g. 'next.config.mjs'), or null. */
85
129
  nextConfigFile: string | null;
86
130
  /** Source of that Next config, so the export can be wrapped in withReticle. */
@@ -104,18 +148,33 @@ export interface PlanInput {
104
148
  viteDevModuleExists?: boolean | undefined;
105
149
  /** Whether src/hooks.client.ts already exists (SvelteKit idempotency). */
106
150
  svelteKitHooksExists?: boolean;
151
+ /** CRA's bundled entry (src/index.tsx or .js) — where the connect import has to go. */
152
+ craEntry?: {
153
+ path: string;
154
+ source: string;
155
+ } | null;
156
+ /** Existing .env.development.local, so an unrelated variable in it survives. */
157
+ craEnv?: string | null;
158
+ /** The daemon's pairing token, inlined for CRA through the one channel it supports. */
159
+ pairingToken?: string;
107
160
  /** Whether .reticle.json already exists in the project root (idempotency). */
108
161
  reticleConfigExists?: boolean;
109
162
  /** Current project-root CLAUDE.md content (for the idempotent agent-rule merge), or null/undefined. */
110
163
  claudeMdContent?: string | null | undefined;
111
164
  /** Current project-root AGENTS.md content (cross-agent fallback rule), or null/undefined. */
112
165
  agentsMdContent?: string | null | undefined;
113
- /** Whether .cursor/rules/reticle.mdc already exists (agent-rule idempotency). */
114
- cursorRuleExists?: boolean | undefined;
115
- /** Whether .claude/commands/reticle.md already exists (slash-command idempotency). */
116
- claudeCommandExists?: boolean | undefined;
117
- /** Whether .cursor/commands/reticle.md already exists. */
118
- cursorCommandExists?: boolean | undefined;
166
+ /**
167
+ * Current .cursor/rules/reticle.mdc content, or null when absent.
168
+ *
169
+ * CONTENT, not existence. Gating on the file merely being there froze a Cursor project's rule at
170
+ * whatever release wrote it — so the CLAUDE.md path refreshed itself while the Cursor one never
171
+ * could, and a rule added later (`version_skew`) never reached a Cursor-only project at all.
172
+ */
173
+ cursorRuleContent?: string | null | undefined;
174
+ /** Current .claude/commands/reticle.md content, or null when absent (slash-command idempotency). */
175
+ claudeCommandContent?: string | null | undefined;
176
+ /** Current .cursor/commands/reticle.md content, or null when absent. */
177
+ cursorCommandContent?: string | null | undefined;
119
178
  options: {
120
179
  port: number | undefined;
121
180
  mcp: boolean;
@@ -126,4 +185,24 @@ export interface PlanInput {
126
185
  sdkVersion?: string;
127
186
  };
128
187
  }
188
+ /**
189
+ * Every coding agent `reticle init` knows how to wire itself into, and the three surfaces it wires:
190
+ * the global MCP registration, the project rule file that makes the agent USE Reticle, and the
191
+ * `/reticle` command.
192
+ *
193
+ * One list, because those three surfaces used to enumerate Claude and Cursor separately in three
194
+ * places — so supporting a fourth agent meant finding all three and getting each right. Adding one
195
+ * is now an entry here plus its builders; each builder answers null when that agent is not present
196
+ * for this user or this project, which is also how "no agent detected" falls through to the
197
+ * cross-agent AGENTS.md.
198
+ *
199
+ * Deliberately functions rather than data: registering with Claude runs its CLI while Cursor merges
200
+ * a JSON file, and pretending those are the same shape would cost more than it saves.
201
+ */
202
+ declare const AgentId: {
203
+ readonly CLAUDE: "claude";
204
+ readonly CURSOR: "cursor";
205
+ };
206
+ export type AgentId = (typeof AgentId)[keyof typeof AgentId];
129
207
  export declare function buildPlan(input: PlanInput): Plan;
208
+ export {};