@reticlehq/server 2.4.0 → 2.6.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 +719 -0
- package/dist/bridge/auth-failure-reason.d.ts +19 -0
- package/dist/bridge/auth-failure-reason.js +29 -0
- package/dist/{bridge-security.d.ts → bridge/bridge-security.d.ts} +1 -1
- package/dist/{bridge-security.js → bridge/bridge-security.js} +1 -1
- package/dist/{bridge.d.ts → bridge/bridge.d.ts} +13 -1
- package/dist/{bridge.js → bridge/bridge.js} +95 -15
- package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +9 -11
- package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +18 -10
- package/dist/{pairing-token.js → bridge/pairing-token.js} +1 -1
- package/dist/capsule/capsule-store.d.ts +8 -3
- package/dist/capsule/capsule-store.js +7 -2
- package/dist/capsule/capsule.js +3 -3
- package/dist/capsule/causal-summary.d.ts +8 -0
- package/dist/capsule/causal-summary.js +22 -12
- package/dist/capsule/divergence.d.ts +9 -4
- package/dist/capsule/divergence.js +8 -8
- package/dist/capsule/predicate-to-links.js +11 -8
- package/dist/cli/cli-doctor.d.ts +1 -0
- package/dist/cli/cli-doctor.js +135 -0
- package/dist/{cli-flow-commands.d.ts → cli/cli-flow-commands.d.ts} +2 -2
- package/dist/{cli-flow-commands.js → cli/cli-flow-commands.js} +15 -15
- package/dist/{cli-launch.d.ts → cli/cli-launch.d.ts} +32 -3
- package/dist/cli/cli-launch.js +171 -0
- package/dist/cli/cli-parse-feedback.d.ts +31 -0
- package/dist/cli/cli-parse-feedback.js +56 -0
- package/dist/{cli-parse.d.ts → cli/cli-parse.d.ts} +6 -19
- package/dist/{cli-parse.js → cli/cli-parse.js} +118 -81
- package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +12 -0
- package/dist/{cli-port.js → cli/cli-port.js} +9 -9
- package/dist/cli/cli-update-commands.d.ts +4 -0
- package/dist/cli/cli-update-commands.js +93 -0
- package/dist/{cli-verify.js → cli/cli-verify.js} +14 -14
- package/dist/{cloud-cli.js → cli/cloud-cli.js} +29 -24
- package/dist/cli/doctor-daemon-line.d.ts +37 -0
- package/dist/cli/doctor-daemon-line.js +35 -0
- package/dist/cli/port-holder.d.ts +43 -0
- package/dist/cli/port-holder.js +99 -0
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +302 -100
- package/dist/cloud/cloud-config.d.ts +0 -1
- package/dist/cloud/cloud-config.js +9 -9
- package/dist/cloud/cloud-sync.d.ts +1 -7
- package/dist/cloud/cloud-sync.js +12 -12
- package/dist/crawl/crawl-empty.d.ts +16 -0
- package/dist/crawl/crawl-empty.js +24 -0
- package/dist/crawl/crawl-tools.js +4 -1
- package/dist/crawl/crawl.js +26 -7
- package/dist/daemon/daemon-resilience.d.ts +73 -0
- package/dist/daemon/daemon-resilience.js +279 -0
- package/dist/daemon/daemon-usefulness.d.ts +61 -0
- package/dist/daemon/daemon-usefulness.js +62 -0
- package/dist/{daemon.d.ts → daemon/daemon.d.ts} +33 -8
- package/dist/{daemon.js → daemon/daemon.js} +105 -48
- package/dist/daemon/heartbeat.d.ts +115 -0
- package/dist/daemon/heartbeat.js +141 -0
- package/dist/daemon/idle-grace.d.ts +32 -0
- package/dist/daemon/idle-grace.js +41 -0
- package/dist/{idle-shutdown.d.ts → daemon/idle-shutdown.d.ts} +23 -2
- package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +37 -6
- package/dist/daemon/port-presence.d.ts +76 -0
- package/dist/daemon/port-presence.js +93 -0
- package/dist/daemon/state-dir.d.ts +7 -0
- package/dist/daemon/state-dir.js +59 -0
- package/dist/daemon/unclean-predecessor.d.ts +23 -0
- package/dist/daemon/unclean-predecessor.js +27 -0
- package/dist/domain/domain-model.js +2 -2
- package/dist/events/body-failures.js +8 -8
- package/dist/events/contradictions.d.ts +1 -1
- package/dist/events/contradictions.js +60 -10
- package/dist/events/echo-mismatch.js +10 -10
- package/dist/events/event-filters.js +6 -6
- package/dist/events/json-salvage.d.ts +2 -1
- package/dist/events/json-salvage.js +6 -6
- package/dist/events/observed-in-window.d.ts +12 -0
- package/dist/events/observed-in-window.js +21 -0
- package/dist/events/predicate-eval.d.ts +53 -20
- package/dist/events/predicate-eval.js +179 -55
- package/dist/events/predicate-parse.d.ts +23 -0
- package/dist/events/predicate-parse.js +54 -0
- package/dist/events/predicate.d.ts +7 -2
- package/dist/events/predicate.js +126 -35
- package/dist/events/reconcile.js +5 -5
- package/dist/events/ring-buffer.js +2 -17
- package/dist/events/stale-response.js +6 -6
- package/dist/events/testid-near-miss.d.ts +22 -0
- package/dist/events/testid-near-miss.js +33 -0
- package/dist/events/unit-mismatch.js +8 -8
- package/dist/flows/affected-tools.js +19 -4
- package/dist/flows/affected.js +1 -1
- package/dist/flows/annotate-target.d.ts +1 -0
- package/dist/flows/annotate-target.js +20 -0
- package/dist/flows/annotate-tools.js +25 -3
- package/dist/flows/annotate.js +17 -4
- package/dist/flows/assertion-integrity.d.ts +2 -1
- package/dist/flows/assertion-tiers-store.d.ts +3 -66
- package/dist/flows/assertion-tiers-store.js +2 -2
- package/dist/flows/attributed-failure.d.ts +17 -0
- package/dist/flows/attributed-failure.js +20 -0
- package/dist/flows/buddy-status.d.ts +2 -1
- package/dist/flows/buddy-status.js +2 -2
- package/dist/flows/coverage.d.ts +3 -2
- package/dist/flows/coverage.js +2 -2
- package/dist/flows/decision.js +24 -9
- package/dist/flows/empty-flow.d.ts +6 -0
- package/dist/flows/empty-flow.js +24 -0
- package/dist/flows/flake-store.d.ts +0 -1
- package/dist/flows/flake-store.js +1 -1
- package/dist/flows/flake.d.ts +2 -1
- package/dist/flows/flake.js +2 -2
- package/dist/flows/flow-classify.js +12 -0
- package/dist/flows/flow-replay-run.js +4 -4
- package/dist/flows/flow-replay.d.ts +6 -8
- package/dist/flows/flow-replay.js +132 -48
- package/dist/flows/flow-report.js +1 -1
- package/dist/flows/flow-scope.d.ts +1 -6
- package/dist/flows/flow-step-runners.d.ts +26 -6
- package/dist/flows/flow-step-runners.js +156 -6
- package/dist/flows/flow-success.js +20 -15
- package/dist/flows/flow-tools.js +63 -21
- package/dist/flows/flows.js +15 -11
- package/dist/flows/gate.d.ts +4 -3
- package/dist/flows/gate.js +1 -1
- package/dist/flows/heal-run.d.ts +0 -8
- package/dist/flows/heal-run.js +5 -5
- package/dist/flows/heal.js +3 -3
- package/dist/flows/predicate-to-expect.d.ts +38 -0
- package/dist/flows/predicate-to-expect.js +95 -0
- package/dist/flows/replay.d.ts +16 -1
- package/dist/flows/replay.js +58 -22
- package/dist/flows/role-anchor-nearest.d.ts +6 -0
- package/dist/flows/role-anchor-nearest.js +45 -0
- package/dist/flows/role-drift-reason.d.ts +20 -0
- package/dist/flows/role-drift-reason.js +39 -0
- package/dist/flows/server-verify.d.ts +1 -1
- package/dist/flows/server-verify.js +5 -5
- package/dist/flows/suite-flakes.d.ts +33 -0
- package/dist/flows/suite-flakes.js +32 -0
- package/dist/flows/verify-change-tools.js +32 -10
- package/dist/flows/verify-change-verdict.d.ts +15 -0
- package/dist/flows/verify-change-verdict.js +25 -0
- package/dist/flows/watch-batcher.d.ts +3 -2
- package/dist/honesty/already-true.d.ts +2 -0
- package/dist/honesty/already-true.js +31 -0
- package/dist/honesty/blind-spots.d.ts +35 -3
- package/dist/honesty/blind-spots.js +57 -12
- package/dist/honesty/honesty.d.ts +3 -2
- package/dist/honesty/honesty.js +4 -4
- package/dist/honesty/uncaptured-bodies.js +1 -1
- package/dist/honesty/unread-outcome.js +2 -2
- package/dist/honesty/verified.d.ts +31 -3
- package/dist/honesty/verified.js +64 -8
- package/dist/http-server.js +23 -7
- package/dist/hunt/hunt-report.d.ts +2 -1
- package/dist/hunt/hunt-report.js +2 -2
- package/dist/index.d.ts +9 -6
- package/dist/index.js +41 -25
- package/dist/init/agent-rules.d.ts +20 -1
- package/dist/init/agent-rules.js +64 -8
- package/dist/init/app-choice.d.ts +20 -0
- package/dist/init/app-choice.js +25 -0
- package/dist/init/astro-host.d.ts +21 -0
- package/dist/init/astro-host.js +27 -0
- package/dist/init/astro-patch.d.ts +16 -0
- package/dist/init/astro-patch.js +240 -0
- package/dist/init/capabilities.js +4 -1
- package/dist/init/cra.d.ts +50 -0
- package/dist/init/cra.js +106 -0
- package/dist/init/cursor.js +39 -4
- package/dist/init/desktop-doctor.d.ts +3 -2
- package/dist/init/desktop-doctor.js +4 -4
- package/dist/init/detect.d.ts +9 -2
- package/dist/init/detect.js +24 -5
- package/dist/init/mcp-clients.d.ts +81 -0
- package/dist/init/mcp-clients.js +248 -0
- package/dist/init/mcp-registered.d.ts +12 -0
- package/dist/init/mcp-registered.js +14 -0
- package/dist/init/mcp.d.ts +27 -2
- package/dist/init/mcp.js +40 -4
- package/dist/init/next-patch.d.ts +2 -4
- package/dist/init/next-patch.js +109 -19
- package/dist/init/node-io.js +29 -6
- package/dist/init/plan-framework.d.ts +16 -1
- package/dist/init/plan-framework.js +166 -8
- package/dist/init/plan.d.ts +85 -6
- package/dist/init/plan.js +196 -33
- package/dist/init/project-id.d.ts +5 -9
- package/dist/init/project-id.js +10 -22
- package/dist/init/run.d.ts +23 -1
- package/dist/init/run.js +338 -47
- package/dist/init/slash-command.d.ts +9 -0
- package/dist/init/slash-command.js +10 -1
- package/dist/init/snippets.d.ts +7 -10
- package/dist/init/snippets.js +44 -15
- package/dist/init/vite-config.js +1 -1
- package/dist/init/windows-quote.d.ts +38 -0
- package/dist/init/windows-quote.js +70 -0
- package/dist/init/workspace-apps.d.ts +23 -0
- package/dist/init/workspace-apps.js +68 -0
- package/dist/input/driven-redaction.js +1 -1
- package/dist/input/network-detail.js +8 -8
- package/dist/input/network-mock-tools.js +2 -2
- package/dist/input/network-mock.js +4 -4
- package/dist/input/real-input.js +8 -3
- package/dist/input/scroll-find.js +2 -2
- package/dist/input/scroll-tools.d.ts +0 -5
- package/dist/input/scroll-tools.js +11 -4
- package/dist/input/viewport-tools.js +2 -2
- package/dist/journal/ambient-store.d.ts +0 -2
- package/dist/journal/ambient-store.js +1 -1
- package/dist/journal/ambient.js +1 -1
- package/dist/journal/attach-journal.d.ts +2 -1
- package/dist/journal/deviation-report.js +6 -6
- package/dist/journal/deviation-service.js +1 -1
- package/dist/journal/envelope-store.d.ts +0 -2
- package/dist/journal/envelope-store.js +1 -1
- package/dist/journal/envelope.d.ts +2 -3
- package/dist/journal/envelope.js +3 -3
- package/dist/journal/journal-query.js +1 -1
- package/dist/journal/journal-recorder.d.ts +2 -1
- package/dist/journal/journal-recorder.js +2 -2
- package/dist/journal/rollups.js +9 -9
- package/dist/journal/session-end.d.ts +2 -1
- package/dist/journal/session-journal.js +4 -4
- package/dist/license/license.d.ts +0 -14
- package/dist/license/license.js +8 -8
- package/dist/log.d.ts +10 -0
- package/dist/log.js +11 -1
- package/dist/mcp/mcp-is-error.d.ts +13 -0
- package/dist/mcp/mcp-is-error.js +18 -0
- package/dist/mcp/mcp-outage.d.ts +32 -0
- package/dist/mcp/mcp-outage.js +55 -0
- package/dist/mcp/mcp-proxy.d.ts +134 -0
- package/dist/mcp/mcp-proxy.js +720 -0
- package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
- package/dist/{mcp.js → mcp/mcp.js} +139 -37
- package/dist/mcp/proxy-handshake.d.ts +3 -0
- package/dist/mcp/proxy-handshake.js +54 -0
- package/dist/mcp/proxy-lifecycle.d.ts +64 -0
- package/dist/mcp/proxy-lifecycle.js +70 -0
- package/dist/mcp/tool-catalog-cache.d.ts +29 -0
- package/dist/mcp/tool-catalog-cache.js +55 -0
- package/dist/oracles/propose-consequences.d.ts +2 -1
- package/dist/oracles/propose-consequences.js +16 -11
- package/dist/oracles/self-instrument.d.ts +2 -1
- package/dist/oracles/self-instrument.js +1 -1
- package/dist/phenomena/phenomena.js +3 -3
- package/dist/platform.d.ts +16 -0
- package/dist/platform.js +16 -0
- package/dist/pool/browser-pool.d.ts +9 -0
- package/dist/pool/browser-pool.js +38 -9
- package/dist/pool/playwright-launcher.d.ts +15 -2
- package/dist/pool/playwright-launcher.js +21 -2
- package/dist/project/fs-port.js +1 -1
- package/dist/project/project-tools.js +2 -2
- package/dist/runs/build-verification-run.js +1 -1
- package/dist/runs/repair-prompt.d.ts +0 -6
- package/dist/runs/repair-prompt.js +3 -3
- package/dist/runs/risk-classify.js +1 -1
- package/dist/runs/run-diff.d.ts +0 -2
- package/dist/runs/run-diff.js +3 -3
- package/dist/runs/run-tools.js +2 -2
- package/dist/runs/verification-sync.js +2 -2
- package/dist/runs/verify-http.js +1 -1
- package/dist/runs/verify-server.js +1 -1
- package/dist/session/attachment-history.d.ts +46 -0
- package/dist/session/attachment-history.js +65 -0
- package/dist/session/command-timeout.d.ts +11 -3
- package/dist/session/command-timeout.js +2 -2
- package/dist/session/control-envelope.d.ts +6 -0
- package/dist/session/control-envelope.js +7 -1
- package/dist/session/dev-server-probe.d.ts +13 -0
- package/dist/session/dev-server-probe.js +52 -0
- package/dist/session/last-act.d.ts +17 -3
- package/dist/session/last-act.js +16 -4
- package/dist/session/live-control-tools.js +7 -2
- package/dist/session/live-control.js +1 -1
- package/dist/session/looks-like-dev-server.d.ts +14 -0
- package/dist/session/looks-like-dev-server.js +25 -0
- package/dist/session/no-session-diagnosis.d.ts +45 -0
- package/dist/session/no-session-diagnosis.js +120 -0
- package/dist/session/no-session-watch.d.ts +21 -0
- package/dist/session/no-session-watch.js +69 -0
- package/dist/session/observed-state.d.ts +4 -0
- package/dist/session/observed-state.js +19 -1
- package/dist/session/output-budget.js +1 -1
- package/dist/session/pending-commands.js +1 -0
- package/dist/session/session-health.d.ts +8 -1
- package/dist/session/session-health.js +8 -7
- package/dist/session/session-info.d.ts +43 -8
- package/dist/session/session-info.js +46 -1
- package/dist/session/session-lease.d.ts +0 -11
- package/dist/session/session-lease.js +1 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.js +124 -12
- package/dist/session/session-readiness.d.ts +1 -1
- package/dist/session/session-readiness.js +6 -1
- package/dist/session/session-reaper.js +1 -1
- package/dist/session/session-reconnect.d.ts +32 -0
- package/dist/session/session-reconnect.js +42 -0
- package/dist/session/session.d.ts +15 -2
- package/dist/session/session.js +77 -26
- package/dist/session/state-select.d.ts +1 -1
- package/dist/session/state-select.js +1 -1
- package/dist/status-payload.d.ts +19 -0
- package/dist/status-payload.js +11 -0
- package/dist/telemetry/argument-shape.js +10 -1
- package/dist/telemetry/browser-mode.d.ts +27 -0
- package/dist/telemetry/browser-mode.js +33 -0
- package/dist/telemetry/bug-found.d.ts +17 -21
- package/dist/telemetry/bug-found.js +120 -8
- package/dist/telemetry/cli-telemetry.d.ts +2 -12
- package/dist/telemetry/cli-telemetry.js +27 -4
- package/dist/telemetry/crash-cause.d.ts +47 -0
- package/dist/telemetry/crash-cause.js +104 -0
- package/dist/telemetry/daemon-telemetry.d.ts +38 -1
- package/dist/telemetry/daemon-telemetry.js +37 -12
- package/dist/telemetry/dev-repo.js +4 -4
- package/dist/telemetry/error-class.d.ts +26 -0
- package/dist/telemetry/error-class.js +52 -0
- package/dist/telemetry/error-fingerprint.js +21 -2
- package/dist/telemetry/feedback-cli.d.ts +8 -3
- package/dist/telemetry/feedback-cli.js +52 -8
- package/dist/telemetry/feedback-context.d.ts +23 -6
- package/dist/telemetry/feedback-context.js +105 -5
- package/dist/telemetry/feedback-delivery.d.ts +20 -0
- package/dist/telemetry/feedback-delivery.js +30 -0
- package/dist/telemetry/feedback-outbox.d.ts +22 -0
- package/dist/telemetry/feedback-outbox.js +87 -0
- package/dist/telemetry/feedback.d.ts +22 -1
- package/dist/telemetry/feedback.js +67 -8
- package/dist/telemetry/git-facts.d.ts +7 -0
- package/dist/telemetry/git-facts.js +5 -5
- package/dist/telemetry/project-profile.js +2 -1
- package/dist/telemetry/session-metrics.d.ts +47 -3
- package/dist/telemetry/session-metrics.js +315 -15
- package/dist/telemetry/telemetry.d.ts +45 -2
- package/dist/telemetry/telemetry.js +150 -37
- package/dist/telemetry/verification-of.d.ts +22 -0
- package/dist/telemetry/verification-of.js +84 -0
- package/dist/tools/act-capsule.js +2 -2
- package/dist/tools/act-danger.d.ts +12 -0
- package/dist/tools/act-danger.js +20 -3
- package/dist/tools/act-helpers.js +4 -4
- package/dist/tools/act-tools.d.ts +0 -8
- package/dist/tools/act-tools.js +114 -118
- package/dist/tools/act-view.js +7 -7
- package/dist/tools/alias-args.d.ts +17 -0
- package/dist/tools/alias-args.js +25 -0
- package/dist/tools/assert-grade.js +9 -9
- package/dist/tools/assert-verdict.d.ts +9 -1
- package/dist/tools/assert-verdict.js +21 -6
- package/dist/tools/browser-tools.js +36 -11
- package/dist/tools/contract-tools.d.ts +0 -5
- package/dist/tools/contract-tools.js +27 -1
- package/dist/tools/coverage-identity.d.ts +34 -0
- package/dist/tools/coverage-identity.js +46 -0
- package/dist/tools/coverage-tools.js +10 -14
- package/dist/tools/dynamic-tools.d.ts +2 -1
- package/dist/tools/dynamic-tools.js +96 -19
- package/dist/tools/error-recovery.d.ts +34 -2
- package/dist/tools/error-recovery.js +255 -4
- package/dist/tools/feedback-invite.d.ts +48 -0
- package/dist/tools/feedback-invite.js +71 -0
- package/dist/tools/feedback-tools.d.ts +12 -1
- package/dist/tools/feedback-tools.js +28 -5
- package/dist/tools/invoke-tool.d.ts +0 -12
- package/dist/tools/invoke-tool.js +126 -33
- package/dist/tools/lease-hint.d.ts +17 -0
- package/dist/tools/lease-hint.js +24 -0
- package/dist/tools/lease-tools.js +6 -5
- package/dist/tools/merge-tools.d.ts +10 -1
- package/dist/tools/merge-tools.js +9 -3
- package/dist/tools/merged-name-redirect.d.ts +13 -0
- package/dist/tools/merged-name-redirect.js +55 -0
- package/dist/tools/navigate-arrival.d.ts +26 -0
- package/dist/tools/navigate-arrival.js +60 -0
- package/dist/tools/navigate-result.d.ts +31 -0
- package/dist/tools/navigate-result.js +38 -0
- package/dist/tools/observe-tools.js +72 -20
- package/dist/tools/observed-nothing.d.ts +25 -0
- package/dist/tools/observed-nothing.js +33 -0
- package/dist/tools/query-paginate.js +2 -2
- package/dist/tools/query-shape.d.ts +18 -0
- package/dist/tools/query-shape.js +39 -0
- package/dist/tools/read-tools.js +81 -20
- package/dist/tools/real-input-attempt.d.ts +28 -0
- package/dist/tools/real-input-attempt.js +93 -0
- package/dist/tools/reconcile-tools.js +7 -7
- package/dist/tools/reload-result.d.ts +14 -0
- package/dist/tools/reload-result.js +29 -0
- package/dist/tools/snapshot-delta.d.ts +4 -5
- package/dist/tools/snapshot-delta.js +0 -0
- package/dist/tools/tool-kit.d.ts +16 -0
- package/dist/tools/tool-surface.d.ts +83 -0
- package/dist/tools/tool-surface.js +217 -0
- package/dist/tools/tools-helpers.js +6 -6
- package/dist/tools/tools.d.ts +15 -0
- package/dist/tools/tools.js +53 -17
- package/dist/tools/unadvertised-help.d.ts +5 -0
- package/dist/tools/unadvertised-help.js +39 -0
- package/dist/trace.d.ts +69 -0
- package/dist/trace.js +150 -0
- package/dist/update/nudge-credit.d.ts +4 -0
- package/dist/update/nudge-credit.js +53 -0
- package/dist/update/sdk-sync.d.ts +21 -0
- package/dist/update/sdk-sync.js +42 -0
- package/dist/update/update-checker.js +3 -3
- package/dist/update/update-nudge.d.ts +63 -6
- package/dist/update/update-nudge.js +128 -15
- package/dist/update/updater.d.ts +1 -9
- package/dist/update/updater.js +13 -8
- package/dist/version/peer-announce.d.ts +4 -0
- package/dist/version/peer-announce.js +30 -0
- package/dist/{server-version.js → version/server-version.js} +5 -1
- package/dist/version/version-nudge.d.ts +28 -0
- package/dist/version/version-nudge.js +40 -0
- package/dist/version/version-skew.d.ts +66 -0
- package/dist/version/version-skew.js +71 -0
- package/dist/visual/visual-diff.js +2 -2
- package/dist/visual/visual-tools.js +4 -4
- package/docs/README.md +55 -0
- package/docs/agent-cheatsheet.md +85 -0
- package/docs/architecture.md +113 -0
- package/docs/benchmarks.md +255 -0
- package/docs/debugging.md +102 -0
- package/docs/deploy-checks.md +69 -0
- package/docs/desktop-apps.md +256 -0
- package/docs/enterprise.md +62 -0
- package/docs/fixtures-dispatch-receiver.yml +76 -0
- package/docs/fixtures.md +45 -0
- package/docs/flows.md +166 -0
- package/docs/gate-plan.md +98 -0
- package/docs/gates.md +117 -0
- package/docs/getting-started.md +469 -0
- package/docs/human-control.md +63 -0
- package/docs/integration-patterns.md +171 -0
- package/docs/local-registry.md +126 -0
- package/docs/matrix/2.5.0/claude-code-machine.json +19 -0
- package/docs/matrix/2.5.0/codex-machine.json +20 -0
- package/docs/matrix/2.5.0/cursor-machine.json +22 -0
- package/docs/matrix/2.5.0/gemini-machine.json +22 -0
- package/docs/matrix/2.5.0/opencode-machine.json +22 -0
- package/docs/matrix/2.5.0/vscode-machine.json +22 -0
- package/docs/matrix/2.5.0/windsurf-machine.json +22 -0
- package/docs/matrix/MATRIX.md +26 -0
- package/docs/matrix/README.md +59 -0
- package/docs/mint.json +61 -0
- package/docs/multi-agent-testing.md +55 -0
- package/docs/platform-integration.md +122 -0
- package/docs/system-map.md +152 -0
- package/docs/telemetry-contract.md +214 -0
- package/docs/telemetry.md +191 -0
- package/docs/testing.md +82 -0
- package/docs/token-efficiency.md +80 -0
- package/docs/usage.md +1046 -0
- package/package.json +8 -5
- package/dist/cli-doctor.d.ts +0 -6
- package/dist/cli-doctor.js +0 -60
- package/dist/cli-launch.js +0 -112
- package/dist/daemon-resilience.d.ts +0 -22
- package/dist/daemon-resilience.js +0 -85
- package/dist/mcp-proxy.d.ts +0 -67
- package/dist/mcp-proxy.js +0 -337
- package/dist/tools/profiles.d.ts +0 -37
- package/dist/tools/profiles.js +0 -139
- /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
- /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
- /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
- /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
- /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
- /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
package/dist/init/plan.js
CHANGED
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
import { Framework, PackageManager, UiLibrary, installCommand, installCommandParts, } from './detect.js';
|
|
7
7
|
import { claudeAddCommand, mcpManual } from './mcp.js';
|
|
8
8
|
import { mergeCursorConfig, CursorMergeStatus, cursorServerEntry } from './cursor.js';
|
|
9
|
-
import {
|
|
9
|
+
import { mergeClientConfig, ClientMergeStatus, clientSnippet, clientSpec, } from './mcp-clients.js';
|
|
10
|
+
import { CLAUDE_COMMAND_PATH, CURSOR_COMMAND_PATH, SLASH_COMMAND_BODY, SLASH_COMMAND_SIGNATURE, } from './slash-command.js';
|
|
10
11
|
import { mergeMarkedInstruction, cursorRuleFile, AgentRuleStatus, CLAUDE_MD_PATH, AGENTS_MD_PATH, CURSOR_RULE_PATH, } from './agent-rules.js';
|
|
11
|
-
import { viteSteps, nextSteps, svelteKitSteps, VITE_PLUGIN_DETAIL } from './plan-framework.js';
|
|
12
|
-
import { htmlManual, reticleConfigContent, unverifiedUiLibraryNote
|
|
12
|
+
import { viteSteps, nextSteps, craSteps, svelteKitSteps, astroSteps, VITE_PLUGIN_DETAIL, } from './plan-framework.js';
|
|
13
|
+
import { htmlManual, reticleConfigContent, unverifiedUiLibraryNote } from './snippets.js';
|
|
13
14
|
// An app dev installs exactly the audience-scoped browser-side dependencies — never the retired
|
|
14
15
|
// `@reticlehq/core` umbrella (which dragged the Node MCP server + ws into every app). The kit is the
|
|
15
16
|
// framework adapter (it re-exports the browser sensor), paired with that framework's dev-only build
|
|
@@ -27,7 +28,7 @@ const RETICLE_NEXT_PLUGIN = '@reticlehq/next';
|
|
|
27
28
|
* irrelevant, and a skewed pair impossible to install by accident.
|
|
28
29
|
*/
|
|
29
30
|
export function pinnedPackages(packages, version) {
|
|
30
|
-
if (version === undefined || version.length
|
|
31
|
+
if (version === undefined || 0 === version.length)
|
|
31
32
|
return packages;
|
|
32
33
|
return packages.map((p) => `${p}@${version}`);
|
|
33
34
|
}
|
|
@@ -44,6 +45,10 @@ export function frameworkPackages(framework) {
|
|
|
44
45
|
// Astro owns its own Vite instance and renders its own HTML, so there is no config for the
|
|
45
46
|
// plugin to attach to — the kit alone, connected from a page <script> (see astroManual).
|
|
46
47
|
return [RETICLE_REACT_KIT];
|
|
48
|
+
case Framework.CRA:
|
|
49
|
+
// react-scripts owns its webpack config and cannot be extended without ejecting, so there is
|
|
50
|
+
// no build plugin — the kit alone, imported from src/index.tsx (see cra.ts).
|
|
51
|
+
return [RETICLE_REACT_KIT];
|
|
47
52
|
case Framework.HTML:
|
|
48
53
|
// No bundler plugin to install — just the kit; connect is wired by hand (see htmlManual).
|
|
49
54
|
return [RETICLE_REACT_KIT];
|
|
@@ -51,6 +56,27 @@ export function frameworkPackages(framework) {
|
|
|
51
56
|
}
|
|
52
57
|
/** Exported so the init telemetry can tell an MCP-registration failure from a dependency install. */
|
|
53
58
|
export const MCP_TARGET = 'global (claude user scope)';
|
|
59
|
+
/**
|
|
60
|
+
* Titles of the steps WITHOUT which no session ever appears.
|
|
61
|
+
*
|
|
62
|
+
* A ⚠ on one of these is not a warning, it is a guaranteed failure: nothing performs the manual step,
|
|
63
|
+
* so the app will not connect and every Reticle tool will answer "no browser session connected".
|
|
64
|
+
* Reported from a field sweep, where the ⚠ count and "did it connect" were treated as independent
|
|
65
|
+
* signals and are not.
|
|
66
|
+
*/
|
|
67
|
+
const CONNECT_STEP_TITLES = new Set([
|
|
68
|
+
'Connect snippet',
|
|
69
|
+
'Connect snippet (CRA)',
|
|
70
|
+
'Connect snippet (Astro)',
|
|
71
|
+
'Reticle client hook',
|
|
72
|
+
'Reticle connect module',
|
|
73
|
+
'ReticleDev component',
|
|
74
|
+
'Vite plugin',
|
|
75
|
+
]);
|
|
76
|
+
/** True when this step is what makes the app dial the daemon. */
|
|
77
|
+
export function isConnectStep(title) {
|
|
78
|
+
return CONNECT_STEP_TITLES.has(title);
|
|
79
|
+
}
|
|
54
80
|
/** The step that runs the package manager — the other thing that commonly fails on a user's machine. */
|
|
55
81
|
export const DEPS_TARGET = 'package.json';
|
|
56
82
|
const RETICLE_CONFIG_FILE = '.reticle.json';
|
|
@@ -117,6 +143,49 @@ function cursorMcpStep(input) {
|
|
|
117
143
|
write: { path: input.cursorConfigPath, content: r.content },
|
|
118
144
|
};
|
|
119
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* One step per OTHER detected client.
|
|
148
|
+
*
|
|
149
|
+
* The shapes differ enough that a shared "write mcp.json" would be wrong for three of them — see
|
|
150
|
+
* mcp-clients.ts. What is shared is the DECISION: already-correct is left alone, a file we cannot
|
|
151
|
+
* parse is reported with a paste-able block rather than overwritten, and everything else is written.
|
|
152
|
+
*/
|
|
153
|
+
function otherClientSteps(input) {
|
|
154
|
+
const steps = [];
|
|
155
|
+
for (const detected of input.detectedClients ?? []) {
|
|
156
|
+
const spec = clientSpec(detected.id);
|
|
157
|
+
const merged = mergeClientConfig(spec, detected.existing);
|
|
158
|
+
const title = `MCP server (${spec.label})`;
|
|
159
|
+
if (merged.status === ClientMergeStatus.ALREADY) {
|
|
160
|
+
steps.push({
|
|
161
|
+
title,
|
|
162
|
+
target: detected.configPath,
|
|
163
|
+
status: StepStatus.ALREADY,
|
|
164
|
+
detail: `reticle already registered with ${spec.label}`,
|
|
165
|
+
});
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (merged.status === ClientMergeStatus.MANUAL) {
|
|
169
|
+
// Either the file did not parse, or the format is one we refuse to edit blind (TOML). Both
|
|
170
|
+
// end the same way: say so, and hand over the exact block.
|
|
171
|
+
steps.push({
|
|
172
|
+
title,
|
|
173
|
+
target: detected.configPath,
|
|
174
|
+
status: StepStatus.MANUAL,
|
|
175
|
+
detail: `add this to ${detected.configPath} by hand:\n${clientSnippet(spec)}`,
|
|
176
|
+
});
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
steps.push({
|
|
180
|
+
title,
|
|
181
|
+
target: detected.configPath,
|
|
182
|
+
status: StepStatus.APPLY,
|
|
183
|
+
detail: `register reticle with ${spec.label}`,
|
|
184
|
+
write: { path: detected.configPath, content: merged.content },
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return steps;
|
|
188
|
+
}
|
|
120
189
|
/** One global registration per detected agent (Claude + Cursor). Falls back to a manual note. */
|
|
121
190
|
function mcpSteps(input) {
|
|
122
191
|
if (!input.options.mcp) {
|
|
@@ -125,14 +194,22 @@ function mcpSteps(input) {
|
|
|
125
194
|
title: 'MCP server (global)',
|
|
126
195
|
target: MCP_TARGET,
|
|
127
196
|
status: StepStatus.SKIP,
|
|
128
|
-
|
|
197
|
+
// Names everything it turns off. `--no-mcp` reads like "skip one step" and skips three: the
|
|
198
|
+
// registration, the agent rule files, and the /reticle command. A gate running with this flag
|
|
199
|
+
// therefore covers far less than its name suggests, which is worth saying out loud.
|
|
200
|
+
detail: '--no-mcp — also skips the agent rule files (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command',
|
|
129
201
|
},
|
|
130
202
|
];
|
|
131
203
|
}
|
|
132
|
-
|
|
204
|
+
// Claude and Cursor first (they have their own registration paths), then every other detected
|
|
205
|
+
// client. A machine with Cursor AND Windsurf gets both — registering only the first one found is
|
|
206
|
+
// how a user ends up with Reticle in the editor they were not using.
|
|
207
|
+
const steps = [...stepsForAgents(input, (a) => a.mcpStep), ...otherClientSteps(input)];
|
|
133
208
|
if (steps.length > 0)
|
|
134
209
|
return steps;
|
|
135
|
-
// No supported agent detected — print the one-time global instructions.
|
|
210
|
+
// No supported agent detected — print the one-time global instructions. Reached when the `claude`
|
|
211
|
+
// CLI is absent AND ~/.cursor does not exist, which includes Cursor installed with a fresh profile
|
|
212
|
+
// that has not written its config directory yet, so the manual text covers both agents.
|
|
136
213
|
return [
|
|
137
214
|
{
|
|
138
215
|
title: 'MCP server (global)',
|
|
@@ -143,35 +220,50 @@ function mcpSteps(input) {
|
|
|
143
220
|
];
|
|
144
221
|
}
|
|
145
222
|
const SLASH_COMMAND_TITLE = 'The /reticle command';
|
|
223
|
+
/**
|
|
224
|
+
* Nothing to do for this command file: it already holds the CURRENT body, or it is not ours at all.
|
|
225
|
+
*
|
|
226
|
+
* Gating on mere existence froze the command at whatever release wrote it. Rewriting anything found
|
|
227
|
+
* there would be worse — a human may have claimed `/reticle` for their own prompt — so a file without
|
|
228
|
+
* our signature is left exactly as it is.
|
|
229
|
+
*/
|
|
230
|
+
function commandIsSettled(content) {
|
|
231
|
+
if (null === content || content === undefined)
|
|
232
|
+
return false;
|
|
233
|
+
return content === SLASH_COMMAND_BODY || !content.includes(SLASH_COMMAND_SIGNATURE);
|
|
234
|
+
}
|
|
146
235
|
/**
|
|
147
236
|
* `/reticle` — the entry point SKILL.md promises in three places and nothing ever created, so it
|
|
148
|
-
* silently did nothing in every tool.
|
|
237
|
+
* silently did nothing in every tool.
|
|
238
|
+
*
|
|
239
|
+
* CURRENT, not merely present — same reason as the Cursor rule: a command file frozen at whatever
|
|
240
|
+
* release created it is a command that can never be improved for anyone who already ran init. The
|
|
241
|
+
* whole file is Reticle's, so a stale one is rewritten.
|
|
149
242
|
*/
|
|
150
|
-
function
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
path: CURSOR_COMMAND_PATH,
|
|
155
|
-
when: input.cursorProjectPresent === true || (input.cursorPresent && !input.claudeCli),
|
|
156
|
-
exists: input.cursorCommandExists === true,
|
|
157
|
-
},
|
|
158
|
-
];
|
|
159
|
-
return targets
|
|
160
|
-
.filter((t) => t.when)
|
|
161
|
-
.map((t) => t.exists
|
|
243
|
+
function commandStepFor(path, present, content) {
|
|
244
|
+
if (!present)
|
|
245
|
+
return null;
|
|
246
|
+
return commandIsSettled(content)
|
|
162
247
|
? {
|
|
163
248
|
title: SLASH_COMMAND_TITLE,
|
|
164
|
-
target:
|
|
249
|
+
target: path,
|
|
165
250
|
status: StepStatus.ALREADY,
|
|
166
251
|
detail: 'command already exists',
|
|
167
252
|
}
|
|
168
253
|
: {
|
|
169
254
|
title: SLASH_COMMAND_TITLE,
|
|
170
|
-
target:
|
|
255
|
+
target: path,
|
|
171
256
|
status: StepStatus.APPLY,
|
|
172
257
|
detail: 'type /reticle to verify one flow in the browser',
|
|
173
|
-
write: { path
|
|
174
|
-
}
|
|
258
|
+
write: { path, content: SLASH_COMMAND_BODY },
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function claudeCommandStep(input) {
|
|
262
|
+
return commandStepFor(CLAUDE_COMMAND_PATH, input.claudeCli, input.claudeCommandContent);
|
|
263
|
+
}
|
|
264
|
+
function cursorCommandStep(input) {
|
|
265
|
+
const present = true === input.cursorProjectPresent || (input.cursorPresent && !input.claudeCli);
|
|
266
|
+
return commandStepFor(CURSOR_COMMAND_PATH, present, input.cursorCommandContent);
|
|
175
267
|
}
|
|
176
268
|
const AGENT_RULE_TITLE = 'Agent verification rule';
|
|
177
269
|
const AGENT_RULE_DETAIL = 'teach the agent to verify features with Reticle after building them';
|
|
@@ -206,7 +298,9 @@ function cursorRuleStep(input) {
|
|
|
206
298
|
return null;
|
|
207
299
|
if (input.cursorProjectPresent !== true && input.claudeCli)
|
|
208
300
|
return null;
|
|
209
|
-
|
|
301
|
+
// The whole file is Reticle's — init created it — so a stale one is REWRITTEN rather than merged.
|
|
302
|
+
// Comparing content is what makes the rule updatable; comparing existence made it permanent.
|
|
303
|
+
if (input.cursorRuleContent === cursorRuleFile()) {
|
|
210
304
|
return {
|
|
211
305
|
title: AGENT_RULE_TITLE,
|
|
212
306
|
target: CURSOR_RULE_PATH,
|
|
@@ -222,6 +316,46 @@ function cursorRuleStep(input) {
|
|
|
222
316
|
write: { path: CURSOR_RULE_PATH, content: cursorRuleFile() },
|
|
223
317
|
};
|
|
224
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* Every coding agent `reticle init` knows how to wire itself into, and the three surfaces it wires:
|
|
321
|
+
* the global MCP registration, the project rule file that makes the agent USE Reticle, and the
|
|
322
|
+
* `/reticle` command.
|
|
323
|
+
*
|
|
324
|
+
* One list, because those three surfaces used to enumerate Claude and Cursor separately in three
|
|
325
|
+
* places — so supporting a fourth agent meant finding all three and getting each right. Adding one
|
|
326
|
+
* is now an entry here plus its builders; each builder answers null when that agent is not present
|
|
327
|
+
* for this user or this project, which is also how "no agent detected" falls through to the
|
|
328
|
+
* cross-agent AGENTS.md.
|
|
329
|
+
*
|
|
330
|
+
* Deliberately functions rather than data: registering with Claude runs its CLI while Cursor merges
|
|
331
|
+
* a JSON file, and pretending those are the same shape would cost more than it saves.
|
|
332
|
+
*/
|
|
333
|
+
const AgentId = {
|
|
334
|
+
CLAUDE: 'claude',
|
|
335
|
+
CURSOR: 'cursor',
|
|
336
|
+
};
|
|
337
|
+
const AGENT_INTEGRATIONS = [
|
|
338
|
+
{
|
|
339
|
+
id: AgentId.CLAUDE,
|
|
340
|
+
mcpStep: claudeMcpStep,
|
|
341
|
+
ruleStep: claudeRuleStep,
|
|
342
|
+
commandStep: claudeCommandStep,
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
id: AgentId.CURSOR,
|
|
346
|
+
mcpStep: cursorMcpStep,
|
|
347
|
+
ruleStep: cursorRuleStep,
|
|
348
|
+
commandStep: cursorCommandStep,
|
|
349
|
+
},
|
|
350
|
+
];
|
|
351
|
+
/** The steps one surface contributes across every known agent, in registry order. */
|
|
352
|
+
function stepsForAgents(input, surface) {
|
|
353
|
+
return AGENT_INTEGRATIONS.map((a) => surface(a)(input)).filter((s) => s !== null);
|
|
354
|
+
}
|
|
355
|
+
/** The `/reticle` command file for every agent that has a command surface and is present here. */
|
|
356
|
+
function slashCommandSteps(input) {
|
|
357
|
+
return stepsForAgents(input, (a) => a.commandStep);
|
|
358
|
+
}
|
|
225
359
|
/**
|
|
226
360
|
* The behavioral rule that makes the agent actually USE Reticle. Written into the detected agent's
|
|
227
361
|
* instruction file (Claude / Cursor, or both), falling back to the cross-agent AGENTS.md when neither
|
|
@@ -230,7 +364,7 @@ function cursorRuleStep(input) {
|
|
|
230
364
|
function agentRuleSteps(input) {
|
|
231
365
|
if (!input.options.mcp)
|
|
232
366
|
return [];
|
|
233
|
-
const detected =
|
|
367
|
+
const detected = stepsForAgents(input, (a) => a.ruleStep);
|
|
234
368
|
if (detected.length > 0)
|
|
235
369
|
return detected;
|
|
236
370
|
const r = mergeMarkedInstruction(input.agentsMdContent);
|
|
@@ -261,6 +395,31 @@ function agentRuleSteps(input) {
|
|
|
261
395
|
* with nothing naming a version. Pinning turns that into this loud failure, which is the better
|
|
262
396
|
* trade — but only if the message says what to do about it.
|
|
263
397
|
*/
|
|
398
|
+
/**
|
|
399
|
+
* Said out loud when the exact-version install failed and the unpinned one worked.
|
|
400
|
+
*
|
|
401
|
+
* It used to assert a cause it cannot know. Every one of nine fixture apps got the same sentence —
|
|
402
|
+
* "the registry refused 2.5.0 (pnpm's minimumReleaseAge holds new releases back)" — when the actual
|
|
403
|
+
* cause on that run was that the version did not exist yet, and the remedy offered was a `pnpm
|
|
404
|
+
* config` command handed to a yarn 1 project that will never read it.
|
|
405
|
+
*
|
|
406
|
+
* This note is built at PLAN time, before anything runs, and `io.exec` returns a bare boolean, so
|
|
407
|
+
* the apply layer has no failure text to hand back either. The honest move is therefore to report
|
|
408
|
+
* the CONSEQUENCE (which is certain and is the part that bites) and offer the remedy that belongs to
|
|
409
|
+
* the manager actually in use — rather than name a cause that is one possibility among several.
|
|
410
|
+
*/
|
|
411
|
+
function unpinnedRetryNote(version, pm) {
|
|
412
|
+
const wanted = version === undefined ? 'the exact version' : version;
|
|
413
|
+
// Kept verbatim for pnpm, where minimumReleaseAge is a real and common cause with a real remedy.
|
|
414
|
+
const remedy = pm === PackageManager.PNPM
|
|
415
|
+
? ' One common cause on pnpm is minimumReleaseAge holding a new release back; if pnpm ' +
|
|
416
|
+
'reported ERR_PNPM_NO_MATURE_MATCHING_VERSION, either wait out the window or allow these ' +
|
|
417
|
+
'packages: pnpm config set minimumReleaseAgeExclude "@reticlehq/*"'
|
|
418
|
+
: '';
|
|
419
|
+
return (`the pinned install of ${wanted} failed, so the newest version the registry WOULD accept was ` +
|
|
420
|
+
`installed instead. That may not match the daemon — if the agent reports protocol errors, check ` +
|
|
421
|
+
`\`versionSkew\` in reticle_sessions.${remedy}`);
|
|
422
|
+
}
|
|
264
423
|
function installFailureHint(pm) {
|
|
265
424
|
if (pm !== PackageManager.PNPM)
|
|
266
425
|
return 'If the version was refused, install the SDK yourself.';
|
|
@@ -293,10 +452,16 @@ function installStep(input) {
|
|
|
293
452
|
args: parts.args,
|
|
294
453
|
fallback: `${command}\n\n${installFailureHint(pm)}`,
|
|
295
454
|
},
|
|
455
|
+
// Unpinned. pnpm resolves the newest MATURE version there, which is how a project with a
|
|
456
|
+
// release-age hold gets a working install instead of no install.
|
|
457
|
+
retry: {
|
|
458
|
+
...installCommandParts(pm, frameworkPackages(input.detection.framework)),
|
|
459
|
+
note: unpinnedRetryNote(input.options.sdkVersion, pm),
|
|
460
|
+
},
|
|
296
461
|
};
|
|
297
462
|
}
|
|
298
463
|
function reticleConfigStep(input) {
|
|
299
|
-
if (input.reticleConfigExists
|
|
464
|
+
if (true === input.reticleConfigExists) {
|
|
300
465
|
return {
|
|
301
466
|
title: 'Reticle config',
|
|
302
467
|
target: RETICLE_CONFIG_FILE,
|
|
@@ -348,12 +513,10 @@ export function buildPlan(input) {
|
|
|
348
513
|
steps.push(...nextSteps(input));
|
|
349
514
|
}
|
|
350
515
|
else if (input.detection.framework === Framework.ASTRO) {
|
|
351
|
-
steps.push(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
detail: astroManual(input.options.port, input.options.projectId),
|
|
356
|
-
});
|
|
516
|
+
steps.push(...astroSteps(input));
|
|
517
|
+
}
|
|
518
|
+
else if (input.detection.framework === Framework.CRA) {
|
|
519
|
+
steps.push(...craSteps(input));
|
|
357
520
|
}
|
|
358
521
|
else if (input.detection.framework === Framework.SVELTEKIT) {
|
|
359
522
|
steps.push(...svelteKitSteps(input));
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project-identity
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Project-identity for `reticle init` — the `.reticle.json` side of the scheme the Vite plugin
|
|
3
|
+
* stamps at build time. The RULE lives in `@reticlehq/core` (projectIdFrom) so both sides spell the
|
|
4
|
+
* id the same way by construction; this file supplies only the Node-only hashing it needs.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
export declare function slugifyPackageName(name: string): string;
|
|
6
|
+
export { slugifyPackageName } from '@reticlehq/core';
|
|
8
7
|
/** Short, stable hex fingerprint of the absolute project root. */
|
|
9
8
|
export declare function shortHash(input: string): string;
|
|
10
|
-
/**
|
|
11
|
-
* Derive the stable projectId from the package name (may be undefined) and the absolute root path.
|
|
12
|
-
* Falls back to the root folder name, then "app". Pure.
|
|
13
|
-
*/
|
|
9
|
+
/** Derive the stable projectId from the package name (may be undefined) and the absolute root path. */
|
|
14
10
|
export declare function deriveProjectId(pkgName: string | undefined, rootPath: string): string;
|
|
15
11
|
/** Pull a string `name` out of an already-parsed package.json object, or undefined. */
|
|
16
12
|
export declare function packageName(pkg: unknown): string | undefined;
|
package/dist/init/project-id.js
CHANGED
|
@@ -1,36 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project-identity
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Project-identity for `reticle init` — the `.reticle.json` side of the scheme the Vite plugin
|
|
3
|
+
* stamps at build time. The RULE lives in `@reticlehq/core` (projectIdFrom) so both sides spell the
|
|
4
|
+
* id the same way by construction; this file supplies only the Node-only hashing it needs.
|
|
5
5
|
*/
|
|
6
6
|
import { createHash } from 'node:crypto';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
export function slugifyPackageName(name) {
|
|
10
|
-
return name
|
|
11
|
-
.toLowerCase()
|
|
12
|
-
.replace(/^@/, '')
|
|
13
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
14
|
-
.replace(/^-+|-+$/g, '');
|
|
15
|
-
}
|
|
7
|
+
import { PROJECT_ID_HASH_LENGTH, projectIdFrom } from '@reticlehq/core';
|
|
8
|
+
export { slugifyPackageName } from '@reticlehq/core';
|
|
16
9
|
/** Short, stable hex fingerprint of the absolute project root. */
|
|
17
10
|
export function shortHash(input) {
|
|
18
|
-
return createHash('sha1').update(input).digest('hex').slice(0,
|
|
11
|
+
return createHash('sha1').update(input).digest('hex').slice(0, PROJECT_ID_HASH_LENGTH);
|
|
19
12
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Derive the stable projectId from the package name (may be undefined) and the absolute root path.
|
|
22
|
-
* Falls back to the root folder name, then "app". Pure.
|
|
23
|
-
*/
|
|
13
|
+
/** Derive the stable projectId from the package name (may be undefined) and the absolute root path. */
|
|
24
14
|
export function deriveProjectId(pkgName, rootPath) {
|
|
25
|
-
|
|
26
|
-
const base = fromName.length > 0 ? fromName : slugifyPackageName(basename(rootPath)) || 'app';
|
|
27
|
-
return `${base}-${shortHash(rootPath)}`;
|
|
15
|
+
return projectIdFrom(pkgName, rootPath, shortHash);
|
|
28
16
|
}
|
|
29
17
|
/** Pull a string `name` out of an already-parsed package.json object, or undefined. */
|
|
30
18
|
export function packageName(pkg) {
|
|
31
|
-
if (typeof pkg
|
|
19
|
+
if ('object' === typeof pkg && pkg !== null) {
|
|
32
20
|
const name = pkg['name'];
|
|
33
|
-
if (typeof name
|
|
21
|
+
if ('string' === typeof name && name.length > 0)
|
|
34
22
|
return name;
|
|
35
23
|
}
|
|
36
24
|
return undefined;
|
package/dist/init/run.d.ts
CHANGED
|
@@ -7,14 +7,26 @@
|
|
|
7
7
|
* Resolve the lockfiles set used to pick the package manager. A lockfile in the project root wins;
|
|
8
8
|
* otherwise we walk UP the directory tree (monorepos keep the lockfile at the workspace root, not in
|
|
9
9
|
* each package) so `reticle init` in a sub-package suggests `pnpm add` instead of defaulting to `npm i`.
|
|
10
|
+
*
|
|
11
|
+
* The walk is skipped when the project has its own installed tree, because an INHERITED lockfile is
|
|
12
|
+
* weaker evidence than a `node_modules` sitting right there — the ancestor describes the workspace,
|
|
13
|
+
* the tree describes THIS package. Reported from the field: `init` in a `frontend/` app installed
|
|
14
|
+
* with npm emitted `pnpm add -D` off a repo-root `pnpm-lock.yaml`, pnpm was not on PATH, and the
|
|
15
|
+
* failed install took every downstream wiring step with it. A LOCAL lockfile still wins over the
|
|
16
|
+
* tree — it is a deliberate statement about this package, not an inheritance.
|
|
10
17
|
*/
|
|
11
|
-
export declare function resolveLockfiles(rootFiles: ReadonlySet<string>, cwd: string, io: Pick<InitIo, 'exists'>): Set<string>;
|
|
18
|
+
export declare function resolveLockfiles(rootFiles: ReadonlySet<string>, cwd: string, io: Pick<InitIo, 'exists'>, nodeModulesMarkers?: ReadonlySet<string>): Set<string>;
|
|
12
19
|
export interface InitOptions {
|
|
13
20
|
cwd: string;
|
|
14
21
|
port: number | undefined;
|
|
15
22
|
mcp: boolean;
|
|
16
23
|
dryRun: boolean;
|
|
17
24
|
install: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Which app in a monorepo to wire, when several are found. Without it `init` refuses to guess, and
|
|
27
|
+
* "re-run inside the one you want" is not an instruction a script or an agent can follow.
|
|
28
|
+
*/
|
|
29
|
+
app?: string;
|
|
18
30
|
/** Set on the recursive call after a workspace redirect, so the search happens at most once. */
|
|
19
31
|
redirected?: boolean;
|
|
20
32
|
}
|
|
@@ -54,5 +66,15 @@ interface InitResult {
|
|
|
54
66
|
* it knows it is in a workspace; this is the matching walk DOWN.
|
|
55
67
|
*/
|
|
56
68
|
export declare function findWorkspaceApps(io: Pick<InitIo, 'exists' | 'readFile' | 'listDirs'>): string[];
|
|
69
|
+
/**
|
|
70
|
+
* The standing ask, printed at the end of every `init`.
|
|
71
|
+
*
|
|
72
|
+
* Addressed to the agent as much as the human: whichever of them just ran this command is the one
|
|
73
|
+
* holding the experience, and neither has a Reticle tool surface to file through at this point.
|
|
74
|
+
*
|
|
75
|
+
* Printed by the `runInit` wrapper, NOT by `report()` — see the comment there for why, and for how
|
|
76
|
+
* the workspace redirect is kept from asking twice.
|
|
77
|
+
*/
|
|
78
|
+
export declare const FEEDBACK_HINT: string;
|
|
57
79
|
export declare function runInit(options: InitOptions, io: InitIo): InitResult;
|
|
58
80
|
export {};
|