@reticlehq/server 2.2.1 → 2.4.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/README.md +1 -1
- package/dist/bridge-security.d.ts +0 -1
- package/dist/bridge-security.js +0 -1
- package/dist/bridge.d.ts +0 -1
- package/dist/bridge.js +102 -12
- package/dist/bridge.test-harness.d.ts +5 -1
- package/dist/bridge.test-harness.js +12 -1
- package/dist/capsule/capsule-store.d.ts +2 -3
- package/dist/capsule/capsule-store.js +0 -1
- package/dist/capsule/capsule.d.ts +0 -1
- package/dist/capsule/capsule.js +0 -1
- package/dist/capsule/causal-summary.d.ts +21 -1
- package/dist/capsule/causal-summary.js +20 -2
- package/dist/capsule/divergence.d.ts +0 -1
- package/dist/capsule/divergence.js +0 -1
- package/dist/capsule/minimize.d.ts +0 -1
- package/dist/capsule/minimize.js +0 -1
- package/dist/capsule/predicate-to-links.d.ts +0 -1
- package/dist/capsule/predicate-to-links.js +0 -1
- package/dist/cli-doctor.d.ts +6 -0
- package/dist/cli-doctor.js +60 -0
- package/dist/cli-flow-commands.d.ts +0 -1
- package/dist/cli-flow-commands.js +0 -1
- package/dist/cli-launch.d.ts +0 -1
- package/dist/cli-launch.js +7 -3
- package/dist/cli-parse.d.ts +47 -3
- package/dist/cli-parse.js +147 -13
- package/dist/cli-port.d.ts +3 -1
- package/dist/cli-port.js +21 -1
- package/dist/cli-verify.d.ts +0 -1
- package/dist/cli-verify.js +1 -2
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +88 -69
- package/dist/cloud/cloud-config.d.ts +0 -1
- package/dist/cloud/cloud-config.js +0 -1
- package/dist/cloud/cloud-sync.d.ts +4 -5
- package/dist/cloud/cloud-sync.js +0 -1
- package/dist/cloud-cli.d.ts +0 -1
- package/dist/cloud-cli.js +9 -2
- package/dist/crawl/crawl-tools.d.ts +0 -1
- package/dist/crawl/crawl-tools.js +1 -2
- package/dist/crawl/crawl.d.ts +17 -3
- package/dist/crawl/crawl.js +43 -4
- package/dist/daemon-resilience.d.ts +6 -1
- package/dist/daemon-resilience.js +63 -1
- package/dist/daemon.d.ts +23 -3
- package/dist/daemon.js +36 -24
- package/dist/domain/domain-model.d.ts +0 -1
- package/dist/domain/domain-model.js +1 -2
- package/dist/domain/domain-tools.d.ts +0 -7
- package/dist/domain/domain-tools.js +21 -4
- package/dist/domain/flow-risk.d.ts +0 -1
- package/dist/domain/flow-risk.js +0 -1
- package/dist/ee/audit-log.d.ts +0 -1
- package/dist/ee/audit-log.js +0 -1
- package/dist/events/body-failures.d.ts +4 -0
- package/dist/events/body-failures.js +113 -0
- package/dist/events/contradictions.d.ts +53 -0
- package/dist/events/contradictions.js +282 -0
- package/dist/events/echo-mismatch.d.ts +4 -0
- package/dist/events/echo-mismatch.js +138 -0
- package/dist/events/event-filters.d.ts +17 -3
- package/dist/events/event-filters.js +13 -3
- package/dist/events/json-salvage.d.ts +32 -0
- package/dist/events/json-salvage.js +96 -0
- package/dist/events/predicate-eval.d.ts +2 -1
- package/dist/events/predicate-eval.js +56 -9
- package/dist/events/predicate.d.ts +0 -1
- package/dist/events/predicate.js +56 -2
- package/dist/events/reaction.d.ts +0 -1
- package/dist/events/reaction.js +0 -1
- package/dist/events/reconcile.d.ts +39 -0
- package/dist/events/reconcile.js +211 -0
- package/dist/events/ring-buffer.d.ts +0 -1
- package/dist/events/ring-buffer.js +0 -1
- package/dist/events/stale-response.d.ts +4 -0
- package/dist/events/stale-response.js +139 -0
- package/dist/events/unit-mismatch.d.ts +16 -0
- package/dist/events/unit-mismatch.js +167 -0
- package/dist/flows/affected-tools.d.ts +18 -0
- package/dist/flows/affected-tools.js +52 -0
- package/dist/flows/affected.d.ts +0 -1
- package/dist/flows/affected.js +0 -1
- package/dist/flows/annotate-tools.d.ts +0 -1
- package/dist/flows/annotate-tools.js +21 -3
- package/dist/flows/annotate.d.ts +0 -1
- package/dist/flows/annotate.js +0 -1
- package/dist/flows/annotation-store.d.ts +0 -1
- package/dist/flows/annotation-store.js +0 -1
- package/dist/flows/assertion-integrity.d.ts +0 -1
- package/dist/flows/assertion-integrity.js +0 -1
- package/dist/flows/assertion-tiers-store.d.ts +0 -1
- package/dist/flows/assertion-tiers-store.js +0 -1
- package/dist/flows/buddy-status.d.ts +0 -1
- package/dist/flows/buddy-status.js +0 -1
- package/dist/flows/coverage.d.ts +0 -1
- package/dist/flows/coverage.js +0 -1
- package/dist/flows/decision.d.ts +0 -7
- package/dist/flows/decision.js +47 -7
- package/dist/flows/flake-store.d.ts +0 -1
- package/dist/flows/flake-store.js +0 -1
- package/dist/flows/flake.d.ts +0 -1
- package/dist/flows/flake.js +0 -1
- package/dist/flows/flow-classify.d.ts +0 -1
- package/dist/flows/flow-classify.js +0 -1
- package/dist/flows/flow-replay-run.d.ts +0 -1
- package/dist/flows/flow-replay-run.js +2 -3
- package/dist/flows/flow-replay.d.ts +20 -4
- package/dist/flows/flow-replay.js +9 -43
- package/dist/flows/flow-report.d.ts +0 -1
- package/dist/flows/flow-report.js +0 -1
- package/dist/flows/flow-scope.d.ts +0 -1
- package/dist/flows/flow-scope.js +0 -1
- package/dist/flows/flow-sources.d.ts +0 -1
- package/dist/flows/flow-sources.js +0 -1
- package/dist/flows/flow-step-runners.d.ts +23 -0
- package/dist/flows/flow-step-runners.js +102 -0
- package/dist/flows/flow-success.d.ts +0 -1
- package/dist/flows/flow-success.js +0 -1
- package/dist/flows/flow-tools.d.ts +0 -1
- package/dist/flows/flow-tools.js +44 -14
- package/dist/flows/flows.d.ts +6 -2
- package/dist/flows/flows.js +15 -2
- package/dist/flows/gate.d.ts +0 -1
- package/dist/flows/gate.js +0 -1
- package/dist/flows/git-changed.d.ts +0 -1
- package/dist/flows/git-changed.js +0 -1
- package/dist/flows/heal-run.d.ts +0 -1
- package/dist/flows/heal-run.js +0 -1
- package/dist/flows/heal.d.ts +0 -1
- package/dist/flows/heal.js +0 -1
- package/dist/flows/parallel-suite.d.ts +0 -1
- package/dist/flows/parallel-suite.js +0 -1
- package/dist/flows/recordings.d.ts +0 -1
- package/dist/flows/recordings.js +0 -1
- package/dist/flows/replay.d.ts +0 -1
- package/dist/flows/replay.js +71 -4
- package/dist/flows/server-verify.d.ts +0 -1
- package/dist/flows/server-verify.js +0 -1
- package/dist/flows/verify-change-tools.d.ts +2 -0
- package/dist/flows/verify-change-tools.js +187 -0
- package/dist/flows/watch-batcher.d.ts +0 -1
- package/dist/flows/watch-batcher.js +0 -1
- package/dist/honesty/accepted-write.d.ts +14 -0
- package/dist/honesty/accepted-write.js +17 -0
- package/dist/honesty/blind-spots.d.ts +18 -1
- package/dist/honesty/blind-spots.js +47 -5
- package/dist/honesty/honesty.d.ts +0 -1
- package/dist/honesty/honesty.js +0 -1
- package/dist/honesty/uncaptured-bodies.d.ts +19 -0
- package/dist/honesty/uncaptured-bodies.js +30 -0
- package/dist/honesty/unread-outcome.d.ts +2 -0
- package/dist/honesty/unread-outcome.js +50 -0
- package/dist/honesty/verified.d.ts +40 -0
- package/dist/honesty/verified.js +86 -0
- package/dist/http-server.d.ts +0 -1
- package/dist/http-server.js +5 -1
- package/dist/hunt/hunt-report.d.ts +50 -0
- package/dist/hunt/hunt-report.js +84 -0
- package/dist/idle-shutdown.d.ts +0 -1
- package/dist/idle-shutdown.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/init/agent-rules.d.ts +0 -1
- package/dist/init/agent-rules.js +4 -2
- package/dist/init/capabilities.d.ts +17 -0
- package/dist/init/capabilities.js +51 -0
- package/dist/init/cursor.d.ts +0 -1
- package/dist/init/cursor.js +0 -1
- package/dist/init/desktop-doctor.d.ts +40 -0
- package/dist/init/desktop-doctor.js +198 -0
- package/dist/init/detect.d.ts +25 -1
- package/dist/init/detect.js +65 -4
- package/dist/init/mcp.d.ts +0 -1
- package/dist/init/mcp.js +0 -1
- package/dist/init/next-patch.d.ts +41 -0
- package/dist/init/next-patch.js +106 -0
- package/dist/init/node-io.d.ts +0 -1
- package/dist/init/node-io.js +25 -1
- package/dist/init/patch-kind.d.ts +20 -0
- package/dist/init/patch-kind.js +10 -0
- package/dist/init/plan-framework.d.ts +35 -0
- package/dist/init/plan-framework.js +217 -0
- package/dist/init/plan.d.ts +55 -4
- package/dist/init/plan.js +130 -112
- package/dist/init/project-id.d.ts +0 -1
- package/dist/init/project-id.js +0 -1
- package/dist/init/run.d.ts +17 -1
- package/dist/init/run.js +237 -18
- package/dist/init/slash-command.d.ts +18 -0
- package/dist/init/slash-command.js +52 -0
- package/dist/init/snippets.d.ts +48 -3
- package/dist/init/snippets.js +156 -6
- package/dist/init/vite-config.d.ts +4 -11
- package/dist/init/vite-config.js +15 -8
- package/dist/input/driven-redaction.d.ts +15 -0
- package/dist/input/driven-redaction.js +76 -0
- package/dist/input/network-detail.d.ts +9 -4
- package/dist/input/network-detail.js +35 -16
- package/dist/input/network-mock-tools.d.ts +0 -1
- package/dist/input/network-mock-tools.js +3 -4
- package/dist/input/network-mock.d.ts +0 -1
- package/dist/input/network-mock.js +0 -1
- package/dist/input/real-input.d.ts +14 -1
- package/dist/input/real-input.js +45 -3
- package/dist/input/scroll-find.d.ts +0 -1
- package/dist/input/scroll-find.js +0 -1
- package/dist/input/scroll-tools.d.ts +0 -1
- package/dist/input/scroll-tools.js +0 -1
- package/dist/input/viewport-tools.d.ts +0 -1
- package/dist/input/viewport-tools.js +3 -4
- package/dist/journal/ambient-store.d.ts +0 -1
- package/dist/journal/ambient-store.js +0 -1
- package/dist/journal/ambient.d.ts +0 -1
- package/dist/journal/ambient.js +0 -1
- package/dist/journal/attach-journal.d.ts +0 -1
- package/dist/journal/attach-journal.js +0 -1
- package/dist/journal/deviation-report.d.ts +0 -1
- package/dist/journal/deviation-report.js +0 -1
- package/dist/journal/deviation-service.d.ts +0 -1
- package/dist/journal/deviation-service.js +0 -1
- package/dist/journal/envelope-store.d.ts +0 -1
- package/dist/journal/envelope-store.js +0 -1
- package/dist/journal/envelope.d.ts +8 -9
- package/dist/journal/envelope.js +0 -1
- package/dist/journal/journal-query.d.ts +0 -1
- package/dist/journal/journal-query.js +0 -1
- package/dist/journal/journal-recorder.d.ts +0 -1
- package/dist/journal/journal-recorder.js +0 -1
- package/dist/journal/retention.d.ts +0 -1
- package/dist/journal/retention.js +0 -1
- package/dist/journal/rollups.d.ts +0 -1
- package/dist/journal/rollups.js +0 -1
- package/dist/journal/session-end.d.ts +0 -1
- package/dist/journal/session-end.js +0 -1
- package/dist/journal/session-journal.d.ts +0 -1
- package/dist/journal/session-journal.js +0 -1
- package/dist/license/license.d.ts +0 -1
- package/dist/license/license.js +0 -1
- package/dist/log.d.ts +0 -1
- package/dist/log.js +0 -1
- package/dist/mcp-proxy.d.ts +35 -4
- package/dist/mcp-proxy.js +174 -28
- package/dist/mcp.d.ts +15 -1
- package/dist/mcp.js +145 -17
- package/dist/oracles/flow-instrument-gaps.d.ts +0 -1
- package/dist/oracles/flow-instrument-gaps.js +0 -1
- package/dist/oracles/propose-consequences.d.ts +0 -1
- package/dist/oracles/propose-consequences.js +0 -1
- package/dist/oracles/self-instrument.d.ts +0 -1
- package/dist/oracles/self-instrument.js +0 -1
- package/dist/pairing-token.d.ts +0 -1
- package/dist/pairing-token.js +0 -1
- package/dist/phenomena/phenomena.d.ts +0 -1
- package/dist/phenomena/phenomena.js +0 -1
- package/dist/pool/browser-pool.d.ts +0 -1
- package/dist/pool/browser-pool.js +0 -1
- package/dist/pool/lease-reaper.d.ts +0 -1
- package/dist/pool/lease-reaper.js +0 -1
- package/dist/pool/playwright-launcher.d.ts +0 -1
- package/dist/pool/playwright-launcher.js +10 -2
- package/dist/project/baselines.d.ts +0 -1
- package/dist/project/baselines.js +0 -1
- package/dist/project/file-lock.d.ts +2 -1
- package/dist/project/file-lock.js +12 -2
- package/dist/project/fs-port.d.ts +0 -1
- package/dist/project/fs-port.js +0 -1
- package/dist/project/project-store.d.ts +0 -1
- package/dist/project/project-store.js +0 -1
- package/dist/project/project-tools.d.ts +0 -1
- package/dist/project/project-tools.js +29 -4
- package/dist/project/reticle-dir.d.ts +0 -1
- package/dist/project/reticle-dir.js +0 -1
- package/dist/runs/build-verification-run.d.ts +0 -1
- package/dist/runs/build-verification-run.js +0 -1
- package/dist/runs/profile-redact.d.ts +0 -1
- package/dist/runs/profile-redact.js +0 -1
- package/dist/runs/render-report.d.ts +0 -1
- package/dist/runs/render-report.js +0 -1
- package/dist/runs/repair-prompt.d.ts +0 -1
- package/dist/runs/repair-prompt.js +0 -1
- package/dist/runs/replay-mapping.d.ts +0 -1
- package/dist/runs/replay-mapping.js +0 -1
- package/dist/runs/reticle-runner.d.ts +0 -1
- package/dist/runs/reticle-runner.js +4 -2
- package/dist/runs/risk-classify.d.ts +0 -1
- package/dist/runs/risk-classify.js +0 -1
- package/dist/runs/run-diff.d.ts +0 -1
- package/dist/runs/run-diff.js +0 -1
- package/dist/runs/run-store.d.ts +0 -1
- package/dist/runs/run-store.js +0 -1
- package/dist/runs/run-tools.d.ts +0 -1
- package/dist/runs/run-tools.js +0 -1
- package/dist/runs/runner-port.d.ts +0 -1
- package/dist/runs/runner-port.js +0 -1
- package/dist/runs/verification-sync.d.ts +0 -1
- package/dist/runs/verification-sync.js +0 -1
- package/dist/runs/verify-http.d.ts +0 -1
- package/dist/runs/verify-http.js +0 -1
- package/dist/runs/verify-server.d.ts +0 -1
- package/dist/runs/verify-server.js +0 -1
- package/dist/server-version.d.ts +0 -1
- package/dist/server-version.js +0 -1
- package/dist/session/command-timeout.d.ts +35 -0
- package/dist/session/command-timeout.js +41 -0
- package/dist/session/control-envelope.d.ts +2 -3
- package/dist/session/control-envelope.js +2 -3
- package/dist/session/last-act.d.ts +31 -0
- package/dist/session/last-act.js +24 -0
- package/dist/session/live-control-tools.d.ts +0 -1
- package/dist/session/live-control-tools.js +3 -4
- package/dist/session/live-control.d.ts +0 -1
- package/dist/session/live-control.js +0 -1
- package/dist/session/observed-state.d.ts +12 -2
- package/dist/session/observed-state.js +29 -2
- package/dist/session/output-budget.d.ts +0 -1
- package/dist/session/output-budget.js +0 -1
- package/dist/session/pending-commands.d.ts +12 -0
- package/dist/session/pending-commands.js +36 -0
- package/dist/session/presenter-args.d.ts +0 -1
- package/dist/session/presenter-args.js +0 -1
- package/dist/session/review-store.d.ts +0 -1
- package/dist/session/review-store.js +0 -1
- package/dist/session/session-health.d.ts +26 -2
- package/dist/session/session-health.js +13 -1
- package/dist/session/session-info.d.ts +29 -0
- package/dist/session/session-info.js +1 -0
- package/dist/session/session-lease.d.ts +25 -0
- package/dist/session/session-lease.js +14 -0
- package/dist/session/session-manager.d.ts +7 -19
- package/dist/session/session-manager.js +35 -2
- package/dist/session/session-readiness.d.ts +0 -1
- package/dist/session/session-readiness.js +3 -4
- package/dist/session/session-reaper.d.ts +0 -1
- package/dist/session/session-reaper.js +0 -1
- package/dist/session/session-recommendation.d.ts +0 -1
- package/dist/session/session-recommendation.js +0 -1
- package/dist/session/session-tools.d.ts +0 -1
- package/dist/session/session-tools.js +2 -3
- package/dist/session/session.d.ts +33 -53
- package/dist/session/session.js +102 -66
- package/dist/session/state-select.d.ts +0 -1
- package/dist/session/state-select.js +0 -1
- package/dist/telemetry/argument-shape.d.ts +41 -0
- package/dist/telemetry/argument-shape.js +87 -0
- package/dist/telemetry/bug-found.d.ts +33 -0
- package/dist/telemetry/bug-found.js +95 -0
- package/dist/telemetry/cli-telemetry.d.ts +13 -0
- package/dist/telemetry/cli-telemetry.js +43 -0
- package/dist/telemetry/connect-failure.d.ts +16 -0
- package/dist/telemetry/connect-failure.js +44 -0
- package/dist/telemetry/daemon-telemetry.d.ts +19 -0
- package/dist/telemetry/daemon-telemetry.js +76 -0
- package/dist/telemetry/dev-repo.d.ts +10 -0
- package/dist/telemetry/dev-repo.js +80 -0
- package/dist/telemetry/error-fingerprint.d.ts +24 -0
- package/dist/telemetry/error-fingerprint.js +88 -0
- package/dist/telemetry/feedback-cli.d.ts +31 -0
- package/dist/telemetry/feedback-cli.js +102 -0
- package/dist/telemetry/feedback-context.d.ts +32 -0
- package/dist/telemetry/feedback-context.js +143 -0
- package/dist/telemetry/feedback.d.ts +66 -0
- package/dist/telemetry/feedback.js +175 -0
- package/dist/telemetry/git-facts.d.ts +21 -0
- package/dist/telemetry/git-facts.js +109 -0
- package/dist/telemetry/identify.d.ts +22 -0
- package/dist/telemetry/identify.js +73 -0
- package/dist/telemetry/init-telemetry.d.ts +26 -0
- package/dist/telemetry/init-telemetry.js +33 -0
- package/dist/telemetry/machine-snapshot.d.ts +6 -0
- package/dist/telemetry/machine-snapshot.js +39 -0
- package/dist/telemetry/mcp-connection.d.ts +5 -0
- package/dist/telemetry/mcp-connection.js +44 -0
- package/dist/telemetry/project-profile.d.ts +44 -0
- package/dist/telemetry/project-profile.js +205 -0
- package/dist/telemetry/run-telemetry.d.ts +21 -0
- package/dist/telemetry/run-telemetry.js +62 -0
- package/dist/telemetry/session-metrics.d.ts +103 -0
- package/dist/telemetry/session-metrics.js +329 -0
- package/dist/telemetry/telemetry.d.ts +35 -8
- package/dist/telemetry/telemetry.js +105 -12
- package/dist/token-auth.d.ts +0 -1
- package/dist/token-auth.js +0 -1
- package/dist/tools/act-capsule.d.ts +23 -0
- package/dist/tools/act-capsule.js +47 -0
- package/dist/tools/act-danger.d.ts +7 -0
- package/dist/tools/act-danger.js +44 -0
- package/dist/tools/act-helpers.d.ts +17 -0
- package/dist/tools/act-helpers.js +40 -0
- package/dist/tools/act-tools.d.ts +8 -1
- package/dist/tools/act-tools.js +96 -98
- package/dist/tools/act-view.d.ts +7 -1
- package/dist/tools/act-view.js +13 -1
- package/dist/tools/assert-grade.d.ts +22 -1
- package/dist/tools/assert-grade.js +46 -1
- package/dist/tools/assert-verdict.d.ts +21 -0
- package/dist/tools/assert-verdict.js +62 -0
- package/dist/tools/browser-tools.d.ts +0 -1
- package/dist/tools/browser-tools.js +2 -2
- package/dist/tools/contract-tools.d.ts +0 -1
- package/dist/tools/contract-tools.js +0 -1
- package/dist/tools/coverage-tools.d.ts +9 -0
- package/dist/tools/coverage-tools.js +92 -0
- package/dist/tools/dynamic-tools.d.ts +0 -1
- package/dist/tools/dynamic-tools.js +21 -2
- package/dist/tools/error-recovery.d.ts +18 -2
- package/dist/tools/error-recovery.js +42 -7
- package/dist/tools/feedback-tools.d.ts +24 -0
- package/dist/tools/feedback-tools.js +180 -0
- package/dist/tools/invoke-tool.d.ts +0 -1
- package/dist/tools/invoke-tool.js +115 -5
- package/dist/tools/lease-tools.d.ts +0 -1
- package/dist/tools/lease-tools.js +6 -5
- package/dist/tools/merge-tools.d.ts +0 -1
- package/dist/tools/merge-tools.js +0 -1
- package/dist/tools/observe-tools.d.ts +0 -1
- package/dist/tools/observe-tools.js +91 -39
- package/dist/tools/profiles.d.ts +1 -2
- package/dist/tools/profiles.js +43 -16
- package/dist/tools/query-paginate.d.ts +0 -1
- package/dist/tools/query-paginate.js +0 -1
- package/dist/tools/read-tools.d.ts +0 -1
- package/dist/tools/read-tools.js +14 -8
- package/dist/tools/reconcile-tools.d.ts +2 -0
- package/dist/tools/reconcile-tools.js +111 -0
- package/dist/tools/snapshot-delta.d.ts +0 -1
- package/dist/tools/snapshot-delta.js +0 -0
- package/dist/tools/tool-invoker.d.ts +0 -1
- package/dist/tools/tool-invoker.js +0 -1
- package/dist/tools/tool-kit.d.ts +16 -1
- package/dist/tools/tool-kit.js +8 -2
- package/dist/tools/tool-names.d.ts +6 -1
- package/dist/tools/tool-names.js +6 -1
- package/dist/tools/tools-helpers.d.ts +0 -1
- package/dist/tools/tools-helpers.js +0 -1
- package/dist/tools/tools.d.ts +0 -1
- package/dist/tools/tools.js +24 -4
- package/dist/update/update-checker.d.ts +0 -1
- package/dist/update/update-checker.js +0 -1
- package/dist/update/update-nudge.d.ts +20 -0
- package/dist/update/update-nudge.js +72 -0
- package/dist/update/updater.d.ts +14 -1
- package/dist/update/updater.js +33 -2
- package/dist/visual/visual-diff.d.ts +0 -1
- package/dist/visual/visual-diff.js +0 -1
- package/dist/visual/visual-store.d.ts +0 -1
- package/dist/visual/visual-store.js +0 -1
- package/dist/visual/visual-tools.d.ts +0 -1
- package/dist/visual/visual-tools.js +103 -16
- package/package.json +2 -2
- package/dist/bridge-security.d.ts.map +0 -1
- package/dist/bridge-security.js.map +0 -1
- package/dist/bridge.d.ts.map +0 -1
- package/dist/bridge.js.map +0 -1
- package/dist/bridge.test-harness.d.ts.map +0 -1
- package/dist/bridge.test-harness.js.map +0 -1
- package/dist/capsule/capsule-store.d.ts.map +0 -1
- package/dist/capsule/capsule-store.js.map +0 -1
- package/dist/capsule/capsule.d.ts.map +0 -1
- package/dist/capsule/capsule.js.map +0 -1
- package/dist/capsule/causal-summary.d.ts.map +0 -1
- package/dist/capsule/causal-summary.js.map +0 -1
- package/dist/capsule/divergence.d.ts.map +0 -1
- package/dist/capsule/divergence.js.map +0 -1
- package/dist/capsule/minimize.d.ts.map +0 -1
- package/dist/capsule/minimize.js.map +0 -1
- package/dist/capsule/predicate-to-links.d.ts.map +0 -1
- package/dist/capsule/predicate-to-links.js.map +0 -1
- package/dist/cli-flow-commands.d.ts.map +0 -1
- package/dist/cli-flow-commands.js.map +0 -1
- package/dist/cli-launch.d.ts.map +0 -1
- package/dist/cli-launch.js.map +0 -1
- package/dist/cli-parse.d.ts.map +0 -1
- package/dist/cli-parse.js.map +0 -1
- package/dist/cli-port.d.ts.map +0 -1
- package/dist/cli-port.js.map +0 -1
- package/dist/cli-verify.d.ts.map +0 -1
- package/dist/cli-verify.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cloud/cloud-config.d.ts.map +0 -1
- package/dist/cloud/cloud-config.js.map +0 -1
- package/dist/cloud/cloud-sync.d.ts.map +0 -1
- package/dist/cloud/cloud-sync.js.map +0 -1
- package/dist/cloud-cli.d.ts.map +0 -1
- package/dist/cloud-cli.js.map +0 -1
- package/dist/crawl/crawl-tools.d.ts.map +0 -1
- package/dist/crawl/crawl-tools.js.map +0 -1
- package/dist/crawl/crawl.d.ts.map +0 -1
- package/dist/crawl/crawl.js.map +0 -1
- package/dist/daemon-resilience.d.ts.map +0 -1
- package/dist/daemon-resilience.js.map +0 -1
- package/dist/daemon.d.ts.map +0 -1
- package/dist/daemon.js.map +0 -1
- package/dist/domain/domain-model.d.ts.map +0 -1
- package/dist/domain/domain-model.js.map +0 -1
- package/dist/domain/domain-tools.d.ts.map +0 -1
- package/dist/domain/domain-tools.js.map +0 -1
- package/dist/domain/flow-risk.d.ts.map +0 -1
- package/dist/domain/flow-risk.js.map +0 -1
- package/dist/ee/audit-log.d.ts.map +0 -1
- package/dist/ee/audit-log.js.map +0 -1
- package/dist/events/event-filters.d.ts.map +0 -1
- package/dist/events/event-filters.js.map +0 -1
- package/dist/events/predicate-eval.d.ts.map +0 -1
- package/dist/events/predicate-eval.js.map +0 -1
- package/dist/events/predicate.d.ts.map +0 -1
- package/dist/events/predicate.js.map +0 -1
- package/dist/events/reaction.d.ts.map +0 -1
- package/dist/events/reaction.js.map +0 -1
- package/dist/events/ring-buffer.d.ts.map +0 -1
- package/dist/events/ring-buffer.js.map +0 -1
- package/dist/flows/affected.d.ts.map +0 -1
- package/dist/flows/affected.js.map +0 -1
- package/dist/flows/annotate-tools.d.ts.map +0 -1
- package/dist/flows/annotate-tools.js.map +0 -1
- package/dist/flows/annotate.d.ts.map +0 -1
- package/dist/flows/annotate.js.map +0 -1
- package/dist/flows/annotation-store.d.ts.map +0 -1
- package/dist/flows/annotation-store.js.map +0 -1
- package/dist/flows/assertion-integrity.d.ts.map +0 -1
- package/dist/flows/assertion-integrity.js.map +0 -1
- package/dist/flows/assertion-tiers-store.d.ts.map +0 -1
- package/dist/flows/assertion-tiers-store.js.map +0 -1
- package/dist/flows/buddy-status.d.ts.map +0 -1
- package/dist/flows/buddy-status.js.map +0 -1
- package/dist/flows/coverage.d.ts.map +0 -1
- package/dist/flows/coverage.js.map +0 -1
- package/dist/flows/decision.d.ts.map +0 -1
- package/dist/flows/decision.js.map +0 -1
- package/dist/flows/flake-store.d.ts.map +0 -1
- package/dist/flows/flake-store.js.map +0 -1
- package/dist/flows/flake.d.ts.map +0 -1
- package/dist/flows/flake.js.map +0 -1
- package/dist/flows/flow-classify.d.ts.map +0 -1
- package/dist/flows/flow-classify.js.map +0 -1
- package/dist/flows/flow-replay-run.d.ts.map +0 -1
- package/dist/flows/flow-replay-run.js.map +0 -1
- package/dist/flows/flow-replay.d.ts.map +0 -1
- package/dist/flows/flow-replay.js.map +0 -1
- package/dist/flows/flow-report.d.ts.map +0 -1
- package/dist/flows/flow-report.js.map +0 -1
- package/dist/flows/flow-scope.d.ts.map +0 -1
- package/dist/flows/flow-scope.js.map +0 -1
- package/dist/flows/flow-sources.d.ts.map +0 -1
- package/dist/flows/flow-sources.js.map +0 -1
- package/dist/flows/flow-success.d.ts.map +0 -1
- package/dist/flows/flow-success.js.map +0 -1
- package/dist/flows/flow-tools.d.ts.map +0 -1
- package/dist/flows/flow-tools.js.map +0 -1
- package/dist/flows/flows.d.ts.map +0 -1
- package/dist/flows/flows.js.map +0 -1
- package/dist/flows/gate.d.ts.map +0 -1
- package/dist/flows/gate.js.map +0 -1
- package/dist/flows/git-changed.d.ts.map +0 -1
- package/dist/flows/git-changed.js.map +0 -1
- package/dist/flows/heal-run.d.ts.map +0 -1
- package/dist/flows/heal-run.js.map +0 -1
- package/dist/flows/heal.d.ts.map +0 -1
- package/dist/flows/heal.js.map +0 -1
- package/dist/flows/parallel-suite.d.ts.map +0 -1
- package/dist/flows/parallel-suite.js.map +0 -1
- package/dist/flows/recordings.d.ts.map +0 -1
- package/dist/flows/recordings.js.map +0 -1
- package/dist/flows/replay.d.ts.map +0 -1
- package/dist/flows/replay.js.map +0 -1
- package/dist/flows/server-verify.d.ts.map +0 -1
- package/dist/flows/server-verify.js.map +0 -1
- package/dist/flows/watch-batcher.d.ts.map +0 -1
- package/dist/flows/watch-batcher.js.map +0 -1
- package/dist/honesty/blind-spots.d.ts.map +0 -1
- package/dist/honesty/blind-spots.js.map +0 -1
- package/dist/honesty/honesty.d.ts.map +0 -1
- package/dist/honesty/honesty.js.map +0 -1
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/idle-shutdown.d.ts.map +0 -1
- package/dist/idle-shutdown.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init/agent-rules.d.ts.map +0 -1
- package/dist/init/agent-rules.js.map +0 -1
- package/dist/init/cursor.d.ts.map +0 -1
- package/dist/init/cursor.js.map +0 -1
- package/dist/init/detect.d.ts.map +0 -1
- package/dist/init/detect.js.map +0 -1
- package/dist/init/mcp.d.ts.map +0 -1
- package/dist/init/mcp.js.map +0 -1
- package/dist/init/node-io.d.ts.map +0 -1
- package/dist/init/node-io.js.map +0 -1
- package/dist/init/plan.d.ts.map +0 -1
- package/dist/init/plan.js.map +0 -1
- package/dist/init/project-id.d.ts.map +0 -1
- package/dist/init/project-id.js.map +0 -1
- package/dist/init/run.d.ts.map +0 -1
- package/dist/init/run.js.map +0 -1
- package/dist/init/snippets.d.ts.map +0 -1
- package/dist/init/snippets.js.map +0 -1
- package/dist/init/vite-config.d.ts.map +0 -1
- package/dist/init/vite-config.js.map +0 -1
- package/dist/input/network-detail.d.ts.map +0 -1
- package/dist/input/network-detail.js.map +0 -1
- package/dist/input/network-mock-tools.d.ts.map +0 -1
- package/dist/input/network-mock-tools.js.map +0 -1
- package/dist/input/network-mock.d.ts.map +0 -1
- package/dist/input/network-mock.js.map +0 -1
- package/dist/input/real-input.d.ts.map +0 -1
- package/dist/input/real-input.js.map +0 -1
- package/dist/input/scroll-find.d.ts.map +0 -1
- package/dist/input/scroll-find.js.map +0 -1
- package/dist/input/scroll-tools.d.ts.map +0 -1
- package/dist/input/scroll-tools.js.map +0 -1
- package/dist/input/viewport-tools.d.ts.map +0 -1
- package/dist/input/viewport-tools.js.map +0 -1
- package/dist/journal/ambient-store.d.ts.map +0 -1
- package/dist/journal/ambient-store.js.map +0 -1
- package/dist/journal/ambient.d.ts.map +0 -1
- package/dist/journal/ambient.js.map +0 -1
- package/dist/journal/attach-journal.d.ts.map +0 -1
- package/dist/journal/attach-journal.js.map +0 -1
- package/dist/journal/deviation-report.d.ts.map +0 -1
- package/dist/journal/deviation-report.js.map +0 -1
- package/dist/journal/deviation-service.d.ts.map +0 -1
- package/dist/journal/deviation-service.js.map +0 -1
- package/dist/journal/envelope-store.d.ts.map +0 -1
- package/dist/journal/envelope-store.js.map +0 -1
- package/dist/journal/envelope.d.ts.map +0 -1
- package/dist/journal/envelope.js.map +0 -1
- package/dist/journal/journal-query.d.ts.map +0 -1
- package/dist/journal/journal-query.js.map +0 -1
- package/dist/journal/journal-recorder.d.ts.map +0 -1
- package/dist/journal/journal-recorder.js.map +0 -1
- package/dist/journal/retention.d.ts.map +0 -1
- package/dist/journal/retention.js.map +0 -1
- package/dist/journal/rollups.d.ts.map +0 -1
- package/dist/journal/rollups.js.map +0 -1
- package/dist/journal/session-end.d.ts.map +0 -1
- package/dist/journal/session-end.js.map +0 -1
- package/dist/journal/session-journal.d.ts.map +0 -1
- package/dist/journal/session-journal.js.map +0 -1
- package/dist/license/license.d.ts.map +0 -1
- package/dist/license/license.js.map +0 -1
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js.map +0 -1
- package/dist/mcp-proxy.d.ts.map +0 -1
- package/dist/mcp-proxy.js.map +0 -1
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/dist/oracles/flow-instrument-gaps.d.ts.map +0 -1
- package/dist/oracles/flow-instrument-gaps.js.map +0 -1
- package/dist/oracles/propose-consequences.d.ts.map +0 -1
- package/dist/oracles/propose-consequences.js.map +0 -1
- package/dist/oracles/self-instrument.d.ts.map +0 -1
- package/dist/oracles/self-instrument.js.map +0 -1
- package/dist/pairing-token.d.ts.map +0 -1
- package/dist/pairing-token.js.map +0 -1
- package/dist/phenomena/phenomena.d.ts.map +0 -1
- package/dist/phenomena/phenomena.js.map +0 -1
- package/dist/pool/browser-pool.d.ts.map +0 -1
- package/dist/pool/browser-pool.js.map +0 -1
- package/dist/pool/lease-reaper.d.ts.map +0 -1
- package/dist/pool/lease-reaper.js.map +0 -1
- package/dist/pool/playwright-launcher.d.ts.map +0 -1
- package/dist/pool/playwright-launcher.js.map +0 -1
- package/dist/project/baselines.d.ts.map +0 -1
- package/dist/project/baselines.js.map +0 -1
- package/dist/project/file-lock.d.ts.map +0 -1
- package/dist/project/file-lock.js.map +0 -1
- package/dist/project/fs-port.d.ts.map +0 -1
- package/dist/project/fs-port.js.map +0 -1
- package/dist/project/project-store.d.ts.map +0 -1
- package/dist/project/project-store.js.map +0 -1
- package/dist/project/project-tools.d.ts.map +0 -1
- package/dist/project/project-tools.js.map +0 -1
- package/dist/project/reticle-dir.d.ts.map +0 -1
- package/dist/project/reticle-dir.js.map +0 -1
- package/dist/runs/build-verification-run.d.ts.map +0 -1
- package/dist/runs/build-verification-run.js.map +0 -1
- package/dist/runs/profile-redact.d.ts.map +0 -1
- package/dist/runs/profile-redact.js.map +0 -1
- package/dist/runs/render-report.d.ts.map +0 -1
- package/dist/runs/render-report.js.map +0 -1
- package/dist/runs/repair-prompt.d.ts.map +0 -1
- package/dist/runs/repair-prompt.js.map +0 -1
- package/dist/runs/replay-mapping.d.ts.map +0 -1
- package/dist/runs/replay-mapping.js.map +0 -1
- package/dist/runs/reticle-runner.d.ts.map +0 -1
- package/dist/runs/reticle-runner.js.map +0 -1
- package/dist/runs/risk-classify.d.ts.map +0 -1
- package/dist/runs/risk-classify.js.map +0 -1
- package/dist/runs/run-diff.d.ts.map +0 -1
- package/dist/runs/run-diff.js.map +0 -1
- package/dist/runs/run-store.d.ts.map +0 -1
- package/dist/runs/run-store.js.map +0 -1
- package/dist/runs/run-tools.d.ts.map +0 -1
- package/dist/runs/run-tools.js.map +0 -1
- package/dist/runs/runner-port.d.ts.map +0 -1
- package/dist/runs/runner-port.js.map +0 -1
- package/dist/runs/verification-sync.d.ts.map +0 -1
- package/dist/runs/verification-sync.js.map +0 -1
- package/dist/runs/verify-http.d.ts.map +0 -1
- package/dist/runs/verify-http.js.map +0 -1
- package/dist/runs/verify-server.d.ts.map +0 -1
- package/dist/runs/verify-server.js.map +0 -1
- package/dist/server-version.d.ts.map +0 -1
- package/dist/server-version.js.map +0 -1
- package/dist/session/control-envelope.d.ts.map +0 -1
- package/dist/session/control-envelope.js.map +0 -1
- package/dist/session/live-control-tools.d.ts.map +0 -1
- package/dist/session/live-control-tools.js.map +0 -1
- package/dist/session/live-control.d.ts.map +0 -1
- package/dist/session/live-control.js.map +0 -1
- package/dist/session/observed-state.d.ts.map +0 -1
- package/dist/session/observed-state.js.map +0 -1
- package/dist/session/output-budget.d.ts.map +0 -1
- package/dist/session/output-budget.js.map +0 -1
- package/dist/session/presenter-args.d.ts.map +0 -1
- package/dist/session/presenter-args.js.map +0 -1
- package/dist/session/review-store.d.ts.map +0 -1
- package/dist/session/review-store.js.map +0 -1
- package/dist/session/session-health.d.ts.map +0 -1
- package/dist/session/session-health.js.map +0 -1
- package/dist/session/session-manager.d.ts.map +0 -1
- package/dist/session/session-manager.js.map +0 -1
- package/dist/session/session-readiness.d.ts.map +0 -1
- package/dist/session/session-readiness.js.map +0 -1
- package/dist/session/session-reaper.d.ts.map +0 -1
- package/dist/session/session-reaper.js.map +0 -1
- package/dist/session/session-recommendation.d.ts.map +0 -1
- package/dist/session/session-recommendation.js.map +0 -1
- package/dist/session/session-tools.d.ts.map +0 -1
- package/dist/session/session-tools.js.map +0 -1
- package/dist/session/session.d.ts.map +0 -1
- package/dist/session/session.js.map +0 -1
- package/dist/session/state-select.d.ts.map +0 -1
- package/dist/session/state-select.js.map +0 -1
- package/dist/telemetry/telemetry.d.ts.map +0 -1
- package/dist/telemetry/telemetry.js.map +0 -1
- package/dist/token-auth.d.ts.map +0 -1
- package/dist/token-auth.js.map +0 -1
- package/dist/tools/act-tools.d.ts.map +0 -1
- package/dist/tools/act-tools.js.map +0 -1
- package/dist/tools/act-view.d.ts.map +0 -1
- package/dist/tools/act-view.js.map +0 -1
- package/dist/tools/assert-grade.d.ts.map +0 -1
- package/dist/tools/assert-grade.js.map +0 -1
- package/dist/tools/browser-tools.d.ts.map +0 -1
- package/dist/tools/browser-tools.js.map +0 -1
- package/dist/tools/contract-tools.d.ts.map +0 -1
- package/dist/tools/contract-tools.js.map +0 -1
- package/dist/tools/dynamic-tools.d.ts.map +0 -1
- package/dist/tools/dynamic-tools.js.map +0 -1
- package/dist/tools/error-recovery.d.ts.map +0 -1
- package/dist/tools/error-recovery.js.map +0 -1
- package/dist/tools/invoke-tool.d.ts.map +0 -1
- package/dist/tools/invoke-tool.js.map +0 -1
- package/dist/tools/lease-tools.d.ts.map +0 -1
- package/dist/tools/lease-tools.js.map +0 -1
- package/dist/tools/merge-tools.d.ts.map +0 -1
- package/dist/tools/merge-tools.js.map +0 -1
- package/dist/tools/observe-tools.d.ts.map +0 -1
- package/dist/tools/observe-tools.js.map +0 -1
- package/dist/tools/profiles.d.ts.map +0 -1
- package/dist/tools/profiles.js.map +0 -1
- package/dist/tools/query-paginate.d.ts.map +0 -1
- package/dist/tools/query-paginate.js.map +0 -1
- package/dist/tools/read-tools.d.ts.map +0 -1
- package/dist/tools/read-tools.js.map +0 -1
- package/dist/tools/snapshot-delta.d.ts.map +0 -1
- package/dist/tools/snapshot-delta.js.map +0 -1
- package/dist/tools/tool-invoker.d.ts.map +0 -1
- package/dist/tools/tool-invoker.js.map +0 -1
- package/dist/tools/tool-kit.d.ts.map +0 -1
- package/dist/tools/tool-kit.js.map +0 -1
- package/dist/tools/tool-names.d.ts.map +0 -1
- package/dist/tools/tool-names.js.map +0 -1
- package/dist/tools/tools-helpers.d.ts.map +0 -1
- package/dist/tools/tools-helpers.js.map +0 -1
- package/dist/tools/tools.d.ts.map +0 -1
- package/dist/tools/tools.js.map +0 -1
- package/dist/update/update-checker.d.ts.map +0 -1
- package/dist/update/update-checker.js.map +0 -1
- package/dist/update/updater.d.ts.map +0 -1
- package/dist/update/updater.js.map +0 -1
- package/dist/visual/visual-diff.d.ts.map +0 -1
- package/dist/visual/visual-diff.js.map +0 -1
- package/dist/visual/visual-store.d.ts.map +0 -1
- package/dist/visual/visual-store.js.map +0 -1
- package/dist/visual/visual-tools.d.ts.map +0 -1
- package/dist/visual/visual-tools.js.map +0 -1
package/dist/cli-parse.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export const CLI_USAGE = `usage:
|
|
8
8
|
reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] (wire Reticle into the project in this directory)
|
|
9
|
-
reticle serve [--port N] [--drive <url>] [--
|
|
9
|
+
reticle serve [--port N] [--drive <url>] [--headless] [--http] [--http-port N] [--http-token T]
|
|
10
10
|
reticle stop [--port N] [--quiet]
|
|
11
11
|
reticle status [--port N]
|
|
12
12
|
reticle doctor [--port N] (diagnose setup: Chromium, daemon, port — one command)
|
|
@@ -15,12 +15,15 @@ export const CLI_USAGE = `usage:
|
|
|
15
15
|
reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)
|
|
16
16
|
reticle gate [--since <ref>] [file...] (exit non-zero unless passing artifacts cover the affected flows)
|
|
17
17
|
reticle watch [url] (on save, report which saved flows must re-verify)
|
|
18
|
-
reticle drive <url> [--
|
|
19
|
-
reticle mcp [--port N] [--drive <url>] [--
|
|
18
|
+
reticle drive <url> [--headless] (foreground mode — for debugging)
|
|
19
|
+
reticle mcp [--port N] [--drive <url>] [--headless] (MCP stdio proxy — auto-starts daemon if needed)
|
|
20
20
|
reticle update (install the latest server version and restart)
|
|
21
21
|
reticle rollback (restore the previous server version and restart)
|
|
22
22
|
reticle license (show enterprise license status: active | eval | missing)
|
|
23
23
|
reticle telemetry [status|enable|disable] (anonymous usage metrics — status shows what's sent + the policy)
|
|
24
|
+
reticle feedback [--rating 1-5] [--bug] "message" (tell us what worked and what didn't — prints exactly what it sends)
|
|
25
|
+
reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]
|
|
26
|
+
(OPT-IN: tell us who you are, e.g. for support or an enterprise trial)
|
|
24
27
|
|
|
25
28
|
Cloud (link this project to Reticle Cloud — runs/flows recorded on the dashboard):
|
|
26
29
|
reticle login --email <e> [--code <c>] [--org <n>] (sign in: mails a code, then exchanges it)
|
|
@@ -29,7 +32,10 @@ Cloud (link this project to Reticle Cloud — runs/flows recorded on the dashboa
|
|
|
29
32
|
reticle project <ls|create <name>> (list or create cloud projects)
|
|
30
33
|
reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
|
|
31
34
|
reticle push (send local run artifacts to the dashboard)
|
|
32
|
-
reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)
|
|
35
|
+
reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)
|
|
36
|
+
|
|
37
|
+
'drive' shows the browser; everything else is hidden (serve/mcp own the pool behind leases, replay
|
|
38
|
+
and the spec runner — batch work). --headed opts any of them in, --headless hides drive, CI hides it.`;
|
|
33
39
|
const INIT_COMMAND = 'init';
|
|
34
40
|
const SERVE_COMMAND = 'serve';
|
|
35
41
|
const STOP_COMMAND = 'stop';
|
|
@@ -38,6 +44,7 @@ const OPEN_COMMAND = 'open';
|
|
|
38
44
|
const DRIVE_COMMAND = 'drive';
|
|
39
45
|
const VERIFY_COMMAND = 'verify';
|
|
40
46
|
const AFFECTED_COMMAND = 'affected';
|
|
47
|
+
const HUNT_COMMAND = 'hunt';
|
|
41
48
|
const CAPSULES_COMMAND = 'capsules';
|
|
42
49
|
const GATE_COMMAND = 'gate';
|
|
43
50
|
const WATCH_COMMAND = 'watch';
|
|
@@ -47,6 +54,15 @@ const MCP_COMMAND = 'mcp';
|
|
|
47
54
|
const LICENSE_COMMAND = 'license';
|
|
48
55
|
const VERSION_COMMAND = 'version';
|
|
49
56
|
const TELEMETRY_COMMAND = 'telemetry';
|
|
57
|
+
const FEEDBACK_COMMAND = 'feedback';
|
|
58
|
+
const IDENTIFY_COMMAND = 'identify';
|
|
59
|
+
export const COMPANY_FLAG = '--company';
|
|
60
|
+
export const EMAIL_FLAG = '--email';
|
|
61
|
+
export const CONTEXT_FLAG = '--context';
|
|
62
|
+
export const FORGET_FLAG = '--forget';
|
|
63
|
+
/** `reticle feedback --rating 4 "the words"` — the human half of the channel. */
|
|
64
|
+
export const RATING_FLAG = '--rating';
|
|
65
|
+
export const BUG_FLAG = '--bug';
|
|
50
66
|
/** The `reticle telemetry` sub-actions. Bare `reticle telemetry` means `status`. */
|
|
51
67
|
export const TelemetryAction = {
|
|
52
68
|
STATUS: 'status',
|
|
@@ -54,7 +70,65 @@ export const TelemetryAction = {
|
|
|
54
70
|
DISABLE: 'disable',
|
|
55
71
|
};
|
|
56
72
|
export const DAEMON_INNER_COMMAND = '_daemon';
|
|
73
|
+
/**
|
|
74
|
+
* Every subcommand a person can type, as one closed vocabulary. Telemetry reports which one ran, and
|
|
75
|
+
* this is what keeps that property low-cardinality and non-identifying: an argument we do not
|
|
76
|
+
* recognize reports as `unknown` rather than being echoed, so a typo — which may be a path, a URL, or
|
|
77
|
+
* a flow name — can never reach the wire just because someone misspelled `status`.
|
|
78
|
+
*
|
|
79
|
+
* Lives here rather than in the telemetry module because this is where the command names are already
|
|
80
|
+
* defined; a second list somewhere else would drift the first time a command is added.
|
|
81
|
+
*/
|
|
82
|
+
export const UNKNOWN_COMMAND = 'unknown';
|
|
83
|
+
const KNOWN_COMMANDS = new Set([
|
|
84
|
+
INIT_COMMAND,
|
|
85
|
+
SERVE_COMMAND,
|
|
86
|
+
STOP_COMMAND,
|
|
87
|
+
STATUS_COMMAND,
|
|
88
|
+
OPEN_COMMAND,
|
|
89
|
+
DRIVE_COMMAND,
|
|
90
|
+
VERIFY_COMMAND,
|
|
91
|
+
AFFECTED_COMMAND,
|
|
92
|
+
HUNT_COMMAND,
|
|
93
|
+
CAPSULES_COMMAND,
|
|
94
|
+
GATE_COMMAND,
|
|
95
|
+
WATCH_COMMAND,
|
|
96
|
+
UPDATE_COMMAND,
|
|
97
|
+
ROLLBACK_COMMAND,
|
|
98
|
+
MCP_COMMAND,
|
|
99
|
+
LICENSE_COMMAND,
|
|
100
|
+
VERSION_COMMAND,
|
|
101
|
+
TELEMETRY_COMMAND,
|
|
102
|
+
FEEDBACK_COMMAND,
|
|
103
|
+
IDENTIFY_COMMAND,
|
|
104
|
+
DAEMON_INNER_COMMAND,
|
|
105
|
+
// Cloud subcommands dispatch before the local parser but are still commands a human ran.
|
|
106
|
+
'login',
|
|
107
|
+
'logout',
|
|
108
|
+
'whoami',
|
|
109
|
+
'link',
|
|
110
|
+
'project',
|
|
111
|
+
'config',
|
|
112
|
+
'push',
|
|
113
|
+
'runs',
|
|
114
|
+
'regression',
|
|
115
|
+
'share',
|
|
116
|
+
'doctor',
|
|
117
|
+
'help',
|
|
118
|
+
]);
|
|
119
|
+
/** The subcommand name if we recognize it, else `unknown`. Bare `reticle` reports `help`. */
|
|
120
|
+
export function knownCommand(arg) {
|
|
121
|
+
if (arg === undefined || arg === '')
|
|
122
|
+
return 'help';
|
|
123
|
+
return KNOWN_COMMANDS.has(arg) ? arg : UNKNOWN_COMMAND;
|
|
124
|
+
}
|
|
57
125
|
export const HEADED_FLAG = '--headed';
|
|
126
|
+
/**
|
|
127
|
+
* Force a hidden browser. The default is now HEADED: a run nobody can see is a run nobody trusts,
|
|
128
|
+
* and every "did it actually do anything?" question cost a round-trip. CI passes this (or just sets
|
|
129
|
+
* CI, which flips the default) because there is no display there to be headed on.
|
|
130
|
+
*/
|
|
131
|
+
export const HEADLESS_FLAG = '--headless';
|
|
58
132
|
export const PORT_FLAG = '--port';
|
|
59
133
|
export const DRIVE_FLAG = '--drive';
|
|
60
134
|
const QUIET_FLAG = '--quiet';
|
|
@@ -67,7 +141,13 @@ export const HTTP_PORT_FLAG = '--http-port';
|
|
|
67
141
|
export const HTTP_TOKEN_FLAG = '--http-token';
|
|
68
142
|
const TIMEOUT_FLAG = '--timeout';
|
|
69
143
|
const STORAGE_STATE_FLAG = '--storage-state';
|
|
70
|
-
|
|
144
|
+
/**
|
|
145
|
+
* `serve` / `mcp` / `_daemon` own the browser POOL, which backs automated work — leased contexts for
|
|
146
|
+
* parallel agents, flow replay, the spec runner. Those are batch: nobody is watching, and launching
|
|
147
|
+
* them headed changed timing enough to break four e2e specs. The headed default belongs to the
|
|
148
|
+
* INTERACTIVE command (`drive`), where a human asked to see the run. `--headed` still opts in here.
|
|
149
|
+
*/
|
|
150
|
+
function parseServeFlags(args, defaultPort, _defaultHeadless) {
|
|
71
151
|
let port = defaultPort;
|
|
72
152
|
let driveUrl;
|
|
73
153
|
let headless = true;
|
|
@@ -96,6 +176,9 @@ function parseServeFlags(args, defaultPort) {
|
|
|
96
176
|
else if (arg === HEADED_FLAG) {
|
|
97
177
|
headless = false;
|
|
98
178
|
}
|
|
179
|
+
else if (arg === HEADLESS_FLAG) {
|
|
180
|
+
headless = true;
|
|
181
|
+
}
|
|
99
182
|
else if (arg === HTTP_FLAG) {
|
|
100
183
|
http = true;
|
|
101
184
|
}
|
|
@@ -140,13 +223,16 @@ function parsePortFlag(args, defaultPort) {
|
|
|
140
223
|
const parsed = parseInt(n, 10);
|
|
141
224
|
return isNaN(parsed) ? defaultPort : parsed;
|
|
142
225
|
}
|
|
143
|
-
function parseDriveSuffix(args, port) {
|
|
144
|
-
let headless =
|
|
226
|
+
function parseDriveSuffix(args, port, defaultHeadless) {
|
|
227
|
+
let headless = defaultHeadless;
|
|
145
228
|
let driveUrl;
|
|
146
229
|
for (const arg of args) {
|
|
147
230
|
if (arg === HEADED_FLAG) {
|
|
148
231
|
headless = false;
|
|
149
232
|
}
|
|
233
|
+
else if (arg === HEADLESS_FLAG) {
|
|
234
|
+
headless = true;
|
|
235
|
+
}
|
|
150
236
|
else if (arg.startsWith('--')) {
|
|
151
237
|
return { kind: 'error', message: CLI_USAGE };
|
|
152
238
|
}
|
|
@@ -271,7 +357,14 @@ function parseTargetArgs(rest) {
|
|
|
271
357
|
}
|
|
272
358
|
return since === undefined ? { files } : { files, since };
|
|
273
359
|
}
|
|
274
|
-
|
|
360
|
+
/**
|
|
361
|
+
* @param defaultHeadless Whether a browser Reticle launches should be hidden when no flag says
|
|
362
|
+
* otherwise. Injected rather than read from the environment here, because this module is pure —
|
|
363
|
+
* `cli.ts` decides it from `CI`. The product default is FALSE: showing the run is what makes it
|
|
364
|
+
* trustworthy, and asking people to opt into seeing their own app was backwards.
|
|
365
|
+
*/
|
|
366
|
+
export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
|
|
367
|
+
// Bare `reticle` is `serve` — a pool-owning command, so headless like the rest of that family.
|
|
275
368
|
if (argv.length === 0)
|
|
276
369
|
return { kind: 'serve', port: defaultPort, headless: true, http: false };
|
|
277
370
|
const [cmd, ...rest] = argv;
|
|
@@ -291,7 +384,7 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
291
384
|
return { kind: 'init', port: r.port, mcp: r.mcp, dryRun: r.dryRun, install: r.install };
|
|
292
385
|
}
|
|
293
386
|
case SERVE_COMMAND: {
|
|
294
|
-
const r = parseServeFlags(rest, defaultPort);
|
|
387
|
+
const r = parseServeFlags(rest, defaultPort, defaultHeadless);
|
|
295
388
|
if (r.kind === 'error')
|
|
296
389
|
return r;
|
|
297
390
|
return {
|
|
@@ -328,6 +421,42 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
328
421
|
}
|
|
329
422
|
return { kind: 'telemetry', action };
|
|
330
423
|
}
|
|
424
|
+
case IDENTIFY_COMMAND: {
|
|
425
|
+
const flag = (name) => {
|
|
426
|
+
const at = rest.indexOf(name);
|
|
427
|
+
return at === -1 ? undefined : rest[at + 1];
|
|
428
|
+
};
|
|
429
|
+
const context = flag(CONTEXT_FLAG);
|
|
430
|
+
const company = flag(COMPANY_FLAG);
|
|
431
|
+
const email = flag(EMAIL_FLAG);
|
|
432
|
+
return {
|
|
433
|
+
kind: 'identify',
|
|
434
|
+
...(context !== undefined ? { context } : {}),
|
|
435
|
+
...(company !== undefined ? { company } : {}),
|
|
436
|
+
...(email !== undefined ? { email } : {}),
|
|
437
|
+
forget: rest.includes(FORGET_FLAG),
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
case FEEDBACK_COMMAND: {
|
|
441
|
+
const ratingAt = rest.indexOf(RATING_FLAG);
|
|
442
|
+
const rating = ratingAt === -1 ? undefined : Number(rest[ratingAt + 1]);
|
|
443
|
+
if (rating !== undefined && (!Number.isInteger(rating) || rating < 1 || rating > 5)) {
|
|
444
|
+
return { kind: 'error', message: `${RATING_FLAG} takes a whole number from 1 to 5` };
|
|
445
|
+
}
|
|
446
|
+
// Everything that is not a flag or the rating's value is the message. Quoting is the user's
|
|
447
|
+
// job for shell reasons, but joining the remainder means an unquoted sentence still works.
|
|
448
|
+
const consumed = new Set(ratingAt === -1 ? [] : [ratingAt, ratingAt + 1]);
|
|
449
|
+
const text = rest
|
|
450
|
+
.filter((arg, i) => !consumed.has(i) && !arg.startsWith('--'))
|
|
451
|
+
.join(' ')
|
|
452
|
+
.trim();
|
|
453
|
+
return {
|
|
454
|
+
kind: 'feedback',
|
|
455
|
+
text,
|
|
456
|
+
...(rating !== undefined ? { rating } : {}),
|
|
457
|
+
bug: rest.includes(BUG_FLAG),
|
|
458
|
+
};
|
|
459
|
+
}
|
|
331
460
|
case OPEN_COMMAND: {
|
|
332
461
|
const port = parsePortFlag(rest, defaultPort);
|
|
333
462
|
// The first non-flag arg is the url (optional — omitting reuses a connected tab).
|
|
@@ -335,13 +464,13 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
335
464
|
return url !== undefined ? { kind: 'open', port, url } : { kind: 'open', port };
|
|
336
465
|
}
|
|
337
466
|
case DRIVE_COMMAND: {
|
|
338
|
-
const r = parseDriveSuffix(rest, defaultPort);
|
|
467
|
+
const r = parseDriveSuffix(rest, defaultPort, defaultHeadless);
|
|
339
468
|
if (r.kind === 'error')
|
|
340
469
|
return r;
|
|
341
470
|
return { kind: 'drive', port: r.port, driveUrl: r.driveUrl, headless: r.headless };
|
|
342
471
|
}
|
|
343
472
|
case DAEMON_INNER_COMMAND: {
|
|
344
|
-
const r = parseServeFlags(rest, defaultPort);
|
|
473
|
+
const r = parseServeFlags(rest, defaultPort, defaultHeadless);
|
|
345
474
|
if (r.kind === 'error')
|
|
346
475
|
return r;
|
|
347
476
|
return {
|
|
@@ -368,6 +497,12 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
368
497
|
}
|
|
369
498
|
case CAPSULES_COMMAND:
|
|
370
499
|
return { kind: 'capsules' };
|
|
500
|
+
case HUNT_COMMAND: {
|
|
501
|
+
const dir = rest.find((a) => !a.startsWith('-'));
|
|
502
|
+
return dir === undefined
|
|
503
|
+
? { kind: 'error', message: 'usage: reticle hunt <dir-of-crawl-reports>' }
|
|
504
|
+
: { kind: 'hunt', dir };
|
|
505
|
+
}
|
|
371
506
|
case AFFECTED_COMMAND: {
|
|
372
507
|
const t = parseTargetArgs(rest);
|
|
373
508
|
if (t.files.length === 0 && t.since === undefined) {
|
|
@@ -396,7 +531,7 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
396
531
|
case ROLLBACK_COMMAND:
|
|
397
532
|
return { kind: 'rollback' };
|
|
398
533
|
case MCP_COMMAND: {
|
|
399
|
-
const r = parseServeFlags(rest, defaultPort);
|
|
534
|
+
const r = parseServeFlags(rest, defaultPort, defaultHeadless);
|
|
400
535
|
if (r.kind === 'error')
|
|
401
536
|
return r;
|
|
402
537
|
return {
|
|
@@ -413,4 +548,3 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
413
548
|
return { kind: 'error', message: CLI_USAGE };
|
|
414
549
|
}
|
|
415
550
|
}
|
|
416
|
-
//# sourceMappingURL=cli-parse.js.map
|
package/dist/cli-port.d.ts
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* 3..reticle.json "port" field in the cwd ← per-project isolation
|
|
8
8
|
* 4. RETICLE_DEFAULT_PORT (4400)
|
|
9
9
|
*/
|
|
10
|
+
export declare function isLikelyDevServerPort(port: number): boolean;
|
|
11
|
+
/** The warning printed when a project pins the bridge to something that looks like its dev server. */
|
|
12
|
+
export declare function devServerPortWarning(port: number): string;
|
|
10
13
|
/**
|
|
11
14
|
* Read the port stored in the project's .reticle.json (written by `reticle init`).
|
|
12
15
|
* Returns undefined if the file is absent, unreadable, or has no valid numeric port.
|
|
@@ -29,4 +32,3 @@ export declare function readJournalEnabled(cwd: string, env: string | undefined)
|
|
|
29
32
|
* Pass `portFlag` when the user explicitly supplied --port; pass `undefined` to fall through.
|
|
30
33
|
*/
|
|
31
34
|
export declare function resolvePort(portFlag: number | undefined, envPort: number | undefined, projectPort: number | undefined, defaultPort: number): number;
|
|
32
|
-
//# sourceMappingURL=cli-port.d.ts.map
|
package/dist/cli-port.js
CHANGED
|
@@ -8,6 +8,27 @@
|
|
|
8
8
|
* 4. RETICLE_DEFAULT_PORT (4400)
|
|
9
9
|
*/
|
|
10
10
|
import { readFileSync } from 'node:fs';
|
|
11
|
+
/**
|
|
12
|
+
* Ports that belong to a DEV SERVER, not to Reticle's bridge. Next defaults to 3000, Vite to 5173,
|
|
13
|
+
* Astro to 4321, and so on.
|
|
14
|
+
*
|
|
15
|
+
* `.reticle.json`'s `port` is the bridge — the daemon ↔ SDK channel, default 4400 — and it has
|
|
16
|
+
* nothing to do with the port the app is served on. Setting it to the dev-server port makes the
|
|
17
|
+
* daemon try to bind the port the app already holds; what the user sees is either a bind failure or
|
|
18
|
+
* a daemon that never connects, neither of which mentions the actual mistake. The old setup skill
|
|
19
|
+
* asked "what port does your dev server run on?" a few lines before showing this field, which is how
|
|
20
|
+
* the confusion got manufactured in the first place.
|
|
21
|
+
*/
|
|
22
|
+
const DEV_SERVER_PORTS = new Set([
|
|
23
|
+
3000, 3001, 4200, 4321, 5000, 5173, 5174, 8000, 8080, 8100, 9000,
|
|
24
|
+
]);
|
|
25
|
+
export function isLikelyDevServerPort(port) {
|
|
26
|
+
return DEV_SERVER_PORTS.has(port);
|
|
27
|
+
}
|
|
28
|
+
/** The warning printed when a project pins the bridge to something that looks like its dev server. */
|
|
29
|
+
export function devServerPortWarning(port) {
|
|
30
|
+
return `[reticle] .reticle.json sets "port": ${port}, which is a common DEV-SERVER port. That field is the Reticle BRIDGE port (default 4400), not the port your app is served on — they must be different, or the daemon fights your dev server for it. Remove "port" unless you are running several apps at once.`;
|
|
31
|
+
}
|
|
11
32
|
/**
|
|
12
33
|
* Read the port stored in the project's .reticle.json (written by `reticle init`).
|
|
13
34
|
* Returns undefined if the file is absent, unreadable, or has no valid numeric port.
|
|
@@ -80,4 +101,3 @@ export function readJournalEnabled(cwd, env) {
|
|
|
80
101
|
export function resolvePort(portFlag, envPort, projectPort, defaultPort) {
|
|
81
102
|
return portFlag ?? envPort ?? projectPort ?? defaultPort;
|
|
82
103
|
}
|
|
83
|
-
//# sourceMappingURL=cli-port.js.map
|
package/dist/cli-verify.d.ts
CHANGED
package/dist/cli-verify.js
CHANGED
|
@@ -34,7 +34,7 @@ const MSG_NO_SESSION = 'No app connected — Reticle drove the URL but no @retic
|
|
|
34
34
|
' Make sure the SDK is in the build and reticle.connect() runs on the preview page' +
|
|
35
35
|
' (for a non-localhost preview: allowNonLocalhost + a pairing token).';
|
|
36
36
|
const MSG_NO_FLOWS = 'No saved flows to verify (.reticle/flows is empty) — refusing to report a pass for verifying nothing.\n' +
|
|
37
|
-
' Flows are recorded interactively by an agent (
|
|
37
|
+
' Flows are recorded interactively by an agent (reticle_record{action:"start"} → act → reticle_flow_save via the\n' +
|
|
38
38
|
' MCP tools), then committed to .reticle/flows/. In CI, check those files in and re-run `reticle verify`.';
|
|
39
39
|
const MSG_VERIFY_PREFIX = 'verify failed: ';
|
|
40
40
|
function errMessage(error) {
|
|
@@ -219,4 +219,3 @@ export function handleVerify(parsed) {
|
|
|
219
219
|
};
|
|
220
220
|
void runVerify({ url: parsed.url, timeoutMs: parsed.timeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS }, ports);
|
|
221
221
|
}
|
|
222
|
-
//# sourceMappingURL=cli-verify.js.map
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { pathToFileURL } from 'node:url';
|
|
3
|
-
import { realpathSync
|
|
3
|
+
import { realpathSync } from 'node:fs';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { handleWatch, handleCapsules, handleGate, loadNamedFlows, resolveChangedFiles, } from './cli-flow-commands.js';
|
|
6
6
|
import { RETICLE_DEFAULT_PORT, ReticleDir, ReticleEnv } from '@reticlehq/core';
|
|
7
|
+
import { loadDotEnv } from './telemetry/dev-repo.js';
|
|
7
8
|
import { createNodeFileSystem } from './project/fs-port.js';
|
|
8
9
|
import { affectedSavedFlows } from './flows/flow-sources.js';
|
|
9
10
|
import { checkForUpdate } from './update/update-checker.js';
|
|
@@ -11,7 +12,6 @@ import { applyUpdate, rollback } from './update/updater.js';
|
|
|
11
12
|
import { start, startDaemon } from './index.js';
|
|
12
13
|
import { isCloudCommand, runCloudCommand } from './cloud-cli.js';
|
|
13
14
|
import { SERVER_VERSION } from './server-version.js';
|
|
14
|
-
import { getTelemetry, TelemetryEventKind, describeTelemetry, setTelemetryEnabled, } from './telemetry/telemetry.js';
|
|
15
15
|
import { log } from './log.js';
|
|
16
16
|
import { readPid, isAlive, isRunning, removePid, spawnDaemon, discoverDaemonPort, writeDaemonRegistry, } from './daemon.js';
|
|
17
17
|
import { waitForDaemon, startMcpProxy, probeDaemon } from './mcp-proxy.js';
|
|
@@ -19,11 +19,16 @@ import { installDaemonResilience } from './daemon-resilience.js';
|
|
|
19
19
|
import { IdleShutdown, resolveIdleShutdownMs } from './idle-shutdown.js';
|
|
20
20
|
import { fetchStatus, summarizeStatus, decideOpen, openInBrowser } from './cli-launch.js';
|
|
21
21
|
import { handleVerify } from './cli-verify.js';
|
|
22
|
+
import { summarizeHunt } from './hunt/hunt-report.js';
|
|
22
23
|
import { runInit } from './init/run.js';
|
|
24
|
+
import { handleDoctor } from './cli-doctor.js';
|
|
23
25
|
import { buildNodeIo } from './init/node-io.js';
|
|
24
26
|
import { describeLicense } from './license/license.js';
|
|
25
|
-
import { readProjectPort, readProjectId } from './cli-port.js';
|
|
26
|
-
import { DAEMON_INNER_COMMAND, PORT_FLAG, DRIVE_FLAG, HEADED_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, parseCliArgs, CLI_USAGE,
|
|
27
|
+
import { isLikelyDevServerPort, devServerPortWarning, readProjectPort, readProjectId } from './cli-port.js';
|
|
28
|
+
import { DAEMON_INNER_COMMAND, PORT_FLAG, DRIVE_FLAG, HEADED_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, parseCliArgs, CLI_USAGE, } from './cli-parse.js';
|
|
29
|
+
import { handleFeedback, handleIdentify, handleTelemetry } from './telemetry/feedback-cli.js';
|
|
30
|
+
import { installDaemonTelemetry } from './telemetry/daemon-telemetry.js';
|
|
31
|
+
import { reportCliRun } from './telemetry/cli-telemetry.js';
|
|
27
32
|
// Re-exported so existing imports (and the CLI tests) keep resolving from './cli.js'.
|
|
28
33
|
export { parseCliArgs, CLI_USAGE };
|
|
29
34
|
function handleInit(parsed) {
|
|
@@ -100,36 +105,6 @@ function handleStatus(port) {
|
|
|
100
105
|
log('reticle_status', { port, running: true, pid, ...summarizeStatus(payload) });
|
|
101
106
|
});
|
|
102
107
|
}
|
|
103
|
-
/**
|
|
104
|
-
* `reticle doctor` — collapse the ~6 independent first-run failure modes into one command. Checks the
|
|
105
|
-
* Chromium install (the #1 silent failure), whether a daemon is up on the resolved bridge port, and
|
|
106
|
-
* reminds the user which port the app must dial. Human-readable to stdout (not the JSON log).
|
|
107
|
-
*/
|
|
108
|
-
async function handleDoctor(port) {
|
|
109
|
-
const line = (s) => {
|
|
110
|
-
process.stdout.write(`${s}\n`);
|
|
111
|
-
};
|
|
112
|
-
line('reticle doctor');
|
|
113
|
-
line(` node ${process.version}`);
|
|
114
|
-
try {
|
|
115
|
-
const { chromium } = await import('playwright');
|
|
116
|
-
const path = chromium.executablePath();
|
|
117
|
-
line(existsSync(path)
|
|
118
|
-
? ' chromium ✓ installed'
|
|
119
|
-
: ' chromium ✗ missing — run: npx playwright install chromium');
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
line(' chromium ✗ missing — run: npx playwright install chromium');
|
|
123
|
-
}
|
|
124
|
-
const pid = readPid(port);
|
|
125
|
-
if (pid !== null && isAlive(pid)) {
|
|
126
|
-
line(` daemon ✓ running on :${port} (pid ${pid})`);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
line(` daemon ✗ not running on :${port} — your agent runs \`reticle mcp\` (or \`reticle serve\`)`);
|
|
130
|
-
}
|
|
131
|
-
line(` bridge port ${port} (your app must dial THIS port — not your dev-server port)`);
|
|
132
|
-
}
|
|
133
108
|
/** Print the running package version (resolved once in server-version.ts). */
|
|
134
109
|
function handleVersion() {
|
|
135
110
|
log('reticle_version', { version: SERVER_VERSION });
|
|
@@ -138,24 +113,6 @@ function handleVersion() {
|
|
|
138
113
|
function handleLicense() {
|
|
139
114
|
log('reticle_license', { ...describeLicense(Date.now()) });
|
|
140
115
|
}
|
|
141
|
-
/**
|
|
142
|
-
* `reticle telemetry [status|enable|disable]` — the user-facing control for anonymous usage metrics.
|
|
143
|
-
* `disable` persists a machine-wide opt-out (survives shells, unlike RETICLE_TELEMETRY=0); `status`
|
|
144
|
-
* says what's on, why, and where the full policy lives. Human-readable to stdout, like `doctor`.
|
|
145
|
-
*/
|
|
146
|
-
function handleTelemetry(action) {
|
|
147
|
-
const line = (s) => {
|
|
148
|
-
process.stdout.write(`${s}\n`);
|
|
149
|
-
};
|
|
150
|
-
if (action !== TelemetryAction.STATUS) {
|
|
151
|
-
setTelemetryEnabled(action === TelemetryAction.ENABLE);
|
|
152
|
-
}
|
|
153
|
-
const state = describeTelemetry();
|
|
154
|
-
line(`telemetry ${state.enabled ? 'enabled' : 'disabled'} (${state.reason})`);
|
|
155
|
-
line(`policy ${state.policyUrl}`);
|
|
156
|
-
if (state.enabled)
|
|
157
|
-
line('opt out reticle telemetry disable (or RETICLE_TELEMETRY=0 / DO_NOT_TRACK=1)');
|
|
158
|
-
}
|
|
159
116
|
/**
|
|
160
117
|
* `reticle affected <file...>` — print which saved flows must re-verify for the given changed files.
|
|
161
118
|
* Environment-side (costs the agent nothing per turn); the foundation of watch/gate. Never throws:
|
|
@@ -179,6 +136,42 @@ async function handleAffected(files, since) {
|
|
|
179
136
|
});
|
|
180
137
|
}
|
|
181
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* `reticle hunt <dir>` — aggregate crawl reports from many checkouts into one number.
|
|
141
|
+
*
|
|
142
|
+
* Detection already exists (`reticle_crawl`). This is the arithmetic that turns a pile of runs into
|
|
143
|
+
* the claim worth making: over N already-merged, already-green changes, how many carried a candidate
|
|
144
|
+
* false green? No control arm is needed, because those changes SHIPPED — the counterfactual is
|
|
145
|
+
* already established, which is what makes this the cheapest credible evidence available.
|
|
146
|
+
*
|
|
147
|
+
* Each file in <dir> is one crawl result. Producing them is a shell loop over a commit range:
|
|
148
|
+
* check out, boot the app, `reticle_crawl`, write the JSON here.
|
|
149
|
+
*/
|
|
150
|
+
async function handleHunt(dir) {
|
|
151
|
+
try {
|
|
152
|
+
const fs = createNodeFileSystem();
|
|
153
|
+
const names = await fs.readdir(dir);
|
|
154
|
+
const runs = [];
|
|
155
|
+
for (const name of names.filter((n) => n.endsWith('.json'))) {
|
|
156
|
+
const raw = await fs.readFile(join(dir, name));
|
|
157
|
+
if (raw === undefined)
|
|
158
|
+
continue;
|
|
159
|
+
const parsed = JSON.parse(raw);
|
|
160
|
+
const report = parsed;
|
|
161
|
+
runs.push({
|
|
162
|
+
label: report.label ?? name.replace(/\.json$/, ''),
|
|
163
|
+
anomalies: report.anomalies ?? [],
|
|
164
|
+
...(report.stepsRun === undefined ? {} : { stepsRun: report.stepsRun }),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
log('reticle_hunt', { ...summarizeHunt(runs) });
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
log('reticle_hunt_failed', {
|
|
171
|
+
error: error instanceof Error ? error.message : String(error),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
182
175
|
/** `reticle update` — install the latest server version and restart (moved off the MCP surface). */
|
|
183
176
|
async function handleUpdate() {
|
|
184
177
|
try {
|
|
@@ -237,7 +230,11 @@ function handleOpen(requestedPort, url) {
|
|
|
237
230
|
const { sessions } = summarizeStatus(await fetchStatus(port));
|
|
238
231
|
const decision = decideOpen(sessions, url);
|
|
239
232
|
if (decision.action === 'need-url') {
|
|
240
|
-
log('reticle_open', {
|
|
233
|
+
log('reticle_open', {
|
|
234
|
+
port,
|
|
235
|
+
error: 'no app connected — pass a url: reticle open <url>. Desktop app (Electron/Tauri)? ' +
|
|
236
|
+
'There is no url to open: start it as you normally would and it connects to this bridge itself.',
|
|
237
|
+
});
|
|
241
238
|
return;
|
|
242
239
|
}
|
|
243
240
|
if (decision.action === 'reuse') {
|
|
@@ -269,10 +266,9 @@ function handleDaemonInner(parsed) {
|
|
|
269
266
|
startDaemon(options)
|
|
270
267
|
.then((server) => {
|
|
271
268
|
log('reticle_daemon_ready', { port: parsed.port, pid: process.pid });
|
|
272
|
-
//
|
|
273
|
-
//
|
|
274
|
-
const
|
|
275
|
-
void getTelemetry().emit(TelemetryEventKind.SESSION_START);
|
|
269
|
+
// Daemon lifecycle telemetry: started, a one-shot project profile, the periodic counter flush,
|
|
270
|
+
// and the rich summary on shutdown. All of it lives in one module — see daemon-telemetry.ts.
|
|
271
|
+
const daemonTelemetry = installDaemonTelemetry(process.cwd());
|
|
276
272
|
// Publish to the discovery registry so a build plugin can find this daemon by projectId — no
|
|
277
273
|
// hand-reconciled port. Written from the child (only it knows its cwd); removePid drops it.
|
|
278
274
|
const registryProjectId = readProjectId(process.cwd());
|
|
@@ -289,11 +285,12 @@ function handleDaemonInner(parsed) {
|
|
|
289
285
|
process.exit(1);
|
|
290
286
|
});
|
|
291
287
|
const shutdown = () => {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
.
|
|
288
|
+
// Awaited before the close/exit chain: `process.exit(0)` kills an in-flight POST, and this is
|
|
289
|
+
// the one event carrying the whole session. A failed send resolves anyway (emit swallows its
|
|
290
|
+
// own errors), so this can delay the exit by at most the send timeout, never prevent it.
|
|
291
|
+
void daemonTelemetry
|
|
292
|
+
.shutdown()
|
|
293
|
+
.then(() => server.close())
|
|
297
294
|
.then(() => {
|
|
298
295
|
removePid(parsed.port);
|
|
299
296
|
process.exit(0);
|
|
@@ -392,14 +389,21 @@ function handleLegacyDrive(parsed) {
|
|
|
392
389
|
});
|
|
393
390
|
}
|
|
394
391
|
function main() {
|
|
392
|
+
// Before anything reads process.env — notably the telemetry gate and the bridge's security
|
|
393
|
+
// options — fold in a project-local `.env`. Values already in the environment always win.
|
|
394
|
+
loadDotEnv(process.cwd());
|
|
395
395
|
const argv = process.argv.slice(2);
|
|
396
396
|
// Every invocation passes through here — the single chokepoint for the "how often is it used / how
|
|
397
397
|
// many distinct machines + projects" metrics. Fire-and-forget: a metric must never delay or fail a run.
|
|
398
|
-
|
|
399
|
-
// `
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
398
|
+
//
|
|
399
|
+
// `_daemon` is EXCLUDED, and that exclusion is the whole point of this branch. `reticle mcp` and
|
|
400
|
+
// `reticle serve` start the daemon by re-running this very binary, so the child re-entered main()
|
|
401
|
+
// and emitted a second event for what a person experienced as one action. The old `invoke` metric
|
|
402
|
+
// was therefore inflated ~2x — and inflated worst on the agent-driven sessions that matter most,
|
|
403
|
+
// while one-shot commands like `version` counted once. That skewed the RATIO between commands, not
|
|
404
|
+
// just the scale, which is the kind of error you cannot correct for after the fact. The daemon's
|
|
405
|
+
// own lifecycle is already reported by `daemon_started` / `daemon_stopped`; it is not a CLI run.
|
|
406
|
+
reportCliRun(argv);
|
|
403
407
|
// Cloud subcommands (login/link/project/config/push) are a distinct family with their own async client;
|
|
404
408
|
// handle them before the local typed parser so `reticle login` etc. work as one tool.
|
|
405
409
|
if (isCloudCommand(argv[0])) {
|
|
@@ -409,8 +413,15 @@ function main() {
|
|
|
409
413
|
const portEnv = process.env[ReticleEnv.PORT];
|
|
410
414
|
const envPort = portEnv !== undefined ? parseInt(portEnv, 10) : undefined;
|
|
411
415
|
const projectPort = readProjectPort(process.cwd());
|
|
416
|
+
// Say so rather than letting the daemon fight the dev server for the port and fail with an
|
|
417
|
+
// EADDRINUSE that mentions neither file nor cause.
|
|
418
|
+
if (projectPort !== undefined && isLikelyDevServerPort(projectPort)) {
|
|
419
|
+
process.stderr.write(`${devServerPortWarning(projectPort)}\n`);
|
|
420
|
+
}
|
|
412
421
|
const defaultPort = envPort ?? projectPort ?? RETICLE_DEFAULT_PORT;
|
|
413
|
-
|
|
422
|
+
// Headed by default; hidden only where there is no display to be headed on. A run nobody can see
|
|
423
|
+
// is a run nobody trusts, and every "did it actually do anything?" cost a human round-trip.
|
|
424
|
+
const parsed = parseCliArgs(argv, defaultPort, process.env['CI'] !== undefined);
|
|
414
425
|
switch (parsed.kind) {
|
|
415
426
|
case 'error':
|
|
416
427
|
log('reticle_usage_error', { message: parsed.message });
|
|
@@ -434,6 +445,12 @@ function main() {
|
|
|
434
445
|
case 'telemetry':
|
|
435
446
|
handleTelemetry(parsed.action);
|
|
436
447
|
break;
|
|
448
|
+
case 'feedback':
|
|
449
|
+
void handleFeedback(parsed.text, parsed.rating, parsed.bug);
|
|
450
|
+
break;
|
|
451
|
+
case 'identify':
|
|
452
|
+
void handleIdentify(parsed);
|
|
453
|
+
break;
|
|
437
454
|
case 'version':
|
|
438
455
|
handleVersion();
|
|
439
456
|
break;
|
|
@@ -458,6 +475,9 @@ function main() {
|
|
|
458
475
|
case 'affected':
|
|
459
476
|
void handleAffected(parsed.files, parsed.since);
|
|
460
477
|
break;
|
|
478
|
+
case 'hunt':
|
|
479
|
+
void handleHunt(parsed.dir);
|
|
480
|
+
break;
|
|
461
481
|
case 'gate':
|
|
462
482
|
void handleGate(parsed.files, parsed.since);
|
|
463
483
|
break;
|
|
@@ -500,4 +520,3 @@ function isEntryPoint() {
|
|
|
500
520
|
if (isEntryPoint()) {
|
|
501
521
|
main();
|
|
502
522
|
}
|
|
503
|
-
//# sourceMappingURL=cli.js.map
|
|
@@ -34,4 +34,3 @@ export interface ProjectCloud {
|
|
|
34
34
|
* so the single-project / CI flow is unchanged. `homeDir` is injected (testable; `os.homedir()` at call).
|
|
35
35
|
*/
|
|
36
36
|
export declare function resolveProjectCloud(fs: FileSystemPort, reticleRoot: string, homeDir: string, env: NodeJS.ProcessEnv): Promise<ProjectCloud>;
|
|
37
|
-
//# sourceMappingURL=cloud-config.d.ts.map
|
|
@@ -84,4 +84,3 @@ export async function resolveProjectCloud(fs, reticleRoot, homeDir, env) {
|
|
|
84
84
|
const config = key !== null ? { url: link.url.replace(/\/+$/, ''), apiKey: key } : null;
|
|
85
85
|
return { config, policy, verify: link.verify, projectId: link.projectId };
|
|
86
86
|
}
|
|
87
|
-
//# sourceMappingURL=cloud-config.js.map
|
|
@@ -110,20 +110,20 @@ declare const ServerVerificationSchema: z.ZodObject<{
|
|
|
110
110
|
}>, "many">;
|
|
111
111
|
summary: z.ZodString;
|
|
112
112
|
}, "strip", z.ZodTypeAny, {
|
|
113
|
-
verificationId: string;
|
|
114
|
-
verdict: string | null;
|
|
115
113
|
flows: {
|
|
116
114
|
status: string;
|
|
117
115
|
name: string;
|
|
118
116
|
}[];
|
|
119
|
-
summary: string;
|
|
120
|
-
}, {
|
|
121
117
|
verificationId: string;
|
|
122
118
|
verdict: string | null;
|
|
119
|
+
summary: string;
|
|
120
|
+
}, {
|
|
123
121
|
flows: {
|
|
124
122
|
status: string;
|
|
125
123
|
name: string;
|
|
126
124
|
}[];
|
|
125
|
+
verificationId: string;
|
|
126
|
+
verdict: string | null;
|
|
127
127
|
summary: string;
|
|
128
128
|
}>;
|
|
129
129
|
export type ServerVerification = z.infer<typeof ServerVerificationSchema>;
|
|
@@ -140,4 +140,3 @@ export declare function submitServerVerification(body: {
|
|
|
140
140
|
source: string;
|
|
141
141
|
}, config: CloudConfig | null, fetchImpl: FetchPostJsonLike): Promise<ServerVerification | null>;
|
|
142
142
|
export {};
|
|
143
|
-
//# sourceMappingURL=cloud-sync.d.ts.map
|
package/dist/cloud/cloud-sync.js
CHANGED