@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
package/docs/predicates.mdx
CHANGED
|
@@ -5,7 +5,7 @@ description: The grammar for declaring what should be true. Every kind, every fi
|
|
|
5
5
|
icon: filter
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
A predicate declares what should be true, as `{ kind, ...fields }`. Reticle has
|
|
8
|
+
A predicate declares what should be true, as `{ kind, ...fields }`. Reticle has thirteen kinds: `signal`, `state`, `net`, `route`, `element`, `text`, `console`, `animation`, `settled`, `compare`, and the combinators `allOf`, `anyOf` and `not`. Which one you pick decides whether a green means anything.
|
|
9
9
|
|
|
10
10
|
It is the argument to `until` on [`reticle_act_and_wait`](/tools/act-and-wait), and to `predicate` on [`reticle_assert`](/tools/assert) and [`reticle_assert { action: "wait" }`](/tools/wait-for).
|
|
11
11
|
|
|
@@ -25,17 +25,19 @@ Reticle grades them, and it will tell you when you have chosen a weak one. This
|
|
|
25
25
|
|
|
26
26
|
Take the advice. `element` and `text` are convenient and weak; `signal`, `state` and `net` are what make a green trustworthy.
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
28
|
+
The verdict reports the grade it proved, strongest first: `signal`, `net`, `state`, then `presence`.
|
|
29
|
+
|
|
30
|
+
| Kind | Grade | Proves |
|
|
31
|
+
| ------------------ | ---------- | ------------------------------------------------------ |
|
|
32
|
+
| `signal` | `signal` | The app declared success in its own words |
|
|
33
|
+
| `net` | `net` | A specific request fired, with a countable cardinality |
|
|
34
|
+
| `state` | `state` | A registered store actually changed |
|
|
35
|
+
| `route` | `presence` | Navigation happened |
|
|
36
|
+
| `console` | `presence` | Something logged, or nothing did |
|
|
37
|
+
| `element` / `text` | `presence` | Something rendered. A mock renders too |
|
|
38
|
+
| `animation` | `presence` | An animation ran or finished |
|
|
39
|
+
| `settled` | `presence` | The page went quiet. A precondition, not a proof |
|
|
40
|
+
| `compare` | its sides | Two readings agree: the stronger side's grade |
|
|
39
41
|
|
|
40
42
|
## The leaves
|
|
41
43
|
|
|
@@ -49,7 +51,7 @@ Take the advice. `element` and `text` are convenient and weak; `signal`, `state`
|
|
|
49
51
|
}
|
|
50
52
|
```
|
|
51
53
|
|
|
52
|
-
`query` accepts `role`, `name`, `text`, `label`, `placeholder`, `testid`, `alt`, `value`, `by`, `component`, `source`, `scope`, `self`, `attrs`. `state` is one of `visible`, `hidden`, `enabled`, `disabled`, `checked`, `expanded`, `pressed`, `focused`, `inViewport`, `present`.
|
|
54
|
+
`query` accepts `role`, `name`, `text`, `label`, `placeholder`, `testid`, `alt`, `value`, `by`, `component`, `source`, `scope`, `self`, `attrs`, `matchCase`. Written flat on the predicate instead of under `query`, these fields are moved into `query` for you. `state` is one of `visible`, `hidden`, `enabled`, `disabled`, `checked`, `expanded`, `pressed`, `focused`, `inViewport`, `present`.
|
|
53
55
|
|
|
54
56
|
`value` is the one worth knowing about. `{ "role": "textbox", "name": "Amount" }` collapses to "a textbox called Amount exists", which passes against an empty field; adding `value` is what makes it an assertion about what the user will actually send. `by` selects the locator strategy explicitly, `component` and `source` match React component identity and source location, and `self` restricts a scoped match to the scope element itself rather than its descendants.
|
|
55
57
|
|
|
@@ -69,7 +71,7 @@ Add `"absent": true` to assert something is **gone**. The predicate for a remova
|
|
|
69
71
|
{ "kind": "text", "contains": "Saved successfully", "visible": true }
|
|
70
72
|
```
|
|
71
73
|
|
|
72
|
-
`contains` is the field the published schema declares. `value` and `
|
|
74
|
+
`contains` is the field the published schema declares. `value`, `text` and `query` are accepted as aliases and rewritten to it. The match is case-sensitive; `ignoreCase: true` relaxes that. `absent: true` asserts the text is not present, and `visible: true` requires it to be on screen rather than merely in the DOM.
|
|
73
75
|
|
|
74
76
|
Use `scope` to restrict the search to a CSS selector or element ref. If Reticle reports that the text is split across the scope's children, retry its generated predicate with `"self": true`; that checks the scope root's combined subtree text while still enforcing `contains`.
|
|
75
77
|
|
|
@@ -121,7 +123,17 @@ Two fields read the RESPONSE BODY, so a request that succeeded with the wrong nu
|
|
|
121
123
|
|
|
122
124
|
`bodyMatches` is a field match, keyed like `signal.dataMatches` and taking the same operators (`*`, `$gte`, `$contains`). A key can be a dotted path into a wrapped answer: `{ "data.status": "completed" }`, `{ "items.0.id": "a1" }`, `{ "items.length": 3 }`. A nested object written out as a value is compared whole, so use the path to match one field inside it. Reach for it whenever the value is an enum, because that is the case a substring cannot decide: `bodyContains: "completed"` passes on a body carrying `"completedAt": null`, where the needle matched the KEY and the job was still queued. `completed`/`completedAt`, `success`/`successRate`, `sent`/`unsent` all have that shape.
|
|
123
125
|
|
|
124
|
-
|
|
126
|
+
Two more read the REQUEST body, what the UI sent: `requestBodyContains` (a substring) and `requestBodyMatches` (a field match, same operators). They are separate fields so neither can be satisfied by the wrong half of the exchange.
|
|
127
|
+
|
|
128
|
+
All four require body capture, `reticle.connect({ captureNetworkBodies: true })`, and say so when the body was never recorded rather than reporting an ordinary mismatch.
|
|
129
|
+
|
|
130
|
+
Some endpoints read over POST: a GraphQL query, a tRPC batch, a query bus, a Server Action that loads a list. When one runs twice in an action window, which React StrictMode does in development, the second call looks like a double submit and the verdict comes back `unknown` with `duplicate-request`. Declare the endpoint a read on its clause:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{ "kind": "net", "method": "POST", "urlContains": "/graphql", "repeatable": true }
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`repeatable: true` keeps that endpoint out of `duplicate-request` for this verdict only. The request is still waited for and still counted, so `count` keeps its meaning. It needs a non-empty `urlContains`, and a clause without one is refused, because it would excuse every request in the window. When the clause names a `method`, only calls with that method are excused: a repeatable `GET` never excuses a `POST` to the same URL. Leave it off for an endpoint that writes: there, the second call is the bug.
|
|
125
137
|
|
|
126
138
|
### route
|
|
127
139
|
|
|
@@ -129,7 +141,7 @@ Both require body capture, `reticle({ captureNetworkBodies: true })`, and say so
|
|
|
129
141
|
{ "kind": "route", "pathname": "/success" }
|
|
130
142
|
```
|
|
131
143
|
|
|
132
|
-
`pathname` matches the path exactly. `contains` matches anywhere in the whole route, path, query and fragment together. `path` is accepted as an alias for `pathname`, and `url` and `
|
|
144
|
+
`pathname` matches the path exactly. `contains` matches anywhere in the whole route, path, query and fragment together. `path` is accepted as an alias for `pathname`, and `url`, `urlContains` and `pathContains` as aliases for `contains`, but the canonical spellings are the ones above.
|
|
133
145
|
|
|
134
146
|
A passing route verdict quotes the transition itself:
|
|
135
147
|
|
|
@@ -143,10 +155,12 @@ A passing route verdict quotes the transition itself:
|
|
|
143
155
|
}
|
|
144
156
|
```
|
|
145
157
|
|
|
146
|
-
<
|
|
147
|
-
`route`
|
|
148
|
-
the
|
|
149
|
-
|
|
158
|
+
<Note>
|
|
159
|
+
`route` reads the last route change in the window. When there was none, it reads the session's
|
|
160
|
+
current URL instead, and the evidence says `decidedBy: "current-route"`. Only when neither exists
|
|
161
|
+
does it fail, and the response says so: `expected: "a route change to /"`, `assertion:
|
|
162
|
+
"route.changed"`.
|
|
163
|
+
</Note>
|
|
150
164
|
|
|
151
165
|
### console
|
|
152
166
|
|
|
@@ -156,6 +170,8 @@ A passing route verdict quotes the transition itself:
|
|
|
156
170
|
|
|
157
171
|
"The flow completed and logged nothing." Worth attaching to most actions. Plenty of features work while quietly throwing.
|
|
158
172
|
|
|
173
|
+
`contains` narrows it to one message: with `absent: true` it asserts THIS message did not appear, rather than that nothing was logged at all. `textContains` is accepted as an alias.
|
|
174
|
+
|
|
159
175
|
### signal
|
|
160
176
|
|
|
161
177
|
```json
|
|
@@ -269,7 +285,7 @@ A number is read out of displayed text, so `"$1,234.50"` compares as `1234.5`. A
|
|
|
269
285
|
|
|
270
286
|
These only work where a before-reading was taken, which today is `reticle_act_and_wait`. Asked anywhere else they report `unknown` with "no before-reading was taken", never a failure, because nothing was compared and a `false` would blame the app for a reading nobody took. For the same reason a relative property is never `already_true`: `unchanged` is trivially true against a baseline taken a microsecond earlier, so the pre-action check skips it and lets the action decide.
|
|
271
287
|
|
|
272
|
-
A saved flow
|
|
288
|
+
A saved flow keeps it: a step's `expect` is a full predicate, `satisfies` included.
|
|
273
289
|
|
|
274
290
|
A miss quotes the real value back at you:
|
|
275
291
|
|
|
@@ -398,7 +414,7 @@ A combinator needs its own `kind`, and the children go in `predicates`, or in `o
|
|
|
398
414
|
accepted as an alias for it. `not` takes a single child in `predicate`, or in `of`. A bare
|
|
399
415
|
`{ "allOf": [ … ] }` does not parse, and neither does `{ "kind": "allOf", "allOf": [ … ] }`.
|
|
400
416
|
|
|
401
|
-
Reticle refuses the call rather than running half of it. The
|
|
417
|
+
Reticle refuses the call rather than running half of it. The refusal names the field, says that nothing ran and no verdict was produced, lists the fields `allOf` accepts, and shows a valid example. Better to be told than to get a green from an assertion that never executed.
|
|
402
418
|
|
|
403
419
|
</Warning>
|
|
404
420
|
|
|
@@ -433,10 +449,10 @@ On a failure each child reports separately too, so you can see which one broke:
|
|
|
433
449
|
|
|
434
450
|
| Field | Where | What it does |
|
|
435
451
|
| --- | --- | --- |
|
|
436
|
-
| `timeout_ms` | `
|
|
452
|
+
| `timeout_ms` | `reticle_assert` (both actions), `reticle_act_and_wait` | Wait up to N ms for it to become true |
|
|
437
453
|
| `since` | `net`, `route`, `console`, `animation` and `signal` leaves, and the call itself | Only consider events after this cursor |
|
|
438
454
|
|
|
439
|
-
The `since` cursor comes from a prior `reticle_act` response. Use it whenever you are asserting something an action was supposed to cause. Without it, an assertion can pass on an event from two clicks ago. That applies to every one of the five kinds above, not only to network calls: an unscoped `signal` matches a fire from an earlier action just as readily.
|
|
455
|
+
The `since` cursor comes from a prior `reticle_act` or `reticle_observe` response. Use it whenever you are asserting something an action was supposed to cause. Without it, an assertion can pass on an event from two clicks ago. That applies to every one of the five kinds above, not only to network calls: an unscoped `signal` matches a fire from an earlier action just as readily.
|
|
440
456
|
|
|
441
457
|
<Card title="Where predicates get used" icon="circle-check" href="/tools/act-and-wait">
|
|
442
458
|
Naming the consequence before the action is the whole point.
|
package/docs/quickstart.mdx
CHANGED
|
@@ -5,7 +5,7 @@ description: Install Reticle, connect your coding agent, and get a real verdict
|
|
|
5
5
|
icon: rocket
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
**
|
|
8
|
+
**Four steps: run the installer once per machine, run `reticle init` once per project, then optionally `reticle connect` for the dashboard and `reticle sync` to send runs.** Skip `init` and your agent's first `reticle_session` call wires the app instead. Reticle embeds a dev-only SDK in your running app and proves a browser session connected. No account needed for steps 1 and 2.
|
|
9
9
|
|
|
10
10
|
By the end of this page your agent will click a button in your app and prove what happened: the request that fired, the state that changed, and the file to open if it didn't.
|
|
11
11
|
|
|
@@ -16,7 +16,7 @@ By the end of this page your agent will click a button in your app and prove wha
|
|
|
16
16
|
|
|
17
17
|
## Prerequisites
|
|
18
18
|
|
|
19
|
-
- Node 20 or newer
|
|
19
|
+
- Node 20.11 or newer
|
|
20
20
|
- A web app you can run locally, and its dev server
|
|
21
21
|
- A coding agent that speaks MCP (Claude Code, Cursor, Codex, OpenCode, Windsurf, VS Code)
|
|
22
22
|
|
|
@@ -36,9 +36,9 @@ irm https://raw.githubusercontent.com/reticlehq/reticle/main/install/install.ps1
|
|
|
36
36
|
|
|
37
37
|
</CodeGroup>
|
|
38
38
|
|
|
39
|
-
This puts `reticle` on your PATH and registers the MCP server with every coding agent it can reach: Claude Code, Cursor, Windsurf, VS Code, Zed, Gemini CLI, Copilot CLI, OpenCode, Warp, Kiro, Amazon Q, Cline, Amp, Continue and Factory Droid. Nothing is asked.
|
|
39
|
+
This puts `reticle` on your PATH and registers the MCP server with every coding agent it can reach: Claude Code, Cursor, Windsurf, VS Code, Zed, Gemini CLI, Copilot CLI, OpenCode, Antigravity, Warp, Kiro, Amazon Q, Cline, Roo Code, Amp, Continue and Factory Droid. Nothing is asked. It does not wire your app, and says so: that is step 2. Want a verdict first? Signed in, `reticle try <url>` drives a URL once in a window you watch.
|
|
40
40
|
|
|
41
|
-
Codex CLI keeps a TOML config that Reticle will not rewrite, so the installer prints the lines to paste and the file to paste them into.
|
|
41
|
+
Codex CLI keeps a TOML config that Reticle will not rewrite itself, so with the `codex` command installed the installer registers Reticle through `codex mcp add`. Without it, the installer prints the lines to paste and the file to paste them into.
|
|
42
42
|
|
|
43
43
|
<Note>
|
|
44
44
|
**Run this before opening your agent, and there is nothing to restart.** A coding agent reads its
|
|
@@ -46,7 +46,7 @@ Codex CLI keeps a TOML config that Reticle will not rewrite, so the installer pr
|
|
|
46
46
|
you open it. If it was already open, quit and reopen it once.
|
|
47
47
|
</Note>
|
|
48
48
|
|
|
49
|
-
Prefer not to pipe a script into a shell? The
|
|
49
|
+
Prefer not to pipe a script into a shell? The same result by hand:
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
52
|
npm install -g @reticlehq/server
|
|
@@ -61,17 +61,16 @@ In your project directory, before opening your coding agent:
|
|
|
61
61
|
RETICLE_INSTALL_SOURCE=docs_site npx @reticlehq/server init
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
This installs the dev-only SDK, wires your build config, starts the dev server, and checks that a browser session connected. Nothing from your project leaves your machine. Open your coding agent once this command finishes; if it was already open during installation, restart it to load the new tools. The `RETICLE_INSTALL_SOURCE` prefix is optional and only tells us which page you installed from. It is idempotent: run it twice and the second run reports what was already done rather than doing it again.
|
|
64
|
+
This installs the dev-only SDK, wires your build config, starts the dev server, and checks that a browser session connected. Nothing from your project leaves your machine. If your dev server was already running, restart it once and hard-reload the tab: it read your build config before `init` edited it. Open your coding agent once this command finishes; if it was already open during installation, restart it to load the new tools. The `RETICLE_INSTALL_SOURCE` prefix is optional and only tells us which page you installed from. It is idempotent: run it twice and the second run reports what was already done rather than doing it again.
|
|
65
65
|
|
|
66
|
-
Step 1 is once per machine. This step is once per project. **Skipping it is
|
|
67
|
-
|
|
68
|
-
Want a cloud dashboard too? Run `npx @reticlehq/server connect --project "My App"` instead of, or after, `init`. It does everything `init` does, then opens browser sign-in approval, links this folder to the named cloud project, and sends existing local history. Approve the short code shown in the browser and terminal; the command resumes by itself.
|
|
66
|
+
Step 1 is once per machine. This step is once per project. **Skipping it is a common reason Reticle "does nothing":** the agent has the tools, but there is no app on the other end for them to see.
|
|
69
67
|
|
|
70
68
|
<Note>
|
|
71
69
|
**Skipped this step?** Ask your agent to verify something in the app. Its first `reticle_session`
|
|
72
70
|
call finds a project that has never connected, runs `init` there itself, and lists every file it
|
|
73
71
|
changed under `wired`. Asked about something unrelated, it offers to wire the app instead of doing
|
|
74
|
-
it. This works in Claude Code, Codex, Cursor and other MCP agents
|
|
72
|
+
it. This works in Claude Code, Codex, Cursor and other MCP agents, including a second project
|
|
73
|
+
while Reticle is already running for another one.
|
|
75
74
|
</Note>
|
|
76
75
|
|
|
77
76
|
Prefer to install the skill and let the agent run setup itself? On Claude Code the plugin registers the MCP server and the skill in one step:
|
|
@@ -93,6 +92,7 @@ Useful flags for the local-only `reticle init` path:
|
|
|
93
92
|
|
|
94
93
|
```
|
|
95
94
|
reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
|
|
95
|
+
[--env KEY=VALUE]... [--files-only] [--json] [--relaunch]
|
|
96
96
|
--app picks WHICH app in a monorepo, when several are found
|
|
97
97
|
--no-mcp skips MORE than the server registration: also the agent rule files
|
|
98
98
|
(CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
|
|
@@ -102,13 +102,38 @@ reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
|
|
|
102
102
|
Start with `reticle init --dry-run` if you want to see the app changes before anything is written.
|
|
103
103
|
|
|
104
104
|
<Tip>
|
|
105
|
-
In a monorepo, `init`
|
|
106
|
-
|
|
105
|
+
In a monorepo, `init` run at the root lists every app it found, each with its own
|
|
106
|
+
`reticle init --app <dir>` line, and stops. Run the line for the app you want: it writes that
|
|
107
|
+
app's files and starts nothing (add `--start` to boot it). With only one app, it wires that one
|
|
108
|
+
without asking.
|
|
107
109
|
</Tip>
|
|
108
110
|
|
|
109
111
|
Prefer to wire it yourself? See [Manual install](/install-manual). It is about ten lines, and worth reading once even if you let the agent do it, because it explains what the agent actually changed.
|
|
110
112
|
|
|
111
|
-
## Step 3.
|
|
113
|
+
## Step 3. Connect the dashboard (optional)
|
|
114
|
+
|
|
115
|
+
Skip this if you only want local verdicts. Everything above works without an account.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx @reticlehq/server connect --project "My App"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`connect` runs Step 2 first if this project isn't wired yet, so you can use it in place of `init`. Then it:
|
|
122
|
+
|
|
123
|
+
1. Opens a browser so you can sign in, or create a free account at app.reticle.sh. Approve the short code shown in the browser and in the terminal, and the command carries on by itself.
|
|
124
|
+
2. Links this folder to the cloud project you named, creating it if it doesn't exist. `npx @reticlehq/server status` shows the link.
|
|
125
|
+
3. Sends the runs and flows already on this machine.
|
|
126
|
+
|
|
127
|
+
After that, every verified run syncs on its own. To sync right now, for example before showing a teammate:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npx @reticlehq/server sync # one sync
|
|
131
|
+
npx @reticlehq/server sync --watch # keep syncing while you work
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
A new account gets 10 free credits to try the Harness. What syncs, and how to switch each part off (`reticle config --runs/--memory/--flows on|off`), is in [What is recorded](/what-is-recorded). In CI, set `RETICLE_API_KEY` instead of signing in.
|
|
135
|
+
|
|
136
|
+
## Step 4. Check the setup
|
|
112
137
|
|
|
113
138
|
```bash
|
|
114
139
|
npx @reticlehq/server doctor
|
|
@@ -116,9 +141,9 @@ npx @reticlehq/server doctor
|
|
|
116
141
|
|
|
117
142
|
`doctor` diagnoses the whole setup in one command: Chromium, the daemon, the port. If something is wrong this is the page you want before you start debugging your app instead.
|
|
118
143
|
|
|
119
|
-
## Step
|
|
144
|
+
## Step 5. Open your app again when you need it
|
|
120
145
|
|
|
121
|
-
`connect` already started the dev server and opened the app. On a later day, start your dev server as usual, then:
|
|
146
|
+
`init` (or `connect`) already started the dev server and opened the app. On a later day, start your dev server as usual, then:
|
|
122
147
|
|
|
123
148
|
```bash
|
|
124
149
|
npx @reticlehq/server open
|
|
@@ -128,12 +153,13 @@ This reuses the tab you already have open, or opens one if you don't. The SDK co
|
|
|
128
153
|
|
|
129
154
|
<Warning>
|
|
130
155
|
If the browser console says `[Reticle] this page could not open a websocket to …`, your app and
|
|
131
|
-
the daemon disagree about the port. Set it explicitly:
|
|
132
|
-
|
|
133
|
-
|
|
156
|
+
the daemon disagree about the port. Set it explicitly: `RETICLE_PORT=4400 pnpm dev` (Vite
|
|
157
|
+
plugin), `reticle({ port: 4400 })` in `vite.config`, or
|
|
158
|
+
`reticle.connect({ url: 'ws://localhost:4400/reticle' })` by hand. The console
|
|
159
|
+
message names the exact address it tried.
|
|
134
160
|
</Warning>
|
|
135
161
|
|
|
136
|
-
## Step
|
|
162
|
+
## Step 6. Look at the page
|
|
137
163
|
|
|
138
164
|
Ask your agent to take a snapshot. This is what came back from a real app:
|
|
139
165
|
|
|
@@ -155,7 +181,7 @@ The whole snapshot cost **61 tokens**. This is `mode: "interactive"`, which retu
|
|
|
155
181
|
|
|
156
182
|
Each control has a `ref` like `e5`. That's the handle for the next step, and it stays valid until the element leaves the DOM, so you don't re-snapshot between actions.
|
|
157
183
|
|
|
158
|
-
## Step
|
|
184
|
+
## Step 7. Act, and prove it
|
|
159
185
|
|
|
160
186
|
Here is the whole idea of Reticle in one call. Your agent names the expected consequence **before** it acts:
|
|
161
187
|
|
|
@@ -259,17 +285,19 @@ That third state is the one that matters. Most tools have two outcomes and quiet
|
|
|
259
285
|
</Accordion>
|
|
260
286
|
|
|
261
287
|
<Accordion title="Will any of this end up in my production build?">
|
|
262
|
-
No. The SDK is dev-only.
|
|
263
|
-
|
|
264
|
-
recommended wiring also guards the call behind `import.meta.env.DEV`,
|
|
265
|
-
locks.
|
|
288
|
+
No. The SDK is dev-only. A production `vite build` with the Vite plugin injects nothing and
|
|
289
|
+
replaces the SDK with an inert stub, and `connect()` self-disables when the build reports
|
|
290
|
+
`NODE_ENV=production`. The recommended wiring also guards the call behind `import.meta.env.DEV`,
|
|
291
|
+
so there are two independent locks.
|
|
266
292
|
</Accordion>
|
|
267
293
|
|
|
268
294
|
<Accordion title="Does my code or my app's data leave my machine?">
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
295
|
+
Not unless you link a project. The daemon runs on your machine and the SDK runs in your browser.
|
|
296
|
+
Nothing from your app leaves the machine until you link a project (`reticle connect`, or
|
|
297
|
+
`RETICLE_API_KEY` in CI). After that, what syncs is set by `reticle config`, and when the Harness
|
|
298
|
+
drives, the platform sees the steps it drives. Secret values never leave. Anonymous product
|
|
299
|
+
analytics are sent unless you opt out with `npx @reticlehq/server telemetry disable`, and they
|
|
300
|
+
never include your code or your app's data.
|
|
273
301
|
</Accordion>
|
|
274
302
|
|
|
275
303
|
<Accordion title="What if my framework is not React or Next.js?">
|
|
@@ -293,7 +321,8 @@ That third state is the one that matters. Most tools have two outcomes and quiet
|
|
|
293
321
|
Emit signals like `auth:granted` so your verdicts get stronger than "the DOM changed".
|
|
294
322
|
</Card>
|
|
295
323
|
<Card title="Every tool" icon="list" href="/tools/overview">
|
|
296
|
-
The
|
|
324
|
+
The 10 tools your agent sees by default, and the rest it reaches through `reticle_tools` and
|
|
325
|
+
`reticle_run`.
|
|
297
326
|
</Card>
|
|
298
327
|
<Card title="Run it in CI" icon="circle-check" href="/testing">
|
|
299
328
|
Turn this session into a suite that blocks a bad merge.
|
package/docs/required-checks.md
CHANGED
|
@@ -9,9 +9,9 @@ That gap is the difference between a gate and a decoration. A decoration still c
|
|
|
9
9
|
|
|
10
10
|
## How it works here
|
|
11
11
|
|
|
12
|
-
`ci.yml` ends in a single job called **`gate`**. It waits on every other job in that file and passes only when each one either succeeded or was legitimately skipped. So one required check, `gate`, covers
|
|
12
|
+
`ci.yml` ends in a single job called **`gate`**. It waits on every other job in that file and passes only when each one either succeeded or was legitimately skipped. So one required check, `gate`, covers every other job in `ci.yml` except `fixtures-dispatch`, which notifies another repository and never runs on a pull request.
|
|
13
13
|
|
|
14
|
-
That trick only reaches so far. A job can only wait on jobs in **its own workflow file**, so the
|
|
14
|
+
That trick only reaches so far. A job can only wait on jobs in **its own workflow file**, so the other workflows below cannot be folded into `gate`. Each has to be named in branch protection separately, or it blocks nothing.
|
|
15
15
|
|
|
16
16
|
`server/src/ci-aggregate-covers-jobs.test.ts` fails if a new workflow starts running on pull requests without being accounted for, and if a job in `ci.yml` is not watched by `gate`.
|
|
17
17
|
|
|
@@ -21,13 +21,14 @@ Set these as required status checks on the default branch:
|
|
|
21
21
|
|
|
22
22
|
| check | what it is | what merges without it |
|
|
23
23
|
| --- | --- | --- |
|
|
24
|
-
| `gate` | every job in `ci.yml`: build, tests, e2e, desktop, install, Rust, Windows, macOS, bench | a red build of any kind |
|
|
25
|
-
| `package-quality` | the published packages: exports and types correctness, and the browser SDK's size budget | a package that installs but cannot be imported, or a silently growing SDK |
|
|
26
|
-
| `break-gates` | onboarding | a broken first-run experience |
|
|
27
|
-
| `codeql` | security scan | a flagged vulnerability |
|
|
24
|
+
| `gate` | every job in `ci.yml`: build, tests, e2e, desktop, install, Rust, Windows, macOS, bench, package quality, the break gates | a red build of any kind (bench and the Windows install cells run only after merge) |
|
|
28
25
|
| `dco` | contributions are signed off | an unsigned contribution |
|
|
29
26
|
|
|
30
|
-
`
|
|
27
|
+
package-quality and the break gates (`launchers`, `early-gates`, `break-matrix`) run as jobs inside `ci.yml` and are covered by `gate`. They used to be separate workflows with no `merge_group` trigger, so requiring them by name would have stalled the queue.
|
|
28
|
+
|
|
29
|
+
CodeQL (`analyze (javascript-typescript)`) runs on pull requests and in the merge queue, but the ruleset does not require it, so a flagged vulnerability is reported rather than blocked.
|
|
30
|
+
|
|
31
|
+
`labeler`, `welcome` and `dependabot-auto-merge` are deliberately absent. They label a pull request, greet a first contribution, and turn on auto-merge for Dependabot updates the queue still gates; there is no result to block on.
|
|
31
32
|
|
|
32
33
|
## Adding a workflow
|
|
33
34
|
|
package/docs/reticle-manual.md
CHANGED
|
@@ -10,7 +10,9 @@ Every row below is a call that was made against a running app and the answer tha
|
|
|
10
10
|
|
|
11
11
|
`refused (names the fix)` means the error told you what to call instead, so you can correct without reading anything else. `refused (no fix named)` means it did not.
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## reticle_look { action: "page" }
|
|
14
|
+
|
|
15
|
+
Probed as `reticle_snapshot`, its name before the merge, which still answers. Call it as `reticle_look { action: "page" }` and pass the arguments below alongside `action`.
|
|
14
16
|
|
|
15
17
|
| you call it with | you get back | bytes |
|
|
16
18
|
| --- | --- | --- |
|
|
@@ -18,7 +20,9 @@ Every row below is a call that was made against a running app and the answer tha
|
|
|
18
20
|
| the documented call: `{"mode":"interactive"}` | ran | 434 |
|
|
19
21
|
| a value outside the allowed set: `{"mode":"not-a-mode"}` | refused (names the fix) | 236 |
|
|
20
22
|
|
|
21
|
-
##
|
|
23
|
+
## reticle_look { action: "find" }
|
|
24
|
+
|
|
25
|
+
Probed as `reticle_query`, its name before the merge, which still answers. Call it as `reticle_look { action: "find" }` and pass the arguments below alongside `action`.
|
|
22
26
|
|
|
23
27
|
| you call it with | you get back | bytes |
|
|
24
28
|
| --- | --- | --- |
|
|
@@ -26,7 +30,9 @@ Every row below is a call that was made against a running app and the answer tha
|
|
|
26
30
|
| the documented call: `{"by":"role","value":"button"}` | ran | 200 |
|
|
27
31
|
| a value outside the allowed set: `{"by":"telepathy","value":"x"}` | refused (names the fix) | 290 |
|
|
28
32
|
|
|
29
|
-
##
|
|
33
|
+
## reticle_observe { action: "network" }
|
|
34
|
+
|
|
35
|
+
Probed as `reticle_network`, its name before the merge, which still answers. Call it as `reticle_observe { action: "network" }` and pass the arguments below alongside `action`.
|
|
30
36
|
|
|
31
37
|
| you call it with | you get back | bytes |
|
|
32
38
|
| --- | --- | --- |
|
|
@@ -34,13 +40,17 @@ Every row below is a call that was made against a running app and the answer tha
|
|
|
34
40
|
| the documented call: `{"limit":5}` | ran | 1175 |
|
|
35
41
|
| a number outside its range: `{"limit":-1}` | refused (names the fix) | 222 |
|
|
36
42
|
|
|
37
|
-
##
|
|
43
|
+
## reticle_observe { action: "console" }
|
|
44
|
+
|
|
45
|
+
Probed as `reticle_console`, its name before the merge, which still answers. Call it as `reticle_observe { action: "console" }` and pass the arguments below alongside `action`.
|
|
38
46
|
|
|
39
47
|
| you call it with | you get back | bytes |
|
|
40
48
|
| --- | --- | --- |
|
|
41
49
|
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 293 |
|
|
42
50
|
|
|
43
|
-
##
|
|
51
|
+
## reticle_look { action: "state" }
|
|
52
|
+
|
|
53
|
+
Probed as `reticle_state`, its name before the merge, which still answers. Call it as `reticle_look { action: "state" }` and pass the arguments below alongside `action`.
|
|
44
54
|
|
|
45
55
|
| you call it with | you get back | bytes |
|
|
46
56
|
| --- | --- | --- |
|
package/docs/skill-file.mdx
CHANGED
|
@@ -1,107 +1,45 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 'The SKILL file: paste and go'
|
|
3
3
|
sidebarTitle: SKILL file
|
|
4
|
-
description: One URL you paste into any coding agent to teach it Reticle.
|
|
4
|
+
description: One URL you paste into any coding agent to teach it Reticle. Where it lives and what it tells the agent.
|
|
5
5
|
icon: graduation-cap
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
`SKILL.md` is one short document written for a coding agent. Its home is this docs site:
|
|
9
9
|
|
|
10
|
-
`SKILL.md` is a single document you hand to a coding agent. It teaches the agent to install Reticle, wire it into your app, and then drive a verification loop properly. Without you explaining any of it.
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
https://raw.githubusercontent.com/reticlehq/reticle/main/SKILL.md
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
That URL is live and returns the current version. Paste it into your agent and say "read this and set up Reticle".
|
|
17
|
-
|
|
18
|
-
<Note>
|
|
19
|
-
You often do not need it. `npx @reticlehq/server init` writes a `/reticle` slash command for
|
|
20
|
-
Claude Code automatically, and installs agent rule files for Claude and Cursor. The SKILL file is
|
|
21
|
-
for agents that `init` cannot configure, for a from-scratch install, or when you want the agent to
|
|
22
|
-
have the full protocol in context rather than a summary.
|
|
23
|
-
</Note>
|
|
24
|
-
|
|
25
|
-
## It has two modes, and it picks one itself
|
|
26
|
-
|
|
27
|
-
The first thing the document tells an agent to do is check which situation it is in:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
cat .reticle.json 2>/dev/null || echo "NOT_FOUND"
|
|
31
10
|
```
|
|
32
|
-
|
|
33
|
-
- **Not found** → run **Setup mode**: register the MCP server, install the SDK, wire the entry point, validate the connection, and prove it on one flow while the user watches.
|
|
34
|
-
- **Found** → run **Test mode**: connect, orient, decide what to test, drive it, report.
|
|
35
|
-
|
|
36
|
-
One document, two jobs, no flag for you to remember. The second time you invoke it, it skips straight to the useful part.
|
|
37
|
-
|
|
38
|
-
## What Setup mode actually does
|
|
39
|
-
|
|
40
|
-
| Phase | What the agent does |
|
|
41
|
-
| --- | --- |
|
|
42
|
-
| Save the skill | Store it as `/reticle` so the loop is one word away from then on |
|
|
43
|
-
| Run `init`, then the first run | Without asking you questions it can answer itself, naming the journey worth proving as the `persona` |
|
|
44
|
-
| Manual fallbacks | Only when `init` could not run: an older CLI that stops after writing files, or the same failure twice |
|
|
45
|
-
| Validate | Confirm a session actually connected. Not that a checklist went green |
|
|
46
|
-
| Prove it | Drive one real flow while you watch, so the install ends in evidence |
|
|
47
|
-
|
|
48
|
-
That last row is the one that matters. Plenty of installs "succeed" and then nothing works. The skill does not consider itself finished until a real flow has produced a real verdict.
|
|
49
|
-
|
|
50
|
-
## What Test mode actually does
|
|
51
|
-
|
|
52
|
-
Five phases: connect, orient, decide what to test, run the tests, report. The reporting format is specified, which matters more than it sounds. An agent left to summarise freely will summarise optimistically.
|
|
53
|
-
|
|
54
|
-
The rules it operates under are the same ones these docs keep repeating:
|
|
55
|
-
|
|
56
|
-
- Only `reticle_act_and_wait` and `reticle_assert` produce a verdict.
|
|
57
|
-
- `verified: "unknown"` is not a pass.
|
|
58
|
-
- Never weaken a check to make it pass.
|
|
59
|
-
|
|
60
|
-
## Feedback is the first section, on purpose
|
|
61
|
-
|
|
62
|
-
Before setup, before anything, the document tells the agent that reporting problems is part of the job. And that this applies **during** setup, which is where Reticle is most likely to break and least likely to hear about it.
|
|
63
|
-
|
|
64
|
-
It even covers the case where nothing is installed yet:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
npx @reticlehq/server feedback --agent --kind gap "init finished but no session ever connected"
|
|
11
|
+
https://docs.reticle.sh/skill.md
|
|
68
12
|
```
|
|
69
13
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
<Tip>
|
|
73
|
-
It also draws a line that saves everyone time: report defects in **Reticle**. A bug found in the
|
|
74
|
-
app under test is Reticle working correctly, and belongs in the answer to the user.
|
|
75
|
-
</Tip>
|
|
76
|
-
|
|
77
|
-
## It ships inside the package too
|
|
78
|
-
|
|
79
|
-
`SKILL.md` is bundled into `@reticlehq/server` at publish time, alongside a copy of this entire documentation site. So an agent that has already installed Reticle can read it from disk without a network round trip:
|
|
14
|
+
Paste that URL into the agent and say "read this and set up Reticle". It is the canonical file with [Agent Skill](https://agentskills.io) frontmatter (`name`, `description`) added. The repository copy, `https://raw.githubusercontent.com/reticlehq/reticle/main/SKILL.md`, has the same body without the frontmatter, and a test fails if the two ever differ. To install the rules as a skill instead, `npx skills add reticlehq/reticle` installs `reticle` (the Claude Code plugin's shorter restructure of this file, held to the same rules by that test) and the task skills beside it. The same file ships inside the package, so an agent with no network can read it from disk:
|
|
80
15
|
|
|
81
16
|
```
|
|
82
17
|
node_modules/@reticlehq/server/SKILL.md
|
|
83
18
|
node_modules/@reticlehq/server/docs/
|
|
84
19
|
```
|
|
85
20
|
|
|
86
|
-
|
|
21
|
+
The `docs/` folder beside it is a copy of this site.
|
|
22
|
+
|
|
23
|
+
## What it tells the agent
|
|
87
24
|
|
|
88
|
-
|
|
25
|
+
It is the critical path and nothing else. Read [SKILL.md](https://github.com/reticlehq/reticle/blob/main/SKILL.md) itself to get the rules exactly right; in short:
|
|
89
26
|
|
|
90
|
-
|
|
27
|
+
- **First move:** if the `reticle_*` tools are visible, call `reticle_session { action: "list" }`. If they are not, hand the user the installer line and stop.
|
|
28
|
+
- **Setup is `init`, then the first run.** `init` wires the app and waits for a session. It never drives. A dev server that was already running must be restarted once.
|
|
29
|
+
- **Done means a verdict.** A session listed means the SDK reached the page. Setup is finished when the first run returns a verdict.
|
|
30
|
+
- **Only `verified: "yes"` is a pass.** `unknown` means Reticle could not tell. Never weaken a check to make it pass.
|
|
31
|
+
- **Replay before you drive.** `reticle_verify { action: "change" }` or `{ action: "flows" }` re-verifies saved journeys in one call.
|
|
32
|
+
- **Report problems with Reticle** through `reticle_session { action: "feedback" }`, or `reticle feedback --agent` from the shell.
|
|
91
33
|
|
|
92
|
-
|
|
34
|
+
## Do you need it?
|
|
35
|
+
|
|
36
|
+
Often not. The installer registers the MCP server with your agents, and `reticle init` writes agent rule files and a `/reticle` command for Claude Code. The SKILL file is for agents `init` cannot configure, for a from-scratch install, or for an agent you want to hold the rules in context.
|
|
93
37
|
|
|
94
38
|
<CardGroup cols={2}>
|
|
95
39
|
<Card title="Agentic install" icon="wand-magic-sparkles" href="/install-agentic">
|
|
96
40
|
What `reticle init` does, with real output.
|
|
97
41
|
</Card>
|
|
98
|
-
<Card title="Manual install" icon="screwdriver-wrench" href="/install-manual">
|
|
99
|
-
Every step `init` cannot automate.
|
|
100
|
-
</Card>
|
|
101
42
|
<Card title="Agent cheat sheet" icon="bolt" href="/agent-cheatsheet">
|
|
102
43
|
The one-screen version of the drive loop.
|
|
103
44
|
</Card>
|
|
104
|
-
<Card title="Best practices" icon="star" href="/best-practices">
|
|
105
|
-
The habits that make verdicts worth trusting.
|
|
106
|
-
</Card>
|
|
107
45
|
</CardGroup>
|