@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
|
@@ -34,6 +34,10 @@ const EXPLORE_FLAG = '--explore';
|
|
|
34
34
|
const PERSONA_FLAG = '--persona';
|
|
35
35
|
/** Narrow the suite to flows carrying this label. Repeatable — a set is the union of what you name. */
|
|
36
36
|
const SELECT_FLAG = '--select';
|
|
37
|
+
/** Write the per-journey verdicts to this file as JSON, for a CI step that posts them. */
|
|
38
|
+
const RESULTS_JSON_FLAG = '--results-json';
|
|
39
|
+
/** Acknowledge, for this run only, the steps the replay guard holds as destructive ("Place order"). */
|
|
40
|
+
const CONFIRM_DANGEROUS_FLAG = '--confirm-dangerous';
|
|
37
41
|
/**
|
|
38
42
|
* Parse `verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>]
|
|
39
43
|
* [--session-id <id>]`. The first non-flag token is the preview URL. `defaultPort` is already
|
|
@@ -90,6 +94,8 @@ export function parseVerifySuffix(args, defaultPort) {
|
|
|
90
94
|
let explore = false;
|
|
91
95
|
let persona;
|
|
92
96
|
const select = [];
|
|
97
|
+
let resultsJson;
|
|
98
|
+
let confirmDangerous = false;
|
|
93
99
|
let port = defaultPort;
|
|
94
100
|
let i = 0;
|
|
95
101
|
while (i < args.length) {
|
|
@@ -142,9 +148,19 @@ export function parseVerifySuffix(args, defaultPort) {
|
|
|
142
148
|
// silently become two selections that match nothing.
|
|
143
149
|
select.push(v);
|
|
144
150
|
}
|
|
151
|
+
else if (arg === RESULTS_JSON_FLAG) {
|
|
152
|
+
i++;
|
|
153
|
+
const v = args[i];
|
|
154
|
+
if (v === undefined)
|
|
155
|
+
return missingValue(RESULTS_JSON_FLAG);
|
|
156
|
+
resultsJson = v;
|
|
157
|
+
}
|
|
145
158
|
else if (arg === EXPLORE_FLAG) {
|
|
146
159
|
explore = true;
|
|
147
160
|
}
|
|
161
|
+
else if (arg === CONFIRM_DANGEROUS_FLAG) {
|
|
162
|
+
confirmDangerous = true;
|
|
163
|
+
}
|
|
148
164
|
else if (arg === PERSONA_FLAG) {
|
|
149
165
|
i++;
|
|
150
166
|
const v = args[i];
|
|
@@ -212,5 +228,7 @@ export function parseVerifySuffix(args, defaultPort) {
|
|
|
212
228
|
...(explore ? { explore } : {}),
|
|
213
229
|
...(persona !== undefined ? { persona } : {}),
|
|
214
230
|
...(select.length > 0 ? { select } : {}),
|
|
231
|
+
...(resultsJson !== undefined ? { resultsJson } : {}),
|
|
232
|
+
...(confirmDangerous ? { confirmDangerous } : {}),
|
|
215
233
|
};
|
|
216
234
|
}
|
|
@@ -3,19 +3,12 @@
|
|
|
3
3
|
* The parser stays pure and unit-testable; `cli.ts` owns the side-effecting handlers and dispatch,
|
|
4
4
|
* and re-exports this surface.
|
|
5
5
|
*/
|
|
6
|
-
import { TutorialAudience } from './tutorial.js';
|
|
7
6
|
import { type ParsedFeedback } from './cli-parse-feedback.js';
|
|
8
7
|
import { HEADED_FLAG, PORT_FLAG } from './cli-parse-grammar.js';
|
|
9
8
|
export { HEADED_FLAG, PORT_FLAG };
|
|
10
9
|
export { AGENT_FLAG, BUG_FLAG, FEEDBACK_KINDS, KIND_FLAG, RATING_FLAG, } from './cli-parse-feedback.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
* once it is on PATH. Copied into `npx`, it is not: `npx reticle` resolves the PACKAGE named
|
|
14
|
-
* `reticle`, which belongs to somebody else, and npx will happily fetch and run it. The docs were
|
|
15
|
-
* telling readers to do exactly that on 110 lines before it was caught, so the invocation now leads
|
|
16
|
-
* the usage block rather than being a footnote somewhere else.
|
|
17
|
-
*/
|
|
18
|
-
export declare const CLI_USAGE = "usage: npx @reticlehq/server <command> (or `reticle <command>` once the bin is on your PATH)\n\n reticle tutorial [--run] [--headless] [--port N] (watch Reticle verify a demo app, in seconds)\n reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]\n [--env KEY=VALUE]... [--files-only] [--hooks] (wire Reticle into the project in this directory)\n init is ONBOARDING: it wires the project, boots the app and proves a session\n connected. It does not drive. The FIRST RUN is the stage that proves a flow:\n an agent drives one journey with reticle_act_and_wait and an `until` on its last\n step; with a linked project, reticle_verify { action: \"explore\", persona: \"\u2026\" }\n (or reticle verify <url> --explore --persona \"\u2026\") drives it instead\n --app picks WHICH app in a monorepo, when several are found\n --env is what the app needs to reach a usable state: the key from\n .env.example, the mock backend, the variable that skips an auth wall.\n Repeatable, and a value may contain spaces and equals signs\n --files-only writes the files and stops, which is what init did before it\n learned to boot the app and prove the install works\n --relaunch prints the exact command that restarts THIS conversation with\n the tools loaded, so the restart is not a chore handed to a human. It\n refuses when the session id has no transcript behind it, because\n --resume on an empty id opens a blank conversation that looks like\n success. Works with --files-only\n --license writes the key to .env and keeps .env out of git\n --json puts the result on stdout, so an agent reads one object\n --no-open / --no-agents / --url / --timeout are the runtime dials: CI, a\n headless box, or an app you already run\n --no-mcp skips MORE than the server registration: also the agent rule files\n (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three\n only make sense once the tools are reachable.\n reticle serve [--port N] [--drive <url>] [--headless] [--http] [--http-port N] [--http-token T]\n reticle stop [--port N] [--quiet] (stop the daemon we started, by its recorded pid)\n reticle kill [--port N] [--force] (free the port by its LISTENER, never the agent's mcp proxy)\n reticle restart [--port N] [--force] (kill, then start a daemon and wait for a real bind)\n reticle status [--port N] [--json] (a readable block; --json for the event)\n reticle doctor [--port N] (one command to diagnose setup: Chromium, daemon, port)\n reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)\n reticle verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>] [--session-id <id>] (one-shot: drive the URL, verify saved flows, exit 0=pass)\n [--explore] [--persona <who>] (no saved flows? let Reticle drive the app itself and record them)\n [--select <label>] (repeatable: verify only flows carrying these labels \u2014 no model, exit 0=pass)\n [--expect '<json predicate>' | --expect-file <path>] (one verdict, no saved\n flows needed. --expect-file avoids cmd.exe and PowerShell quote mangling. It\n asks an existing daemon, never binds or stops one; with none, it refuses.\n Cannot combine with --storage-state. Use when the client lacks reticle_*\n tools. exit 0 ONLY on verified:\"yes\" \u2014 \"unknown\" is not a pass. For an\n action --expect cannot do, drive the daemon's HTTP MCP transport instead \u2014 see\n https://docs.reticle.sh/http-transport.md)\n reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)\n reticle gate [--since <ref>] [--accept-coverage] [file...] (exit non-zero unless passing artifacts cover the affected flows)\n reticle report [--session <id>] [--hook] (what the latest session claimed, and what held)\n reticle setup mcp (register the MCP server with your agents; the installer's registration half)\n reticle capsules (list the saved fail-to-pass bug capsules in .reticle/capsules)\n reticle hunt <dir> (aggregate a directory of crawl reports into one false-green rate)\n reticle watch [url] (on save, report which saved flows must re-verify)\n reticle drive <url> [--headless] (foreground mode, for debugging)\n reticle mcp [--port N] [--drive <url>] [--headless] (MCP stdio proxy; auto-starts daemon if needed)\n reticle update (install the latest server version and restart)\n reticle rollback (restore the previous server version and restart)\n reticle license (show enterprise license status: active | eval | missing)\n reticle telemetry [status|enable|disable] (anonymous usage metrics; status shows what's sent + the policy)\n reticle feedback [--rating 1-5] [--bug] \"message\" (tell us what worked and what didn't; prints exactly what it sends)\n reticle feedback --agent --kind <bug|gap|ambiguity|feature_request|improvement|experience> \"message\"\n (agents: file from anywhere, including a setup that never finished)\n reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]\n (OPT-IN: tell us who you are, e.g. for support or an enterprise trial)\n\nCloud (link this project to Reticle; runs/flows recorded on the dashboard):\n reticle connect [--project <name|id>] [--url <cloud origin>]\n (wire this app if needed, sign in, link, send local history)\n reticle login [--url <u>] [--email <e>] [--code <c>] [--org <n>]\n (browser device flow by default; --email mails a code)\n reticle logout [--url <u>] (sign out of ONE host; others stay signed in)\n reticle link [--project <name|id>] (bind this repo: mints a scoped key, writes .reticle/cloud.json)\n reticle whoami (who am I signed in as, and is this repo attached?)\n reticle project <ls|create <name>> (list or create cloud projects)\n reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]\n reticle push | sync [--watch] (one sync cycle: send the difference, collect decisions)\n reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)\n\n'drive' shows the browser; everything else is hidden (serve/mcp own the pool behind leases, replay\nand the spec runner: batch work). --headed opts any of them in, --headless hides drive, CI hides it.";
|
|
10
|
+
import { CLI_USAGE } from './cli-usage.js';
|
|
11
|
+
export { CLI_USAGE };
|
|
19
12
|
/** The `reticle telemetry` sub-actions. Bare `reticle telemetry` means `status`. */
|
|
20
13
|
export declare const TelemetryAction: {
|
|
21
14
|
readonly STATUS: "status";
|
|
@@ -34,8 +27,16 @@ export declare const DAEMON_INNER_COMMAND = "_daemon";
|
|
|
34
27
|
* defined; a second list somewhere else would drift the first time a command is added.
|
|
35
28
|
*/
|
|
36
29
|
export declare const UNKNOWN_COMMAND = "unknown";
|
|
30
|
+
/** Every command the typed parser below routes. The parser refuses any word not in this list. */
|
|
31
|
+
export declare const LOCAL_COMMANDS: readonly string[];
|
|
37
32
|
/** The subcommand name if we recognize it, else `unknown`. Bare `reticle` reports `help`. */
|
|
38
33
|
export declare function knownCommand(arg: string | undefined): string;
|
|
34
|
+
/**
|
|
35
|
+
* Force a hidden browser. The default is now HEADED: a run nobody can see is a run nobody trusts,
|
|
36
|
+
* and every "did it actually do anything?" question cost a round-trip. CI passes this (or just sets
|
|
37
|
+
* CI, which flips the default) because there is no display there to be headed on.
|
|
38
|
+
*/
|
|
39
|
+
export declare const HEADLESS_FLAG = "--headless";
|
|
39
40
|
export declare const DRIVE_FLAG = "--drive";
|
|
40
41
|
export declare const HTTP_FLAG = "--http";
|
|
41
42
|
export declare const HTTP_PORT_FLAG = "--http-port";
|
|
@@ -62,6 +63,7 @@ export type CliResult = {
|
|
|
62
63
|
json: boolean;
|
|
63
64
|
relaunch: boolean;
|
|
64
65
|
open: boolean;
|
|
66
|
+
firstRun: boolean;
|
|
65
67
|
agents: boolean;
|
|
66
68
|
url: string | undefined;
|
|
67
69
|
timeoutSeconds: number | undefined;
|
|
@@ -98,15 +100,13 @@ export type CliResult = {
|
|
|
98
100
|
} | Extract<ParsedFeedback, {
|
|
99
101
|
kind: 'feedback';
|
|
100
102
|
}> | {
|
|
101
|
-
kind: 'identify';
|
|
102
|
-
context?: string;
|
|
103
|
-
company?: string;
|
|
104
|
-
email?: string;
|
|
105
|
-
forget: boolean;
|
|
106
|
-
} | {
|
|
107
103
|
kind: 'version';
|
|
108
104
|
} | {
|
|
109
105
|
kind: 'help';
|
|
106
|
+
topic?: string;
|
|
107
|
+
} | {
|
|
108
|
+
kind: 'removed';
|
|
109
|
+
message: string;
|
|
110
110
|
} | {
|
|
111
111
|
kind: 'doctor';
|
|
112
112
|
port: number;
|
|
@@ -117,12 +117,6 @@ export type CliResult = {
|
|
|
117
117
|
runtimeSecs: number;
|
|
118
118
|
installSecs: number;
|
|
119
119
|
mcp: boolean;
|
|
120
|
-
} | {
|
|
121
|
-
kind: 'tutorial';
|
|
122
|
-
audience: TutorialAudience;
|
|
123
|
-
run: boolean;
|
|
124
|
-
port: number;
|
|
125
|
-
headless: boolean;
|
|
126
120
|
} | {
|
|
127
121
|
kind: 'open';
|
|
128
122
|
port: number;
|
|
@@ -153,15 +147,12 @@ export type CliResult = {
|
|
|
153
147
|
explore?: boolean;
|
|
154
148
|
persona?: string;
|
|
155
149
|
select?: string[];
|
|
150
|
+
resultsJson?: string;
|
|
151
|
+
confirmDangerous?: boolean;
|
|
156
152
|
} | {
|
|
157
153
|
kind: 'affected';
|
|
158
154
|
files: string[];
|
|
159
155
|
since?: string;
|
|
160
|
-
} | {
|
|
161
|
-
kind: 'hunt';
|
|
162
|
-
dir: string;
|
|
163
|
-
} | {
|
|
164
|
-
kind: 'capsules';
|
|
165
156
|
} | {
|
|
166
157
|
kind: 'gate';
|
|
167
158
|
files: string[];
|
|
@@ -173,8 +164,8 @@ export type CliResult = {
|
|
|
173
164
|
session?: string;
|
|
174
165
|
hook: boolean;
|
|
175
166
|
} | {
|
|
176
|
-
kind: '
|
|
177
|
-
|
|
167
|
+
kind: 'context';
|
|
168
|
+
session?: string;
|
|
178
169
|
} | {
|
|
179
170
|
kind: 'update';
|
|
180
171
|
} | {
|
|
@@ -3,102 +3,18 @@
|
|
|
3
3
|
* The parser stays pure and unit-testable; `cli.ts` owns the side-effecting handlers and dispatch,
|
|
4
4
|
* and re-exports this surface.
|
|
5
5
|
*/
|
|
6
|
-
import { TutorialAudience } from './tutorial.js';
|
|
7
6
|
import { parseFeedbackArgs } from './cli-parse-feedback.js';
|
|
8
7
|
import { parseVerifySuffix } from './cli-parse-verify.js';
|
|
9
|
-
import { HEADED_FLAG, PORT_FLAG, VERIFY_COMMAND, missingOperand, missingValue, notANumber, retiredFlag, unknownArgument, } from './cli-parse-grammar.js';
|
|
8
|
+
import { HEADED_FLAG, PORT_FLAG, VERIFY_COMMAND, missingOperand, missingValue, notANumber, retiredFlag, unknownArgument, CLOUD_COMMANDS, REMOVED_COMMANDS, removedNote, } from './cli-parse-grammar.js';
|
|
10
9
|
// Re-exported because the daemon's own argv builder reaches for these through this module, which is
|
|
11
10
|
// where the grammar has always lived as far as every caller is concerned.
|
|
12
11
|
export { HEADED_FLAG, PORT_FLAG };
|
|
13
12
|
import { FORCE_FLAG } from './cli-kill.js';
|
|
14
13
|
// Re-exported so every existing importer of these flags is unaffected by the file split.
|
|
15
14
|
export { AGENT_FLAG, BUG_FLAG, FEEDBACK_KINDS, KIND_FLAG, RATING_FLAG, } from './cli-parse-feedback.js';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* `reticle`, which belongs to somebody else, and npx will happily fetch and run it. The docs were
|
|
20
|
-
* telling readers to do exactly that on 110 lines before it was caught, so the invocation now leads
|
|
21
|
-
* the usage block rather than being a footnote somewhere else.
|
|
22
|
-
*/
|
|
23
|
-
export const CLI_USAGE = `usage: npx @reticlehq/server <command> (or \`reticle <command>\` once the bin is on your PATH)
|
|
24
|
-
|
|
25
|
-
reticle tutorial [--run] [--headless] [--port N] (watch Reticle verify a demo app, in seconds)
|
|
26
|
-
reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
|
|
27
|
-
[--env KEY=VALUE]... [--files-only] [--hooks] (wire Reticle into the project in this directory)
|
|
28
|
-
init is ONBOARDING: it wires the project, boots the app and proves a session
|
|
29
|
-
connected. It does not drive. The FIRST RUN is the stage that proves a flow:
|
|
30
|
-
an agent drives one journey with reticle_act_and_wait and an \`until\` on its last
|
|
31
|
-
step; with a linked project, reticle_verify { action: "explore", persona: "…" }
|
|
32
|
-
(or reticle verify <url> --explore --persona "…") drives it instead
|
|
33
|
-
--app picks WHICH app in a monorepo, when several are found
|
|
34
|
-
--env is what the app needs to reach a usable state: the key from
|
|
35
|
-
.env.example, the mock backend, the variable that skips an auth wall.
|
|
36
|
-
Repeatable, and a value may contain spaces and equals signs
|
|
37
|
-
--files-only writes the files and stops, which is what init did before it
|
|
38
|
-
learned to boot the app and prove the install works
|
|
39
|
-
--relaunch prints the exact command that restarts THIS conversation with
|
|
40
|
-
the tools loaded, so the restart is not a chore handed to a human. It
|
|
41
|
-
refuses when the session id has no transcript behind it, because
|
|
42
|
-
--resume on an empty id opens a blank conversation that looks like
|
|
43
|
-
success. Works with --files-only
|
|
44
|
-
--license writes the key to .env and keeps .env out of git
|
|
45
|
-
--json puts the result on stdout, so an agent reads one object
|
|
46
|
-
--no-open / --no-agents / --url / --timeout are the runtime dials: CI, a
|
|
47
|
-
headless box, or an app you already run
|
|
48
|
-
--no-mcp skips MORE than the server registration: also the agent rule files
|
|
49
|
-
(CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
|
|
50
|
-
only make sense once the tools are reachable.
|
|
51
|
-
reticle serve [--port N] [--drive <url>] [--headless] [--http] [--http-port N] [--http-token T]
|
|
52
|
-
reticle stop [--port N] [--quiet] (stop the daemon we started, by its recorded pid)
|
|
53
|
-
reticle kill [--port N] [--force] (free the port by its LISTENER, never the agent's mcp proxy)
|
|
54
|
-
reticle restart [--port N] [--force] (kill, then start a daemon and wait for a real bind)
|
|
55
|
-
reticle status [--port N] [--json] (a readable block; --json for the event)
|
|
56
|
-
reticle doctor [--port N] (one command to diagnose setup: Chromium, daemon, port)
|
|
57
|
-
reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)
|
|
58
|
-
reticle verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>] [--session-id <id>] (one-shot: drive the URL, verify saved flows, exit 0=pass)
|
|
59
|
-
[--explore] [--persona <who>] (no saved flows? let Reticle drive the app itself and record them)
|
|
60
|
-
[--select <label>] (repeatable: verify only flows carrying these labels — no model, exit 0=pass)
|
|
61
|
-
[--expect '<json predicate>' | --expect-file <path>] (one verdict, no saved
|
|
62
|
-
flows needed. --expect-file avoids cmd.exe and PowerShell quote mangling. It
|
|
63
|
-
asks an existing daemon, never binds or stops one; with none, it refuses.
|
|
64
|
-
Cannot combine with --storage-state. Use when the client lacks reticle_*
|
|
65
|
-
tools. exit 0 ONLY on verified:"yes" — "unknown" is not a pass. For an
|
|
66
|
-
action --expect cannot do, drive the daemon's HTTP MCP transport instead — see
|
|
67
|
-
https://docs.reticle.sh/http-transport.md)
|
|
68
|
-
reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)
|
|
69
|
-
reticle gate [--since <ref>] [--accept-coverage] [file...] (exit non-zero unless passing artifacts cover the affected flows)
|
|
70
|
-
reticle report [--session <id>] [--hook] (what the latest session claimed, and what held)
|
|
71
|
-
reticle setup mcp (register the MCP server with your agents; the installer's registration half)
|
|
72
|
-
reticle capsules (list the saved fail-to-pass bug capsules in .reticle/capsules)
|
|
73
|
-
reticle hunt <dir> (aggregate a directory of crawl reports into one false-green rate)
|
|
74
|
-
reticle watch [url] (on save, report which saved flows must re-verify)
|
|
75
|
-
reticle drive <url> [--headless] (foreground mode, for debugging)
|
|
76
|
-
reticle mcp [--port N] [--drive <url>] [--headless] (MCP stdio proxy; auto-starts daemon if needed)
|
|
77
|
-
reticle update (install the latest server version and restart)
|
|
78
|
-
reticle rollback (restore the previous server version and restart)
|
|
79
|
-
reticle license (show enterprise license status: active | eval | missing)
|
|
80
|
-
reticle telemetry [status|enable|disable] (anonymous usage metrics; status shows what's sent + the policy)
|
|
81
|
-
reticle feedback [--rating 1-5] [--bug] "message" (tell us what worked and what didn't; prints exactly what it sends)
|
|
82
|
-
reticle feedback --agent --kind <bug|gap|ambiguity|feature_request|improvement|experience> "message"
|
|
83
|
-
(agents: file from anywhere, including a setup that never finished)
|
|
84
|
-
reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]
|
|
85
|
-
(OPT-IN: tell us who you are, e.g. for support or an enterprise trial)
|
|
86
|
-
|
|
87
|
-
Cloud (link this project to Reticle; runs/flows recorded on the dashboard):
|
|
88
|
-
reticle connect [--project <name|id>] [--url <cloud origin>]
|
|
89
|
-
(wire this app if needed, sign in, link, send local history)
|
|
90
|
-
reticle login [--url <u>] [--email <e>] [--code <c>] [--org <n>]
|
|
91
|
-
(browser device flow by default; --email mails a code)
|
|
92
|
-
reticle logout [--url <u>] (sign out of ONE host; others stay signed in)
|
|
93
|
-
reticle link [--project <name|id>] (bind this repo: mints a scoped key, writes .reticle/cloud.json)
|
|
94
|
-
reticle whoami (who am I signed in as, and is this repo attached?)
|
|
95
|
-
reticle project <ls|create <name>> (list or create cloud projects)
|
|
96
|
-
reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
|
|
97
|
-
reticle push | sync [--watch] (one sync cycle: send the difference, collect decisions)
|
|
98
|
-
reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)
|
|
99
|
-
|
|
100
|
-
'drive' shows the browser; everything else is hidden (serve/mcp own the pool behind leases, replay
|
|
101
|
-
and the spec runner: batch work). --headed opts any of them in, --headless hides drive, CI hides it.`;
|
|
15
|
+
// The help text lives on its own page; re-exported so every importer of it is unaffected.
|
|
16
|
+
import { CLI_USAGE } from './cli-usage.js';
|
|
17
|
+
export { CLI_USAGE };
|
|
102
18
|
const INIT_COMMAND = 'init';
|
|
103
19
|
const SERVE_COMMAND = 'serve';
|
|
104
20
|
const STOP_COMMAND = 'stop';
|
|
@@ -108,16 +24,15 @@ const STATUS_COMMAND = 'status';
|
|
|
108
24
|
const OPEN_COMMAND = 'open';
|
|
109
25
|
const DRIVE_COMMAND = 'drive';
|
|
110
26
|
const AFFECTED_COMMAND = 'affected';
|
|
111
|
-
const HUNT_COMMAND = 'hunt';
|
|
112
|
-
const CAPSULES_COMMAND = 'capsules';
|
|
113
27
|
const GATE_COMMAND = 'gate';
|
|
114
28
|
/** Hook mode: prose a human can read, and silence when there was simply nothing to check. */
|
|
115
29
|
const HOOK_FLAG = '--hook';
|
|
116
30
|
const ACCEPT_COVERAGE_FLAG = '--accept-coverage';
|
|
117
31
|
/** `reticle report [--session <id>] [--hook]` — what the latest session claimed, and what held. */
|
|
118
32
|
const REPORT_COMMAND = 'report';
|
|
33
|
+
/** `reticle context --compact`: the resume block, from disk. A SessionStart hook prints it. */
|
|
34
|
+
const CONTEXT_COMMAND = 'context';
|
|
119
35
|
const SESSION_FLAG = '--session';
|
|
120
|
-
const WATCH_COMMAND = 'watch';
|
|
121
36
|
const UPDATE_COMMAND = 'update';
|
|
122
37
|
const ROLLBACK_COMMAND = 'rollback';
|
|
123
38
|
const MCP_COMMAND = 'mcp';
|
|
@@ -125,11 +40,8 @@ const LICENSE_COMMAND = 'license';
|
|
|
125
40
|
const VERSION_COMMAND = 'version';
|
|
126
41
|
const TELEMETRY_COMMAND = 'telemetry';
|
|
127
42
|
const FEEDBACK_COMMAND = 'feedback';
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
const EMAIL_FLAG = '--email';
|
|
131
|
-
const CONTEXT_FLAG = '--context';
|
|
132
|
-
const FORGET_FLAG = '--forget';
|
|
43
|
+
const DOCTOR_COMMAND = 'doctor';
|
|
44
|
+
const SETUP_COMMAND = 'setup';
|
|
133
45
|
/** The `reticle telemetry` sub-actions. Bare `reticle telemetry` means `status`. */
|
|
134
46
|
export const TelemetryAction = {
|
|
135
47
|
STATUS: 'status',
|
|
@@ -147,7 +59,10 @@ export const DAEMON_INNER_COMMAND = '_daemon';
|
|
|
147
59
|
* defined; a second list somewhere else would drift the first time a command is added.
|
|
148
60
|
*/
|
|
149
61
|
export const UNKNOWN_COMMAND = 'unknown';
|
|
150
|
-
const
|
|
62
|
+
const HELP_COMMAND = 'help';
|
|
63
|
+
const HELP_FLAGS = new Set(['--help', '-h']);
|
|
64
|
+
/** Every command the typed parser below routes. The parser refuses any word not in this list. */
|
|
65
|
+
export const LOCAL_COMMANDS = [
|
|
151
66
|
INIT_COMMAND,
|
|
152
67
|
SERVE_COMMAND,
|
|
153
68
|
STOP_COMMAND,
|
|
@@ -158,11 +73,9 @@ const KNOWN_COMMANDS = new Set([
|
|
|
158
73
|
DRIVE_COMMAND,
|
|
159
74
|
VERIFY_COMMAND,
|
|
160
75
|
AFFECTED_COMMAND,
|
|
161
|
-
HUNT_COMMAND,
|
|
162
|
-
CAPSULES_COMMAND,
|
|
163
76
|
GATE_COMMAND,
|
|
164
77
|
REPORT_COMMAND,
|
|
165
|
-
|
|
78
|
+
CONTEXT_COMMAND,
|
|
166
79
|
UPDATE_COMMAND,
|
|
167
80
|
ROLLBACK_COMMAND,
|
|
168
81
|
MCP_COMMAND,
|
|
@@ -170,25 +83,23 @@ const KNOWN_COMMANDS = new Set([
|
|
|
170
83
|
VERSION_COMMAND,
|
|
171
84
|
TELEMETRY_COMMAND,
|
|
172
85
|
FEEDBACK_COMMAND,
|
|
173
|
-
IDENTIFY_COMMAND,
|
|
174
86
|
DAEMON_INNER_COMMAND,
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
'
|
|
188
|
-
'
|
|
189
|
-
'
|
|
190
|
-
'
|
|
191
|
-
'help',
|
|
87
|
+
DOCTOR_COMMAND,
|
|
88
|
+
SETUP_COMMAND,
|
|
89
|
+
];
|
|
90
|
+
const LOCAL_COMMAND_SET = new Set(LOCAL_COMMANDS);
|
|
91
|
+
const KNOWN_COMMANDS = new Set([
|
|
92
|
+
...LOCAL_COMMANDS,
|
|
93
|
+
...CLOUD_COMMANDS,
|
|
94
|
+
...REMOVED_COMMANDS.keys(),
|
|
95
|
+
HELP_COMMAND,
|
|
96
|
+
]);
|
|
97
|
+
/** The conventional flag spellings of two commands, reported as the command they ask for. */
|
|
98
|
+
const COMMAND_FLAG_ALIASES = new Map([
|
|
99
|
+
['--version', VERSION_COMMAND],
|
|
100
|
+
['-v', VERSION_COMMAND],
|
|
101
|
+
['--help', HELP_COMMAND],
|
|
102
|
+
['-h', HELP_COMMAND],
|
|
192
103
|
]);
|
|
193
104
|
/**
|
|
194
105
|
* A non-negative integer flag, or 0.
|
|
@@ -207,15 +118,15 @@ function numberFlag(args, name) {
|
|
|
207
118
|
/** The subcommand name if we recognize it, else `unknown`. Bare `reticle` reports `help`. */
|
|
208
119
|
export function knownCommand(arg) {
|
|
209
120
|
if (arg === undefined || '' === arg)
|
|
210
|
-
return
|
|
211
|
-
return KNOWN_COMMANDS.has(arg) ? arg : UNKNOWN_COMMAND;
|
|
121
|
+
return HELP_COMMAND;
|
|
122
|
+
return KNOWN_COMMANDS.has(arg) ? arg : (COMMAND_FLAG_ALIASES.get(arg) ?? UNKNOWN_COMMAND);
|
|
212
123
|
}
|
|
213
124
|
/**
|
|
214
125
|
* Force a hidden browser. The default is now HEADED: a run nobody can see is a run nobody trusts,
|
|
215
126
|
* and every "did it actually do anything?" question cost a round-trip. CI passes this (or just sets
|
|
216
127
|
* CI, which flips the default) because there is no display there to be headed on.
|
|
217
128
|
*/
|
|
218
|
-
const HEADLESS_FLAG = '--headless';
|
|
129
|
+
export const HEADLESS_FLAG = '--headless';
|
|
219
130
|
export const DRIVE_FLAG = '--drive';
|
|
220
131
|
const QUIET_FLAG = '--quiet';
|
|
221
132
|
const DRY_RUN_FLAG = '--dry-run';
|
|
@@ -236,6 +147,8 @@ const FLOW_FLAG = '--flow';
|
|
|
236
147
|
const FIRST_RUN_MOVED = 'onboarding wires the project, the FIRST RUN proves a flow. Drive one with reticle_verify { action: "explore", persona: "<who does what>" }, or npx @reticlehq/server verify <url> --explore --persona "<who does what>"';
|
|
237
148
|
const ENV_FLAG = '--env';
|
|
238
149
|
const FILES_ONLY_FLAG = '--files-only';
|
|
150
|
+
/** With `--app`, also start the app: naming one app of a workspace otherwise writes its files only. */
|
|
151
|
+
const START_FLAG = '--start';
|
|
239
152
|
/**
|
|
240
153
|
* Write `captureNetworkBodies: true` into the app's config. OFF unless asked (#705).
|
|
241
154
|
*
|
|
@@ -256,6 +169,8 @@ const HOOKS_FLAG = '--hooks';
|
|
|
256
169
|
const JSON_FLAG = '--json';
|
|
257
170
|
const NO_DRIVE_FLAG = '--no-drive';
|
|
258
171
|
const NO_OPEN_FLAG = '--no-open';
|
|
172
|
+
/** Connect and stop: no coverage summary and no prompt at the end. */
|
|
173
|
+
const NO_FIRST_RUN_FLAG = '--no-first-run';
|
|
259
174
|
const NO_AGENTS_FLAG = '--no-agents';
|
|
260
175
|
/**
|
|
261
176
|
* Restart the calling client so IT gets the tools.
|
|
@@ -281,12 +196,6 @@ const NO_INSTALL_FLAG = '--no-install';
|
|
|
281
196
|
export const HTTP_FLAG = '--http';
|
|
282
197
|
export const HTTP_PORT_FLAG = '--http-port';
|
|
283
198
|
export const HTTP_TOKEN_FLAG = '--http-token';
|
|
284
|
-
/**
|
|
285
|
-
* `serve` / `mcp` / `_daemon` own the browser POOL, which backs automated work — leased contexts for
|
|
286
|
-
* parallel agents, flow replay, the spec runner. Those are batch: nobody is watching, and launching
|
|
287
|
-
* them headed changed timing enough to break four e2e specs. The headed default belongs to the
|
|
288
|
-
* INTERACTIVE command (`drive`), where a human asked to see the run. `--headed` still opts in here.
|
|
289
|
-
*/
|
|
290
199
|
/**
|
|
291
200
|
* A usage error names the thing that was wrong.
|
|
292
201
|
*
|
|
@@ -307,10 +216,10 @@ const unknownCommand = (command) => ({
|
|
|
307
216
|
kind: 'error',
|
|
308
217
|
message: `unknown command '${command}'`,
|
|
309
218
|
});
|
|
310
|
-
function parseServeFlags(args, defaultPort,
|
|
219
|
+
function parseServeFlags(args, defaultPort, defaultHeadless) {
|
|
311
220
|
let port = defaultPort;
|
|
312
221
|
let driveUrl;
|
|
313
|
-
let headless =
|
|
222
|
+
let headless = defaultHeadless;
|
|
314
223
|
let http = false;
|
|
315
224
|
let httpPort;
|
|
316
225
|
let httpToken;
|
|
@@ -427,10 +336,12 @@ function parseInitFlags(args) {
|
|
|
427
336
|
// Repeatable: one variable per flag, so a value containing spaces or `=` needs no quoting rules.
|
|
428
337
|
const env = [];
|
|
429
338
|
let filesOnly = false;
|
|
339
|
+
let start = false;
|
|
430
340
|
let captureBodies = false;
|
|
431
341
|
let hooks = false;
|
|
432
342
|
let json = false;
|
|
433
343
|
let open = true;
|
|
344
|
+
let firstRun = true;
|
|
434
345
|
let relaunch = false;
|
|
435
346
|
let agents = true;
|
|
436
347
|
let url;
|
|
@@ -473,6 +384,9 @@ function parseInitFlags(args) {
|
|
|
473
384
|
else if (arg === FILES_ONLY_FLAG) {
|
|
474
385
|
filesOnly = true;
|
|
475
386
|
}
|
|
387
|
+
else if (arg === START_FLAG) {
|
|
388
|
+
start = true;
|
|
389
|
+
}
|
|
476
390
|
else if (arg === CAPTURE_BODIES_FLAG) {
|
|
477
391
|
captureBodies = true;
|
|
478
392
|
}
|
|
@@ -485,6 +399,9 @@ function parseInitFlags(args) {
|
|
|
485
399
|
else if (arg === NO_OPEN_FLAG) {
|
|
486
400
|
open = false;
|
|
487
401
|
}
|
|
402
|
+
else if (arg === NO_FIRST_RUN_FLAG) {
|
|
403
|
+
firstRun = false;
|
|
404
|
+
}
|
|
488
405
|
else if (arg === RELAUNCH_FLAG) {
|
|
489
406
|
relaunch = true;
|
|
490
407
|
}
|
|
@@ -540,11 +457,14 @@ function parseInitFlags(args) {
|
|
|
540
457
|
install,
|
|
541
458
|
app,
|
|
542
459
|
env,
|
|
543
|
-
|
|
460
|
+
// One app of a workspace, named: its files, and nothing started unless asked (`--start`). Its
|
|
461
|
+
// dev server is often run from the root, and a monorepo init started the daemon and failed it.
|
|
462
|
+
filesOnly: filesOnly || (app !== undefined && !start),
|
|
544
463
|
captureBodies,
|
|
545
464
|
hooks,
|
|
546
465
|
json,
|
|
547
466
|
open,
|
|
467
|
+
firstRun,
|
|
548
468
|
relaunch,
|
|
549
469
|
agents,
|
|
550
470
|
url,
|
|
@@ -592,8 +512,6 @@ function parseTargetArgs(rest) {
|
|
|
592
512
|
export function dialsTheDaemon(parsed) {
|
|
593
513
|
if ('init' === parsed.kind)
|
|
594
514
|
return false;
|
|
595
|
-
if ('tutorial' === parsed.kind)
|
|
596
|
-
return parsed.run;
|
|
597
515
|
return 'port' in parsed;
|
|
598
516
|
}
|
|
599
517
|
/**
|
|
@@ -603,9 +521,9 @@ export function dialsTheDaemon(parsed) {
|
|
|
603
521
|
* trustworthy, and asking people to opt into seeing their own app was backwards.
|
|
604
522
|
*/
|
|
605
523
|
export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
606
|
-
// Bare `reticle` is `serve
|
|
524
|
+
// Bare `reticle` is `serve`.
|
|
607
525
|
if (0 === argv.length)
|
|
608
|
-
return { kind: 'serve', port: defaultPort, headless:
|
|
526
|
+
return { kind: 'serve', port: defaultPort, headless: defaultHeadless, http: false };
|
|
609
527
|
const [cmd, ...rest] = argv;
|
|
610
528
|
// Guaranteed by the bare-argv check above; restated so the unknown-command error can name it.
|
|
611
529
|
if (cmd === undefined)
|
|
@@ -623,9 +541,22 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
623
541
|
// `reticle_usage_error: unknown argument '--help'` on stderr with exit 1. The usage text was
|
|
624
542
|
// printed underneath it, so the request was in fact answered; it was simply answered as a failure,
|
|
625
543
|
// which is the wrong first impression to give somebody who has just asked a tool what it does.
|
|
626
|
-
|
|
627
|
-
|
|
544
|
+
//
|
|
545
|
+
// Removed commands answer before help does: `reticle hunt --help` should say it is gone, not
|
|
546
|
+
// describe something that no longer runs.
|
|
547
|
+
const removed = REMOVED_COMMANDS.get(cmd);
|
|
548
|
+
if (removed !== undefined)
|
|
549
|
+
return { kind: 'removed', message: removedNote(cmd, removed) };
|
|
550
|
+
if (HELP_COMMAND === cmd || HELP_FLAGS.has(cmd)) {
|
|
551
|
+
// `reticle help all`, `reticle --help all`, `reticle help init`.
|
|
552
|
+
const topic = rest.find((arg) => !HELP_FLAGS.has(arg));
|
|
553
|
+
return topic === undefined ? { kind: 'help' } : { kind: 'help', topic };
|
|
628
554
|
}
|
|
555
|
+
if (argv.some((arg) => HELP_FLAGS.has(arg)))
|
|
556
|
+
return { kind: 'help', topic: cmd };
|
|
557
|
+
// The list is the gate, so a command cannot be routed without also being named in telemetry.
|
|
558
|
+
if (!LOCAL_COMMAND_SET.has(cmd))
|
|
559
|
+
return unknownCommand(cmd);
|
|
629
560
|
switch (cmd) {
|
|
630
561
|
case INIT_COMMAND: {
|
|
631
562
|
const r = parseInitFlags(rest);
|
|
@@ -644,6 +575,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
644
575
|
hooks: r.hooks,
|
|
645
576
|
json: r.json,
|
|
646
577
|
open: r.open,
|
|
578
|
+
firstRun: r.firstRun,
|
|
647
579
|
relaunch: r.relaunch,
|
|
648
580
|
agents: r.agents,
|
|
649
581
|
url: r.url,
|
|
@@ -667,6 +599,10 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
667
599
|
}
|
|
668
600
|
case STOP_COMMAND: {
|
|
669
601
|
const port = parsePortFlag(rest, defaultPort);
|
|
602
|
+
// `stop --force` is what `kill` was: free the port by its listener, which must still be a
|
|
603
|
+
// Reticle daemon. Overriding that refusal stays on `restart --force` and the old `kill --force`.
|
|
604
|
+
if (rest.includes(FORCE_FLAG))
|
|
605
|
+
return { kind: 'kill', port, force: false };
|
|
670
606
|
const quiet = rest.includes(QUIET_FLAG);
|
|
671
607
|
return { kind: 'stop', port, quiet };
|
|
672
608
|
}
|
|
@@ -685,22 +621,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
685
621
|
// parsing it knows to ask for the object.
|
|
686
622
|
return { kind: 'status', port, json: rest.includes(JSON_FLAG) };
|
|
687
623
|
}
|
|
688
|
-
case
|
|
689
|
-
// `--agent` is the opt-in, because a person typing this is the common case and should not have
|
|
690
|
-
// to ask for prose. An agent knows to pass the flag; a human would not know to avoid it.
|
|
691
|
-
const audience = argv.includes('--agent') ? TutorialAudience.AGENT : TutorialAudience.HUMAN;
|
|
692
|
-
// `--run` drives the demo instead of describing it. Opt-in rather than the default: the tour
|
|
693
|
-
// starts a daemon and opens a browser, and a command that did that to somebody who typed it
|
|
694
|
-
// expecting a page of text would be a surprise in the one place surprises are least welcome.
|
|
695
|
-
return {
|
|
696
|
-
kind: 'tutorial',
|
|
697
|
-
audience,
|
|
698
|
-
run: argv.includes('--run'),
|
|
699
|
-
port: parsePortFlag(rest, defaultPort),
|
|
700
|
-
headless: !argv.includes('--headed'),
|
|
701
|
-
};
|
|
702
|
-
}
|
|
703
|
-
case 'doctor': {
|
|
624
|
+
case DOCTOR_COMMAND: {
|
|
704
625
|
const port = parsePortFlag(rest, defaultPort);
|
|
705
626
|
return { kind: 'doctor', port };
|
|
706
627
|
}
|
|
@@ -716,7 +637,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
716
637
|
* no flag: it tells a reader a confirmation exists. What this writes is stated before it runs
|
|
717
638
|
* and printed after, which is the honest version of the same reassurance.
|
|
718
639
|
*/
|
|
719
|
-
case
|
|
640
|
+
case SETUP_COMMAND: {
|
|
720
641
|
const what = rest[0];
|
|
721
642
|
/*
|
|
722
643
|
* `setup install` — the Node half of the one-line installer.
|
|
@@ -737,7 +658,7 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
737
658
|
// Only `mcp` today. A bare `reticle setup` falls to help rather than guessing, because the
|
|
738
659
|
// next subcommand here will not be a synonym for this one.
|
|
739
660
|
if (what !== 'mcp')
|
|
740
|
-
return { kind: 'help' };
|
|
661
|
+
return { kind: 'help', topic: SETUP_COMMAND };
|
|
741
662
|
return { kind: 'setup-mcp' };
|
|
742
663
|
}
|
|
743
664
|
case LICENSE_COMMAND:
|
|
@@ -751,22 +672,6 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
751
672
|
}
|
|
752
673
|
return { kind: 'telemetry', action };
|
|
753
674
|
}
|
|
754
|
-
case IDENTIFY_COMMAND: {
|
|
755
|
-
const flag = (name) => {
|
|
756
|
-
const at = rest.indexOf(name);
|
|
757
|
-
return -1 === at ? undefined : rest[at + 1];
|
|
758
|
-
};
|
|
759
|
-
const context = flag(CONTEXT_FLAG);
|
|
760
|
-
const company = flag(COMPANY_FLAG);
|
|
761
|
-
const email = flag(EMAIL_FLAG);
|
|
762
|
-
return {
|
|
763
|
-
kind: 'identify',
|
|
764
|
-
...(context !== undefined ? { context } : {}),
|
|
765
|
-
...(company !== undefined ? { company } : {}),
|
|
766
|
-
...(email !== undefined ? { email } : {}),
|
|
767
|
-
forget: rest.includes(FORGET_FLAG),
|
|
768
|
-
};
|
|
769
|
-
}
|
|
770
675
|
case FEEDBACK_COMMAND:
|
|
771
676
|
return parseFeedbackArgs(rest);
|
|
772
677
|
case OPEN_COMMAND: {
|
|
@@ -812,16 +717,10 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
812
717
|
...(true === r.explore ? { explore: true } : {}),
|
|
813
718
|
...(r.persona !== undefined ? { persona: r.persona } : {}),
|
|
814
719
|
...(r.select !== undefined ? { select: r.select } : {}),
|
|
720
|
+
...(r.resultsJson !== undefined ? { resultsJson: r.resultsJson } : {}),
|
|
721
|
+
...(true === r.confirmDangerous ? { confirmDangerous: true } : {}),
|
|
815
722
|
};
|
|
816
723
|
}
|
|
817
|
-
case CAPSULES_COMMAND:
|
|
818
|
-
return { kind: 'capsules' };
|
|
819
|
-
case HUNT_COMMAND: {
|
|
820
|
-
const dir = rest.find((a) => !a.startsWith('-'));
|
|
821
|
-
return dir === undefined
|
|
822
|
-
? { kind: 'error', message: 'usage: reticle hunt <dir-of-crawl-reports>' }
|
|
823
|
-
: { kind: 'hunt', dir };
|
|
824
|
-
}
|
|
825
724
|
case AFFECTED_COMMAND: {
|
|
826
725
|
const t = parseTargetArgs(rest);
|
|
827
726
|
const since = t.since ?? implicitSince(t.files);
|
|
@@ -850,10 +749,11 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
|
850
749
|
...(session === undefined ? {} : { session }),
|
|
851
750
|
};
|
|
852
751
|
}
|
|
853
|
-
case
|
|
854
|
-
// `
|
|
855
|
-
const
|
|
856
|
-
|
|
752
|
+
case CONTEXT_COMMAND: {
|
|
753
|
+
// `--compact` is the only form; accepted so the hook line reads as what it does.
|
|
754
|
+
const at = rest.indexOf(SESSION_FLAG);
|
|
755
|
+
const session = -1 === at ? undefined : rest[at + 1];
|
|
756
|
+
return { kind: 'context', ...(session === undefined ? {} : { session }) };
|
|
857
757
|
}
|
|
858
758
|
case UPDATE_COMMAND:
|
|
859
759
|
return { kind: 'update' };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/** `reticle update` — install the latest server version, sync the app's SDK, and restart. */
|
|
2
|
-
export declare function handleUpdate(): Promise<void>;
|
|
2
|
+
export declare function handleUpdate(cwd?: string): Promise<void>;
|
|
3
3
|
/** `reticle rollback` — restore the previous server version and restart. */
|
|
4
4
|
export declare function handleRollback(): Promise<void>;
|