@reticlehq/server 3.7.0 → 3.8.1
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.
- package/SKILL.md +59 -68
- package/bin/reticle.js +9 -2
- package/dist/command/cli/adhoc-suite.js +1 -1
- package/dist/command/cli/adhoc-verdict.d.ts +12 -0
- package/dist/command/cli/adhoc-verdict.js +62 -4
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +5 -1
- package/dist/command/cli/auth/cloud-session.d.ts +11 -19
- package/dist/command/cli/auth/cloud-session.js +23 -0
- package/dist/command/cli/auth/device-flow.d.ts +3 -37
- package/dist/command/cli/cli-doctor.js +66 -21
- package/dist/command/cli/cli-flow-commands.js +53 -11
- package/dist/command/cli/cli-kill.d.ts +8 -0
- package/dist/command/cli/cli-kill.js +43 -3
- package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
- package/dist/command/cli/cli-parse-feedback.js +13 -1
- package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
- package/dist/command/cli/cli-parse-grammar.js +1 -6
- package/dist/command/cli/cli-parse-serve.d.ts +24 -0
- package/dist/command/cli/cli-parse-serve.js +124 -0
- package/dist/command/cli/cli-parse.d.ts +12 -11
- package/dist/command/cli/cli-parse.js +100 -123
- package/dist/command/cli/cli-usage.d.ts +0 -11
- package/dist/command/cli/cli-usage.js +43 -16
- package/dist/command/cli/cli-verify.d.ts +1 -1
- package/dist/command/cli/cli-verify.js +29 -14
- package/dist/command/cli/cloud-cli.js +27 -9
- package/dist/command/cli/cloud-kit.js +3 -3
- package/dist/command/cli/cloud-link.d.ts +1 -20
- package/dist/command/cli/cloud-link.js +2 -0
- package/dist/command/cli/cloud-login.d.ts +6 -2
- package/dist/command/cli/cloud-login.js +13 -41
- package/dist/command/cli/config/checkout.d.ts +10 -0
- package/dist/command/cli/config/checkout.js +78 -0
- package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
- package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
- package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
- package/dist/command/cli/doctor/doctor-rows.js +4 -0
- package/dist/command/cli/drive/drive-attach.d.ts +5 -0
- package/dist/command/cli/drive/drive-attach.js +21 -1
- package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
- package/dist/command/cli/hook/codex-transcript.js +224 -0
- package/dist/command/cli/hook/episode-structure.d.ts +24 -0
- package/dist/command/cli/hook/episode-structure.js +138 -0
- package/dist/command/cli/hook/hook-command.d.ts +9 -0
- package/dist/command/cli/hook/hook-command.js +211 -0
- package/dist/command/cli/hook/hook-fast.d.ts +31 -0
- package/dist/command/cli/hook/hook-fast.js +136 -0
- package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
- package/dist/command/cli/hook/prompt-hook.js +199 -0
- package/dist/command/cli/hook/tool-hook.d.ts +21 -0
- package/dist/command/cli/hook/tool-hook.js +259 -0
- package/dist/command/cli/launch/cli-launch.d.ts +2 -0
- package/dist/command/cli/launch/cli-launch.js +22 -2
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
- package/dist/command/cli/mcp-command.d.ts +9 -0
- package/dist/command/cli/mcp-command.js +127 -41
- package/dist/command/cli/open-navigate.d.ts +43 -0
- package/dist/command/cli/open-navigate.js +85 -0
- package/dist/command/cli/ports/port-holder.d.ts +16 -4
- package/dist/command/cli/ports/port-holder.js +58 -12
- package/dist/command/cli/ports/resolve/cli-port.js +18 -2
- package/dist/command/cli/project-name.d.ts +1 -7
- package/dist/command/cli/project-name.js +1 -0
- package/dist/command/cli/report-command.d.ts +8 -2
- package/dist/command/cli/report-command.js +95 -18
- package/dist/command/cli/status-fields.d.ts +9 -2
- package/dist/command/cli/status-fields.js +148 -4
- package/dist/command/cli/try-command.d.ts +3 -4
- package/dist/command/cli/try-command.js +6 -11
- package/dist/command/cli/verify-results.d.ts +4 -1
- package/dist/command/cli/verify-results.js +3 -1
- package/dist/command/cli.d.ts +1 -7
- package/dist/command/cli.js +79 -160
- package/dist/command/daemon/daemon-resilience.d.ts +6 -1
- package/dist/command/daemon/daemon-resilience.js +31 -18
- package/dist/command/daemon/daemon.d.ts +11 -0
- package/dist/command/daemon/daemon.js +70 -2
- package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
- package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
- package/dist/command/daemon/wake-decision.js +4 -2
- package/dist/command/daemon/win32-escape.d.ts +32 -0
- package/dist/command/daemon/win32-escape.js +119 -0
- package/dist/command/setup/agent-configs.d.ts +9 -0
- package/dist/command/setup/agent-configs.js +9 -0
- package/dist/command/setup/auto-approve.d.ts +10 -3
- package/dist/command/setup/auto-approve.js +51 -3
- package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
- package/dist/command/setup/bringup/dev-server-wait.js +5 -1
- package/dist/command/setup/bringup/ensure-daemon.js +4 -7
- package/dist/command/setup/init/init-host.js +6 -0
- package/dist/command/setup/init/init-port.js +5 -4
- package/dist/command/setup/init/init-runtime.js +7 -1
- package/dist/command/setup/node-effects.d.ts +8 -0
- package/dist/command/setup/node-effects.js +36 -4
- package/dist/command/setup/probe/dev-port.d.ts +26 -0
- package/dist/command/setup/probe/dev-port.js +117 -0
- package/dist/command/setup/probe/page-probe.d.ts +1 -1
- package/dist/command/setup/probe/page-probe.js +11 -3
- package/dist/command/setup/remaining-steps.d.ts +0 -7
- package/dist/command/setup/remaining-steps.js +3 -2
- package/dist/command/setup/run-setup.d.ts +11 -0
- package/dist/command/setup/run-setup.js +33 -5
- package/dist/command/setup/setup-command.d.ts +2 -0
- package/dist/command/setup/setup-command.js +22 -4
- package/dist/command/update/updater.d.ts +1 -6
- package/dist/command/update/updater.js +4 -5
- package/dist/command/update/version-seen.d.ts +24 -0
- package/dist/command/update/version-seen.js +65 -0
- package/dist/command/version/peer-announce.d.ts +9 -1
- package/dist/command/version/peer-announce.js +25 -2
- package/dist/command/version/sdk-fix.d.ts +5 -6
- package/dist/command/version/sdk-fix.js +17 -32
- package/dist/command/version/version-skew.d.ts +16 -1
- package/dist/command/version/version-skew.js +84 -10
- package/dist/features/crawl/crawl-tools.js +2 -2
- package/dist/features/crawl/crawl.js +2 -0
- package/dist/features/exhaust/ledger.d.ts +15 -96
- package/dist/features/exhaust/ledger.js +3 -3
- package/dist/features/harness/drive-runs.d.ts +28 -4
- package/dist/features/harness/drive-runs.js +99 -7
- package/dist/features/harness/drivers.d.ts +1 -1
- package/dist/features/harness/drivers.js +1 -1
- package/dist/features/harness/harness.d.ts +5 -0
- package/dist/features/harness/harness.js +24 -12
- package/dist/features/harness/platform/platform-drives.d.ts +7 -1
- package/dist/features/harness/platform/platform-drives.js +12 -7
- package/dist/features/harness/platform/refusal.d.ts +1 -1
- package/dist/features/harness/platform/refusal.js +4 -4
- package/dist/features/harness/platform/remote-drive.js +70 -28
- package/dist/features/harness/platform/server-driver.js +22 -1
- package/dist/features/harness/platform-config.d.ts +1 -10
- package/dist/features/harness/platform-config.js +0 -20
- package/dist/features/license/license.d.ts +2 -14
- package/dist/features/visual/step-shots.d.ts +33 -1
- package/dist/features/visual/step-shots.js +155 -1
- package/dist/features/visual/visual-tools.js +12 -4
- package/dist/hooks/coding-agents.d.ts +6 -0
- package/dist/hooks/coding-agents.js +24 -3
- package/dist/hooks/episode-stamp.d.ts +32 -0
- package/dist/hooks/episode-stamp.js +61 -0
- package/dist/hooks/hook-commands.js +19 -9
- package/dist/index.d.ts +5 -1
- package/dist/index.js +66 -24
- package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
- package/dist/judgement/app-graph/journal-steps.js +92 -0
- package/dist/judgement/capsule/capsule-store.d.ts +2 -39
- package/dist/judgement/domain/domain-model.js +1 -10
- package/dist/judgement/domain/domain-tools.js +4 -2
- package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
- package/dist/judgement/runs/artifact/run-store.js +153 -28
- package/dist/judgement/runs/default-run-id.d.ts +3 -1
- package/dist/judgement/runs/default-run-id.js +15 -3
- package/dist/judgement/runs/drive-run.d.ts +3 -3
- package/dist/judgement/runs/drive-run.js +11 -7
- package/dist/judgement/runs/run-ledger.d.ts +21 -0
- package/dist/judgement/runs/run-ledger.js +143 -0
- package/dist/judgement/runs/runner-port.d.ts +1 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +4 -3
- package/dist/judgement/runs/verification-sync.js +27 -5
- package/dist/language/flows/affected-tools.js +2 -1
- package/dist/language/flows/annotate-notes/annotate.js +8 -3
- package/dist/language/flows/annotate-tools.js +1 -1
- package/dist/language/flows/change/affected.d.ts +8 -0
- package/dist/language/flows/change/affected.js +20 -7
- package/dist/language/flows/decision.js +19 -4
- package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
- package/dist/language/flows/fields/flow-secret-field.js +67 -5
- package/dist/language/flows/flow-anchor.d.ts +5 -0
- package/dist/language/flows/flow-anchor.js +4 -0
- package/dist/language/flows/flow-cross-step.d.ts +7 -1
- package/dist/language/flows/flow-cross-step.js +9 -0
- package/dist/language/flows/flow-expect-grammar.js +15 -10
- package/dist/language/flows/flow-intent.js +6 -1
- package/dist/language/flows/flow-journey.d.ts +8 -0
- package/dist/language/flows/flow-journey.js +13 -0
- package/dist/language/flows/flow-lease.d.ts +27 -0
- package/dist/language/flows/flow-lease.js +59 -0
- package/dist/language/flows/flow-replay-run.d.ts +1 -87
- package/dist/language/flows/flow-replay-run.js +111 -310
- package/dist/language/flows/flow-replay.js +21 -19
- package/dist/language/flows/flow-replayable.d.ts +38 -0
- package/dist/language/flows/flow-replayable.js +179 -0
- package/dist/language/flows/flow-start-path.d.ts +108 -0
- package/dist/language/flows/flow-start-path.js +313 -0
- package/dist/language/flows/flow-step-runners.d.ts +23 -2
- package/dist/language/flows/flow-step-runners.js +191 -32
- package/dist/language/flows/flow-store-for-session.d.ts +8 -1
- package/dist/language/flows/flow-store-for-session.js +6 -0
- package/dist/language/flows/flow-tools.d.ts +2 -23
- package/dist/language/flows/flow-tools.js +63 -113
- package/dist/language/flows/flows.d.ts +4 -6
- package/dist/language/flows/flows.js +90 -15
- package/dist/language/flows/heal-run.d.ts +10 -4
- package/dist/language/flows/heal-run.js +26 -9
- package/dist/language/flows/recording/flake.d.ts +3 -27
- package/dist/language/flows/recording/flake.js +1 -1
- package/dist/language/flows/recording/recording-backtrack.js +1 -4
- package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
- package/dist/language/flows/recording/tape/recordings.js +9 -3
- package/dist/language/flows/replay.d.ts +25 -5
- package/dist/language/flows/replay.js +83 -16
- package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
- package/dist/language/flows/suite/coverage.d.ts +9 -0
- package/dist/language/flows/suite/coverage.js +12 -1
- package/dist/language/flows/suite-selection.d.ts +25 -0
- package/dist/language/flows/suite-selection.js +41 -9
- package/dist/machine/git-tracks.d.ts +6 -0
- package/dist/machine/git-tracks.js +36 -0
- package/dist/memory/cloud/background-sync.d.ts +25 -0
- package/dist/memory/cloud/background-sync.js +79 -0
- package/dist/memory/cloud/cloud-config.d.ts +12 -1
- package/dist/memory/cloud/cloud-config.js +39 -13
- package/dist/memory/cloud/cloud-sync.d.ts +3 -24
- package/dist/memory/cloud/cloud-sync.js +5 -2
- package/dist/memory/cloud/harness-config.d.ts +0 -7
- package/dist/memory/cloud/memory-scope.d.ts +19 -0
- package/dist/memory/cloud/memory-scope.js +48 -0
- package/dist/memory/cloud/sync-answer.d.ts +43 -0
- package/dist/memory/cloud/sync-answer.js +42 -0
- package/dist/memory/cloud/sync-cycle.d.ts +40 -10
- package/dist/memory/cloud/sync-cycle.js +97 -144
- package/dist/memory/cloud/sync-daemon.d.ts +50 -3
- package/dist/memory/cloud/sync-daemon.js +473 -83
- package/dist/memory/cloud/sync-describe.d.ts +28 -0
- package/dist/memory/cloud/sync-describe.js +92 -0
- package/dist/memory/cloud/sync-disk.d.ts +9 -1
- package/dist/memory/cloud/sync-disk.js +137 -33
- package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
- package/dist/memory/cloud/sync-flow-versions.js +42 -0
- package/dist/memory/impact/impact-store.js +32 -15
- package/dist/memory/intent/intent-shard.d.ts +41 -266
- package/dist/memory/intent/intent-tools.js +20 -61
- package/dist/memory/intent/record-request.d.ts +27 -0
- package/dist/memory/intent/record-request.js +88 -0
- package/dist/memory/intent/settled-words.js +9 -1
- package/dist/memory/journal/drive-flow.d.ts +3 -0
- package/dist/memory/journal/drive-flow.js +11 -41
- package/dist/memory/journal/envelope-store.js +1 -1
- package/dist/memory/journal/envelope.d.ts +6 -154
- package/dist/memory/journal/episode-log.d.ts +107 -0
- package/dist/memory/journal/episode-log.js +302 -0
- package/dist/memory/journal/journal-recorder.d.ts +7 -0
- package/dist/memory/journal/journal-recorder.js +22 -9
- package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
- package/dist/memory/journal/on-disk/ambient-file.js +1 -1
- package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
- package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
- package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
- package/dist/memory/journal/self-observation.js +3 -1
- package/dist/memory/journal/session-end.js +23 -9
- package/dist/memory/journal/session-journal.js +39 -20
- package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
- package/dist/memory/project/artifact-root-resolver.js +68 -23
- package/dist/memory/project/artifact-root.d.ts +17 -3
- package/dist/memory/project/artifact-root.js +47 -9
- package/dist/memory/project/fs/fs-port.d.ts +5 -0
- package/dist/memory/project/fs/fs-port.js +13 -0
- package/dist/memory/project/learned-routes.d.ts +3 -4
- package/dist/memory/project/learned-routes.js +3 -11
- package/dist/memory/project/link-directory.js +5 -2
- package/dist/memory/project/root-claims.d.ts +3 -1
- package/dist/memory/project/root-claims.js +41 -7
- package/dist/memory/project/session-root.d.ts +1 -1
- package/dist/memory/project/session-root.js +1 -15
- package/dist/memory/project/sync-status.js +5 -6
- package/dist/memory/recall/memory-tools.js +2 -2
- package/dist/memory/recall/platform-memory.d.ts +3 -1
- package/dist/memory/recall/platform-memory.js +9 -1
- package/dist/memory/recall/project-memory.js +15 -19
- package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
- package/dist/portal/bridge/auth-failure-reason.js +19 -0
- package/dist/portal/bridge/bridge.d.ts +19 -4
- package/dist/portal/bridge/bridge.js +150 -177
- package/dist/portal/bridge/harness-request.d.ts +15 -0
- package/dist/portal/bridge/harness-request.js +19 -0
- package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
- package/dist/portal/bridge/origin/origin-follow.js +110 -0
- package/dist/portal/bridge/pairing-token.d.ts +6 -0
- package/dist/portal/bridge/pairing-token.js +47 -16
- package/dist/portal/bridge/protocol-skew.d.ts +27 -2
- package/dist/portal/bridge/protocol-skew.js +66 -2
- package/dist/portal/bridge/session-nonces.d.ts +46 -0
- package/dist/portal/bridge/session-nonces.js +72 -0
- package/dist/portal/input/viewport-tools.d.ts +31 -0
- package/dist/portal/input/viewport-tools.js +106 -15
- package/dist/portal/pool/bounded-close.d.ts +23 -0
- package/dist/portal/pool/bounded-close.js +38 -0
- package/dist/portal/pool/browser-pool.d.ts +44 -39
- package/dist/portal/pool/browser-pool.js +247 -95
- package/dist/portal/pool/context-permissions.d.ts +9 -1
- package/dist/portal/pool/context-permissions.js +26 -0
- package/dist/portal/pool/lease-emulation.d.ts +37 -0
- package/dist/portal/pool/lease-emulation.js +29 -0
- package/dist/portal/pool/playwright-launcher.d.ts +6 -0
- package/dist/portal/pool/playwright-launcher.js +74 -7
- package/dist/portal/pool/pool-contract.d.ts +23 -1
- package/dist/portal/pool/pool-lease.d.ts +128 -0
- package/dist/portal/pool/pool-lease.js +49 -0
- package/dist/portal/pool/zero-install.d.ts +8 -1
- package/dist/portal/pool/zero-install.js +24 -2
- package/dist/portal/production/production-activation.d.ts +136 -0
- package/dist/portal/production/production-activation.js +173 -0
- package/dist/portal/production/production-drive.d.ts +52 -0
- package/dist/portal/production/production-drive.js +301 -0
- package/dist/portal/production/production-hello.d.ts +23 -0
- package/dist/portal/production/production-hello.js +23 -0
- package/dist/portal/realm/web-realm.js +42 -15
- package/dist/portal/session/control-envelope.d.ts +1 -1
- package/dist/portal/session/dev-server/served-document.d.ts +0 -5
- package/dist/portal/session/dev-server/served-document.js +6 -8
- package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
- package/dist/portal/session/first-run-wiring.d.ts +3 -36
- package/dist/portal/session/first-run-wiring.js +10 -103
- package/dist/portal/session/live-control-tools.js +61 -19
- package/dist/portal/session/no-session-next-action.d.ts +11 -0
- package/dist/portal/session/no-session-next-action.js +40 -15
- package/dist/portal/session/no-session-watch.d.ts +7 -0
- package/dist/portal/session/no-session-watch.js +67 -23
- package/dist/portal/session/output-budget.d.ts +10 -0
- package/dist/portal/session/output-budget.js +16 -0
- package/dist/portal/session/presence/session-lease.d.ts +2 -0
- package/dist/portal/session/presence/session-lease.js +8 -0
- package/dist/portal/session/recorded-gaps.d.ts +15 -11
- package/dist/portal/session/recorded-gaps.js +39 -18
- package/dist/portal/session/serving-directory.d.ts +24 -2
- package/dist/portal/session/serving-directory.js +93 -5
- package/dist/portal/session/session-info.d.ts +26 -0
- package/dist/portal/session/session-info.js +20 -0
- package/dist/portal/session/session-manager.d.ts +35 -3
- package/dist/portal/session/session-manager.js +69 -14
- package/dist/portal/session/session-successor.js +1 -9
- package/dist/portal/session/session-tools.js +22 -4
- package/dist/portal/session/session.d.ts +10 -10
- package/dist/portal/session/session.js +37 -29
- package/dist/portal/session/zero-install-first-call.d.ts +7 -2
- package/dist/portal/session/zero-install-first-call.js +43 -20
- package/dist/start-wiring.d.ts +2 -2
- package/dist/start-wiring.js +17 -3
- package/dist/status-payload.d.ts +11 -1
- package/dist/status-payload.js +7 -1
- package/dist/surface/agent-presence-grace.d.ts +11 -0
- package/dist/surface/agent-presence-grace.js +34 -0
- package/dist/surface/http-server.d.ts +12 -1
- package/dist/surface/http-server.js +64 -15
- package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
- package/dist/surface/mcp/faults/mcp-outage.js +19 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
- package/dist/surface/mcp/mcp-proxy.js +194 -267
- package/dist/surface/mcp/mcp.d.ts +20 -3
- package/dist/surface/mcp/mcp.js +88 -25
- package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
- package/dist/surface/mcp/proxy/drive-calls.js +114 -5
- package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
- package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
- package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
- package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
- package/dist/surface/mcp/server-instructions.js +35 -16
- package/dist/surface/mcp/shared-params.d.ts +8 -0
- package/dist/surface/mcp/shared-params.js +15 -1
- package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
- package/dist/surface/mcp/sse-frame-parser.js +18 -0
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +13 -0
- package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
- package/dist/surface/mcp/tool-catalog-cache.js +14 -4
- package/dist/surface/tools/account-tool.d.ts +4 -3
- package/dist/surface/tools/account-tool.js +20 -31
- package/dist/surface/tools/act/act-danger.d.ts +2 -0
- package/dist/surface/tools/act/act-danger.js +41 -14
- package/dist/surface/tools/act/act-observation.d.ts +11 -0
- package/dist/surface/tools/act/act-observation.js +33 -0
- package/dist/surface/tools/act/act-preflight.js +10 -3
- package/dist/surface/tools/act/act-sequence-retry.js +2 -1
- package/dist/surface/tools/act/act-target.js +19 -5
- package/dist/surface/tools/act/durable.js +1 -1
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
- package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
- package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
- package/dist/surface/tools/act/unsettled-find.js +71 -0
- package/dist/surface/tools/act-sequence-tool.js +53 -24
- package/dist/surface/tools/act-tools.d.ts +2 -3
- package/dist/surface/tools/act-tools.js +49 -47
- package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
- package/dist/surface/tools/agent/for-the-agent.js +41 -3
- package/dist/surface/tools/assert/assert-grade.js +8 -3
- package/dist/surface/tools/assert/assert-verdict.js +4 -2
- package/dist/surface/tools/browser-tools.js +7 -4
- package/dist/surface/tools/chat-drives.js +50 -25
- package/dist/surface/tools/coverage-tools.js +1 -1
- package/dist/surface/tools/dynamic-tools.d.ts +8 -0
- package/dist/surface/tools/dynamic-tools.js +89 -34
- package/dist/surface/tools/empty-session-list.d.ts +18 -25
- package/dist/surface/tools/empty-session-list.js +67 -38
- package/dist/surface/tools/error-recovery.d.ts +17 -7
- package/dist/surface/tools/error-recovery.js +53 -20
- package/dist/surface/tools/explore-tools.d.ts +10 -0
- package/dist/surface/tools/explore-tools.js +72 -19
- package/dist/surface/tools/feedback-tools.js +23 -2
- package/dist/surface/tools/gap-novelty.d.ts +6 -0
- package/dist/surface/tools/gap-novelty.js +9 -0
- package/dist/surface/tools/gaps/capability-absences.js +4 -3
- package/dist/surface/tools/harness-explore.d.ts +1 -1
- package/dist/surface/tools/harness-explore.js +6 -4
- package/dist/surface/tools/harness-gate.d.ts +43 -21
- package/dist/surface/tools/harness-gate.js +55 -81
- package/dist/surface/tools/harness-script.d.ts +2 -0
- package/dist/surface/tools/harness-script.js +11 -6
- package/dist/surface/tools/harness-toolset.js +3 -4
- package/dist/surface/tools/invoke-tool.d.ts +0 -8
- package/dist/surface/tools/invoke-tool.js +164 -178
- package/dist/surface/tools/lease-hint.d.ts +9 -0
- package/dist/surface/tools/lease-hint.js +22 -3
- package/dist/surface/tools/lease-permissions.d.ts +1 -1
- package/dist/surface/tools/lease-readiness.d.ts +55 -0
- package/dist/surface/tools/lease-readiness.js +150 -2
- package/dist/surface/tools/lease-tools.d.ts +3 -75
- package/dist/surface/tools/lease-tools.js +124 -188
- package/dist/surface/tools/map-tools.d.ts +20 -0
- package/dist/surface/tools/map-tools.js +145 -0
- package/dist/surface/tools/merge-tools.js +11 -7
- package/dist/surface/tools/next-step.js +6 -3
- package/dist/surface/tools/observe-tools.js +46 -35
- package/dist/surface/tools/platform-moment.d.ts +3 -12
- package/dist/surface/tools/platform-moment.js +12 -24
- package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
- package/dist/surface/tools/read/complete-snapshot.js +13 -2
- package/dist/surface/tools/read/query-paginate.js +6 -0
- package/dist/surface/tools/read/query-shape.d.ts +9 -0
- package/dist/surface/tools/read/query-shape.js +15 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
- package/dist/surface/tools/read-tools.js +5 -5
- package/dist/surface/tools/real-input-attempt.d.ts +11 -0
- package/dist/surface/tools/real-input-attempt.js +206 -38
- package/dist/surface/tools/reconcile-tools.js +21 -8
- package/dist/surface/tools/reticle-result.d.ts +3 -0
- package/dist/surface/tools/reticle-result.js +8 -1
- package/dist/surface/tools/run-report.d.ts +22 -0
- package/dist/surface/tools/run-report.js +141 -0
- package/dist/surface/tools/session-ports.d.ts +57 -0
- package/dist/surface/tools/session-ports.js +102 -0
- package/dist/surface/tools/tool-kit.d.ts +58 -4
- package/dist/surface/tools/tool-kit.js +140 -6
- package/dist/surface/tools/tool-surface.d.ts +2 -0
- package/dist/surface/tools/tool-surface.js +45 -0
- package/dist/surface/tools/tools.js +49 -87
- package/dist/telemetry/automation-hint.d.ts +5 -0
- package/dist/telemetry/automation-hint.js +7 -0
- package/dist/telemetry/cli-telemetry.d.ts +22 -0
- package/dist/telemetry/cli-telemetry.js +80 -11
- package/dist/telemetry/daemon-telemetry.d.ts +3 -1
- package/dist/telemetry/daemon-telemetry.js +9 -2
- package/dist/telemetry/feedback-cli.d.ts +1 -1
- package/dist/telemetry/feedback-cli.js +8 -3
- package/dist/telemetry/feedback.d.ts +1 -1
- package/dist/telemetry/feedback.js +51 -4
- package/dist/telemetry/harness-run.d.ts +3 -3
- package/dist/telemetry/harness-run.js +18 -7
- package/dist/telemetry/hud-events.d.ts +1 -1
- package/dist/telemetry/hud-metrics.d.ts +6 -3
- package/dist/telemetry/hud-metrics.js +20 -8
- package/dist/telemetry/install-source.js +1 -1
- package/dist/telemetry/mcp-connection.d.ts +1 -1
- package/dist/telemetry/mcp-connection.js +21 -2
- package/dist/telemetry/onboarding-firsts.d.ts +6 -1
- package/dist/telemetry/onboarding-firsts.js +41 -1
- package/dist/telemetry/proxy-telemetry.d.ts +42 -0
- package/dist/telemetry/proxy-telemetry.js +70 -1
- package/dist/telemetry/session-metrics.d.ts +1 -3
- package/dist/telemetry/session-metrics.js +16 -12
- package/dist/telemetry/telemetry.d.ts +9 -1
- package/dist/telemetry/telemetry.js +16 -1
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +7 -1
- package/dist/wire-journal.js +12 -2
- package/docs/README.md +4 -2
- package/docs/actions.mdx +7 -6
- package/docs/adapters.md +2 -1
- package/docs/agent-cheatsheet.md +19 -5
- package/docs/architecture.md +13 -10
- package/docs/autodrive.md +6 -5
- package/docs/benchmarks.md +2 -2
- package/docs/capabilities.mdx +1 -1
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +6 -6
- package/docs/cli/doctor.mdx +3 -1
- package/docs/cli/feedback.mdx +11 -7
- package/docs/cli/gate.mdx +1 -1
- package/docs/cli/help.mdx +1 -1
- package/docs/cli/init.mdx +20 -16
- package/docs/cli/mcp.mdx +5 -2
- package/docs/cli/open.mdx +5 -2
- package/docs/cli/report.mdx +1 -1
- package/docs/cli/restart.mdx +1 -1
- package/docs/cli/rollback.mdx +4 -4
- package/docs/cli/serve.mdx +7 -5
- package/docs/cli/setup.mdx +1 -1
- package/docs/cli/status.mdx +6 -2
- package/docs/cli/stop.mdx +3 -3
- package/docs/cli/telemetry.mdx +5 -1
- package/docs/cli/try.mdx +8 -8
- package/docs/cli/update.mdx +8 -5
- package/docs/cli/verify.mdx +12 -5
- package/docs/cli/version.mdx +1 -1
- package/docs/cli.mdx +10 -6
- package/docs/debugging.md +1 -1
- package/docs/deploy-checks.md +8 -6
- package/docs/desktop.mdx +14 -18
- package/docs/enterprise.md +6 -6
- package/docs/environment.mdx +5 -3
- package/docs/faq.mdx +9 -6
- package/docs/first-drive.md +19 -9
- package/docs/flows.md +3 -4
- package/docs/for-agents.md +1 -1
- package/docs/frameworks.mdx +34 -11
- package/docs/getting-started.md +46 -29
- package/docs/http-transport.md +2 -2
- package/docs/human-control.md +8 -8
- package/docs/index.mdx +2 -2
- package/docs/install-agentic.mdx +18 -19
- package/docs/install-manual.mdx +8 -4
- package/docs/integration-patterns.md +5 -5
- package/docs/multi-agent-testing.md +7 -5
- package/docs/packages/browser.mdx +34 -2
- package/docs/packages/core.mdx +2 -1
- package/docs/packages/electron.mdx +15 -3
- package/docs/packages/eslint-plugin.mdx +1 -1
- package/docs/packages/next.mdx +17 -5
- package/docs/packages/react.mdx +8 -1
- package/docs/packages/server.mdx +3 -3
- package/docs/packages/tauri.mdx +3 -3
- package/docs/packages/vite-plugin.mdx +1 -1
- package/docs/packages.mdx +19 -6
- package/docs/platform-integration.md +12 -4
- package/docs/predicates.mdx +18 -7
- package/docs/production-mode.md +108 -0
- package/docs/prompt-capture.md +99 -0
- package/docs/quickstart.mdx +14 -12
- package/docs/recipes.mdx +9 -8
- package/docs/required-checks.md +3 -2
- package/docs/skill-file.mdx +4 -3
- package/docs/skill-setup.md +2 -2
- package/docs/skill.md +62 -70
- package/docs/state-files.md +1 -0
- package/docs/state-management.mdx +11 -9
- package/docs/system-map.md +14 -13
- package/docs/telemetry.md +32 -24
- package/docs/testing.md +9 -5
- package/docs/tools/act-and-wait.mdx +17 -13
- package/docs/tools/act-sequence.mdx +40 -66
- package/docs/tools/act.mdx +7 -5
- package/docs/tools/assert.mdx +1 -1
- package/docs/tools/look.mdx +1 -1
- package/docs/tools/navigate.mdx +1 -1
- package/docs/tools/network.mdx +13 -11
- package/docs/tools/overview.mdx +3 -3
- package/docs/tools/query.mdx +3 -3
- package/docs/tools/session-and-feedback.mdx +9 -6
- package/docs/tools/sessions.mdx +7 -0
- package/docs/tools/snapshot.mdx +9 -7
- package/docs/tools/tools-and-run.mdx +11 -10
- package/docs/tools/verify.mdx +1 -1
- package/docs/troubleshooting.mdx +21 -9
- package/docs/usage.md +58 -43
- package/docs/use-cases.mdx +2 -2
- package/docs/vs-chrome-devtools-mcp.mdx +5 -5
- package/docs/vs-playwright-mcp.mdx +5 -4
- package/docs/what-is-recorded.md +12 -7
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/dev/stale-issue-guard.d.ts +0 -34
- package/dist/command/dev/stale-issue-guard.js +0 -69
package/docs/cli/affected.mdx
CHANGED
|
@@ -17,7 +17,7 @@ npx @reticlehq/server affected [--since <ref>] [file...]
|
|
|
17
17
|
| `file...` | strings, positional | none | Explicit changed files |
|
|
18
18
|
| `--since <ref>` | string | `HEAD` when no files are given | Also include files git reports as changed since this ref |
|
|
19
19
|
|
|
20
|
-
With nothing after it, `reticle affected`
|
|
20
|
+
With nothing after it, `reticle affected` compares the working tree with `HEAD`.
|
|
21
21
|
|
|
22
22
|
## What it prints
|
|
23
23
|
|
package/docs/cli/cloud.mdx
CHANGED
|
@@ -12,7 +12,7 @@ npx @reticlehq/server connect --project "My App"
|
|
|
12
12
|
|
|
13
13
|
If your daemon is not on the default port 4400, run `npx @reticlehq/server init --port <N>` first: `connect` takes no `--port`, and the `init` it runs for an unwired app uses the default.
|
|
14
14
|
|
|
15
|
-
Use `--url https://your-cloud-origin` for a self-hosted cloud. `connect` checks a saved sign-in against that exact host before reuse; if it has expired, the browser approval opens again. It mints or reuses a project-scoped key, so there is no key to paste. The browser asks you to sign in, or to create a free account at app.reticle.sh. A new account gets
|
|
15
|
+
Use `--url https://your-cloud-origin` for a self-hosted cloud. `connect` checks a saved sign-in against that exact host before reuse; if it has expired, the browser approval opens again. It mints or reuses a project-scoped key, so there is no key to paste. The browser asks you to sign in, or to create a free account at app.reticle.sh. A new account gets free credits to try Harness; adding a card starts a 14-day trial with 500 credits, and the paid plan includes 1,000 credits per seat each month. Harness drives and chat checks spend credits; storing and syncing runs is free. What syncs, and how to switch each part off, is in [What is recorded](/what-is-recorded). A newly wired app may have no run to sync yet: ask your agent to verify one flow and the linked daemon will sync the result. Run `reticle status` to check who is signed in and whether this folder is linked, and `reticle sync` to send anything still pending.
|
|
16
16
|
|
|
17
17
|
The other cloud commands are thin clients over the `/v1` API. Their logic is server-side.
|
|
18
18
|
|
|
@@ -42,7 +42,7 @@ npx @reticlehq/server connect [--project <name|id>] [--workspace <name|id>] [--u
|
|
|
42
42
|
|
|
43
43
|
Signs in if needed (a browser device flow like `gh auth login`: approve in the browser, the CLI polls until confirmed), then binds this repository to a cloud project and sends local history. It **mints** a project-scoped key, so there is nothing to paste; with `RETICLE_API_KEY` already set, it resolves that key's project instead. `--project` accepts a slug id or a display name, and creates the project when no project has that name. Omitted, the project is named after the `projectId` in `.reticle.json`, else after this folder. `--workspace` picks the workspace to link in when you belong to more than one. `--no-install` is passed to the `init` it runs for an unwired app. Writes `cloud.json` and the key.
|
|
44
44
|
|
|
45
|
-
`reticle login`, `reticle link` and `reticle project` are the old spellings. They still work for one release and print one line naming `connect`.
|
|
45
|
+
`reticle login`, `reticle link` and `reticle project` are the old spellings. They still work for one release and print one line naming `connect`. Sign-in is with Google or GitHub, in the browser. Email sign-in is gone: `reticle login --email` stops and says so. Without a browser (CI, an agent, a server), set `RETICLE_API_KEY` to a key from Settings > API keys.
|
|
46
46
|
|
|
47
47
|
### `reticle logout`
|
|
48
48
|
|
|
@@ -59,10 +59,10 @@ Signs out of ONE host. Which host: `--url`, else `RETICLE_CLOUD_URL`, else the a
|
|
|
59
59
|
### `reticle config`
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
-
npx @reticlehq/server config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
|
|
62
|
+
npx @reticlehq/server config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server] [--harness on|off]
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
Edits `.reticle/cloud.json` in place. Any value other than `on` or `off` (or `local` or `server` for `--verify`) exits `2`. Requires the repo to be linked; run in an unlinked repo it exits `2` before it looks at the flags at all:
|
|
65
|
+
Edits `.reticle/cloud.json` in place. Any value other than `on` or `off` (or `local` or `server` for `--verify`) exits `2`. `--harness on|off` switches the Harness for this project on the platform, not in `cloud.json`. Each drive spends the workspace's credits. It exits `1` when the platform did not switch it (locked, no access, or offline). Requires the repo to be linked; run in an unlinked repo it exits `2` before it looks at the flags at all:
|
|
66
66
|
|
|
67
67
|
```
|
|
68
68
|
reticle: no .reticle/cloud.json here ... run `reticle connect` first
|
|
@@ -70,7 +70,7 @@ reticle: no .reticle/cloud.json here ... run `reticle connect` first
|
|
|
70
70
|
|
|
71
71
|
### `reticle sync`
|
|
72
72
|
|
|
73
|
-
Sends local run artifacts from `.reticle` to the linked project, honoring the sync policy, and collects decisions made on the dashboard. Each switch removes only its own part: with `sync.runs` off no runs are sent, but flows and records still go unless they are off too. Prints `{ ok, project, sent, pulled }`, where `sent` carries the accepted counts and, when the server refused anything, a `rejected` array naming each run's index and reason and a `refused` array for flows, capsules and derived records. `sent.records` lists only the records the server accepted.
|
|
73
|
+
Sends local run artifacts from `.reticle` to the linked project, honoring the sync policy, and collects decisions made on the dashboard. Each switch removes only its own part: with `sync.runs` off no runs are sent, but flows and records still go unless they are off too. `sync.screenshots` sends the screenshot of each step, and follows `sync.runs` when unset. `sync.video` sends the frames that Reticle takes about once a second between steps while it drives a tab, and follows `sync.screenshots` when unset. Set `"video": false` under `sync` to keep the frames on this machine and still send the step screenshots. Prints `{ ok, project, sent, pulled }`, where `sent` carries the accepted counts and, when the server refused anything, a `rejected` array naming each run's index and reason and a `refused` array for flows, capsules and derived records. `sent.records` lists only the records the server accepted.
|
|
74
74
|
|
|
75
75
|
Runs go up in batches, so a large backlog is never one oversized request.
|
|
76
76
|
|
|
@@ -82,7 +82,7 @@ npx @reticlehq/server sync --watch
|
|
|
82
82
|
|
|
83
83
|
What the platform cannot read is not sent at all, and a `notSent` array says why: a record kind an older platform does not know yet (this one alone leaves `ok` true), or a flow or run in a file version it does not read. Sending those would only be refused again on every cycle.
|
|
84
84
|
|
|
85
|
-
**A rejection is a failed sync.** If the server refuses any artifact, `ok` is `false` and the command exits `1`, even when other artifacts in the same bundle landed. The reason is kept as the last sync error, which `reticle status` reports, and the background daemon logs it once, until a cycle refuses nothing. A refused run is not offered again until its file changes
|
|
85
|
+
**A rejection is a failed sync.** If the server refuses any artifact, `ok` is `false` and the command exits `1`, even when other artifacts in the same bundle landed. The reason is kept as the last sync error, which `reticle status` reports, and the background daemon logs it once, until a cycle refuses nothing. A refused run, flow set or capsule set is not offered again until its file changes, the platform reports that it reads more, the CLI version changes, or seven days pass. Each of these offers it once more. Until then it is listed under `notRetried`, and the summary reads `refused, not retried: N run(s) (reason)`. A refused artifact never reaches the dashboard and is re-offered on every cycle, so partial loss is still loss. `ok: true` and exit `0` mean everything offered was accepted, which includes the common case of a repo that was already up to date. The accepted counts still report what did land, so a partial sync is visible as one.
|
|
86
86
|
|
|
87
87
|
### `reticle runs`
|
|
88
88
|
|
package/docs/cli/doctor.mdx
CHANGED
|
@@ -24,7 +24,7 @@ Human-readable lines on stdout, not the JSON log. A healthy setup (rows that pri
|
|
|
24
24
|
reticle doctor
|
|
25
25
|
node v22.14.0
|
|
26
26
|
chromium ✓ installed (chromium-1234)
|
|
27
|
-
daemon ✓ running on :4400 (pid 72698, v3.
|
|
27
|
+
daemon ✓ running on :4400 (pid 72698, v3.8.0)
|
|
28
28
|
sessions ✓ 1 page connected
|
|
29
29
|
bridge port 4400 (your app must dial THIS port, not your dev-server port)
|
|
30
30
|
agent link ✓ an MCP client attached here and called tools before (a record, not a live check)
|
|
@@ -64,6 +64,8 @@ When nothing has connected, the `sessions` line fails and the daemon's own diagn
|
|
|
64
64
|
| `desktop` | Only on a desktop project. Every Electron and Tauri misconfiguration here fails silently, so it is diagnosed explicitly |
|
|
65
65
|
| `coverage` | Only with a connected app. What Reticle sees in it, out of eight capabilities: what is missing, what is not seen yet, and, once a verdict recorded a gap, a prompt to paste into your coding agent |
|
|
66
66
|
| `unsynced` | Only when a project folder holds runs the platform never got. Names the folder and the command that sends them, usually `reticle connect` run there |
|
|
67
|
+
| `prompts` | For each agent used here, whether its prompt hook saves each prompt to `.reticle/`, and which agents rely on the MCP instructions instead. Says so when capture is off for the project or the machine |
|
|
68
|
+
| `sync` | Whether the daemon sends this project's work in the background, and why not when it does not: switched off, not linked, or nobody signed in. Adds the last push time and the last error |
|
|
67
69
|
|
|
68
70
|
## The chromium line
|
|
69
71
|
|
package/docs/cli/feedback.mdx
CHANGED
|
@@ -7,7 +7,7 @@ icon: comment
|
|
|
7
7
|
`reticle feedback` is the feedback channel as a command: no prompts, no editor, no account. It exists so the cost of telling the maintainers something is lower than the cost of shrugging and moving on.
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx @reticlehq/server feedback [--rating 1-5] [--bug] "what worked, what didn't"
|
|
10
|
+
npx @reticlehq/server feedback [--rating 1-5] [--bug] [--contact you@example.com] "what worked, what didn't"
|
|
11
11
|
npx @reticlehq/server feedback --agent --kind <bug|gap|ambiguity|feature_request|improvement|experience> "what happened"
|
|
12
12
|
```
|
|
13
13
|
|
|
@@ -21,6 +21,7 @@ The `--agent` form is for an agent that cannot reach the `reticle_session { acti
|
|
|
21
21
|
| `--bug` | boolean | `false` | Shorthand for `--kind bug` |
|
|
22
22
|
| `--kind K` | one of `bug`, `gap`, `ambiguity`, `feature_request`, `improvement`, `experience` | `experience`, or `bug` with `--bug` | The report's class. Wins over `--bug` |
|
|
23
23
|
| `--agent` | boolean | `false` | File as the agent, so agent reports never dilute the human rating signal |
|
|
24
|
+
| `--contact EMAIL` | one email address, at most 254 characters | unset | An address for a reply from the maintainers. Sent only when you give it. Anything that is not one plain address is refused |
|
|
24
25
|
|
|
25
26
|
Everything that is not a flag or a flag's value becomes the message, joined with spaces. Quoting is still your job for shell reasons.
|
|
26
27
|
|
|
@@ -29,27 +30,30 @@ Everything that is not a flag or a flag's value becomes the message, joined with
|
|
|
29
30
|
The payload is printed **before** it is sent, every time. A channel that carries free text and does not show you what it sends is asking for trust it has not earned.
|
|
30
31
|
|
|
31
32
|
```
|
|
32
|
-
sending {"stack":"vite","version":"3.
|
|
33
|
+
sending {"stack":"vite","version":"3.8.0","os":"darwin","ci":false}
|
|
33
34
|
redacted email (removed before sending)
|
|
34
35
|
thanks your feedback is in. it genuinely changes what gets built next.
|
|
35
36
|
```
|
|
36
37
|
|
|
38
|
+
With `--contact`, one more line names the address, after the `sending` line: `contact you@example.com (sent so that the maintainers can answer you)`.
|
|
39
|
+
|
|
37
40
|
`not sent` replaces the last line when the send failed or telemetry is off, and names the reason. Nothing is lost either way: a failed send is kept on disk and retried, and with telemetry off the report is written to disk instead.
|
|
38
41
|
|
|
39
42
|
Run with no message and no rating, it prints usage and exits `1`. Real capture:
|
|
40
43
|
|
|
41
44
|
```
|
|
42
|
-
usage: reticle feedback [--rating 1-5] [--bug] "what worked, what didn't"
|
|
45
|
+
usage: reticle feedback [--rating 1-5] [--bug] [--contact you@example.com] "what worked, what didn't"
|
|
43
46
|
agents: reticle feedback --agent --kind <bug|gap|ambiguity|feature_request|improvement|experience> "what happened"
|
|
44
47
|
your words go to the maintainers; nothing from your app is ever included.
|
|
48
|
+
--contact adds an address for a reply. It is sent only when you give it.
|
|
45
49
|
```
|
|
46
50
|
|
|
47
51
|
## Exit codes
|
|
48
52
|
|
|
49
|
-
| Code | Meaning
|
|
50
|
-
| ---- |
|
|
51
|
-
| `0` | The report was submitted, or attempted and reported as not sent
|
|
52
|
-
| `1` | No message and no rating, or an invalid `--rating` or `--
|
|
53
|
+
| Code | Meaning |
|
|
54
|
+
| ---- | --------------------------------------------------------------------------- |
|
|
55
|
+
| `0` | The report was submitted, or attempted and reported as not sent |
|
|
56
|
+
| `1` | No message and no rating, or an invalid `--rating`, `--kind` or `--contact` |
|
|
53
57
|
|
|
54
58
|
## Worked example
|
|
55
59
|
|
package/docs/cli/gate.mdx
CHANGED
|
@@ -49,7 +49,7 @@ One `reticle_gate` line. Real capture from this repository, with the flow lists
|
|
|
49
49
|
}
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
`downgraded`, `deletedCoverage`, `unflowed`, `coverageRegressed`, `unexecuted`, `coverageStale` and `coverageAccepted` appear only when they are non-empty, and none was present in that run. The coverage categories need a coverage ledger, which a project gets from `reticle_verify { action: "crawl", exhaustive: true }` or `reticle_verify { action: "coverage", app: true }`; without one they never fire. The CLI prints this as a single line of JSON; it is pretty-printed here to be readable.
|
|
52
|
+
`downgraded`, `deletedCoverage`, `unflowed`, `coverageRegressed`, `unexecuted`, `coverageStale` and `coverageAccepted` appear only when they are non-empty, `flowsWithoutSources` only when it is `true`, and none was present in that run. The coverage categories need a coverage ledger, which a project gets from `reticle_verify { action: "crawl", exhaustive: true }` or `reticle_verify { action: "coverage", app: true }`; without one they never fire. The CLI prints this as a single line of JSON; it is pretty-printed here to be readable.
|
|
53
53
|
|
|
54
54
|
## Exit codes
|
|
55
55
|
|
package/docs/cli/help.mdx
CHANGED
|
@@ -61,7 +61,7 @@ All commands: reticle help all One command: reticle <command> --help
|
|
|
61
61
|
|
|
62
62
|
## Only in `help all`
|
|
63
63
|
|
|
64
|
-
`sync`, `runs`, `config`, `affected`, `report`, `context`, `mcp`, `serve`, `drive`, `setup`, `license`, `rollback` and `version`. They all work the same as always; they are left out of the short list because most people never type them. See the [CLI reference](/cli) for one row per command, including the renamed and removed ones.
|
|
64
|
+
`sync`, `runs`, `config`, `affected`, `report`, `context`, `hook`, `mcp`, `serve`, `drive`, `setup`, `license`, `rollback` and `version`. They all work the same as always; they are left out of the short list because most people never type them. See the [CLI reference](/cli) for one row per command, including the renamed and removed ones.
|
|
65
65
|
|
|
66
66
|
## Errors print it too
|
|
67
67
|
|
package/docs/cli/init.mdx
CHANGED
|
@@ -10,7 +10,7 @@ icon: wand-magic-sparkles
|
|
|
10
10
|
npx @reticlehq/server init [--env KEY=VALUE]... [--app <dir>] [--license <key>] [--json]
|
|
11
11
|
[--files-only] [--relaunch] [--no-open] [--no-agents] [--url <app url>]
|
|
12
12
|
[--timeout S] [--dry-run] [--hooks] [--port N] [--no-mcp] [--no-install]
|
|
13
|
-
[--start] [--capture-bodies] [--no-first-run]
|
|
13
|
+
[--start] [--capture-bodies] [--no-first-run] [--new-id] [--no-prompt-capture]
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
## Flags
|
|
@@ -21,10 +21,12 @@ npx @reticlehq/server init [--env KEY=VALUE]... [--app <dir>] [--license <key>]
|
|
|
21
21
|
| `--port N` | number | unset (resolves to `4400`) | Bridge port to write into the config |
|
|
22
22
|
| `--no-mcp` | boolean | `false` (MCP is registered) | Skip the MCP registration **and** the agent rule files (`CLAUDE.md`, `AGENTS.md`, `.cursor`) and the `/reticle` command |
|
|
23
23
|
| `--no-install` | boolean | `false` (deps are installed) | Do not run the install. The step becomes `[–]` ("skipped (--no-install); install them yourself: …") with the install command for you to run by hand, rather than vanishing from the plan |
|
|
24
|
+
| `--new-id` | boolean | `false` | Give this checkout a project id of its own. A copied repository keeps the original's `.reticle.json`, and Reticle refuses a session from a second checkout of one id as ambiguous. This replaces `projectId` in this checkout's `.reticle.json` (and in the agent-root copy that names the same id) with the id derived for this folder, and keeps every other field. Nothing in the original checkout changes |
|
|
24
25
|
| `--app <dir>` | string | unset | Pick which app to wire in a monorepo, without changing directory. On its own it implies `--files-only` |
|
|
25
26
|
| `--start` | boolean | `false` | With `--app`, also boot the app the way a plain `init` does |
|
|
26
27
|
| `--capture-bodies` | boolean | `false` | Write `captureNetworkBodies: true` into the Vite plugin call, so request and response bodies are captured |
|
|
27
28
|
| `--no-first-run` | boolean | `false` | Connect and stop, without the coverage summary |
|
|
29
|
+
| `--no-prompt-capture` | boolean | `false` (the hook is installed) | Do not install the prompt hook in each agent's project config. See [prompt capture](/prompt-capture) |
|
|
28
30
|
| `--hooks` | boolean | `false` | Also add a print-only Stop hook to `.claude/settings.json`, merged into what is there. When the agent stops without a claim that held, it prints one line; it never blocks. See [`reticle report`](/cli/report) |
|
|
29
31
|
| `--env KEY=VALUE` | string, repeatable | none | What the app needs to reach a usable state: a key from `.env.example`, a mock backend, a variable that skips an auth wall. A value may contain spaces and `=` |
|
|
30
32
|
| `--license <key>` | string | unset | Write an enterprise license key to `.env` and keep `.env` out of git |
|
|
@@ -42,47 +44,50 @@ npx @reticlehq/server init [--env KEY=VALUE]... [--app <dir>] [--license <key>]
|
|
|
42
44
|
command go with it, because all three only make sense once the tools are reachable.
|
|
43
45
|
</Warning>
|
|
44
46
|
|
|
47
|
+
## When init runs, and when it asks for a hand
|
|
48
|
+
|
|
49
|
+
Your agent runs `init` only when you agree. The first `reticle_session` call in a project that was never wired changes no file. It offers the zero-install lease, which checks the running app with nothing installed. `reticle init`, `reticle connect` and a setup request from you still wire the app.
|
|
50
|
+
|
|
51
|
+
Some apps get a `⚠` manual step instead of an edit:
|
|
52
|
+
|
|
53
|
+
- **An Electron app with a static `index.html`.** A packaged renderer can also run on `localhost`, so init does not write the localhost-only snippet or `reticle.local.js`. Connect only in development, for example only when `!app.isPackaged`. Keep `reticle.local.js` out of the package: electron-builder `files: ["!reticle.local.js"]`, or Electron Forge `packagerConfig.ignore: [/reticle\.local\.js$/]`.
|
|
54
|
+
- **A Vite config whose `plugins` is a call or the shorthand `{ plugins }`.** Init leaves the config unchanged and tells you where to add `reticle()`.
|
|
55
|
+
|
|
56
|
+
When `~/.reticle` cannot be written (a sandboxed agent host), init writes the dev server log to `.reticle/logs/` in the project and prints where it is.
|
|
57
|
+
|
|
45
58
|
## What it prints
|
|
46
59
|
|
|
47
|
-
A plan, one line per step, each with a status mark: `✓` written, `·` already in place or left alone, `⚠` needs a hand, `–` deliberately skipped by a flag, `ℹ` done, but incomplete in a way that matters. Captured from a real `--dry-run` inside `apps/bench-app
|
|
60
|
+
A plan, one line per step, each with a status mark: `✓` written, `·` already in place or left alone, `⚠` needs a hand, `–` deliberately skipped by a flag, `ℹ` done, but incomplete in a way that matters. Captured from a real `--dry-run` inside `apps/bench-app`, trimmed to one row of each kind:
|
|
48
61
|
|
|
49
62
|
```
|
|
50
63
|
reticle init (dry run, no files written)
|
|
51
64
|
in /Users/you/reticle/apps/bench-app
|
|
52
65
|
|
|
53
66
|
[·] MCP server (Claude, global) → global (claude user scope)
|
|
54
|
-
reticle already registered (install once, used by every project)
|
|
55
67
|
[·] MCP server (Cursor) → /Users/you/.cursor/mcp.json
|
|
56
|
-
reticle already registered with Cursor
|
|
57
68
|
[⚠] MCP server (Codex CLI) → /Users/you/.codex/config.toml
|
|
58
69
|
add this to /Users/you/.codex/config.toml by hand:
|
|
59
70
|
[mcp_servers.reticle]
|
|
60
71
|
command = "npx"
|
|
61
72
|
args = ["@reticlehq/server", "mcp"]
|
|
62
|
-
|
|
63
73
|
[✓] Agent verification rule → CLAUDE.md
|
|
64
|
-
teach the agent to verify features with Reticle after building them
|
|
65
74
|
[✓] Agent verification rule → AGENTS.md
|
|
66
|
-
teach the agent to verify features with Reticle after building them
|
|
67
75
|
[✓] Full agent rules → RETICLE.md
|
|
68
|
-
the reference the always-loaded rule points at (when NOT to verify, recovery, feedback)
|
|
69
76
|
[✓] The /reticle command → .claude/commands/reticle.md
|
|
70
|
-
|
|
77
|
+
[✓] Claude Code resume-after-compaction hook → .claude/settings.json
|
|
78
|
+
[✓] Prompt capture: Claude Code → .claude/settings.json
|
|
79
|
+
[ℹ] Prompt capture → .reticle/request.json
|
|
71
80
|
[✓] Install dependencies → package.json
|
|
72
|
-
pnpm add -D @reticlehq/react@3.7.0 @reticlehq/vite-plugin@3.7.0
|
|
73
81
|
[✓] Reticle config → .reticle.json
|
|
74
|
-
write project config (framework + port)
|
|
75
82
|
[✓] Vite plugin → vite.config.ts
|
|
76
|
-
add reticle() to plugins (also injects connect())
|
|
77
83
|
[·] Capabilities + store → src/reticle-dev.ts
|
|
78
|
-
file exists, left alone, it is yours to edit
|
|
79
84
|
|
|
80
85
|
Restart your dev server (`vite`).
|
|
81
86
|
```
|
|
82
87
|
|
|
83
|
-
|
|
88
|
+
`init` pins the packages to the version of Reticle you are running. When the `codex` binary is on your PATH, the Codex row is not a hand edit: it reads `[✓] MCP server (Codex CLI)` and registers through `codex mcp add reticle -- npx @reticlehq/server mcp`.
|
|
84
89
|
|
|
85
|
-
Below the plan it also prints the two things that actually finish the install: restart your agent so it re-reads its MCP server list, then run `npx @reticlehq/server status` to confirm the app connected.
|
|
90
|
+
Below the plan it also prints the two things that actually finish the install: restart your agent so it re-reads its MCP server list, then run `npx @reticlehq/server status` to confirm the app connected. A successful run ends with one more line, `Tell us what you are building: https://discord.gg/BwAbzv9ZRz`. A dry run and a failed run do not print it.
|
|
86
91
|
|
|
87
92
|
With `--no-mcp`, the whole MCP and rules group collapses into one skipped line:
|
|
88
93
|
|
|
@@ -103,7 +108,6 @@ Several apps found in this workspace. Re-run `reticle init` for the one you want
|
|
|
103
108
|
reticle init --app apps/large-dom-bench
|
|
104
109
|
reticle init --app apps/next-smoke
|
|
105
110
|
reticle init --app apps/tauri-smoke
|
|
106
|
-
reticle init --app apps/vibe-builder-demo
|
|
107
111
|
```
|
|
108
112
|
|
|
109
113
|
Given `--app`, it writes that app's files and starts nothing: no daemon and no dev server, since a monorepo app's dev server is often run from the root. Add `--start` to boot it the way a plain `init` does. It says which directory it moved to before printing the plan:
|
package/docs/cli/mcp.mdx
CHANGED
|
@@ -16,7 +16,7 @@ This is what `reticle init` registers, so you rarely type it yourself.
|
|
|
16
16
|
|
|
17
17
|
| Flag | Type | Default | What it does |
|
|
18
18
|
| --- | --- | --- | --- |
|
|
19
|
-
| `--port N` | number | `
|
|
19
|
+
| `--port N` | number | `RETICLE_PORT`, else the port in `.reticle.json`, else `4400` | The preferred bridge port. When this project's daemon runs, the proxy uses it on any port. When another project's daemon holds the preferred port, the proxy uses a free port. A wake resolves the port again |
|
|
20
20
|
| `--drive <url>` | string | unset | Have the daemon launch its own browser at this URL, so the agent has autonomous control without relying on your tab |
|
|
21
21
|
| `--headless` | boolean | on when `CI` or `RETICLE_HEADLESS` is set, or on Linux with no display | Hide that browser |
|
|
22
22
|
| `--headed` | boolean | on otherwise | Show it |
|
|
@@ -26,11 +26,14 @@ This is what `reticle init` registers, so you rarely type it yourself.
|
|
|
26
26
|
|
|
27
27
|
## The rule this command lives by
|
|
28
28
|
|
|
29
|
-
The proxy **is** the MCP server the editor launched. Nothing respawns it, so an uncaught throw here is what a user experiences as "the MCP server disconnected".
|
|
29
|
+
The proxy **is** the MCP server the editor launched. Nothing respawns it, so an uncaught throw here is what a user experiences as "the MCP server disconnected". Seven behaviours follow from that:
|
|
30
30
|
|
|
31
31
|
- Crash handlers write to the proxy's own log file, not just stderr, because the editor swallows stderr.
|
|
32
32
|
- A daemon that is not there is not fatal. The proxy answers `initialize` itself, serves the cached tool catalog, and retries a daemon on every client request. Present and complaining beats absent, because absent needs a human.
|
|
33
33
|
- Reconnect is self-healing: if the daemon exited, crashed, was stopped, or shut itself down as idle, the reconnect path spawns a new one rather than retrying a dead port until the budget runs out.
|
|
34
|
+
- A wake resolves the port again. When another project's daemon took the port after an idle exit, the proxy finds this project's daemon where it moved, or starts one on a free port, and connects there.
|
|
35
|
+
- After an update, a proxy that meets an older daemon with no tab and no other agent attached stops it and starts the daemon of its own release. When a tab or another agent is attached, or the daemon is older than 3.6.0, the daemon stays and the proxy describes the version difference.
|
|
36
|
+
- A short drop of the link does not end your session. Each proxy sends a fixed id on every connect, so it keeps its identity, its leases and its tab. The daemon waits 10 seconds after the last agent detaches before it ends the browser sessions. A daemon that has served a tool call counts an agent that attached in the last 30 minutes as attached, so a client that starts a new proxy for each turn (Codex) does not wait for a cold start.
|
|
34
37
|
- A proxy with no client traffic and no work in flight exits after 24 hours, so abandoned editor sessions do not leave process pairs behind forever. Set `RETICLE_MCP_PROXY_IDLE_MS=0` to disable that watcher, or set an explicit millisecond window.
|
|
35
38
|
|
|
36
39
|
## What it prints
|
package/docs/cli/open.mdx
CHANGED
|
@@ -7,7 +7,7 @@ icon: window-maximize
|
|
|
7
7
|
`reticle open` is the one-command "show me the app". It resolves the port, makes sure a daemon is up, and then either reuses the tab that is already connected or hands the URL to your operating system's default browser. It never opens the browser Reticle drives.
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx @reticlehq/server open [url] [--port N]
|
|
10
|
+
npx @reticlehq/server open [url] [--port N] [--navigate]
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Arguments and flags
|
|
@@ -16,17 +16,20 @@ npx @reticlehq/server open [url] [--port N]
|
|
|
16
16
|
| --- | --- | --- | --- |
|
|
17
17
|
| `url` | string, positional, optional | unset | The URL to open. Omit it to reuse a connected tab |
|
|
18
18
|
| `--port N` | number | `4400` (or `RETICLE_PORT`, or the port in `.reticle.json`) | Bridge port. If nothing is on it, `open` discovers a running daemon rather than making you hunt |
|
|
19
|
+
| `--navigate` | flag | off | When a tab of this project on the url's origin is connected but on another page, move that tab to the url and wait for it to arrive. Exits `1` when the move fails. Without it the tab is left where it is |
|
|
19
20
|
|
|
20
21
|
It is idempotent. Re-running never piles up duplicate tabs.
|
|
21
22
|
|
|
22
23
|
## What it prints
|
|
23
24
|
|
|
24
|
-
One `reticle_open` line, whose fields say which of
|
|
25
|
+
One `reticle_open` line, whose fields say which of these happened.
|
|
25
26
|
|
|
26
27
|
| Fields | Meaning |
|
|
27
28
|
| --- | --- |
|
|
28
29
|
| `reusing` | A connected tab was already on the right page. Nothing was opened |
|
|
29
30
|
| `reusing` + `requested` + `note` | A tab is connected on that origin but sitting on a different page. It was **left there**, not navigated. Drive it with `reticle_navigate` or open the URL yourself |
|
|
31
|
+
| `navigated` + `sessionId` (+ `landedOn`) | With `--navigate`: that tab was moved to the url and arrived. `sessionId` is the session it reconnected as, and `landedOn` names a redirect when the page ended somewhere else |
|
|
32
|
+
| `requested` + `note` (with `--navigate`) | The browser accepted the navigation but no page on the url reconnected in the wait window, so arrival was not observed |
|
|
30
33
|
| `opened` + `connected: true` | The URL went to the system default browser and a new Reticle session appeared within 8 seconds |
|
|
31
34
|
| `opened` + `connected: false` + `note` | The URL went to the system default browser and no session showed up within 8 seconds. Almost always means the app carries no SDK, or dials a different port |
|
|
32
35
|
| `error` | No app connected and no URL given, or the browser could not be launched |
|
package/docs/cli/report.mdx
CHANGED
|
@@ -33,7 +33,7 @@ An `unknown` is never counted as held. It is Reticle saying it could not tell, a
|
|
|
33
33
|
|
|
34
34
|
## As a Claude Code Stop hook
|
|
35
35
|
|
|
36
|
-
With `--hook` it prints nothing when a claim held or nothing in the tree changed, and otherwise one line, such as `Reticle: not verified. 3 claims: 1 failed, 2 unknown`, followed by the same invitation line. It prints Claude Code's `systemMessage` shape and always exits `0
|
|
36
|
+
With `--hook` it prints nothing when a claim held or nothing in the tree changed, and otherwise one line, such as `Reticle: not verified. 3 claims: 1 failed, 2 unknown`, followed by the same invitation line. It prints Claude Code's `systemMessage` shape and always exits `0`, so you see the line when the agent stops. It blocks the stop in one case only: a Harness drive that the agent started is still running (for at most 30 minutes from its start). Then it prints `{ "decision": "block", "reason": … }`, and the reason tells the agent to poll the drive until it ends. `reticle init --hooks` adds it for you, merged into whatever `.claude/settings.json` already holds. By hand:
|
|
37
37
|
|
|
38
38
|
```json
|
|
39
39
|
{
|
package/docs/cli/restart.mdx
CHANGED
|
@@ -31,7 +31,7 @@ Real capture, restarting over a running daemon (exit `0`), with the long `note`
|
|
|
31
31
|
Real capture, when the port is held by something that is not ours (exit `1`). Both `reason` strings are trimmed at the ellipsis:
|
|
32
32
|
|
|
33
33
|
```
|
|
34
|
-
{"t":"2026-08-15T18:43:57.317Z","event":"reticle_kill_refused","port":4498,"reason":"pid 78795 (\"Python\") is listening, and it is not a Reticle daemon ... it never answered /status and it is not the pid Reticle recorded. Killing it would be killing someone else's process.
|
|
34
|
+
{"t":"2026-08-15T18:43:57.317Z","event":"reticle_kill_refused","port":4498,"reason":"pid 78795 (\"Python\") is listening, and it is not a Reticle daemon ... it never answered /status and it is not the pid Reticle recorded. Killing it would be killing someone else's process. If that is what you meant, `reticle restart --force` stops it and starts Reticle there (`stop --force` never does); or start Reticle on another port.","holder":"Python"}
|
|
35
35
|
{"t":"2026-08-15T18:43:57.318Z","event":"reticle_restart_aborted","port":4498,"reason":"the port was not freed, so nothing was started ... the old holder is still there"}
|
|
36
36
|
```
|
|
37
37
|
|
package/docs/cli/rollback.mdx
CHANGED
|
@@ -24,10 +24,10 @@ Telemetry records the move as a `version_changed` event with `direction: "rollba
|
|
|
24
24
|
|
|
25
25
|
## Exit codes
|
|
26
26
|
|
|
27
|
-
| Code | Meaning
|
|
28
|
-
|
|
|
29
|
-
| `0`
|
|
30
|
-
| `1`
|
|
27
|
+
| Code | Meaning |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| `0` | The previous version was reinstalled and the process exited. Also `0` under `npx`, where nothing is reinstalled: see the warning above |
|
|
30
|
+
| `1` | There was nothing to roll back to, or the restore threw |
|
|
31
31
|
|
|
32
32
|
## Worked example
|
|
33
33
|
|
package/docs/cli/serve.mdx
CHANGED
|
@@ -24,7 +24,9 @@ Most people never type this. Your agent runs [`reticle mcp`](/cli/mcp), which st
|
|
|
24
24
|
| `--http-port N` | number | unset (`7331`) | Port for that endpoint. Requires `--http`. |
|
|
25
25
|
| `--http-token T` | string | unset | Bearer token the endpoint requires. Requires `--http`. |
|
|
26
26
|
|
|
27
|
-
The HTTP flags are honoured or refused, never silently dropped: against an already-running daemon that does not serve the requested verify port, `serve --http` exits 1 and names both ports. A running daemon keeps the flags it was started with, so `reticle stop`, then serve again. A verify port that cannot be bound fails the daemon start with a `reticle_daemon_start_failed` line naming that port.
|
|
27
|
+
The HTTP flags and `--drive` are honoured or refused, never silently dropped: against an already-running daemon that does not serve the requested verify port, `serve --http` exits 1 and names both ports. A running daemon keeps the flags it was started with, so `reticle stop`, then serve again. A verify port that cannot be bound fails the daemon start with a `reticle_daemon_start_failed` line naming that port.
|
|
28
|
+
|
|
29
|
+
When `serve --drive <url>` finds a running daemon, it exits `1` rather than silently ignoring the URL. Its stderr includes a copyable `reticle drive` command with the requested URL. On a non-default bridge port it prefixes the command with `RETICLE_PORT=N` to select the existing daemon. The `drive` command does not support a `--port` flag; see [`reticle drive`](/cli/drive).
|
|
28
30
|
|
|
29
31
|
## What it prints
|
|
30
32
|
|
|
@@ -49,10 +51,10 @@ port 4498 is held by another process that is not a Reticle daemon ... a daemon c
|
|
|
49
51
|
|
|
50
52
|
## Exit codes
|
|
51
53
|
|
|
52
|
-
| Code | Meaning
|
|
53
|
-
|
|
|
54
|
-
| `0`
|
|
55
|
-
| `1`
|
|
54
|
+
| Code | Meaning |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| `0` | A daemon is up on the port and no incompatible flags were supplied |
|
|
57
|
+
| `1` | The port is held by a foreign process, the child never bound, or `--drive` was refused on an existing daemon |
|
|
56
58
|
|
|
57
59
|
<Note>
|
|
58
60
|
`serve` reports the **bind**, not the spawn. It used to exit `0` the moment it forked, while the
|
package/docs/cli/setup.mdx
CHANGED
|
@@ -20,4 +20,4 @@ One line per agent: `✓ <agent>` for a new registration, `✓ <agent> (already
|
|
|
20
20
|
|
|
21
21
|
Restart your coding agent. An agent reads its server list only when it starts. After the restart, the `reticle_*` tools are listed.
|
|
22
22
|
|
|
23
|
-
Codex CLI keeps a TOML config
|
|
23
|
+
Codex CLI keeps a TOML config. When the `codex` binary is on your PATH, Reticle registers through `codex mcp add`. Otherwise it prints the hand-edit lines above. Reticle then adds one line, `default_tools_approval_mode = "approve"`, under `[mcp_servers.reticle]` in `~/.codex/config.toml`. This line approves Reticle's own tools, so Codex does not ask before each call. Reticle changes no other line, and it keeps a mode that you set. To undo it, change that line to `default_tools_approval_mode = "prompt"`. Reticle does not change a mode that is already there.
|
package/docs/cli/status.mdx
CHANGED
|
@@ -34,7 +34,7 @@ reticle status
|
|
|
34
34
|
sessions ✓ 2 pages connected
|
|
35
35
|
http://localhost:5173/ (throttled, hidden)
|
|
36
36
|
http://localhost:7699/ (throttled, hidden)
|
|
37
|
-
agent link
|
|
37
|
+
agent link ✓ your agent has read and used Reticle's tools
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
And with no daemon on the port:
|
|
@@ -43,7 +43,11 @@ And with no daemon on the port:
|
|
|
43
43
|
reticle status
|
|
44
44
|
daemon ✗ not running on :4999
|
|
45
45
|
port presence: free
|
|
46
|
-
agent link
|
|
46
|
+
agent link no agent has started Reticle on this port yet
|
|
47
|
+
no MCP client has started Reticle on this port, so either the server is not
|
|
48
|
+
registered with your client or nothing has attached since this record began:
|
|
49
|
+
register it with `npx @reticlehq/server init`, then restart your MCP client and
|
|
50
|
+
run status again.
|
|
47
51
|
next no daemon is running on this port, which is normal. An agent starts it when it
|
|
48
52
|
first calls a Reticle tool, and it exits again when idle. Ask your agent to verify
|
|
49
53
|
something, then run status again.
|
package/docs/cli/stop.mdx
CHANGED
|
@@ -22,7 +22,7 @@ npx @reticlehq/server stop [--port N] [--quiet] [--force]
|
|
|
22
22
|
|
|
23
23
|
## How it stops
|
|
24
24
|
|
|
25
|
-
1. `
|
|
25
|
+
1. Ask the daemon to stop with `POST /shutdown` on loopback, with the pairing token. The daemon then runs its normal shutdown path on every OS, Windows included. An older daemon without the route, or a refused request, gets `SIGTERM` instead. Then poll every 100ms.
|
|
26
26
|
2. Still alive after 5 seconds: `SIGKILL`. A daemon that ignores `SIGTERM` is wedged, which is the one situation this command exists for, and giving up there left the port held and a human reaching for `kill -9`.
|
|
27
27
|
3. Still alive 2 seconds after that: report `reticle_daemon_stop_timeout` with the pid and exit `1`. Surviving `SIGKILL` means the pid is not yours to kill, or it is an unkillable zombie. Neither is retryable.
|
|
28
28
|
|
|
@@ -79,7 +79,7 @@ With `--quiet` that same run prints nothing at all and still exits `0`.
|
|
|
79
79
|
1. Look up the listener with `lsof -nP -iTCP:<port> -sTCP:LISTEN`. Client sockets are excluded by construction, so the proxy is never a candidate.
|
|
80
80
|
2. It is Reticle's if it answers `/status`, **or** if it is the pid Reticle recorded for the port. `/status` outranks the pid file, so a daemon started from another checkout is still recognised as ours.
|
|
81
81
|
3. Anything else is refused, by name: it is someone else's process.
|
|
82
|
-
4. `SIGTERM
|
|
82
|
+
4. For a Reticle daemon, `POST /shutdown` first, as above; else `SIGTERM`. Then `SIGKILL` after 5 seconds, then report that it survived and exit `1`.
|
|
83
83
|
|
|
84
84
|
### What `--force` prints
|
|
85
85
|
|
|
@@ -94,7 +94,7 @@ Killed:
|
|
|
94
94
|
Refused, because the listener is not ours. This one was captured with `python3 -m http.server 4498` holding the port:
|
|
95
95
|
|
|
96
96
|
```
|
|
97
|
-
{"t":"2026-08-15T18:43:57.128Z","event":"reticle_kill_refused","port":4498,"reason":"pid 78795 (\"Python\") is listening, and it is not a Reticle daemon ... it never answered /status and it is not the pid Reticle recorded. Killing it would be killing someone else's process.
|
|
97
|
+
{"t":"2026-08-15T18:43:57.128Z","event":"reticle_kill_refused","port":4498,"reason":"pid 78795 (\"Python\") is listening, and it is not a Reticle daemon ... it never answered /status and it is not the pid Reticle recorded. Killing it would be killing someone else's process. If that is what you meant, `reticle restart --force` stops it and starts Reticle there (`stop --force` never does); or start Reticle on another port.","holder":"Python"}
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
Nothing to free:
|
package/docs/cli/telemetry.mdx
CHANGED
|
@@ -52,6 +52,10 @@ npx @reticlehq/server telemetry disable
|
|
|
52
52
|
<Card title="Exactly what is collected" icon="shield-check" href="/telemetry">
|
|
53
53
|
The complete list, in plain language, and every way to switch it off.
|
|
54
54
|
</Card>
|
|
55
|
-
<Card
|
|
55
|
+
<Card
|
|
56
|
+
title="Every event, in schema detail"
|
|
57
|
+
icon="database"
|
|
58
|
+
href="https://github.com/reticlehq/reticle/blob/main/contributing/telemetry/events.md"
|
|
59
|
+
>
|
|
56
60
|
The contributor reference: payload blocks, field types, and what each event exists to answer.
|
|
57
61
|
</Card>
|
package/docs/cli/try.mdx
CHANGED
|
@@ -12,12 +12,12 @@ npx @reticlehq/server try <url> [--persona <who>]
|
|
|
12
12
|
|
|
13
13
|
The app needs nothing installed. A page with no Reticle SDK gets one supplied for the drive, so verdicts cover the DOM, network, console and routes. There is no component state and no source `file:line` until you run [`reticle init`](/cli/init).
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Link the folder first
|
|
16
16
|
|
|
17
|
-
The drive runs on the Reticle platform, so `try` needs a linked folder.
|
|
17
|
+
The drive runs on the Reticle platform, so `try` needs a linked folder. Being signed in is not enough. In a folder that is not linked it drives nothing and says:
|
|
18
18
|
|
|
19
19
|
```
|
|
20
|
-
|
|
20
|
+
Link this folder first: reticle connect. It signs you in if you are not, and it is free, no card.
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
Run [`reticle connect`](/cli/cloud) in the folder, then run `try` again. It exits `1` in this case.
|
|
@@ -32,7 +32,7 @@ Run [`reticle connect`](/cli/cloud) in the folder, then run `try` again. It exit
|
|
|
32
32
|
## What happens
|
|
33
33
|
|
|
34
34
|
1. `try` asks the platform for one free drive. If the workspace needs a card first, it prints the platform's message and the plan page, then exits `1` without opening anything.
|
|
35
|
-
2. It opens the URL in a window you can watch, through the Reticle daemon
|
|
35
|
+
2. It opens the URL in a window that you can watch, through the Reticle daemon. It starts the daemon if none is running.
|
|
36
36
|
3. The Harness drives for up to two minutes and 40 steps, and records what it drove as saved flows.
|
|
37
37
|
4. It prints the result and sends the run to your dashboard, the same way [`reticle sync`](/cli/cloud#reticle-sync) does.
|
|
38
38
|
|
|
@@ -56,7 +56,7 @@ If the run could not be sent, `try` says so, keeps the run on this machine and t
|
|
|
56
56
|
|
|
57
57
|
## Exit codes
|
|
58
58
|
|
|
59
|
-
| Code | When
|
|
60
|
-
|
|
|
61
|
-
| `0`
|
|
62
|
-
| `1`
|
|
59
|
+
| Code | When |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `0` | The drive ran. Broken journeys are a finding, not a failure of the command |
|
|
62
|
+
| `1` | The folder is not linked, no free drive was granted, the drive could not run, or an argument was wrong |
|
package/docs/cli/update.mdx
CHANGED
|
@@ -15,9 +15,9 @@ No flags.
|
|
|
15
15
|
## What it does, in order
|
|
16
16
|
|
|
17
17
|
1. Ask the registry what is available.
|
|
18
|
-
2. Compare by **direction
|
|
18
|
+
2. Compare by **direction**. Reticle installs a registry version only when it is newer than the running version. It never installs an older one.
|
|
19
19
|
3. Nothing newer: if this project's SDK is older than the CLI, bring it up to the CLI's version; then log `reticle_update` with `ok: false` and `message: "already on the latest version"`, and stop.
|
|
20
|
-
4. Otherwise
|
|
20
|
+
4. Otherwise, update the Reticle block in the agent rule files that already have one. Then update the **app's SDK first**, so that the CLI and the SDK stay on the same version.
|
|
21
21
|
5. Then apply the CLI update, which execs and exits. Your agent client restarts it.
|
|
22
22
|
|
|
23
23
|
## What it prints
|
|
@@ -27,6 +27,8 @@ No flags.
|
|
|
27
27
|
| `reticle_update` | `ok`, and either `from` and `to`, or `message` and `version` |
|
|
28
28
|
| `reticle_update_sdk` | `synced`, `packages`, `to`, `packageManager`. Or `synced: false` with `reason: "no @reticlehq packages in this project"` |
|
|
29
29
|
| `reticle_update_sdk_failed` | A `hint` naming the exact command to run by hand |
|
|
30
|
+
| `reticle_update_applying`, `reticle_update_applied` | `version`, `executionKind` (`global`, `local` or `npx`) |
|
|
31
|
+
| `reticle_update_npx_strategy` | `note`: under `npx` nothing is installed; the next start fetches the new version |
|
|
30
32
|
| `reticle_rules_refreshed` | `files`, `to`: the agent rule files whose Reticle block was brought up to the new version |
|
|
31
33
|
| `reticle_update_failed` | The error |
|
|
32
34
|
|
|
@@ -57,7 +59,8 @@ npx @reticlehq/server update
|
|
|
57
59
|
```
|
|
58
60
|
|
|
59
61
|
<Warning>
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
A daemon that is already running keeps its own version. When no tab and no other agent is attached
|
|
63
|
+
to it, your agent's new MCP server stops it and starts the new version. When a tab or another
|
|
64
|
+
agent is attached, the old daemon keeps running. Run [`reticle restart`](/cli/restart) to start
|
|
65
|
+
the new version now.
|
|
63
66
|
</Warning>
|
package/docs/cli/verify.mdx
CHANGED
|
@@ -7,7 +7,7 @@ icon: circle-check
|
|
|
7
7
|
`reticle verify` is the CI command: no model in the loop, no MCP. On a free port it boots the engine in drive mode, waits for the in-page SDK to dial back, replays every saved flow, renders the verdict, and exits. When a Reticle daemon already owns the port, it asks that daemon to replay the flows instead.
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx @reticlehq/server verify <url> [--headed] [--timeout N] [--storage-state <file>]
|
|
10
|
+
npx @reticlehq/server verify <url> [--headed] [--timeout N] [--storage-state <file>] [--expect <json> | --expect-file <path>]
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
It uses the same runner and the same verdict as the MCP and HTTP paths, so a platform agent that can only run a shell command gets a byte-identical artifact.
|
|
@@ -18,16 +18,23 @@ It uses the same runner and the same verdict as the MCP and HTTP paths, so a pla
|
|
|
18
18
|
| --- | --- | --- | --- |
|
|
19
19
|
| `url` | string, positional, **required** | none | The preview URL to drive |
|
|
20
20
|
| `--headed` | boolean | `false` (headless) | Show the browser |
|
|
21
|
-
| `--timeout N` | number, ms | `15000` | How long to wait for a browser session to dial back |
|
|
21
|
+
| `--timeout N` | number, ms | `15000` | How long to wait for a browser session to dial back. With `--expect`, how long the predicate may take to come true instead, default `4000` |
|
|
22
22
|
| `--storage-state <file>` | string | unset | A Playwright storage state file. This is how you verify flows behind a login without scripting the login every time |
|
|
23
|
-
| `--results-json <file>` | string | unset | Also write one verdict per journey to this file: `{ verdict, results: [{ journey, verdict, reason? }] }`, each verdict `yes`, `no` or `unknown`. A skipped journey is `unknown`, and the run is `yes` only when every journey is. Written when verify boots its own browser and a run finishes; a refusal before that writes nothing. The [GitHub Action](https://github.com/reticlehq/reticle/tree/main/action) posts this file |
|
|
23
|
+
| `--results-json <file>` | string | unset | Also write one verdict per journey to this file: `{ verdict, results: [{ journey, verdict, reason?, runId? }] }`, each verdict `yes`, `no` or `unknown`. A skipped journey is `unknown`, and the run is `yes` only when every journey is. `runId` names the run the journey came from, and is set only when that run reached the platform. Written when verify boots its own browser and a run finishes; a refusal before that writes nothing. The [GitHub Action](https://github.com/reticlehq/reticle/tree/main/action) posts this file |
|
|
24
24
|
| `--port N` | number | `RETICLE_PORT`, else the project's port, else `4400` | The bridge port the app dials |
|
|
25
25
|
| `--session-id <id>` | string | unset | Use a tab that is already connected |
|
|
26
26
|
| `--select <label>` | string, repeatable | unset | Verify only flows carrying this label |
|
|
27
|
-
| `--expect '<json predicate>'` / `--expect-file <path>` | string | unset | One verdict on one predicate, no saved flows needed. Asks the daemon that owns the port and never starts one; with no daemon it refuses. Exits `0` only on `verified: "yes"`. Cannot be combined with `--storage-state` |
|
|
28
|
-
| `--explore` / `--persona "<who does what>"` | boolean / string | off | No saved flows yet? The Harness drives the app and records them. `--persona` implies `--explore` |
|
|
27
|
+
| `--expect '<json predicate>'` / `--expect-file <path>` | string | unset | One verdict on one predicate, no saved flows needed. Asks the daemon that owns the port and never starts one; with no daemon it refuses. Waits up to `--timeout` for the predicate, the way `reticle_assert { action: "wait" }` does, so a request still in flight after the page loads is waited for. Exits `0` only on `verified: "yes"`. Cannot be combined with `--storage-state` |
|
|
28
|
+
| `--explore` / `--persona "<who does what>"` | boolean / string | off | No saved flows yet? The Harness drives the app and records them. `--persona` implies `--explore`. Needs a linked project (`reticle connect`, or `RETICLE_API_KEY` in CI). It runs at any instrumentation score |
|
|
29
29
|
| `--confirm-dangerous` | boolean | off | Let this run press the controls the replay guard holds as destructive, such as a "Place order" or "Delete" button in a saved flow. Without it such a step is refused, so a checkout flow cannot pass. It covers this run only and is never saved into a flow. |
|
|
30
30
|
|
|
31
|
+
On Windows PowerShell, write the predicate to a file and pass `--expect-file` so the JSON never goes through shell quoting:
|
|
32
|
+
|
|
33
|
+
```powershell
|
|
34
|
+
'{"kind":"text","contains":"Saved"}' | Set-Content expect.json
|
|
35
|
+
npx @reticlehq/server verify http://localhost:3000 --expect-file expect.json
|
|
36
|
+
```
|
|
37
|
+
|
|
31
38
|
## What it prints
|
|
32
39
|
|
|
33
40
|
The rendered run report on stdout. On failure it names the cause on stderr instead, and there are two refusals worth knowing:
|