@reticlehq/server 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +122 -123
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +18 -2
- package/dist/command/cli/adhoc-verdict.js +70 -6
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +28 -105
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +34 -4
- package/dist/command/cli/cli-verify.js +81 -12
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +145 -333
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +15 -1
- package/dist/command/cli/cloud-login.js +67 -13
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.js +1 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +29 -8
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -178
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +14 -0
- package/dist/command/cli.js +103 -83
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +9 -1
- package/dist/command/daemon/daemon-resolve.js +49 -10
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +10 -1
- package/dist/command/setup/init/init-port.js +22 -2
- package/dist/command/setup/init/init-runtime.d.ts +12 -2
- package/dist/command/setup/init/init-runtime.js +96 -37
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +36 -8
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +1 -1
- package/dist/command/setup/run-setup.d.ts +29 -9
- package/dist/command/setup/run-setup.js +34 -28
- package/dist/command/setup/setup-command.d.ts +23 -0
- package/dist/command/setup/setup-command.js +57 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +38 -2
- package/dist/features/crawl/crawl.js +14 -1
- package/dist/features/exhaust/ledger.d.ts +14 -14
- package/dist/features/harness/drive-report.d.ts +39 -5
- package/dist/features/harness/drive-report.js +271 -54
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +1 -1
- package/dist/features/harness/drivers.js +1 -1
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/goals.d.ts +68 -7
- package/dist/features/harness/goals.js +289 -36
- package/dist/features/harness/harness.d.ts +30 -1
- package/dist/features/harness/harness.js +141 -7
- package/dist/features/harness/platform/local-apps.d.ts +36 -3
- package/dist/features/harness/platform/local-apps.js +81 -5
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +8 -2
- package/dist/features/harness/platform/remote-drive.js +22 -9
- package/dist/features/harness/platform/script.d.ts +57 -11
- package/dist/features/harness/platform/script.js +144 -12
- package/dist/features/harness/platform/server-driver.d.ts +17 -4
- package/dist/features/harness/platform/server-driver.js +29 -26
- package/dist/features/harness/platform-config.d.ts +38 -5
- package/dist/features/harness/platform-config.js +93 -8
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/script-run.d.ts +30 -1
- package/dist/features/harness/script/script-run.js +355 -48
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.js +22 -14
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +21 -2
- package/dist/hooks/driven-by.js +42 -2
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +26 -183
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
- package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
- package/dist/judgement/runs/artifact/run-store.js +175 -8
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +53 -5
- package/dist/judgement/runs/drive-run.js +234 -20
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +5 -2
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +2 -0
- package/dist/judgement/runs/verification-sync.js +36 -15
- package/dist/language/flows/decision.js +2 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +7 -2
- package/dist/language/flows/flow-anchor.js +10 -3
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +37 -3
- package/dist/language/flows/flow-replay-run.js +16 -18
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +18 -1
- package/dist/language/flows/flow-replay.js +22 -7
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-step-runners.d.ts +2 -0
- package/dist/language/flows/flow-step-runners.js +12 -6
- package/dist/language/flows/flow-store-for-session.js +5 -1
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +61 -62
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +69 -10
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
- package/dist/language/flows/recording/tape/recordings.js +60 -10
- package/dist/language/flows/replay.js +29 -6
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +200 -193
- package/dist/memory/cloud/cloud-config.d.ts +10 -1
- package/dist/memory/cloud/cloud-config.js +19 -5
- package/dist/memory/cloud/cloud-sync.js +3 -3
- package/dist/memory/cloud/harness-config.d.ts +49 -0
- package/dist/memory/cloud/harness-config.js +16 -20
- package/dist/memory/cloud/memory-scope.d.ts +17 -0
- package/dist/memory/cloud/memory-scope.js +22 -0
- package/dist/memory/cloud/sync-cycle.d.ts +32 -4
- package/dist/memory/cloud/sync-cycle.js +113 -12
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +114 -4
- package/dist/memory/cloud/sync-disk.js +26 -2
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +16 -1
- package/dist/memory/impact/account-watch.js +26 -1
- package/dist/memory/impact/impact-store.d.ts +1 -4
- package/dist/memory/impact/impact-store.js +32 -42
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +12 -0
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +42 -2
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/journal-recorder.js +46 -3
- package/dist/memory/journal/on-disk/retention.d.ts +5 -0
- package/dist/memory/journal/on-disk/retention.js +27 -2
- package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +38 -7
- package/dist/memory/project/artifact-root-resolver.js +33 -5
- package/dist/memory/project/artifact-root.d.ts +4 -3
- package/dist/memory/project/artifact-root.js +2 -2
- package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
- package/dist/memory/project/dir/reticle-dir.js +23 -2
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +2 -0
- package/dist/memory/project/session-root.js +9 -1
- package/dist/memory/project/sync-status.d.ts +46 -0
- package/dist/memory/project/sync-status.js +135 -1
- package/dist/memory/recall/memory-tools.js +46 -3
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.js +36 -8
- package/dist/portal/bridge/bridge.d.ts +9 -5
- package/dist/portal/bridge/bridge.js +66 -23
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +2 -0
- package/dist/portal/input/real-input.js +13 -10
- package/dist/portal/pool/browser-pool.d.ts +48 -0
- package/dist/portal/pool/browser-pool.js +120 -2
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +27 -5
- package/dist/portal/pool/playwright-launcher.js +59 -14
- package/dist/portal/pool/pool-contract.d.ts +21 -1
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.js +6 -1
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
- package/dist/portal/session/dev-server/dev-command.js +27 -1
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/live-control-tools.js +82 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
- package/dist/portal/session/no-session-diagnosis.js +31 -9
- package/dist/portal/session/no-session-next-action.d.ts +20 -0
- package/dist/portal/session/no-session-next-action.js +134 -61
- package/dist/portal/session/no-session-watch.js +179 -22
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/session-health.d.ts +11 -0
- package/dist/portal/session/session-health.js +3 -1
- package/dist/portal/session/session-info.js +2 -1
- package/dist/portal/session/session-manager.d.ts +18 -0
- package/dist/portal/session/session-manager.js +54 -3
- package/dist/portal/session/session-successor.d.ts +8 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session.d.ts +15 -28
- package/dist/portal/session/session.js +60 -61
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +7 -1
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +13 -1
- package/dist/status-payload.js +13 -1
- package/dist/surface/http-server.js +7 -1
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
- package/dist/surface/mcp/mcp-proxy.js +29 -8
- package/dist/surface/mcp/mcp.d.ts +23 -0
- package/dist/surface/mcp/mcp.js +34 -4
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.js +22 -14
- package/dist/surface/mcp/shared-params.js +1 -1
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act-sequence-tool.js +136 -27
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +48 -34
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.js +25 -15
- package/dist/surface/tools/browser-tools.js +43 -1
- package/dist/surface/tools/chat-drives.d.ts +75 -0
- package/dist/surface/tools/chat-drives.js +265 -21
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +10 -0
- package/dist/surface/tools/empty-session-list.js +45 -5
- package/dist/surface/tools/error-recovery.d.ts +8 -0
- package/dist/surface/tools/error-recovery.js +69 -5
- package/dist/surface/tools/explore-tools.d.ts +23 -2
- package/dist/surface/tools/explore-tools.js +377 -74
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +4 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +52 -73
- package/dist/surface/tools/harness-explore.js +177 -146
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +5 -0
- package/dist/surface/tools/harness-plan.js +7 -0
- package/dist/surface/tools/harness-script.d.ts +22 -0
- package/dist/surface/tools/harness-script.js +256 -38
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +8 -0
- package/dist/surface/tools/harness-toolset.js +27 -4
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +220 -93
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +20 -0
- package/dist/surface/tools/lease-seed.js +45 -1
- package/dist/surface/tools/lease-tools.d.ts +10 -1
- package/dist/surface/tools/lease-tools.js +119 -69
- package/dist/surface/tools/live-call-text.js +2 -2
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +11 -1
- package/dist/surface/tools/next-step.js +73 -18
- package/dist/surface/tools/observe-tools.js +43 -5
- package/dist/surface/tools/platform-moment.d.ts +60 -0
- package/dist/surface/tools/platform-moment.js +132 -4
- package/dist/surface/tools/read-tools.js +65 -14
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +68 -2
- package/dist/surface/tools/tool-kit.js +73 -1
- package/dist/surface/tools/tools.js +25 -13
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +27 -6
- package/dist/telemetry/hud-metrics.js +99 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +26 -2
- package/dist/telemetry/telemetry.js +102 -21
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +12 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +16 -5
- package/docs/README.md +2 -2
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +24 -27
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +13 -12
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +8 -3
- package/docs/cli/drive.mdx +12 -12
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +32 -15
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +13 -4
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +3 -2
- package/docs/cli.mdx +110 -41
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +5 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +5 -2
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +66 -64
- package/docs/human-control.md +15 -14
- package/docs/index.mdx +15 -43
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +22 -12
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +8 -8
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +11 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +58 -29
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +22 -24
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +13 -4
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +51 -45
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +7 -5
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +6 -5
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -249
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
|
@@ -31,16 +31,17 @@ if (import.meta.env.DEV) reticle.connect();
|
|
|
31
31
|
|
|
32
32
|
One instance, memoized on `globalThis` so hot module replacement does not create a second one.
|
|
33
33
|
|
|
34
|
-
| Method
|
|
35
|
-
|
|
|
36
|
-
| `connect`
|
|
37
|
-
| `connected`
|
|
38
|
-
| `signal`
|
|
39
|
-
| `state`
|
|
40
|
-
| `renderCommit`
|
|
41
|
-
| `describe`
|
|
42
|
-
| `endSession`
|
|
43
|
-
| `disconnect`
|
|
34
|
+
| Method | Signature |
|
|
35
|
+
| ------------------- | ---------------------------------------------------------- |
|
|
36
|
+
| `connect` | `(options?: ReticleConnectOptions) => void` |
|
|
37
|
+
| `connected` | `get connected(): boolean` |
|
|
38
|
+
| `signal` | `(name: string, data?: Record<string, unknown>) => void` |
|
|
39
|
+
| `state` | `(name: string, value: unknown) => void` |
|
|
40
|
+
| `renderCommit` | `(commits: number) => void` |
|
|
41
|
+
| `describe` | `(input: CapabilitiesInput) => void` |
|
|
42
|
+
| `endSession` | `() => void` |
|
|
43
|
+
| `disconnect` | `() => void` |
|
|
44
|
+
| `observeHotUpdates` | `(hot: unknown) => void` (called by the build integration) |
|
|
44
45
|
|
|
45
46
|
Everything else on the class is private. `Reticle` itself is exported for typing.
|
|
46
47
|
|
|
@@ -56,8 +57,13 @@ Every field is optional.
|
|
|
56
57
|
| `token` | `string` | Pairing token, required for a non-loopback page |
|
|
57
58
|
| `allowNonLocalhost` | `boolean` | Opt in to connecting from a non-localhost origin |
|
|
58
59
|
| `allowInProduction` | `boolean` | Opt in to connecting from a production build. Desktop apps need this |
|
|
60
|
+
| `testIdAttribute` | `string` | The attribute the app marks controls with, when it is not `data-testid` |
|
|
59
61
|
| `overlay` | `boolean` | The in-page overlay |
|
|
60
62
|
| `captureNetworkBodies` | `boolean` | Record request and response bodies |
|
|
63
|
+
| `networkBodyMaxChars` | `number` | Per-body cap for captured bodies (default 8192) |
|
|
64
|
+
| `captureErrorBodies` | `boolean` | Keep the body of a failed request even with body capture off (default true) |
|
|
65
|
+
| `sourceMapping` | `boolean` | Whether the build stamps source locations. Set by the build plugin |
|
|
66
|
+
| `exposePresenter` | `boolean` | Make Reticle's own presenter visible to tools. For Reticle contributors only |
|
|
61
67
|
| `root` | `string` | Repository root, so source paths come back relative |
|
|
62
68
|
| `sdkVersion` | `string` | Reported on the handshake for skew detection |
|
|
63
69
|
| `present` | `boolean` | Presenter mode |
|
package/docs/packages/core.mdx
CHANGED
|
@@ -27,7 +27,13 @@ npm i @reticlehq/core
|
|
|
27
27
|
| Subpath | What it is |
|
|
28
28
|
| --- | --- |
|
|
29
29
|
| `.` | The ESM barrel. Types at `dist/index.d.ts` |
|
|
30
|
+
| `./telemetry` | The analytics wire, for a Node-side importer that needs only that half |
|
|
31
|
+
| `./artifacts` | The on-disk and registry formats |
|
|
32
|
+
| `./hooks` | What Reticle says happened, for hook consumers |
|
|
33
|
+
| `./hud` | Constants shared by the daemon and the HUD panel |
|
|
34
|
+
| `./tour` | The onboarding tour |
|
|
30
35
|
| `./desktop-contract` | A CommonJS shim, generated at build, for the strings the desktop adapters share |
|
|
36
|
+
| `./source-constants` | A CommonJS shim, generated at build, for the source-stamp constants the build adapters share |
|
|
31
37
|
| `./schema/*.json` | Generated JSON Schema for the wire types |
|
|
32
38
|
| `./package.json` | The manifest |
|
|
33
39
|
|
|
@@ -38,7 +44,7 @@ npm i @reticlehq/core
|
|
|
38
44
|
|
|
39
45
|
## What the barrel exports
|
|
40
46
|
|
|
41
|
-
`src/index.ts` is a pure barrel: a stack of `export *` re-exports plus
|
|
47
|
+
`src/index.ts` is a pure barrel: a stack of `export *` re-exports plus two named-export lines. Grouped by what they are for, and not exhaustive:
|
|
42
48
|
|
|
43
49
|
### Wire constants
|
|
44
50
|
|
|
@@ -83,19 +89,20 @@ Pure, isomorphic, and safe on both sides of the wire:
|
|
|
83
89
|
import { RETICLE_IPC_GLOBAL, RETICLE_CAPTURE_CHANNEL } from '@reticlehq/core/desktop-contract';
|
|
84
90
|
```
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
Seven strings shared by the Electron preload and the Tauri crate, in CommonJS because a preload script is required before any ESM transform:
|
|
87
93
|
|
|
88
94
|
| Constant | Value |
|
|
89
95
|
| ------------------------------- | ---------------------------------------------------------- |
|
|
90
96
|
| `RETICLE_IPC_GLOBAL` | `__reticleIpc` |
|
|
91
97
|
| `RETICLE_CAPTURE_CHANNEL` | `__reticle:capture` |
|
|
98
|
+
| `RETICLE_WINDOW_CHANNEL` | `__reticle:window` |
|
|
92
99
|
| `RETICLE_CAPTURE_FILE_PREFIX` | `reticle-capture-` |
|
|
93
100
|
| `RETICLE_TAURI_CAPTURE_COMMAND` | `reticle_capture` |
|
|
94
101
|
| `RETICLE_FULL_PAGE_UNSUPPORTED` | `full-page-unsupported`, for a refused full-page capture |
|
|
95
102
|
| `RETICLE_NOT_COMPOSITED` | `window-not-composited`, for a window that had not painted |
|
|
96
103
|
|
|
97
104
|
<Warning>
|
|
98
|
-
The subpath exports those
|
|
105
|
+
The subpath exports those seven constants individually and nothing else. The `DESKTOP_CONTRACT`
|
|
99
106
|
record they are collected into exists on the ESM side only, so importing it here fails with
|
|
100
107
|
`Module '"@reticlehq/core/desktop-contract"' has no exported member 'DESKTOP_CONTRACT'`. Import
|
|
101
108
|
`DESKTOP_CONTRACT` from `@reticlehq/core` instead.
|
|
@@ -103,9 +110,9 @@ Six strings shared by the Electron preload and the Tauri crate, in CommonJS beca
|
|
|
103
110
|
|
|
104
111
|
## The JSON schemas
|
|
105
112
|
|
|
106
|
-
|
|
113
|
+
Nine files, generated at build from the zod definitions:
|
|
107
114
|
|
|
108
|
-
`reticle-message.json`, `reticle-event.json`, `hello-message.json`, `command-message.json`, `command-result.json`, `event-message.json`, `event-type.json`.
|
|
115
|
+
`reticle-message.json`, `reticle-event.json`, `hello-message.json`, `command-message.json`, `command-result.json`, `event-message.json`, `event-type.json`, `command-name.json`, `event-payloads.json`.
|
|
109
116
|
|
|
110
117
|
```ts
|
|
111
118
|
import schema from '@reticlehq/core/schema/reticle-message.json' with { type: 'json' };
|
|
@@ -49,12 +49,13 @@ It patches three methods, and each IPC call then surfaces to Reticle as a networ
|
|
|
49
49
|
| `ipcRenderer.sendSync` | Two-way, with its outcome |
|
|
50
50
|
| `ipcRenderer.send` | One-way, dispatched, with no outcome |
|
|
51
51
|
|
|
52
|
-
It then exposes `window.__reticleIpc` through the context bridge, with
|
|
52
|
+
It then exposes `window.__reticleIpc` through the context bridge, with four members used by the SDK rather than by you:
|
|
53
53
|
|
|
54
54
|
| Member | Signature | Notes |
|
|
55
55
|
| --- | --- | --- |
|
|
56
56
|
| `subscribe` | `(callback) => number` | Returns a token, or `-1` if the argument is not a function |
|
|
57
57
|
| `unsubscribe` | `(token) => void` | Real removal |
|
|
58
|
+
| `windowLabel` | `() => Promise<string \| undefined>` | The label the main process registered for this window, or `undefined` |
|
|
58
59
|
| `capture` | `(fullPage) => Promise<string \| null>` | Resolves to a capture file path, `null` when no main handler is installed, and propagates the explicit full-page refusal |
|
|
59
60
|
|
|
60
61
|
## The main process
|
|
@@ -66,7 +67,7 @@ const win = new BrowserWindow({/* ... */});
|
|
|
66
67
|
installReticleCapture(win);
|
|
67
68
|
```
|
|
68
69
|
|
|
69
|
-
`installReticleCapture(win): void` is a no-op on `null` or `undefined`, tracks the window until it closes, and registers the capture handler once for the whole app.
|
|
70
|
+
`installReticleCapture(win, options?): void` is a no-op on `null` or `undefined`, tracks the window until it closes, and registers the capture handler once for the whole app. `{ label: 'settings' }` names the window in `reticle_session { action: "list" }`; without it the window is listed by url and title.
|
|
70
71
|
|
|
71
72
|
The handler calls `webContents.capturePage()`, writes the PNG into a per-process `0700` captures directory as `reticle-capture-<n>.png`, and **returns the file path rather than the bytes**, because the transport has a 64KB cap. It refuses `fullPage: true` explicitly rather than silently returning a viewport shot, and it throws named reasons rather than one blanket silence: `full-page-unsupported` for that refusal, `window-not-composited` when the window had nothing painted yet, `no usable webContents to capture` when the window is gone. The preload re-throws the full-page refusal and turns everything else into `null`.
|
|
72
73
|
|
package/docs/packages/engine.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: gavel
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/engine` is the part of Reticle that DECIDES. It reads what happened in a running app and says whether the declared consequence held. It has no browser, no daemon and no command line: evidence goes in, a verdict comes out.
|
|
8
8
|
|
|
9
|
-
**Apache 2.0. Depends on [`@reticlehq/core`](/packages/core) and `zod`.**
|
|
9
|
+
**Apache 2.0. Depends on [`@reticlehq/core`](/packages/core), [`open-verification`](/packages/open-verification) and `zod`.**
|
|
10
10
|
|
|
11
11
|
## Why it is a separate package
|
|
12
12
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: '@reticlehq/eslint-plugin'
|
|
3
|
-
description:
|
|
3
|
+
description: Three lint rules that keep Reticle's signal layer and its comment hygiene self-enforcing.
|
|
4
4
|
icon: shield-check
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
`@reticlehq/eslint-plugin` is
|
|
7
|
+
`@reticlehq/eslint-plugin` is three ESLint rules that keep Reticle's signal layer and its comments self-enforcing. It is entirely optional: nothing in Reticle needs it, and you want it only once your app emits signals and you would like the compiler to notice when a new mutation forgets one.
|
|
8
8
|
|
|
9
9
|
It exists because conventions rot. Someone adds a mutation, forgets the signal, and every verdict for that flow quietly drops a grade. Nothing breaks, the tests still pass, the evidence just gets weaker. A lint rule is the only way a convention survives contact with a deadline.
|
|
10
10
|
|
|
@@ -16,12 +16,13 @@ npm i -D @reticlehq/eslint-plugin
|
|
|
16
16
|
|
|
17
17
|
## Exports
|
|
18
18
|
|
|
19
|
-
| Export
|
|
20
|
-
|
|
|
21
|
-
| `default`
|
|
22
|
-
| `rules`
|
|
23
|
-
| `requireSignalOnMutation` | The rule, exported individually
|
|
24
|
-
| `noInternalTags`
|
|
19
|
+
| Export | What it is |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `default` | The plugin object: `{ meta: { name: 'reticle' }, rules, configs }` |
|
|
22
|
+
| `rules` | `{ 'require-signal-on-mutation': ..., 'no-internal-tags': ..., 'no-runaway-comment': ... }` |
|
|
23
|
+
| `requireSignalOnMutation` | The rule, exported individually |
|
|
24
|
+
| `noInternalTags` | The rule, exported individually |
|
|
25
|
+
| `noRunawayComment` | The rule, exported individually |
|
|
25
26
|
|
|
26
27
|
## The rules
|
|
27
28
|
|
|
@@ -49,10 +50,14 @@ The check is scoped per function: a mutation and its signal must live in the sam
|
|
|
49
50
|
|
|
50
51
|
### `reticle/no-internal-tags`
|
|
51
52
|
|
|
52
|
-
Errors on internal design-doc reference codes and internal version strings appearing in comments, file names, directory names or test descriptions. **Message
|
|
53
|
+
Errors on internal design-doc reference codes and internal version strings appearing in comments, file names, directory names or test descriptions. **Message ids:** `internalTag` (in a comment or test description) and `pathTag` (in a file or directory name), each with a `{ tag }` placeholder. No options.
|
|
53
54
|
|
|
54
55
|
This one is mostly for contributors to Reticle itself, but the `recommended` config turns it on for everyone.
|
|
55
56
|
|
|
57
|
+
### `reticle/no-runaway-comment`
|
|
58
|
+
|
|
59
|
+
Errors on a single block comment longer than 60 lines, which is usually pasted output rather than prose. **Message id:** `runawayComment`, with `{ lines }` and `{ max }` placeholders. No options.
|
|
60
|
+
|
|
56
61
|
## The recommended config
|
|
57
62
|
|
|
58
63
|
One config, `recommended`:
|
|
@@ -71,14 +76,15 @@ Which is exactly:
|
|
|
71
76
|
rules: {
|
|
72
77
|
'reticle/require-signal-on-mutation': 'warn',
|
|
73
78
|
'reticle/no-internal-tags': 'error',
|
|
79
|
+
'reticle/no-runaway-comment': 'error',
|
|
74
80
|
},
|
|
75
81
|
}
|
|
76
82
|
```
|
|
77
83
|
|
|
78
84
|
<Warning>
|
|
79
|
-
`recommended` enables **
|
|
80
|
-
documented only the first rule, so the
|
|
81
|
-
individually if you want just the signal check.
|
|
85
|
+
`recommended` enables **all three** rules, and `no-internal-tags` and `no-runaway-comment` at
|
|
86
|
+
`error`. An older README documented only the first rule, so the other two can arrive as a
|
|
87
|
+
surprise. Enable the rules individually if you want just the signal check.
|
|
82
88
|
</Warning>
|
|
83
89
|
|
|
84
90
|
<Card title="Why signals are the strongest evidence" icon="tower-broadcast" href="/instrumentation">
|
package/docs/packages/next.mdx
CHANGED
|
@@ -10,7 +10,7 @@ icon: n
|
|
|
10
10
|
|
|
11
11
|
## Why it exists
|
|
12
12
|
|
|
13
|
-
Next users are on SWC. Telling them to switch to Babel for a dev tool would be a rude trade, and it would slow down every build they run. This adds a dev-only pre-loader for `.jsx` and `.
|
|
13
|
+
Next users are on SWC. Telling them to switch to Babel for a dev tool would be a rude trade, and it would slow down every build they run. This adds a dev-only pre-loader for `.jsx`, `.tsx` and `.js` files that contain JSX, and leaves the rest of the pipeline alone.
|
|
14
14
|
|
|
15
15
|
## Install and use
|
|
16
16
|
|
|
@@ -35,15 +35,16 @@ module.exports = withReticle({/* your config */});
|
|
|
35
35
|
### `.`
|
|
36
36
|
|
|
37
37
|
```ts
|
|
38
|
-
function withReticle<T = unknown>(nextConfig?: T): T;
|
|
38
|
+
function withReticle<T = unknown>(nextConfig?: T, options?: { sourceMapping?: boolean }): T;
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Returns the config unchanged when `NODE_ENV === 'production'
|
|
41
|
+
Returns the config unchanged when `NODE_ENV === 'production'`, unless `RETICLE_DEV=1` is set (for `NODE_ENV=production next dev`). `sourceMapping: false` skips the loader rules, for an app that renders through a non-DOM React reconciler. Otherwise it merges in:
|
|
42
42
|
|
|
43
43
|
| Addition | What it does |
|
|
44
44
|
| --- | --- |
|
|
45
|
-
| `webpack` | Pushes an `enforce: 'pre'` rule for `/\.(
|
|
46
|
-
| `turbopack` | On Next 15.3 and above only: rules for `*.tsx` and `*.jsx` pointing at `@reticlehq/next/loader` |
|
|
45
|
+
| `webpack` | Pushes an `enforce: 'pre'` rule for `/\.(tsx\|jsx\|js)$/`, excluding `node_modules`, using this package's loader. Your own `webpack` function still runs afterwards |
|
|
46
|
+
| `turbopack` | On Next 15.3 and above only: rules for `*.tsx` and `*.jsx` (and, on Next 16, the project's own `*.js`) pointing at `@reticlehq/next/loader` |
|
|
47
|
+
| `allowedDevOrigins` | Your own list plus the loopback hosts a Reticle-opened tab arrives on, on a Next that accepts the key (15.2.2 and above) |
|
|
47
48
|
| `env.NEXT_PUBLIC_RETICLE_URL` | The bridge URL: a valid `RETICLE_PORT` override, otherwise project daemon discovery and `.reticle.json` |
|
|
48
49
|
| `env.NEXT_PUBLIC_RETICLE_TOKEN` | The pairing token, when one exists on disk |
|
|
49
50
|
| `env.NEXT_PUBLIC_RETICLE_ROOT` | `process.cwd()`, so source paths come back repository-relative |
|
|
@@ -51,7 +52,7 @@ Returns the config unchanged when `NODE_ENV === 'production'`. Otherwise it merg
|
|
|
51
52
|
|
|
52
53
|
Daemon discovery reads `RETICLE_STATE_DIR` (default `~/.reticle`). Pairing tokens use `RETICLE_PAIRING_TOKEN_DIR` independently. The generated `ReticleDev` component reads `NEXT_PUBLIC_RETICLE_URL`; restart the dev server after changing these settings.
|
|
53
54
|
|
|
54
|
-
`readPairingToken()`
|
|
55
|
+
`readPairingToken()`, `discoverDaemonUrl()` and `knowsAllowedDevOrigins()` are also exported at runtime. They are not declared in `index.d.ts`, so TypeScript will not see them.
|
|
55
56
|
|
|
56
57
|
### `./loader`
|
|
57
58
|
|
|
@@ -60,7 +61,7 @@ declare function reticleNextLoader(this: unknown, source: string, inputMap?: unk
|
|
|
60
61
|
export = reticleNextLoader;
|
|
61
62
|
```
|
|
62
63
|
|
|
63
|
-
An async webpack loader. It skips anything that is not `.jsx` or `.
|
|
64
|
+
An async webpack loader. It skips anything that is not `.jsx`, `.tsx` or a `.js` file containing JSX, and anything under `node_modules`. It lazily imports `@reticlehq/babel-plugin` and runs `babel.transformAsync` with `configFile: false`, `babelrc: false`, `retainLines`, and source maps on.
|
|
64
65
|
|
|
65
66
|
<Note>
|
|
66
67
|
The loader never fails the build. Any error falls back to the original source, because a dev-only
|
|
@@ -37,4 +37,4 @@ npm install open-verification
|
|
|
37
37
|
|
|
38
38
|
## Versioning
|
|
39
39
|
|
|
40
|
-
The protocol has its own compatibility rules, stated in `VERSIONING.md` inside the package. It
|
|
40
|
+
The protocol has its own compatibility rules, stated in `VERSIONING.md` inside the package. It carries its own version, separate from the `@reticlehq/*` packages: the protocol does not change whenever Reticle does.
|
package/docs/packages/server.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: server
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/server` is the Reticle bridge, MCP server and CLI in one Node package. It hosts the WebSocket your app dials into, exposes the MCP tools your agent calls, and ships the `reticle` binary. **You do not add it to your project**: your agent runs it with `npx @reticlehq/server mcp`.
|
|
8
8
|
|
|
9
|
-
**Licensed under `
|
|
9
|
+
**Licensed under `FSL-1.1-ALv2` (the Functional Source License, converting to Apache 2.0), not Apache 2.0 like the SDK packages.** This is the package the enterprise terms apply to.
|
|
10
10
|
|
|
11
11
|
## Why it exists
|
|
12
12
|
|
|
@@ -24,9 +24,9 @@ The `bin` entry is `reticle`, so `npx @reticlehq/server <command>` works once it
|
|
|
24
24
|
|
|
25
25
|
## Dependencies
|
|
26
26
|
|
|
27
|
-
**Runtime:** `@modelcontextprotocol/sdk`, `@reticlehq/core`, `ws`, `zod`.
|
|
27
|
+
**Runtime:** `@modelcontextprotocol/sdk`, `@reticlehq/browser`, `@reticlehq/core`, `@reticlehq/engine`, `@reticlehq/init`, `open-verification`, `ws`, `zod`, `zod-to-json-schema`.
|
|
28
28
|
|
|
29
|
-
**Optional:** `playwright
|
|
29
|
+
**Optional:** `playwright` (also a peer dependency, `>=1.50`), `pixelmatch`, `pngjs`. Optional on purpose: Reticle observes the browser you already have. You only need Playwright for the paths that launch or diff one, which is `reticle drive`, `reticle verify`, and visual baselines.
|
|
30
30
|
|
|
31
31
|
## Exports map
|
|
32
32
|
|
|
@@ -50,7 +50,7 @@ await server.close();
|
|
|
50
50
|
|
|
51
51
|
| Option | Type | Default |
|
|
52
52
|
| --- | --- | --- |
|
|
53
|
-
| `port` | `number` | `RETICLE_PORT
|
|
53
|
+
| `port` | `number` | `4400`. The CLI resolves `RETICLE_PORT` before it calls `start` |
|
|
54
54
|
| `host` | `string` | `RETICLE_HOST`, else loopback. A non-loopback host requires a token |
|
|
55
55
|
| `token` | `string` | `RETICLE_TOKEN` |
|
|
56
56
|
| `allowedOrigins` | `string[]` | `RETICLE_ALLOWED_ORIGINS` |
|
|
@@ -71,7 +71,7 @@ await server.close();
|
|
|
71
71
|
|
|
72
72
|
### `RunningServer`
|
|
73
73
|
|
|
74
|
-
`bridge: Bridge`, `close(): Promise<void>`, and the optional `realInput`, `verifyPort`, `isIdle()`, `agentAttached()`, `token`.
|
|
74
|
+
`bridge: Bridge`, `close(): Promise<void>`, and the optional `realInput`, `verifyPort`, `isIdle()`, `agentAttached()`, `token`, `announceShutdown()`.
|
|
75
75
|
|
|
76
76
|
## What else the barrel exports
|
|
77
77
|
|
package/docs/packages/tauri.mdx
CHANGED
|
@@ -6,22 +6,17 @@ icon: rust
|
|
|
6
6
|
|
|
7
7
|
`reticle-tauri` is a Rust crate on crates.io, not an npm package. You need it only if your Tauri app should answer `reticle_screenshot`, or run headless in CI. Everything else about a Tauri app, including IPC observation, works without it.
|
|
8
8
|
|
|
9
|
-
It is versioned **
|
|
9
|
+
It is versioned in **lockstep** with the `@reticlehq/*` npm packages, so `3.7` here and there is the same release. **MIT licensed, unlike the npm packages. Edition 2021.**
|
|
10
10
|
|
|
11
11
|
## Why it exists, and why it is small
|
|
12
12
|
|
|
13
13
|
Tauri IPC observation needs nothing on the Rust side. An `invoke('load_todos')` already reaches Reticle as `ipc://load_todos` through the SDK in the webview. You only need this crate for two things: screenshots, and headless mode.
|
|
14
14
|
|
|
15
|
-
<Warning>
|
|
16
|
-
Do not expect this to match the npm version. Doing so would imply a release cadence the crate does
|
|
17
|
-
not have, and it would make every npm release a crates.io release for no reason.
|
|
18
|
-
</Warning>
|
|
19
|
-
|
|
20
15
|
## Install
|
|
21
16
|
|
|
22
17
|
```toml
|
|
23
18
|
[dependencies]
|
|
24
|
-
reticle-tauri = "3.
|
|
19
|
+
reticle-tauri = "3.7"
|
|
25
20
|
```
|
|
26
21
|
|
|
27
22
|
Its own dependencies are `tauri = "2.12"` (the Windows backend must use the same `webview2-com` and `windows` versions Tauri does, so it follows Tauri's minor version) plus the per-platform capture backends: `objc2` and friends on macOS, `webview2-com` and `windows` on Windows, `webkit2gtk` and `cairo-rs` on Linux and the BSDs.
|
|
@@ -34,6 +29,8 @@ tauri::Builder::default()
|
|
|
34
29
|
.on_page_load(reticle_tauri::on_page_load)
|
|
35
30
|
```
|
|
36
31
|
|
|
32
|
+
**Dev builds only.** In a release build the crate is inert: `reticle_capture` refuses and `on_page_load` does nothing, so the binary you sign and ship carries no Reticle capability. A release build you test with Reticle (a CI fixture) turns it on with `reticle-tauri = { version = "3.7", features = ["in-release"] }`.
|
|
33
|
+
|
|
37
34
|
Nothing is needed on the JavaScript side. Tauri has no preload stage, so the SDK reaches `reticle_capture` through Tauri's own internals.
|
|
38
35
|
|
|
39
36
|
## The public API
|
|
@@ -43,6 +40,9 @@ Nothing is needed on the JavaScript side. Tauri has no preload stage, so the SDK
|
|
|
43
40
|
| `reticle_capture` | `#[tauri::command] pub async fn reticle_capture(window: tauri::WebviewWindow, full_page: Option<bool>) -> Result<String, String>` |
|
|
44
41
|
| `on_page_load` | `pub fn on_page_load<R: Runtime>(webview: &Webview<R>, payload: &tauri::webview::PageLoadPayload<'_>)` |
|
|
45
42
|
| `FULL_PAGE_UNSUPPORTED` | `pub const FULL_PAGE_UNSUPPORTED: &str = "full-page-unsupported"` |
|
|
43
|
+
| `ACTIVE` | `pub const ACTIVE: bool`: true in a debug build, or a release build with `in-release` |
|
|
44
|
+
| `INERT_IN_RELEASE` | `pub const INERT_IN_RELEASE: &str`: what `reticle_capture` answers when the crate is inert |
|
|
45
|
+
| `inert_refusal` | `pub fn inert_refusal() -> Option<&'static str>` |
|
|
46
46
|
|
|
47
47
|
There are no public traits and no macros.
|
|
48
48
|
|
|
@@ -52,7 +52,7 @@ Runs on a blocking thread, writes a PNG into a per-process `0700` directory unde
|
|
|
52
52
|
|
|
53
53
|
### `on_page_load`
|
|
54
54
|
|
|
55
|
-
Hides the window on `PageLoadEvent::Finished` when the environment variable `RETICLE_HEADLESS=1` is set. That ordering matters: the window exists and renders, then it is hidden, so the capture path still works.
|
|
55
|
+
Hides the window on `PageLoadEvent::Finished` when the environment variable `RETICLE_HEADLESS=1` is set. That ordering matters: the window exists and renders, then it is hidden, so the capture path still works. On macOS it also keeps every window's webview scheduling while it is behind other windows (macOS 14 and later); on older macOS, headless moves the window offscreen instead of hiding it.
|
|
56
56
|
|
|
57
57
|
## The silent failure to know about
|
|
58
58
|
|
package/docs/packages/test.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: vial
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/test` is Reticle's spec runner for CI. It turns an interactive session into a suite that runs on every pull request, without an agent and without paying model tokens to re-derive the same checks. Install it when you want unattended verification; skip it if you only ever drive Reticle interactively through MCP.
|
|
8
8
|
|
|
9
|
-
**Licensed under `
|
|
9
|
+
**Licensed under `FSL-1.1-ALv2`. Depends on `@reticlehq/core` and `@reticlehq/server`. Optional peer dependency: `vitest ^3.2.6 || ^4.0.0`.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
npm i -D @reticlehq/test
|
|
@@ -47,10 +47,9 @@ await run.close();
|
|
|
47
47
|
## Writing specs
|
|
48
48
|
|
|
49
49
|
```ts
|
|
50
|
-
import { reticleTest
|
|
50
|
+
import { reticleTest } from '@reticlehq/test';
|
|
51
51
|
|
|
52
|
-
reticleTest('login grants a session', async (
|
|
53
|
-
const t = spec as TestContext;
|
|
52
|
+
reticleTest('login grants a session', async (t) => {
|
|
54
53
|
await t.fill('email', 'user@example.com');
|
|
55
54
|
await t.fill('password', 'hunter2');
|
|
56
55
|
await t.actAndWait('login-submit', 'click', { kind: 'signal', name: 'auth:granted' });
|
|
@@ -61,12 +60,7 @@ reticleTest('login grants a session', async (spec) => {
|
|
|
61
60
|
|
|
62
61
|
`reticleTest(name: string, fn: SpecFn): void` registers into a module-level registry. `register`, `getRegistered` and `clearRegistry` are exported for anyone driving it themselves.
|
|
63
62
|
|
|
64
|
-
|
|
65
|
-
`SpecFn` types its argument as `SpecContext`, which declares only `invoke`. The runner actually
|
|
66
|
-
hands the spec whatever `buildContext` returned, which is a `TestContext`. In plain JavaScript
|
|
67
|
-
this is invisible; in TypeScript you get `Property 'fill' does not exist on type 'SpecContext'`
|
|
68
|
-
unless you narrow it as above.
|
|
69
|
-
</Note>
|
|
63
|
+
`SpecFn` types its argument as `SpecContext`, which is `TestContext`, so the methods below are typed without a cast.
|
|
70
64
|
|
|
71
65
|
## The test context
|
|
72
66
|
|
|
@@ -35,7 +35,7 @@ Set `RETICLE_PORT` in the dev server or desktop build environment to use the sam
|
|
|
35
35
|
|
|
36
36
|
## Why it exists
|
|
37
37
|
|
|
38
|
-
`
|
|
38
|
+
In a production `vite build` the plugin injects nothing and swaps the browser SDK for an inert stub, so the bundle carries no Reticle runtime code. That is the guarantee that lets you leave it in the config permanently: there is no way to ship Reticle to your users by forgetting to remove a line.
|
|
39
39
|
|
|
40
40
|
## What it injects
|
|
41
41
|
|
|
@@ -45,8 +45,11 @@ A virtual module at `/@reticle-connect`, added to the HTML, whose contents are:
|
|
|
45
45
|
import { reticle, install } from '@reticlehq/react';
|
|
46
46
|
install();
|
|
47
47
|
reticle.connect({/* resolved args */});
|
|
48
|
+
if (import.meta.hot) reticle.observeHotUpdates(import.meta.hot);
|
|
48
49
|
```
|
|
49
50
|
|
|
51
|
+
An app with `@reticlehq/browser` and no `@reticlehq/react` (Vue, Svelte, plain TypeScript) gets the same module importing `reticle` from `@reticlehq/browser`, without `install()`.
|
|
52
|
+
|
|
50
53
|
Plus a dynamic import of your dev module if one exists. It looks for `src/reticle-dev.ts`, `.js`, `.tsx` or `.jsx`, in that order, and leaves the file alone if you have one: that file is yours to edit.
|
|
51
54
|
|
|
52
55
|
## Options
|
|
@@ -55,7 +58,7 @@ Plus a dynamic import of your dev module if one exists. It looks for `src/reticl
|
|
|
55
58
|
|
|
56
59
|
| Option | Type | Default |
|
|
57
60
|
| --- | --- | --- |
|
|
58
|
-
| `port` | `number` |
|
|
61
|
+
| `port` | `number` | Used only when the daemon registry and `.reticle.json` name no port; otherwise `4400`. `RETICLE_PORT` overrides all of them |
|
|
59
62
|
| `root` | `string` | Vite's `root`, else `process.cwd()` |
|
|
60
63
|
| `sdkVersion` | `string` | Read from the installed `@reticlehq/react` |
|
|
61
64
|
| `session` | `string` | Omitted, so the SDK generates one |
|
|
@@ -66,6 +69,11 @@ Plus a dynamic import of your dev module if one exists. It looks for `src/reticl
|
|
|
66
69
|
| `inject` | `boolean` | `true`. Set `false` to call `connect()` yourself |
|
|
67
70
|
| `desktop` | `boolean` | `false`. When `true` the connect passes `allowInProduction: true`, which an Electron or Tauri renderer needs, and a `vite build` in a non-production mode (`--mode development`) is instrumented too. A production-mode build is stubbed like a web build |
|
|
68
71
|
| `captureNetworkBodies` | `boolean` | `false`. Also enabled by `VITE_RETICLE_CAPTURE_BODIES=1` |
|
|
72
|
+
| `networkBodyMaxChars` | `number` | `8192`, clamped to 256 to 262144. Also `VITE_RETICLE_BODY_MAX_CHARS` |
|
|
73
|
+
| `captureErrorBodies` | `boolean` | `true`: a failed response keeps its body. `VITE_RETICLE_NO_ERROR_BODIES=1` turns it off |
|
|
74
|
+
| `testIdAttribute` | `string` | `.reticle.json`'s `testIdAttribute`, else `data-testid` |
|
|
75
|
+
| `allowNonLocalhost` | `boolean` | `false`. Lets Reticle run off localhost; a pairing token is still required. Also `VITE_RETICLE_ALLOW_NON_LOCALHOST=1` |
|
|
76
|
+
| `exposePresenter` | `boolean` | `false`. Contributors only: makes Reticle's own presenter visible to its tools |
|
|
69
77
|
| `onWarn` | `(message: string) => void` | `console.warn` |
|
|
70
78
|
|
|
71
79
|
`reticle({ present: false })` still lets the plugin create and configure the connection; it only hides Reticle's visible presenter. `reticle({ inject: false })` disables that generated connection, so your application must call `connect()` itself. In that manual call, pass the pairing token explicitly:
|
|
@@ -86,7 +94,7 @@ declare const __RETICLE_ROOT__: string;
|
|
|
86
94
|
declare const __RETICLE_SDK_VERSION__: string;
|
|
87
95
|
```
|
|
88
96
|
|
|
89
|
-
Vite replaces these `define` identifiers in application source at build time; the declarations let TypeScript typecheck them and do not create runtime globals. The SDK does not discover the pairing token, so pass it explicitly in a hand-written connection
|
|
97
|
+
Vite replaces these `define` identifiers in application source at build time; the declarations let TypeScript typecheck them and do not create runtime globals. The SDK does not discover the pairing token, so pass it explicitly in a hand-written connection.
|
|
90
98
|
|
|
91
99
|
## Other exports
|
|
92
100
|
|
|
@@ -100,7 +108,6 @@ Vite replaces these `define` identifiers in application source at build time; th
|
|
|
100
108
|
| `readPairingToken` | `() => string \| undefined` | Read the pairing token from disk |
|
|
101
109
|
| `findDevModule` | `(root: string, exists: (p: string) => boolean) => string \| null` | Locate the dev module |
|
|
102
110
|
| `connectModuleSource` | `(options: ReticleVitePluginOptions, devModule?: string \| null) => string` | Build the injected module source |
|
|
103
|
-
| `cjsDepIncludes` | `(appRoot: string, canResolve?: (dep: string) => boolean) => string[]` | CommonJS deps to add to `optimizeDeps` |
|
|
104
111
|
|
|
105
112
|
Types: `ReticleVitePluginOptions`, `ReticleVitePlugin`, `ViteDevServerLike`.
|
|
106
113
|
|
package/docs/packages.mdx
CHANGED
|
@@ -5,11 +5,12 @@ description: Every Reticle package. What it does, why it exists, when you actual
|
|
|
5
5
|
icon: cubes
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
Reticle is
|
|
8
|
+
Reticle is fourteen packages (thirteen on npm, one Rust crate), and most people install two. This page exists so you can tell which two, and so that the ones you skip stop looking mysterious.
|
|
9
9
|
|
|
10
10
|
<Note>
|
|
11
11
|
Everything ships together at one version: whatever `npm view @reticlehq/core version` says, every
|
|
12
|
-
other `@reticlehq/*` package says too, and so does the `reticle-tauri` crate on crates.io.
|
|
12
|
+
other `@reticlehq/*` package says too, and so does the `reticle-tauri` crate on crates.io. The
|
|
13
|
+
one exception is `open-verification`, the specification, which carries its own version.
|
|
13
14
|
|
|
14
15
|
It was versioned independently until 2.12.0, and that turned out to mean _stuck_: the crate sat at `0.1.0` from the day it was written, the publish job skipped it every release because that version already existed, and no Rust-side fix reached anybody. Lockstep costs one line in the bump script and cannot fail that way.
|
|
15
16
|
|
|
@@ -55,7 +56,7 @@ Those rules are why the browser SDK cannot accidentally pull in a filesystem cal
|
|
|
55
56
|
|
|
56
57
|
**Why it exists:** without one shared definition, the browser and the server drift. One renames a field, the other keeps reading the old one, and the failure is silent. A verdict that quietly stops carrying evidence. Core makes that a type error instead.
|
|
57
58
|
|
|
58
|
-
**Depends on:** `zod
|
|
59
|
+
**Depends on:** `zod` and `open-verification`, which itself depends only on `zod`. That is the whole point; it sits at the bottom of the graph so everything can depend on it without cycles.
|
|
59
60
|
|
|
60
61
|
**Do you install it?** No. It arrives as a dependency of whatever you did install.
|
|
61
62
|
|
|
@@ -89,7 +90,7 @@ if (import.meta.env.DEV) reticle.connect();
|
|
|
89
90
|
|
|
90
91
|
**Why it exists:** agents speak MCP; browsers speak WebSocket; somebody has to be fluent in both and own the `.reticle/` directory where flows, baselines and runs are stored.
|
|
91
92
|
|
|
92
|
-
**Depends on:** `@modelcontextprotocol/sdk`, `@reticlehq/core`, `@reticlehq/init`, `ws`, `zod`.
|
|
93
|
+
**Depends on:** `@modelcontextprotocol/sdk`, `@reticlehq/browser`, `@reticlehq/core`, `@reticlehq/engine`, `@reticlehq/init`, `open-verification`, `ws`, `zod`, `zod-to-json-schema`. **Peer:** `playwright`.
|
|
93
94
|
|
|
94
95
|
**Do you install it?** Not into your project. Your agent launches it:
|
|
95
96
|
|
|
@@ -129,7 +130,7 @@ npm i -D @reticlehq/react
|
|
|
129
130
|
|
|
130
131
|
**One line in `vite.config.ts`, two jobs.** It stamps source locations onto your JSX and injects `connect()` so you cannot forget to.
|
|
131
132
|
|
|
132
|
-
**Why it exists:** the two things everyone forgets are wiring the SDK and enabling source mapping. This does both, and `
|
|
133
|
+
**Why it exists:** the two things everyone forgets are wiring the SDK and enabling source mapping. This does both, and in a production `vite build` it swaps the SDK for an inert stub, so it never reaches a production bundle.
|
|
133
134
|
|
|
134
135
|
**Depends on:** `@babel/core`, `@reticlehq/babel-plugin`, `@reticlehq/core`. **Peer:** `vite`.
|
|
135
136
|
|
|
@@ -149,7 +150,7 @@ export default defineConfig({ plugins: [reticle(), react()] });
|
|
|
149
150
|
|
|
150
151
|
**Why it exists:** React 19 dropped `_debugSource`, which is what source mapping used to rely on. This plugin puts the information back, at build time, in dev only. Without it, `reticle_look { action: "element" }` can still tell you the component name but not the file.
|
|
151
152
|
|
|
152
|
-
**Depends on:**
|
|
153
|
+
**Depends on:** `@reticlehq/core`. **Peer:** `@babel/core`.
|
|
153
154
|
|
|
154
155
|
**Do you install it?** Only directly if you are wiring Babel yourself. The Vite and Next packages both pull it in.
|
|
155
156
|
|
|
@@ -191,7 +192,7 @@ module.exports = withReticle({/* your config */});
|
|
|
191
192
|
|
|
192
193
|
**Why it exists:** the decision and the machinery that feeds it are different jobs with different reasons to change. Carved out of `@reticlehq/server` so the part that judges can be read, tested and reused without starting anything.
|
|
193
194
|
|
|
194
|
-
**Depends on:** `@reticlehq/core`, `zod`.
|
|
195
|
+
**Depends on:** `@reticlehq/core`, `open-verification`, `zod`.
|
|
195
196
|
|
|
196
197
|
---
|
|
197
198
|
|
|
@@ -211,7 +212,7 @@ module.exports = withReticle({/* your config */});
|
|
|
211
212
|
|
|
212
213
|
## @reticlehq/eslint-plugin
|
|
213
214
|
|
|
214
|
-
**
|
|
215
|
+
**Three rules, the main one being: state changed, so a signal must fire.**
|
|
215
216
|
|
|
216
217
|
**Why it exists:** signals are the strongest evidence Reticle can use, and they rot the way all conventions rot. Someone adds a mutation, forgets the signal, and every verdict for that flow quietly drops a grade. Nothing breaks. The tests still pass. The evidence just gets weaker.
|
|
217
218
|
|
|
@@ -233,20 +234,15 @@ A lint rule makes the signal layer self-enforcing, which is the only way a conve
|
|
|
233
234
|
|
|
234
235
|
## reticle-tauri
|
|
235
236
|
|
|
236
|
-
**The Rust crate**, on crates.io. Versioned in lockstep with the npm packages, so `
|
|
237
|
+
**The Rust crate**, on crates.io. Versioned in lockstep with the npm packages, so `3.7` here and `3.7` there mean the same release.
|
|
237
238
|
|
|
238
239
|
**Why it exists:** Tauri IPC observation needs nothing on the Rust side; an `invoke('load_todos')` already reaches Reticle as `ipc://load_todos`. You only need this crate for screenshots and headless mode.
|
|
239
240
|
|
|
240
241
|
```toml
|
|
241
242
|
[dependencies]
|
|
242
|
-
reticle-tauri = "3.
|
|
243
|
+
reticle-tauri = "3.7"
|
|
243
244
|
```
|
|
244
245
|
|
|
245
|
-
<Warning>
|
|
246
|
-
Do not expect this to match the npm version. Doing so would imply a release cadence the crate does
|
|
247
|
-
not have, and it would make every npm release a crates.io release for no reason.
|
|
248
|
-
</Warning>
|
|
249
|
-
|
|
250
246
|
<Card title="Desktop setup in full" icon="display" href="/desktop">
|
|
251
247
|
Electron and Tauri wiring, including the Tauri CSP whose failure is silent.
|
|
252
248
|
</Card>
|
|
@@ -4,7 +4,7 @@ description: 'Adopt Reticle on your own codebase, or embed it inside an AI app-b
|
|
|
4
4
|
icon: plug
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Two ways in. **A team** runs
|
|
7
|
+
Two ways in. **A team** runs the install script once, which registers the MCP server with its coding agents, and follows the next steps it prints. **A platform** adds the dev-only SDK to its generated-app template, runs `npx @reticlehq/server serve --http --drive <preview-url>` beside each preview, and `POST`s to `/verify` after every generate or edit, gating the ship on `run.verdict.status === 'pass'` and feeding `run.repair.failurePackets[]` back to a fixer agent.
|
|
8
8
|
|
|
9
9
|
> The one guide for adopting Reticle, both for a team using a coding agent on its own app and for an AI app-builder platform (Lovable / Emergent / Bolt) embedding Reticle in its generation pipeline. Reticle reads the program from _inside_ a running app and returns a **verdict with evidence** ("did it actually work?"), not a screenshot. Enterprise/premium access lives in [`enterprise.md`](./enterprise.md).
|
|
10
10
|
|
|
@@ -29,10 +29,11 @@ One call replays the app's key journeys and asserts **program truth** (network c
|
|
|
29
29
|
### A. A team, agent on your own app (~10 min)
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
|
|
32
|
+
curl -fsSL https://raw.githubusercontent.com/reticlehq/reticle/main/install/install.sh | sh
|
|
33
|
+
irm https://raw.githubusercontent.com/reticlehq/reticle/main/install/install.ps1 | iex # Windows
|
|
33
34
|
```
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
It puts the CLI on the machine and registers the MCP server with the coding agents it finds. Then do what it prints: restart your coding agent so it loads Reticle's tools, and paste the prompt the script prints into it. The agent runs `reticle init` in your app (build plugin, SDK connect file, agent rules), then proves one flow. No agent? Run `reticle init` in the app yourself.
|
|
36
37
|
|
|
37
38
|
### B. A platform / CI, driven from your pipeline (no MCP, no human)
|
|
38
39
|
|
|
@@ -87,7 +88,7 @@ Copyable patterns: `apps/bench-app/src/reticle-dev.ts`, `apps/next-smoke/app/ret
|
|
|
87
88
|
| Missing validation (`"abc"` becomes data) | flow oracle (error shown AND nothing created) |
|
|
88
89
|
| Silent console error (logged, UI still renders) | `console { absent: true }` |
|
|
89
90
|
| UI-vs-store desync (the total lies) | reads the store, contradicts the display |
|
|
90
|
-
| Blast-radius (an action corrupts unrelated state) | `state {
|
|
91
|
+
| Blast-radius (an action corrupts unrelated state) | a `state { path, equals }` invariant on the unrelated value |
|
|
91
92
|
|
|
92
93
|
Live, clickable demo of each: `apps/vibe-builder-demo/` (set `BUG_MODE=…`). Proven in CI: `server/src/judgement/runs/generated-app-bugs.test.ts`.
|
|
93
94
|
|
|
@@ -133,7 +134,7 @@ The shape is identical (in-app SDK in the template → verify in the sandbox →
|
|
|
133
134
|
2. Since the runtime is in-browser, drive via the connected session (the SDK dials the bridge) rather than `--drive`; call verify from the Bolt agent after a build.
|
|
134
135
|
3. Same act-on-verdict: gate + self-heal with the repair packets. (Bolt already detects terminal/compile errors; Reticle adds the _runtime program-truth_ layer it's blind to.)
|
|
135
136
|
|
|
136
|
-
> Honest note: a platform can build a verification step itself. Reticle's case is the depth (program-state and source mapping), the determinism (
|
|
137
|
+
> Honest note: a platform can build a verification step itself. Reticle's case is the depth (program-state and source mapping), the determinism (no LLM in the loop), the un-hallucinatable verdict, and a stable drop-in artifact. The reproducible benchmark in [`bench/`](https://github.com/reticlehq/reticle/blob/main/bench/README.md) measures the observation-cost and detection differences against other browser-automation MCPs.
|
|
137
138
|
|
|
138
139
|
---
|
|
139
140
|
|