@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
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
* A repo already knows its name: the directory it lives in. That is not a guess, it is the name its
|
|
12
12
|
* owner chose and the one they will look for in a project list.
|
|
13
13
|
*/
|
|
14
|
+
import { createHash } from 'node:crypto';
|
|
15
|
+
import { execFileSync } from 'node:child_process';
|
|
16
|
+
import { relative } from 'node:path';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { PROJECT_ID_HASH_LENGTH } from '@reticlehq/core';
|
|
19
|
+
import { CredentialRefusedError, api, hint } from './cloud-kit.js';
|
|
14
20
|
/** Cap the slug so a deep or oddly-named checkout cannot produce an unreadable project id. */
|
|
15
21
|
const MAX_SLUG = 48;
|
|
16
22
|
/** The id used when a directory name yields nothing usable — the historical behaviour, unchanged. */
|
|
@@ -37,8 +43,107 @@ export const slugifyProjectName = (raw) => {
|
|
|
37
43
|
* do to rotate a key or repoint an environment — must land in that same project or the history
|
|
38
44
|
* silently splits in two, which is worse than the shared-bucket problem this fixes.
|
|
39
45
|
*/
|
|
40
|
-
export const defaultProjectFor = (cwdBasename, existingProjectId
|
|
46
|
+
export const defaultProjectFor = (cwdBasename, existingProjectId,
|
|
47
|
+
/** The `projectId` `init` wrote into `.reticle.json`, when there is one. */
|
|
48
|
+
localProjectId) => {
|
|
41
49
|
if (existingProjectId !== undefined && existingProjectId.length > 0)
|
|
42
50
|
return existingProjectId;
|
|
43
|
-
|
|
51
|
+
// The name part of `init`'s `<name>-<hash>`, else the id as written: a name the owner chose.
|
|
52
|
+
const named = localProjectId === undefined || 0 === localProjectId.length
|
|
53
|
+
? undefined
|
|
54
|
+
: (nameOfLocalId(localProjectId) ?? localProjectId);
|
|
55
|
+
return slugifyProjectName(named ?? cwdBasename);
|
|
44
56
|
};
|
|
57
|
+
/** `init`'s id is the app's name and a short hash of where it lives: `nina-todo-f96721e8`. */
|
|
58
|
+
const LOCAL_ID = new RegExp(`^(.+)-[0-9a-f]{${String(PROJECT_ID_HASH_LENGTH)}}$`);
|
|
59
|
+
/**
|
|
60
|
+
* The name part of the id `init` wrote. One project carried two names: `.reticle.json` said
|
|
61
|
+
* `nina-todo-f96721e8` (from the package) while the dashboard said `app` (the folder), so the person
|
|
62
|
+
* looked for one and the list showed the other. The dashboard now takes the name `init` wrote.
|
|
63
|
+
*/
|
|
64
|
+
function nameOfLocalId(localProjectId) {
|
|
65
|
+
return LOCAL_ID.exec(localProjectId)?.[1];
|
|
66
|
+
}
|
|
67
|
+
export const CreatedProjectSchema = z.object({ projectId: z.string(), name: z.string() });
|
|
68
|
+
const ProjectsListSchema = z.object({
|
|
69
|
+
projects: z.array(z.object({ projectId: z.string(), name: z.string(), repo: z.string().optional() })),
|
|
70
|
+
});
|
|
71
|
+
/** ` in workspace "<name>"`, or nothing when no name is known. */
|
|
72
|
+
export const inWorkspace = (name) => name === undefined || 0 === name.length ? '' : ` in workspace "${name}"`;
|
|
73
|
+
/** Characters of the repository identity: enough to tell repositories apart, nothing to read. */
|
|
74
|
+
const REPO_ID_CHARS = 16;
|
|
75
|
+
/**
|
|
76
|
+
* Which repository, and which folder in it, a project folder is: a hash of the `origin` remote and
|
|
77
|
+
* the folder's path inside the checkout, so every clone of one app agrees and two different apps
|
|
78
|
+
* both named `web` do not. Undefined outside git or with no remote. Neither leaves the machine.
|
|
79
|
+
*/
|
|
80
|
+
export function repoIdentity(dir) {
|
|
81
|
+
try {
|
|
82
|
+
const git = (...args) => execFileSync('git', args, {
|
|
83
|
+
cwd: dir,
|
|
84
|
+
encoding: 'utf8',
|
|
85
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
86
|
+
}).trim();
|
|
87
|
+
const remote = git('config', '--get', 'remote.origin.url')
|
|
88
|
+
.replace(/\.git$/, '')
|
|
89
|
+
.replace(/^[a-z+]+:\/\/|^[^@]+@/i, '')
|
|
90
|
+
.replace(':', '/')
|
|
91
|
+
.toLowerCase();
|
|
92
|
+
if (0 === remote.length)
|
|
93
|
+
return undefined;
|
|
94
|
+
const inside = relative(git('rev-parse', '--show-toplevel'), dir).split('\\').join('/');
|
|
95
|
+
return createHash('sha256')
|
|
96
|
+
.update(`${remote}\u0000${inside}`)
|
|
97
|
+
.digest('hex')
|
|
98
|
+
.slice(0, REPO_ID_CHARS);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The id for the project the caller named, creating it if it does not exist yet — and saying so,
|
|
106
|
+
* in which workspace. A project of that NAME made for another repository is not reused: two apps
|
|
107
|
+
* whose package is `web` shared one dashboard project. A project with no recorded repository, or an
|
|
108
|
+
* id named outright, is reused as before.
|
|
109
|
+
*/
|
|
110
|
+
/** Projects named when creating one was refused. */
|
|
111
|
+
const MAX_NAMED = 5;
|
|
112
|
+
export async function resolveProjectId(url, token, wanted, workspace, repo,
|
|
113
|
+
/**
|
|
114
|
+
* The id `init` wrote into `.reticle.json`, for a project created by default: the platform is
|
|
115
|
+
* asked to keep it, so the folder and the dashboard name one project by one id. A platform that
|
|
116
|
+
* does not know the field ignores it and answers with its own, which is what gets linked.
|
|
117
|
+
*/
|
|
118
|
+
localId) {
|
|
119
|
+
const { projects } = ProjectsListSchema.parse(await api('GET', `${url}/v1/projects`, token));
|
|
120
|
+
const lc = wanted.toLowerCase();
|
|
121
|
+
const holding = localId === undefined ? undefined : projects.find((p) => p.projectId === localId);
|
|
122
|
+
if (holding !== undefined)
|
|
123
|
+
return holding.projectId;
|
|
124
|
+
const match = projects.find((p) => p.projectId === wanted ||
|
|
125
|
+
(p.name.toLowerCase() === lc &&
|
|
126
|
+
(repo === undefined || p.repo === undefined || p.repo === repo)));
|
|
127
|
+
if (match !== undefined)
|
|
128
|
+
return match.projectId;
|
|
129
|
+
let answer;
|
|
130
|
+
try {
|
|
131
|
+
answer = await api('POST', `${url}/v1/projects`, token, {
|
|
132
|
+
name: wanted,
|
|
133
|
+
...(repo === undefined ? {} : { repo }),
|
|
134
|
+
...(localId === undefined ? {} : { projectId: localId }),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
// Refused to create one (a contributor): the platform's words, then the step that works.
|
|
139
|
+
if (error instanceof CredentialRefusedError ||
|
|
140
|
+
!(error instanceof Error) ||
|
|
141
|
+
0 === projects.length)
|
|
142
|
+
throw error;
|
|
143
|
+
const names = projects.map((p) => p.name).slice(0, MAX_NAMED);
|
|
144
|
+
throw new Error(`${error.message}\nTo link one that exists: ${names.map((n) => `\`reticle connect --project ${n}\``).join(', ')}`);
|
|
145
|
+
}
|
|
146
|
+
const created = CreatedProjectSchema.parse(answer);
|
|
147
|
+
hint(`created project "${wanted}" (${created.projectId})${inWorkspace(workspace)} — it did not exist yet`);
|
|
148
|
+
return created.projectId;
|
|
149
|
+
}
|
|
@@ -14,7 +14,23 @@ import type { OnboardingStep } from '@reticlehq/core/telemetry';
|
|
|
14
14
|
* so the entry point supplies it and every layer below stays a function of its arguments.
|
|
15
15
|
*/
|
|
16
16
|
export type StepReporter = (step: OnboardingStep) => void;
|
|
17
|
-
|
|
17
|
+
/** How many coding agents on this machine have Reticle's tools after this run. */
|
|
18
|
+
export declare function handleSetupMcp(reportStep: StepReporter, standalone?: boolean): number;
|
|
19
|
+
/**
|
|
20
|
+
* The one line the launchers read and strip: what they cannot know and the next steps depend on.
|
|
21
|
+
*
|
|
22
|
+
* The launchers own the closing words (served from main, so wording changes on merge) and used to
|
|
23
|
+
* print "restart your coding agent" to a machine with none, and "cd your-app" to somebody already
|
|
24
|
+
* standing in it. An older launcher shows this line as is; a launcher reading an older CLI finds no
|
|
25
|
+
* line and keeps its generic wording, so neither half has to ship first.
|
|
26
|
+
*/
|
|
27
|
+
export declare const INSTALL_RESULT_PREFIX = "RETICLE_INSTALL";
|
|
28
|
+
/** Whether the folder the installer ran in is an app: `init` runs here, or after a `cd`. */
|
|
29
|
+
export declare const InstallAppHere: {
|
|
30
|
+
readonly HERE: "here";
|
|
31
|
+
readonly NONE: "none";
|
|
32
|
+
};
|
|
33
|
+
export declare function installResultLine(agents: number, cwd: string): string;
|
|
18
34
|
/**
|
|
19
35
|
* `reticle setup install` — the Node half of the one-line installer.
|
|
20
36
|
*
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { dirname } from 'node:path';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { claudeAddCommand, McpClient, probeCli, terminalWidth, wrapForTerminal, } from '@reticlehq/init';
|
|
5
|
-
import {
|
|
5
|
+
import { tutorialShownSteps } from './tutorial.js';
|
|
6
6
|
import { setupMcp, knownClientLabels } from '../setup/setup-mcp.js';
|
|
7
7
|
import { reportInstallSteps } from '../setup/setup-install.js';
|
|
8
8
|
import { registerOtherAgents } from '../setup/setup-command.js';
|
|
9
|
+
/** How many coding agents on this machine have Reticle's tools after this run. */
|
|
9
10
|
export function handleSetupMcp(reportStep, standalone = true) {
|
|
10
11
|
const io = {
|
|
11
12
|
exists: (p) => existsSync(p),
|
|
@@ -45,7 +46,7 @@ export function handleSetupMcp(reportStep, standalone = true) {
|
|
|
45
46
|
io.print(0 < preRegistered
|
|
46
47
|
? `None of ${knownClientLabels().join(', ')} is installed here yet. The agents above are pre-registered and have Reticle's tools once installed; install one of the others, then run \`reticle setup mcp\` again.`
|
|
47
48
|
: `No coding agent config found. Looked for: ${knownClientLabels().join(', ')}. Install one, then run \`reticle setup mcp\` again.`);
|
|
48
|
-
return;
|
|
49
|
+
return 0;
|
|
49
50
|
}
|
|
50
51
|
for (const id of result.registered)
|
|
51
52
|
io.print(` ✓ ${id}`);
|
|
@@ -92,6 +93,25 @@ export function handleSetupMcp(reportStep, standalone = true) {
|
|
|
92
93
|
io.print('Restart your agent for it to pick up the new server.');
|
|
93
94
|
io.print('Then: cd <your project> && reticle init');
|
|
94
95
|
}
|
|
96
|
+
return result.registered.length + result.alreadyThere.length;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The one line the launchers read and strip: what they cannot know and the next steps depend on.
|
|
100
|
+
*
|
|
101
|
+
* The launchers own the closing words (served from main, so wording changes on merge) and used to
|
|
102
|
+
* print "restart your coding agent" to a machine with none, and "cd your-app" to somebody already
|
|
103
|
+
* standing in it. An older launcher shows this line as is; a launcher reading an older CLI finds no
|
|
104
|
+
* line and keeps its generic wording, so neither half has to ship first.
|
|
105
|
+
*/
|
|
106
|
+
export const INSTALL_RESULT_PREFIX = 'RETICLE_INSTALL';
|
|
107
|
+
const APP_MARKERS = ['package.json', 'index.html'];
|
|
108
|
+
/** Whether the folder the installer ran in is an app: `init` runs here, or after a `cd`. */
|
|
109
|
+
export const InstallAppHere = { HERE: 'here', NONE: 'none' };
|
|
110
|
+
export function installResultLine(agents, cwd) {
|
|
111
|
+
const app = APP_MARKERS.some((file) => existsSync(join(cwd, file)))
|
|
112
|
+
? InstallAppHere.HERE
|
|
113
|
+
: InstallAppHere.NONE;
|
|
114
|
+
return `${INSTALL_RESULT_PREFIX} agents=${String(agents)} app=${app}`;
|
|
95
115
|
}
|
|
96
116
|
/**
|
|
97
117
|
* `reticle setup install` — the Node half of the one-line installer.
|
|
@@ -102,16 +122,17 @@ export function handleSetupMcp(reportStep, standalone = true) {
|
|
|
102
122
|
*/
|
|
103
123
|
export function handleSetupInstall(opts, reportStep) {
|
|
104
124
|
reportInstallSteps({ runtimeSecs: opts.runtimeSecs, installSecs: opts.installSecs }, reportStep);
|
|
125
|
+
let agents = 0;
|
|
105
126
|
if (opts.mcp) {
|
|
106
|
-
handleSetupMcp(reportStep, false);
|
|
127
|
+
agents = handleSetupMcp(reportStep, false);
|
|
107
128
|
}
|
|
108
129
|
else {
|
|
109
130
|
process.stdout.write('Skipping MCP registration (--no-mcp).\n');
|
|
110
131
|
}
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
// Shown, so the ONBOARD steps are a fact rather than a guess.
|
|
132
|
+
// No closing here: the installer prints the next step and the agent prompt itself, right after
|
|
133
|
+
// this returns, so what this prints is progress and nothing else. Those two blocks are what the
|
|
134
|
+
// ONBOARD steps below now stand for: what Reticle is for, shown before anything is asked of anyone.
|
|
115
135
|
for (const step of tutorialShownSteps())
|
|
116
136
|
reportStep(step);
|
|
137
|
+
process.stdout.write(`${installResultLine(agents, process.cwd())}\n`);
|
|
117
138
|
}
|
|
@@ -19,6 +19,7 @@ export declare const StatusLabel: {
|
|
|
19
19
|
readonly DAEMON: "daemon";
|
|
20
20
|
readonly SESSIONS: "sessions";
|
|
21
21
|
readonly AGENT_LINK: "agent link";
|
|
22
|
+
readonly ACCOUNT: "account";
|
|
22
23
|
readonly NEXT: "next";
|
|
23
24
|
readonly SPLIT_BRAIN: "split brain";
|
|
24
25
|
readonly UPDATE: "update";
|
|
@@ -19,6 +19,7 @@ export const StatusLabel = {
|
|
|
19
19
|
DAEMON: 'daemon',
|
|
20
20
|
SESSIONS: 'sessions',
|
|
21
21
|
AGENT_LINK: 'agent link',
|
|
22
|
+
ACCOUNT: 'account',
|
|
22
23
|
NEXT: 'next',
|
|
23
24
|
SPLIT_BRAIN: 'split brain',
|
|
24
25
|
UPDATE: 'update',
|
|
@@ -101,9 +102,40 @@ export function statusLines(fields) {
|
|
|
101
102
|
if (why !== undefined)
|
|
102
103
|
lines.push(continuation(why));
|
|
103
104
|
}
|
|
105
|
+
// Who is signed in, and whether this repo is linked: what `whoami` used to answer. Only when the
|
|
106
|
+
// caller looked, which is what the key being present means.
|
|
107
|
+
if ('signedInAs' in fields) {
|
|
108
|
+
const who = str(fields, 'signedInAs');
|
|
109
|
+
const project = str(fields, 'linkedProject');
|
|
110
|
+
// Signed in to one workspace, a repo can still send to another: say which it sends to.
|
|
111
|
+
const workspace = str(fields, 'linkedWorkspace');
|
|
112
|
+
// A key the platform refused at the last sync is the answer, not "not signed in": a member
|
|
113
|
+
// removed from the workspace was told to connect while the key was set, and refused.
|
|
114
|
+
const refused = str(fields, 'keyRefused');
|
|
115
|
+
lines.push(row(StatusLabel.ACCOUNT, refused !== undefined
|
|
116
|
+
? `${NOT_OK} refused at the last sync: ${refused}`
|
|
117
|
+
: who === undefined
|
|
118
|
+
? `${NOT_OK} not signed in`
|
|
119
|
+
: `${OK} signed in as ${who}`));
|
|
120
|
+
const apps = appLinks(fields['workspaceApps']);
|
|
121
|
+
if (project === undefined && 0 < apps.length)
|
|
122
|
+
for (const { app, project: linked } of apps)
|
|
123
|
+
lines.push(continuation(null === linked
|
|
124
|
+
? `${app} is not linked: run \`reticle connect\` in ${app}`
|
|
125
|
+
: `${app} is linked to ${linked}`));
|
|
126
|
+
else
|
|
127
|
+
lines.push(continuation(project === undefined
|
|
128
|
+
? 'this repo is not linked: run `reticle connect`'
|
|
129
|
+
: `this repo is linked to ${project}${workspace === undefined ? '' : ` in workspace "${workspace}"`}`));
|
|
130
|
+
}
|
|
104
131
|
const client = str(fields, 'mcpClient');
|
|
105
|
-
if (client !== undefined)
|
|
106
|
-
|
|
132
|
+
if (client !== undefined) {
|
|
133
|
+
// The state in words (`mcpClientSaid`), never the record's own name for it.
|
|
134
|
+
lines.push(row(StatusLabel.AGENT_LINK, str(fields, 'mcpClientSaid') ?? client));
|
|
135
|
+
const action = str(fields, 'mcpClientAction');
|
|
136
|
+
if (action !== undefined)
|
|
137
|
+
lines.push(continuation(action));
|
|
138
|
+
}
|
|
107
139
|
for (const [label, key] of [
|
|
108
140
|
[StatusLabel.NEXT, 'nextAction'],
|
|
109
141
|
[StatusLabel.SPLIT_BRAIN, 'splitBrain'],
|
|
@@ -115,3 +147,16 @@ export function statusLines(fields) {
|
|
|
115
147
|
}
|
|
116
148
|
return lines;
|
|
117
149
|
}
|
|
150
|
+
/** A workspace root's apps and their links, read defensively off the status fields. */
|
|
151
|
+
function appLinks(value) {
|
|
152
|
+
if (!Array.isArray(value))
|
|
153
|
+
return [];
|
|
154
|
+
return value.flatMap((raw) => {
|
|
155
|
+
if ('object' !== typeof raw || null === raw)
|
|
156
|
+
return [];
|
|
157
|
+
const { app, project } = raw;
|
|
158
|
+
return 'string' === typeof app
|
|
159
|
+
? [{ app, project: 'string' === typeof project ? project : null }]
|
|
160
|
+
: [];
|
|
161
|
+
});
|
|
162
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface AppLink {
|
|
2
|
+
/** The app's directory, relative to the root. */
|
|
3
|
+
app: string;
|
|
4
|
+
/** The project it sends to, or null when it is not linked. */
|
|
5
|
+
project: string | null;
|
|
6
|
+
}
|
|
7
|
+
/** Each app under `root`, in name order, with its link. Empty when `root` is no workspace. */
|
|
8
|
+
export declare function workspaceAppLinks(root: string, linkOf: (appDir: string) => Promise<string | null>): Promise<AppLink[]>;
|
|
9
|
+
/** The project an app folder's link file names, or null with none: local only, as status is. */
|
|
10
|
+
export declare function localLinkOf(appDir: string): Promise<string | null>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The apps of a workspace root and the project each is linked to, for `reticle status` run at a root
|
|
3
|
+
* that is no app of its own: "this repo is not linked" there named nothing that could be acted on.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { ReticleDir, asRecord, asString } from '@reticlehq/core';
|
|
8
|
+
import { SILENT_HOST, buildNodeIo, findWorkspaceApps } from '@reticlehq/init';
|
|
9
|
+
/** Each app under `root`, in name order, with its link. Empty when `root` is no workspace. */
|
|
10
|
+
export async function workspaceAppLinks(root, linkOf) {
|
|
11
|
+
let apps;
|
|
12
|
+
try {
|
|
13
|
+
apps = findWorkspaceApps(buildNodeIo(root, SILENT_HOST));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
return Promise.all([...apps].sort().map(async (app) => ({ app, project: await linkOf(join(root, app)) })));
|
|
19
|
+
}
|
|
20
|
+
/** The project an app folder's link file names, or null with none: local only, as status is. */
|
|
21
|
+
export function localLinkOf(appDir) {
|
|
22
|
+
try {
|
|
23
|
+
const link = JSON.parse(readFileSync(join(appDir, ReticleDir.ROOT, ReticleDir.CLOUD_LINK_FILE), 'utf8'));
|
|
24
|
+
return Promise.resolve(asString(asRecord(link)['projectId']) ?? null);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return Promise.resolve(null);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { CloudConfig } from '../../memory/cloud/cloud-sync.js';
|
|
2
|
+
import { type FreeDrive } from '../../features/harness/platform/platform-drives.js';
|
|
3
|
+
export declare const MSG_SIGN_IN_FIRST = "Sign in first: reticle connect (it is free, no card)";
|
|
4
|
+
/** The whole drive, model turns and browser included, before the CLI stops waiting for it. */
|
|
5
|
+
export declare const TRY_BUDGET_MS = 120000;
|
|
6
|
+
/** Model turns in the one free drive. Bounds what it costs, not what it may find. */
|
|
7
|
+
export declare const TRY_MAX_STEPS = 40;
|
|
8
|
+
export interface TryJourney {
|
|
9
|
+
title: string;
|
|
10
|
+
status: string;
|
|
11
|
+
}
|
|
12
|
+
/** What one drive came back with, or the sentence that says why it could not run. */
|
|
13
|
+
export interface TryDrive {
|
|
14
|
+
journeys: TryJourney[];
|
|
15
|
+
runIds: string[];
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface TryPorts {
|
|
19
|
+
/** The credential `reticle connect` filed for this folder, or null when it is not linked. */
|
|
20
|
+
linked: () => Promise<CloudConfig | null>;
|
|
21
|
+
requestDrive: (cloud: CloudConfig) => Promise<FreeDrive>;
|
|
22
|
+
drive: (request: {
|
|
23
|
+
url: string;
|
|
24
|
+
driveId: string;
|
|
25
|
+
persona?: string;
|
|
26
|
+
}) => Promise<TryDrive>;
|
|
27
|
+
/** Send the drive's run, as `reticle push` does. True when the cycle succeeded. */
|
|
28
|
+
sync: (runIds: readonly string[]) => Promise<boolean>;
|
|
29
|
+
dashboardUrl: (cloud: CloudConfig) => Promise<string | undefined>;
|
|
30
|
+
out: (line: string) => void;
|
|
31
|
+
fail: (line: string) => void;
|
|
32
|
+
}
|
|
33
|
+
export interface TryArgs {
|
|
34
|
+
url: string;
|
|
35
|
+
persona?: string;
|
|
36
|
+
}
|
|
37
|
+
/** `try <url> [--persona <who>]`, or the sentence that says what is missing. */
|
|
38
|
+
export declare function parseTryArgs(argv: readonly string[]): TryArgs | {
|
|
39
|
+
error: string;
|
|
40
|
+
};
|
|
41
|
+
/** The summary, worst news last so it is the line a reader's eye lands on. Pure. */
|
|
42
|
+
export declare function summarizeTry(journeys: readonly TryJourney[]): string[];
|
|
43
|
+
export declare function runTry(args: TryArgs, ports: TryPorts): Promise<number>;
|
|
44
|
+
/** The journeys out of an explore report, or one journey graded from the drive when unplanned. */
|
|
45
|
+
export declare function journeysOf(report: Record<string, unknown>, persona?: string): TryJourney[];
|
|
46
|
+
/** What `try` borrows from the cloud commands, passed in so neither module imports the other. */
|
|
47
|
+
export interface TryCloud {
|
|
48
|
+
push: () => Promise<number>;
|
|
49
|
+
dashboardUrl: (cloud: CloudConfig) => Promise<string | undefined>;
|
|
50
|
+
}
|
|
51
|
+
/** `reticle try`, wired to this machine. Returns the exit code. */
|
|
52
|
+
export declare function cmdTry(argv: readonly string[], cloudCommands: TryCloud): Promise<number>;
|
|
53
|
+
/**
|
|
54
|
+
* How `init` ends once the connection is proved: what Reticle sees of the app, what it is missing,
|
|
55
|
+
* and the prompt that hands the rest to the coding agent, which proves the first flow. `init` never
|
|
56
|
+
* drives: the Harness is opt-in and unlocks at a coverage score (core's `instrumentation-coverage.ts`), and a
|
|
57
|
+
* freshly wired app is rarely there yet.
|
|
58
|
+
*
|
|
59
|
+
* Read from the daemon's `/status`, the same coverage `doctor` prints, so the two never disagree.
|
|
60
|
+
*/
|
|
61
|
+
/** What a project that is not linked is told, once, at the end. */
|
|
62
|
+
export declare const UNLINKED_PITCH: string[];
|
|
63
|
+
/** Prove one flow with the coding agent: the line every ending names. */
|
|
64
|
+
export declare const msgProveOneFlow: (url: string) => string;
|
|
65
|
+
/**
|
|
66
|
+
* The closing lines for one tab's coverage, as `/status` reports it: the score, what is missing, the
|
|
67
|
+
* Harness gate in its own sentence, and the prompt for the coding agent. Pure.
|
|
68
|
+
*/
|
|
69
|
+
export declare function initCoverageLines(tab: Record<string, unknown> | undefined, url: string): string[];
|
|
70
|
+
/**
|
|
71
|
+
* This project's runs and flows that will never reach the dashboard as things stand, one line each:
|
|
72
|
+
* not linked, no key for its host, flow sync off, or refused. A linked root's pending runs are left
|
|
73
|
+
* out, because the daemon sends them within seconds and saying so would be noise.
|
|
74
|
+
*/
|
|
75
|
+
export declare function strandedWorkLines(appDir: string): Promise<string[]>;
|
|
76
|
+
/** What `init` hands its ending, once the connection is proved. */
|
|
77
|
+
export interface FirstFlowContext {
|
|
78
|
+
appDir: string;
|
|
79
|
+
bridgePort: number;
|
|
80
|
+
pairingToken?: string | undefined;
|
|
81
|
+
url: string;
|
|
82
|
+
sessionId: string;
|
|
83
|
+
/** The proof came from a Reticle-owned browser, now closed: its own tab cannot be measured. */
|
|
84
|
+
leased: boolean;
|
|
85
|
+
openBrowser: boolean;
|
|
86
|
+
/** False for `--no-first-run`: connect, and say nothing more. */
|
|
87
|
+
firstRun: boolean;
|
|
88
|
+
json: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* How `init` ends: the coverage score, the gaps and the agent prompt, the pitch when the project is
|
|
92
|
+
* not linked, then what will never reach the dashboard. Nothing is driven. Never throws.
|
|
93
|
+
*/
|
|
94
|
+
export declare function initFirstFlow(ctx: FirstFlowContext, say: (line: string) => void): Promise<{
|
|
95
|
+
flowSaved: boolean;
|
|
96
|
+
}>;
|