From e9d0703f6e6a95c1e5f92d16e7cba027f387f432 Mon Sep 17 00:00:00 2001 From: JSONbored <49853598+JSONbored@users.noreply.github.com> Date: Fri, 17 Jul 2026 05:10:48 -0700 Subject: [PATCH] test: eliminate remaining stale gittensory references from test fixtures Sweeps the rest of test/ for lingering pre-rename "gittensory" text that PR #6900 didn't already cover -- arbitrary example values, prose comments, and non-functional identifiers with no behavioral dependency on the real GITHUB_APP_SLUG or LOOPOVER_REVIEW_REPOS defaults. Purely 1:1 string swaps, no logic changes. Verified via three full unsharded npm run test:coverage passes. The first (before rebasing onto #6900/#6902) was green on a stale base. After reconciling onto the new origin/main, the second surfaced 3 files (rag-index.test.ts, reputation-wiring.test.ts, ci-completion-fork-resume.test.ts) where the renamed repo identity happened to be the SAME value load-bearing against LOOPOVER_REVIEW_REPOS's still-current "JSONbored/gittensory,acme/widgets" allowlist default -- reverted those three back to "gittensory" to keep the allowlist match, matching the same reasoning #6900 already applied to GITHUB_APP_SLUG-dependent fixtures. The third run confirmed clean: 949 files, 18084 tests, 0 failures. --- test/contract/selfhost-d1-database.test.ts | 4 +- test/contract/upstream-contract.test.ts | 2 +- .../engine-parity/predicted-gate/README.md | 2 +- .../miner-calibration-loop.test.ts | 4 +- test/integration/orb-webhook.test.ts | 8 +- test/integration/public-stats-route.test.ts | 24 ++-- test/integration/routes-errors.test.ts | 64 ++++----- test/integration/selfhost-pg.test.ts | 4 +- test/integration/subnet-interface.test.ts | 4 +- test/unit/access-boundary.test.ts | 2 +- test/unit/account-age-throttle.test.ts | 2 +- test/unit/adapters.test.ts | 8 +- .../advisory-ai-routing-config-engine.test.ts | 2 +- test/unit/agent-approval-queue.test.ts | 2 +- test/unit/agent-guardrail-paths.test.ts | 2 +- test/unit/agent-sdk-driver.test.ts | 2 +- test/unit/alerts.test.ts | 2 +- test/unit/analytics-proxy.test.ts | 12 +- test/unit/auth.test.ts | 46 +++---- test/unit/auto-close-exempt-engine.test.ts | 2 +- test/unit/auto-tune.test.ts | 12 +- test/unit/autonomy-engine.test.ts | 2 +- .../backfill-file-hydration-scoping.test.ts | 128 +++++++++--------- .../backfill-reviews-cache-scoping.test.ts | 124 ++++++++--------- test/unit/backup-script.test.ts | 18 +-- .../changed-files-summary-collapsible.test.ts | 2 +- test/unit/check-engine-parity-script.test.ts | 2 +- ...ci-generated-artifact-drift-checks.test.ts | 2 +- .../unit/command-authorization-engine.test.ts | 2 +- test/unit/command-feedback.test.ts | 14 +- test/unit/content-lane-security-scan.test.ts | 4 +- test/unit/content-lane-wire.test.ts | 4 +- .../unit/contributor-blacklist-engine.test.ts | 2 +- test/unit/contributor-fit.test.ts | 28 ++-- test/unit/contributor-issue-draft.test.ts | 46 +++---- test/unit/crypto-secret.test.ts | 4 +- test/unit/cutover-gate.test.ts | 36 ++--- test/unit/data-spine.test.ts | 56 ++++---- test/unit/db-parsers.test.ts | 4 +- test/unit/db-persistence.test.ts | 6 +- test/unit/deny-hook-engine-extraction.test.ts | 2 +- test/unit/dlq.test.ts | 18 +-- test/unit/draft.test.ts | 6 +- test/unit/e2e-test-gen-render.test.ts | 4 +- ...ctive-anchor-config-classification.test.ts | 2 +- test/unit/export-d1-core.test.ts | 4 +- test/unit/extension-auth.test.ts | 30 ++-- test/unit/extension-content.test.ts | 24 ++-- test/unit/feature-activation.test.ts | 2 +- test/unit/fix-handoff-collapsible.test.ts | 4 +- .../unit/focus-manifest-engine-barrel.test.ts | 2 +- test/unit/focus-manifest-loader.test.ts | 4 +- test/unit/focus-manifest.test.ts | 10 +- test/unit/footer.test.ts | 16 +-- test/unit/github-labels.test.ts | 34 ++--- test/unit/github-webhook-coalesce.test.ts | 72 +++++----- test/unit/graphql-status-rollup.test.ts | 2 +- test/unit/grounding-wiring.test.ts | 2 +- test/unit/impact-map-collapsible.test.ts | 2 +- test/unit/index.test.ts | 24 ++-- test/unit/json-utils.test.ts | 6 +- test/unit/linked-issue-hard-rules.test.ts | 4 +- ...ked-issue-label-propagation-engine.test.ts | 2 +- test/unit/local-branch.test.ts | 20 +-- test/unit/local-scorer-adapter.test.ts | 6 +- test/unit/loopover-config-lint-script.test.ts | 2 +- test/unit/loopover-focus-manifest.test.ts | 4 +- test/unit/maintainer-recap-per-repo.test.ts | 2 +- test/unit/maintainer-recap-wire.test.ts | 2 +- .../maintainer-settings-preview-ui.test.ts | 18 +-- test/unit/mcp-automation-state.test.ts | 2 +- .../mcp-check-improvement-potential.test.ts | 2 +- test/unit/mcp-check-slop-risk.test.ts | 2 +- test/unit/mcp-check-test-evidence.test.ts | 2 +- test/unit/mcp-cli-analyze-branch.test.ts | 2 +- test/unit/mcp-cli-basics.test.ts | 4 +- test/unit/mcp-cli-burden-forecast.test.ts | 2 +- test/unit/mcp-cli-doctor.test.ts | 18 +-- test/unit/mcp-cli-find-opportunities.test.ts | 2 +- test/unit/mcp-cli-issue-rag.test.ts | 8 +- test/unit/mcp-cli-issue-slop.test.ts | 2 +- test/unit/mcp-cli-label-audit.test.ts | 2 +- test/unit/mcp-cli-lint-pr-text.test.ts | 2 +- test/unit/mcp-cli-monitor-open-prs.test.ts | 4 +- test/unit/mcp-cli-packets.test.ts | 20 +-- test/unit/mcp-cli-pr-reviewability.test.ts | 2 +- test/unit/mcp-cli-profiles.test.ts | 2 +- test/unit/mcp-cli-review-pr.test.ts | 18 +-- test/unit/mcp-cli-slop-risk.test.ts | 2 +- test/unit/mcp-cli-telemetry.test.ts | 4 +- .../mcp-cli-terminal-sanitization.test.ts | 2 +- test/unit/mcp-discovery.test.ts | 4 +- test/unit/mcp-eligibility-plan.test.ts | 4 +- .../unit/mcp-explain-gate-disposition.test.ts | 2 +- test/unit/mcp-feasibility-gate.test.ts | 6 +- test/unit/mcp-find-opportunities.test.ts | 2 +- test/unit/mcp-finding-taxonomy.test.ts | 2 +- test/unit/mcp-gate-precision.test.ts | 2 +- test/unit/mcp-intake-idea.test.ts | 2 +- test/unit/mcp-issue-rag.test.ts | 2 +- test/unit/mcp-loop-escalation.test.ts | 2 +- test/unit/mcp-loop-progress.test.ts | 2 +- test/unit/mcp-notifications.test.ts | 2 +- test/unit/mcp-output-schemas.test.ts | 2 +- test/unit/mcp-plan-dag.test.ts | 2 +- test/unit/mcp-planning-elicitation.test.ts | 24 ++-- test/unit/mcp-pr-ai-review-findings.test.ts | 2 +- test/unit/mcp-pr-reviewability.test.ts | 2 +- test/unit/mcp-predict-gate.test.ts | 4 +- test/unit/mcp-refresh-repo-docs.test.ts | 2 +- test/unit/mcp-release-candidate.test.ts | 2 +- test/unit/mcp-results-payload.test.ts | 2 +- test/unit/mcp-run-local-scorer.test.ts | 2 +- .../mcp-simulate-open-pr-pressure.test.ts | 2 +- test/unit/mcp-suggest-boundary-tests.test.ts | 2 +- test/unit/mcp-write-tools.test.ts | 6 +- test/unit/miner-attempt-runner.test.ts | 2 +- test/unit/miner-calibration-types.test.ts | 10 +- test/unit/miner-claim-ledger.test.ts | 4 +- test/unit/miner-coding-task-spec.test.ts | 2 +- test/unit/miner-dashboard-commands.test.ts | 6 +- .../miner-dashboard-recommendations.test.ts | 10 +- test/unit/miner-deployment-docs-audit.test.ts | 4 +- test/unit/miner-docker-compose.test.ts | 2 +- test/unit/miner-event-ledger.test.ts | 4 +- test/unit/miner-extension-content.test.ts | 46 +++---- test/unit/miner-forge-config.test.ts | 4 +- test/unit/miner-governor-ledger.test.ts | 6 +- .../unit/miner-mcp-calibration-report.test.ts | 4 +- test/unit/miner-orb-export.test.ts | 2 +- .../miner-rejection-state-machine.test.ts | 4 +- test/unit/miner-rejection-templates.test.ts | 8 +- test/unit/miner-run-state.test.ts | 8 +- test/unit/miner-status.test.ts | 2 +- test/unit/miner-wire-cli-modules.test.ts | 2 +- test/unit/moderation-rules-engine.test.ts | 2 +- test/unit/notifications-events.test.ts | 32 ++--- test/unit/notify-discord.test.ts | 18 +-- test/unit/notify-pagerduty.test.ts | 4 +- test/unit/onboarding-pack.test.ts | 16 +-- test/unit/ops.test.ts | 2 +- test/unit/parse-github-issue-url.test.ts | 4 +- test/unit/policy-sanitizer.test.ts | 16 +-- test/unit/pr-reconciliation.test.ts | 2 +- test/unit/pr-type-label-engine.test.ts | 2 +- .../unit/predicted-gate-engine-barrel.test.ts | 2 +- test/unit/predicted-gate.test.ts | 2 +- test/unit/private-config.test.ts | 12 +- test/unit/product-usage.test.ts | 28 ++-- test/unit/public-accuracy-trend.test.ts | 20 +-- test/unit/public-review-volume-trend.test.ts | 24 ++-- test/unit/public-stats.test.ts | 72 +++++----- test/unit/recommendation-snapshots.test.ts | 10 +- test/unit/redaction.test.ts | 2 +- test/unit/registration-workspace-ui.test.ts | 8 +- test/unit/registry.test.ts | 52 +++---- test/unit/repo-doc-pr.test.ts | 4 +- test/unit/repo-doc-render.test.ts | 4 +- test/unit/retention.test.ts | 38 +++--- test/unit/reward-risk-freshness.test.ts | 2 +- test/unit/reward-risk-reports.test.ts | 38 +++--- .../routes-contributor-issue-draft.test.ts | 6 +- test/unit/routes-focus-manifest.test.ts | 12 +- test/unit/rules.test.ts | 8 +- test/unit/safe-url-engine.test.ts | 2 +- test/unit/safety-wiring.test.ts | 2 +- test/unit/safety.test.ts | 12 +- test/unit/schema-timestamp-defaults.test.ts | 2 +- test/unit/scoring-engine-barrel.test.ts | 2 +- test/unit/scoring.test.ts | 2 +- .../unit/screenshot-table-gate-engine.test.ts | 2 +- test/unit/secret-patterns.test.ts | 8 +- test/unit/secrets-scan.test.ts | 4 +- .../self-dogfood-registration-pack.test.ts | 2 +- test/unit/selfhost-audit.test.ts | 32 ++--- .../selfhost-backup-metrics-script.test.ts | 8 +- test/unit/selfhost-backup-script.test.ts | 22 +-- test/unit/selfhost-blob-store.test.ts | 26 ++-- test/unit/selfhost-deploy-common.test.ts | 2 +- .../unit/selfhost-docker-prune-script.test.ts | 2 +- .../selfhost-grafana-datasource-uids.test.ts | 2 +- ...host-grafana-miner-usage-dashboard.test.ts | 2 +- test/unit/selfhost-image-deploy.test.ts | 34 ++--- test/unit/selfhost-load-file-secrets.test.ts | 2 +- test/unit/selfhost-otel.test.ts | 16 +-- .../selfhost-post-update-check-script.test.ts | 6 +- ...post-update-regression-gate-script.test.ts | 4 +- ...selfhost-pre-deploy-summary-script.test.ts | 2 +- test/unit/selfhost-preflight.test.ts | 14 +- test/unit/selfhost-s3-blob-store.test.ts | 40 +++--- test/unit/selfhost-update-script.test.ts | 4 +- .../selfhost-verify-backup-script.test.ts | 56 ++++---- test/unit/selftune-wiring.test.ts | 4 +- test/unit/signals-v2.test.ts | 36 ++--- test/unit/signals.test.ts | 6 +- test/unit/smoke-selfhost-script.test.ts | 2 +- test/unit/snapshot-replay-ui.test.ts | 14 +- test/unit/stats.test.ts | 12 +- test/unit/subnet-interface.test.ts | 4 +- test/unit/support/mcp-cli-harness.ts | 28 ++-- test/unit/support/miner-cli-harness.ts | 2 +- test/unit/sweep-watchdog.test.ts | 2 +- test/unit/unified-comment.test.ts | 2 +- ...nked-issue-guardrail-config-engine.test.ts | 2 +- test/unit/unmodeled-scoring-drift.test.ts | 8 +- test/unit/visual-capture.test.ts | 16 +-- test/unit/visual-collapsible.test.ts | 98 +++++++------- test/unit/visual-findings.test.ts | 10 +- test/unit/visual-vision-wiring.test.ts | 78 +++++------ test/unit/visual-wire.test.ts | 4 +- test/unit/weekly-value-report.test.ts | 18 +-- test/workers/worker-runtime.test.ts | 8 +- 212 files changed, 1226 insertions(+), 1226 deletions(-) diff --git a/test/contract/selfhost-d1-database.test.ts b/test/contract/selfhost-d1-database.test.ts index e87657dcc5..64e007156b 100644 --- a/test/contract/selfhost-d1-database.test.ts +++ b/test/contract/selfhost-d1-database.test.ts @@ -9,8 +9,8 @@ // no meaningful way to fake generic SQL execution for an arbitrary CREATE TABLE/INSERT/SELECT -- so it // follows the exact same PG_TEST_URL gate test/integration/selfhost-pg.test.ts already established: unset in // CI (skipped, not failed), set locally against a real Postgres to actually exercise it: -// docker run -d -e POSTGRES_PASSWORD=devpw -e POSTGRES_DB=gittensory -p 55432:5432 postgres:16 -// PG_TEST_URL=postgres://postgres:devpw@localhost:55432/gittensory npx vitest run test/contract/selfhost-d1-database.test.ts +// docker run -d -e POSTGRES_PASSWORD=devpw -e POSTGRES_DB=loopover -p 55432:5432 postgres:16 +// PG_TEST_URL=postgres://postgres:devpw@localhost:55432/loopover npx vitest run test/contract/selfhost-d1-database.test.ts // Every statement here uses only PG-native column types (INTEGER/TEXT) and `?`-style placeholders with // explicit values (never relying on SQLite ROWID auto-assignment), which pg-dialect.ts's translateDdl/ // translateSql already pass through/translate unchanged (see its own doc comments) -- so the same SQL text is diff --git a/test/contract/upstream-contract.test.ts b/test/contract/upstream-contract.test.ts index dbc7713fc9..44855253d1 100644 --- a/test/contract/upstream-contract.test.ts +++ b/test/contract/upstream-contract.test.ts @@ -16,7 +16,7 @@ describe.skipIf(!runLiveContracts)("live upstream Gittensor contract", () => { expect(result.ruleset.activeModel).not.toBe("unknown"); expect(result.ruleset.payload).toMatchObject({ registry: expect.objectContaining({ - repositories: expect.arrayContaining([expect.objectContaining({ repo: "JSONbored/gittensory" })]), + repositories: expect.arrayContaining([expect.objectContaining({ repo: "JSONbored/loopover" })]), }), scoring: expect.objectContaining({ activeModel: result.ruleset.activeModel }), issueDiscovery: expect.objectContaining({ branchEligibilityRequired: expect.any(Boolean) }), diff --git a/test/fixtures/engine-parity/predicted-gate/README.md b/test/fixtures/engine-parity/predicted-gate/README.md index 674e4627c1..d9afbbe579 100644 --- a/test/fixtures/engine-parity/predicted-gate/README.md +++ b/test/fixtures/engine-parity/predicted-gate/README.md @@ -1,6 +1,6 @@ # Predicted Gate Parity Fixtures -These fixtures are the scenario corpus for [issue #2285](https://github.com/JSONbored/gittensory/issues/2285). +These fixtures are the scenario corpus for [issue #2285](https://github.com/JSONbored/loopover/issues/2285). Each file exports one complete, self-contained `buildPredictedGateVerdict` input plus the expected high-level surface it should produce today. The follow-up parity runner can reuse the same inputs to snapshot full outputs. diff --git a/test/integration/miner-calibration-loop.test.ts b/test/integration/miner-calibration-loop.test.ts index 5a7364c8e4..be51c454ec 100644 --- a/test/integration/miner-calibration-loop.test.ts +++ b/test/integration/miner-calibration-loop.test.ts @@ -25,7 +25,7 @@ import { initEventLedger } from "../../packages/loopover-miner/lib/event-ledger. const roots: string[] = []; function tempLedgerPath() { - const root = mkdtempSync(join(tmpdir(), "gittensory-miner-calibration-")); + const root = mkdtempSync(join(tmpdir(), "loopover-miner-calibration-")); roots.push(root); return join(root, "event-ledger.sqlite3"); } @@ -85,7 +85,7 @@ describe("miner Phase 7 calibration loop (#4248)", () => { repoFullName: "acme/widgets", }); - // Deliverable: the snapshot is queryable via the EXISTING `gittensory-miner ledger list --type` tooling. + // Deliverable: the snapshot is queryable via the EXISTING `loopover-miner ledger list --type` tooling. const typed = filterLedgerEvents(reopened.readEvents(), { type: MINER_CALIBRATION_SNAPSHOT_EVENT }); expect(typed).toHaveLength(1); diff --git a/test/integration/orb-webhook.test.ts b/test/integration/orb-webhook.test.ts index f4919b95a5..4e9bd70401 100644 --- a/test/integration/orb-webhook.test.ts +++ b/test/integration/orb-webhook.test.ts @@ -37,7 +37,7 @@ async function post( return handleOrbWebhook(ctx(e, headers, request)); } -const INSTALL = JSON.stringify({ action: "created", installation: { id: 42 }, repository: { full_name: "JSONbored/gittensory" } }); +const INSTALL = JSON.stringify({ action: "created", installation: { id: 42 }, repository: { full_name: "JSONbored/loopover" } }); const row = (e: Env, delivery: string) => (e.DB as unknown as TestD1Database).prepare("SELECT event_name, action, installation_id, repository_full_name, status FROM orb_webhook_events WHERE delivery_id=?").bind(delivery).first<{ event_name: string; action: string; installation_id: number; repository_full_name: string; status: string }>(); @@ -102,13 +102,13 @@ describe("handleOrbWebhook (POST /v1/orb/webhook)", () => { const res = await post(e, INSTALL, { delivery: "ok-1" }); expect(res.status).toBe(202); await expect(res.json()).resolves.toMatchObject({ status: "received", eventName: "installation" }); - expect(await row(e, "ok-1")).toMatchObject({ action: "created", installation_id: 42, repository_full_name: "JSONbored/gittensory", status: "received" }); + expect(await row(e, "ok-1")).toMatchObject({ action: "created", installation_id: 42, repository_full_name: "JSONbored/loopover", status: "received" }); }); it("ACKs 202 immediately and SCHEDULES the relay forward via waitUntil (never blocks the ACK on a slow container, #orb-ack-fast)", async () => { const e = env(); const scheduled: Promise[] = []; - const PR = JSON.stringify({ action: "opened", installation: { id: 99 }, repository: { full_name: "JSONbored/gittensory" }, number: 7 }); + const PR = JSON.stringify({ action: "opened", installation: { id: 99 }, repository: { full_name: "JSONbored/loopover" }, number: 7 }); const request = new Request("https://collector/v1/orb/webhook", { method: "POST", body: PR }); const headers = { "x-github-delivery": "fwd-1", "x-github-event": "pull_request", "x-hub-signature-256": await sign(PR, SECRET) }; const res = await handleOrbWebhook(ctx(e, headers, request, { waitUntil: (p) => scheduled.push(p) })); @@ -121,7 +121,7 @@ describe("handleOrbWebhook (POST /v1/orb/webhook)", () => { it("INVARIANT: central Orb ingress stays live without the self-host review-runtime cache", async () => { const e = env(); delete e.SELFHOST_TRANSIENT_CACHE; - const PR = JSON.stringify({ action: "opened", installation: { id: 100 }, repository: { full_name: "JSONbored/gittensory" }, number: 8 }); + const PR = JSON.stringify({ action: "opened", installation: { id: 100 }, repository: { full_name: "JSONbored/loopover" }, number: 8 }); const res = await post(e, PR, { delivery: "orb-no-review-cache", event: "pull_request" }); expect(res.status).toBe(202); await expect(res.json()).resolves.toMatchObject({ status: "received", eventName: "pull_request" }); diff --git a/test/integration/public-stats-route.test.ts b/test/integration/public-stats-route.test.ts index eae92dcec2..4e11f2dae6 100644 --- a/test/integration/public-stats-route.test.ts +++ b/test/integration/public-stats-route.test.ts @@ -12,9 +12,9 @@ import { PUBLIC_REVIEW_VOLUME_TREND_WEEKS } from "../../src/services/public-revi async function seed(env: Env) { // [repo, number, state, mergedAt] — merged (merged_at set) / closed (state closed, no merge) / open (in review). const prs: Array<[string, number, string, string | null]> = [ - ["JSONbored/gittensory", 1, "closed", "2026-06-20T00:00:00Z"], // merged - ["JSONbored/gittensory", 2, "closed", null], // closed without merge - ["JSONbored/gittensory", 3, "open", null], // still in review + ["JSONbored/loopover", 1, "closed", "2026-06-20T00:00:00Z"], // merged + ["JSONbored/loopover", 2, "closed", null], // closed without merge + ["JSONbored/loopover", 3, "open", null], // still in review ["JSONbored/awesome-claude", 5, "closed", "2026-06-20T00:00:00Z"], // merged ["JSONbored/awesome-claude", 6, "closed", "2026-06-20T00:00:00Z"], // merged ]; @@ -37,10 +37,10 @@ async function seed(env: Env) { ) .run(); } - // One live reversal: the engine CLOSED gittensory#3, but it is now reopened (state 'open') — a human overturned + // One live reversal: the engine CLOSED loopover#3, but it is now reopened (state 'open') — a human overturned // the auto-action. awesome-claude has none → exercises the per-project ?? 0 fallback. await env.DB.prepare( - `INSERT INTO audit_events (id, event_type, target_key, outcome) VALUES ('rev1', 'agent.action.close', 'JSONbored/gittensory#3', 'completed')`, + `INSERT INTO audit_events (id, event_type, target_key, outcome) VALUES ('rev1', 'agent.action.close', 'JSONbored/loopover#3', 'completed')`, ).run(); } @@ -56,15 +56,15 @@ describe("GET /v1/public/stats (#1059)", () => { }); it("a present publicStats manifest override turns the endpoint ON even when LOOPOVER_PUBLIC_STATS is OFF (#6275)", async () => { - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); // flag unset → OFF - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { publicStats: { enabled: true } }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); // flag unset → OFF + await upsertRepoFocusManifest(env, "JSONbored/loopover", { publicStats: { enabled: true } }); const res = await createApp().request("/v1/public/stats", {}, env); expect(res.status).toBe(200); }); it("a present publicStats manifest override turns the endpoint OFF even when LOOPOVER_PUBLIC_STATS is ON (#6275)", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS: "1", LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { publicStats: { enabled: false } }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS: "1", LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); + await upsertRepoFocusManifest(env, "JSONbored/loopover", { publicStats: { enabled: false } }); const res = await createApp().request("/v1/public/stats", {}, env); expect(res.status).toBe(404); }); @@ -72,7 +72,7 @@ describe("GET /v1/public/stats (#1059)", () => { it("serves public-safe aggregates with no auth + a cache header when enabled", async () => { const env = createTestEnv({ LOOPOVER_PUBLIC_STATS: "1", - LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory,JSONbored/awesome-claude", + LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover,JSONbored/awesome-claude", }); await seed(env); const res = await createApp().request("/v1/public/stats", {}, env); @@ -97,8 +97,8 @@ describe("GET /v1/public/stats (#1059)", () => { expect(body.totals.reviewed).toBe(5); // merged 3 + closed 1 + in-review 1 expect(body.totals.reversed).toBe(1); expect(body.totals.accuracyPct).toBe(75); // 1 - 1 / (3 + 1) - // busiest repo first: gittensory reviewed 3 (m1+c1+cm1) > awesome-claude 2 (m2+m3) - expect(body.byProject[0]?.project).toBe("JSONbored/gittensory"); + // busiest repo first: loopover reviewed 3 (m1+c1+cm1) > awesome-claude 2 (m2+m3) + expect(body.byProject[0]?.project).toBe("JSONbored/loopover"); expect(body.byProject.map((p) => p.project)).toContain( "JSONbored/awesome-claude", ); diff --git a/test/integration/routes-errors.test.ts b/test/integration/routes-errors.test.ts index b1e1085ffb..ea1c670857 100644 --- a/test/integration/routes-errors.test.ts +++ b/test/integration/routes-errors.test.ts @@ -616,7 +616,7 @@ describe("api route guards and error branches", () => { queued.push(message); }, } as unknown as Queue, - LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory", + LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover", }); vi.stubGlobal("fetch", async (input: RequestInfo | URL) => { const url = input.toString(); @@ -690,14 +690,14 @@ describe("api route guards and error branches", () => { const agentBlockers = await app.request("/v1/agent/explain-blockers", { method: "POST", headers: apiHeaders(env), - body: JSON.stringify({ login: "oktofeesh1", repoFullName: "JSONbored/gittensory" }), + body: JSON.stringify({ login: "oktofeesh1", repoFullName: "JSONbored/loopover" }), }, env); expect(agentBlockers.status).toBe(202); await expect(agentBlockers.json()).resolves.toMatchObject({ run: { status: "needs_snapshot_refresh" } }); const localAgentPayload = { login: "oktofeesh1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", baseRef: "origin/main", headRef: "feature/base-agent", branchName: "feature/base-agent", @@ -805,61 +805,61 @@ describe("api route guards and error branches", () => { const queuedRecap = await app.request( "/v1/internal/jobs/generate-review-recap", - { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/gittensory", windowDays: 999 }) }, + { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/loopover", windowDays: 999 }) }, env, ); expect(queuedRecap.status).toBe(202); - await expect(queuedRecap.json()).resolves.toMatchObject({ status: "queued", repoFullName: "JSONbored/gittensory", windowDays: 90 }); - expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "generate-review-recap", repoFullName: "JSONbored/gittensory", windowDays: 90 })])); + await expect(queuedRecap.json()).resolves.toMatchObject({ status: "queued", repoFullName: "JSONbored/loopover", windowDays: 90 }); + expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "generate-review-recap", repoFullName: "JSONbored/loopover", windowDays: 90 })])); const queuedRecapDefaultWindow = await app.request( "/v1/internal/jobs/generate-review-recap", - { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }) }, + { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/loopover" }) }, env, ); expect(queuedRecapDefaultWindow.status).toBe(202); const queuedRecapDefaultWindowBody = await queuedRecapDefaultWindow.json(); - expect(queuedRecapDefaultWindowBody).toMatchObject({ status: "queued", repoFullName: "JSONbored/gittensory" }); + expect(queuedRecapDefaultWindowBody).toMatchObject({ status: "queued", repoFullName: "JSONbored/loopover" }); expect(queuedRecapDefaultWindowBody).not.toHaveProperty("windowDays"); - expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "generate-review-recap", repoFullName: "JSONbored/gittensory" })])); + expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "generate-review-recap", repoFullName: "JSONbored/loopover" })])); // /run respects reviewRecap.enabled even for an explicit maintainer-triggered call (default-off, fail-safe). const skippedRecapRun = await app.request( "/v1/internal/jobs/generate-review-recap/run", - { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }) }, + { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/loopover" }) }, env, ); expect(skippedRecapRun.status).toBe(200); await expect(skippedRecapRun.json()).resolves.toMatchObject({ ok: false, status: "skipped" }); - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { reviewRecap: { enabled: true, cadenceDays: 3 } }); + await upsertRepoFocusManifest(env, "JSONbored/loopover", { reviewRecap: { enabled: true, cadenceDays: 3 } }); const immediateRecapRun = await app.request( "/v1/internal/jobs/generate-review-recap/run", - { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }) }, + { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/loopover" }) }, env, ); expect(immediateRecapRun.status).toBe(200); - await expect(immediateRecapRun.json()).resolves.toMatchObject({ ok: true, recap: expect.objectContaining({ repoFullName: "JSONbored/gittensory", windowDays: 3 }), delivery: expect.objectContaining({ sent: false }) }); + await expect(immediateRecapRun.json()).resolves.toMatchObject({ ok: true, recap: expect.objectContaining({ repoFullName: "JSONbored/loopover", windowDays: 3 }), delivery: expect.objectContaining({ sent: false }) }); // An explicit windowDays on /run overrides the manifest's cadenceDays default. const immediateRecapRunExplicitWindow = await app.request( "/v1/internal/jobs/generate-review-recap/run", - { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/gittensory", windowDays: 14 }) }, + { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ repoFullName: "JSONbored/loopover", windowDays: 14 }) }, env, ); expect(immediateRecapRunExplicitWindow.status).toBe(200); - await expect(immediateRecapRunExplicitWindow.json()).resolves.toMatchObject({ ok: true, recap: expect.objectContaining({ repoFullName: "JSONbored/gittensory", windowDays: 14 }) }); + await expect(immediateRecapRunExplicitWindow.json()).resolves.toMatchObject({ ok: true, recap: expect.objectContaining({ repoFullName: "JSONbored/loopover", windowDays: 14 }) }); expect( ( await app.request("/v1/internal/jobs/backfill-registered-repos", { method: "POST", headers: internalHeaders(env), - body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }), + body: JSON.stringify({ repoFullName: "JSONbored/loopover" }), }, env) ).status, ).toBe(202); - expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "backfill-registered-repos", repoFullName: "JSONbored/gittensory" })])); + expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "backfill-registered-repos", repoFullName: "JSONbored/loopover" })])); const queuedAllBackfill = await app.request("/v1/internal/jobs/backfill-registered-repos", { method: "POST", @@ -950,10 +950,10 @@ describe("api route guards and error branches", () => { const queuedSignals = await app.request("/v1/internal/jobs/generate-signal-snapshots", { method: "POST", headers: internalHeaders(env), - body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }), + body: JSON.stringify({ repoFullName: "JSONbored/loopover" }), }, env); expect(queuedSignals.status).toBe(202); - expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "generate-signal-snapshots", repoFullName: "JSONbored/gittensory" })])); + expect(queued).toEqual(expect.arrayContaining([expect.objectContaining({ type: "generate-signal-snapshots", repoFullName: "JSONbored/loopover" })])); const queuedScoring = await app.request("/v1/internal/jobs/refresh-scoring-model", { method: "POST", headers: internalHeaders(env) }, env); expect(queuedScoring.status).toBe(202); @@ -970,7 +970,7 @@ describe("api route guards and error branches", () => { expect(disabledDriftIssuesRun.status).toBe(200); await expect(disabledDriftIssuesRun.json()).resolves.toEqual({ status: "disabled", created: 0, updated: 0, skipped: 0 }); - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { upstreamDriftIssues: { enabled: true } }); + await upsertRepoFocusManifest(env, "JSONbored/loopover", { upstreamDriftIssues: { enabled: true } }); const enabledDriftIssuesRun = await app.request("/v1/internal/jobs/file-upstream-drift-issues/run", { method: "POST", headers: internalHeaders(env) }, env); expect(enabledDriftIssuesRun.status).toBe(200); await expect(enabledDriftIssuesRun.json()).resolves.toMatchObject({ status: "skipped", reason: "missing_issue_token" }); @@ -999,13 +999,13 @@ describe("api route guards and error branches", () => { const queuedContributorRefresh = await app.request("/v1/internal/jobs/refresh-contributor-activity", { method: "POST", headers: internalHeaders(env), - body: JSON.stringify({ login: "jsonbored", repoFullName: "JSONbored/gittensory" }), + body: JSON.stringify({ login: "jsonbored", repoFullName: "JSONbored/loopover" }), }, env); expect(queuedContributorRefresh.status).toBe(202); const queuedForecasts = await app.request("/v1/internal/jobs/build-burden-forecasts", { method: "POST", headers: internalHeaders(env), - body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }), + body: JSON.stringify({ repoFullName: "JSONbored/loopover" }), }, env); expect(queuedForecasts.status).toBe(202); @@ -1021,8 +1021,8 @@ describe("api route guards and error branches", () => { expect.objectContaining({ type: "file-upstream-drift-issues" }), expect.objectContaining({ type: "build-contributor-evidence", login: "oktofeesh1" }), expect.objectContaining({ type: "build-contributor-decision-packs", login: "oktofeesh1" }), - expect.objectContaining({ type: "refresh-contributor-activity", login: "jsonbored", repoFullName: "JSONbored/gittensory" }), - expect.objectContaining({ type: "build-burden-forecasts", repoFullName: "JSONbored/gittensory" }), + expect.objectContaining({ type: "refresh-contributor-activity", login: "jsonbored", repoFullName: "JSONbored/loopover" }), + expect.objectContaining({ type: "build-burden-forecasts", repoFullName: "JSONbored/loopover" }), ]), ); @@ -1032,7 +1032,7 @@ describe("api route guards and error branches", () => { await app.request("/v1/internal/jobs/backfill-registered-repos/run", { method: "POST", headers: internalHeaders(env), - body: JSON.stringify({ repoFullName: "JSONbored/gittensory" }), + body: JSON.stringify({ repoFullName: "JSONbored/loopover" }), }, env) ).status, ).toBe(200); @@ -1108,7 +1108,7 @@ describe("api route guards and error branches", () => { // reviewCheckMode is gone from repositorySettingsSchema entirely (#6444) -- probe a still-real field instead. expect( ( - await app.request("/v1/internal/repos/JSONbored/gittensory/settings", { + await app.request("/v1/internal/repos/JSONbored/loopover/settings", { method: "POST", headers: internalHeaders(env), body: JSON.stringify({ gatePack: "bad" }), @@ -1123,7 +1123,7 @@ describe("api route guards and error branches", () => { await persistRegistrySnapshot( asCloudEnv(env), normalizeRegistryPayload( - { "JSONbored/gittensory": { emission_share: 0.01, issue_discovery_share: 0 } }, + { "JSONbored/loopover": { emission_share: 0.01, issue_discovery_share: 0 } }, { kind: "raw-github", url: "https://example.test" }, "2026-05-23T00:00:00.000Z", ), @@ -1136,7 +1136,7 @@ describe("api route guards and error branches", () => { const rawRequest = new Request("http://localhost/mcp", { method: "POST", headers: { authorization: `Bearer ${defensiveSessionToken}`, "content-type": "application/json" }, - body: JSON.stringify({ jsonrpc: "2.0", id: "raw-failure", method: "tools/call", params: { name: "loopover_get_repo_context", arguments: { owner: "JSONbored", repo: "gittensory" } } }), + body: JSON.stringify({ jsonrpc: "2.0", id: "raw-failure", method: "tools/call", params: { name: "loopover_get_repo_context", arguments: { owner: "JSONbored", repo: "loopover" } } }), }); let rawReads = 0; await expect( @@ -1190,12 +1190,12 @@ describe("api route guards and error branches", () => { const snapshot = await app.request("/v1/registry/snapshot", { headers: apiHeaders(env) }, env); expect(snapshot.status).toBe(200); - const repo = await app.request("/v1/repos/JSONbored/gittensory", { headers: apiHeaders(env) }, env); + const repo = await app.request("/v1/repos/JSONbored/loopover", { headers: apiHeaders(env) }, env); expect(repo.status).toBe(200); - await expect(repo.json()).resolves.toMatchObject({ fullName: "JSONbored/gittensory" }); + await expect(repo.json()).resolves.toMatchObject({ fullName: "JSONbored/loopover" }); const updated = await app.request( - "/v1/internal/repos/JSONbored/gittensory/settings", + "/v1/internal/repos/JSONbored/loopover/settings", { method: "POST", headers: internalHeaders(env), @@ -1213,7 +1213,7 @@ describe("api route guards and error branches", () => { const app = createApp(); const env = createTestEnv(); const storage = env as unknown as StorageEnv; - const fullName = "JSONbored/gittensory"; + const fullName = "JSONbored/loopover"; // Seed a live override + two audit rows for the repo the operator will inspect/clear. await writeLiveOverride(storage, fullName, { confidenceFloor: 0.95, scopeCap: { files: 3, lines: 120 } }); diff --git a/test/integration/selfhost-pg.test.ts b/test/integration/selfhost-pg.test.ts index 6751f1d6bf..4e5c7fd194 100644 --- a/test/integration/selfhost-pg.test.ts +++ b/test/integration/selfhost-pg.test.ts @@ -1,7 +1,7 @@ // Real-Postgres integration test for the self-host PG backend (#977). Skipped unless PG_TEST_URL is set, so // CI (no Postgres) skips it; run locally against a real PG: -// docker run -d -e POSTGRES_PASSWORD=devpw -e POSTGRES_DB=gittensory -p 55432:5432 postgres:16 -// PG_TEST_URL=postgres://postgres:devpw@localhost:55432/gittensory npx vitest run test/integration/selfhost-pg.test.ts +// docker run -d -e POSTGRES_PASSWORD=devpw -e POSTGRES_DB=loopover -p 55432:5432 postgres:16 +// PG_TEST_URL=postgres://postgres:devpw@localhost:55432/loopover npx vitest run test/integration/selfhost-pg.test.ts import { afterAll, beforeAll, describe, expect, it } from "vitest"; import pg from "pg"; import { runSelfHostMigrations } from "../../src/selfhost/migrate"; diff --git a/test/integration/subnet-interface.test.ts b/test/integration/subnet-interface.test.ts index 81d0b3281c..c18181056e 100644 --- a/test/integration/subnet-interface.test.ts +++ b/test/integration/subnet-interface.test.ts @@ -5,7 +5,7 @@ import { createTestEnv } from "../helpers/d1"; describe("public subnet-interface descriptor route", () => { it("serves the SN74 contribution-interface descriptor without authentication", async () => { const app = createApp(); - const env = createTestEnv({ PUBLIC_API_ORIGIN: "https://gittensory-api.aethereal.dev" }); + const env = createTestEnv({ PUBLIC_API_ORIGIN: "https://loopover-api.aethereal.dev" }); const response = await app.request("/v1/public/subnet-interface", {}, env); expect(response.status).toBe(200); @@ -15,7 +15,7 @@ describe("public subnet-interface descriptor route", () => { subnet: { netuid: 74, name: "gittensor" }, provider: { name: "LoopOver", role: "contribution_interface" }, interfaces: { - mcp: { endpoint: "https://gittensory-api.aethereal.dev/mcp", transport: "http" }, + mcp: { endpoint: "https://loopover-api.aethereal.dev/mcp", transport: "http" }, // The publicly installable App slug is a stable hardcoded product identity now (see // subnet-interface.ts) -- independent of the Worker's own GITHUB_APP_SLUG, which no longer exists. githubApp: { slug: "loopover-orb", installUrl: "https://github.com/apps/loopover-orb" }, diff --git a/test/unit/access-boundary.test.ts b/test/unit/access-boundary.test.ts index 014b55990f..f0b88a2c1b 100644 --- a/test/unit/access-boundary.test.ts +++ b/test/unit/access-boundary.test.ts @@ -8,7 +8,7 @@ import { createTestEnv } from "../helpers/d1"; // • Identity is per-login: a session reads ONLY its own contributor/miner data. // • Authority is per-repo: a session reads maintainer data ONLY for repos it maintains. // • Maintainer-of-repo-A grants ZERO access to repo B. Operators and server tokens bypass per-repo scope. -// GET /v1/repos/:owner/:repo/settings is the maintainer-DATA exemplar (repo gittensory config). +// GET /v1/repos/:owner/:repo/settings is the maintainer-DATA exemplar (repo loopover config). async function seedOwnedRepo(env: Env, owner: string, name: string, installationId: number): Promise { await upsertInstallation(env, { diff --git a/test/unit/account-age-throttle.test.ts b/test/unit/account-age-throttle.test.ts index 42bc5ba878..8461249ae2 100644 --- a/test/unit/account-age-throttle.test.ts +++ b/test/unit/account-age-throttle.test.ts @@ -17,7 +17,7 @@ describe("account-age throttle helpers (#2561 issue path)", () => { }); it("repoOwnerLoginFromFullName returns the owner segment for owner/repo names", () => { - expect(repoOwnerLoginFromFullName("JSONbored/gittensory")).toBe("JSONbored"); + expect(repoOwnerLoginFromFullName("JSONbored/loopover")).toBe("JSONbored"); }); it("repoOwnerLoginFromFullName returns empty for a no-slash repo name", () => { diff --git a/test/unit/adapters.test.ts b/test/unit/adapters.test.ts index 11523d6fec..b965e8539f 100644 --- a/test/unit/adapters.test.ts +++ b/test/unit/adapters.test.ts @@ -31,7 +31,7 @@ describe("small adapters and normalizers", () => { {}, { id: 33, - repository_full_name: "JSONbored/gittensory", + repository_full_name: "JSONbored/loopover", issue_number: 12, status: "Completed", bounty_amount: 0.5, @@ -42,13 +42,13 @@ describe("small adapters and normalizers", () => { }, { id: "35", - repository_full_name: "JSONbored/gittensory", + repository_full_name: "JSONbored/loopover", issue_number: 13, status: "Active", bounty_alpha: "1.2500", }, - { id: 34, repository_full_name: "JSONbored/gittensory", status: "Active" }, - { id: 36, repository_full_name: "JSONbored/gittensory", issue_number: 14, status: "Cancelled", active: undefined }, + { id: 34, repository_full_name: "JSONbored/loopover", status: "Active" }, + { id: 36, repository_full_name: "JSONbored/loopover", issue_number: 14, status: "Cancelled", active: undefined }, ], }); diff --git a/test/unit/advisory-ai-routing-config-engine.test.ts b/test/unit/advisory-ai-routing-config-engine.test.ts index d989e4a868..92d4353b42 100644 --- a/test/unit/advisory-ai-routing-config-engine.test.ts +++ b/test/unit/advisory-ai-routing-config-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { DEFAULT_ADVISORY_AI_ROUTING, normalizeAdvisoryAiRoutingConfig } from "../../packages/loopover-engine/src/review/advisory-ai-routing-config"; diff --git a/test/unit/agent-approval-queue.test.ts b/test/unit/agent-approval-queue.test.ts index 8b9d0845ad..35f87d4616 100644 --- a/test/unit/agent-approval-queue.test.ts +++ b/test/unit/agent-approval-queue.test.ts @@ -1216,7 +1216,7 @@ describe("agent approval queue (#779)", () => { // mergeableState reads "clean" (the default mock). This row predates closeRequiresMergeableState entirely // (never planned with it, so it's undefined, NOT explicitly false) -- its original justification is // unknown, so a strict `=== true` scoping would silently skip the live recheck and execute unchecked. The - // fix must fail toward "revalidate" for the unknown/legacy case, not "skip" (the exact gap the gittensory + // fix must fail toward "revalidate" for the unknown/legacy case, not "skip" (the exact gap the loopover // orb flagged: undefined must not be treated the same as the explicit `false` case above). const { action } = await createPendingAgentActionIfAbsent(env, { repoFullName: "owner/repo", diff --git a/test/unit/agent-guardrail-paths.test.ts b/test/unit/agent-guardrail-paths.test.ts index 14d6d92b37..a039fc55a7 100644 --- a/test/unit/agent-guardrail-paths.test.ts +++ b/test/unit/agent-guardrail-paths.test.ts @@ -5,7 +5,7 @@ import type { PullRequestFileRecord } from "../../src/types"; function file(path: string, previousFilename?: string | null): PullRequestFileRecord { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 42, path, previousFilename, diff --git a/test/unit/agent-sdk-driver.test.ts b/test/unit/agent-sdk-driver.test.ts index 2f09301a3f..052daef7c7 100644 --- a/test/unit/agent-sdk-driver.test.ts +++ b/test/unit/agent-sdk-driver.test.ts @@ -97,7 +97,7 @@ describe("createAgentSdkCodingAgentDriver", () => { // not eliminate. Reproduced under simulated contention (16 CPU-bound processes oversubscribing a // 12-core machine): clean single-attempt runs ranged ~0.3-20s, with one run exceeding 30s outright. // 60s covers the observed range with headroom instead of relying on ambient timing. - const dir = await mkdtemp(join(tmpdir(), "gittensory-agent-sdk-")); + const dir = await mkdtemp(join(tmpdir(), "loopover-agent-sdk-")); const commitEnv = { ...process.env, GIT_AUTHOR_NAME: "Test User", diff --git a/test/unit/alerts.test.ts b/test/unit/alerts.test.ts index 75cc0f23e9..5cb034c7f8 100644 --- a/test/unit/alerts.test.ts +++ b/test/unit/alerts.test.ts @@ -174,7 +174,7 @@ describe("runAnomalyAlerts guards", () => { }); // ── runAnomalyAlerts send path ─────────────────────────────────────────────────────────────────────── -// gittensory's migrated `notification_deliveries` table is the badge read-model — a DIFFERENT schema than +// loopover's migrated `notification_deliveries` table is the badge read-model — a DIFFERENT schema than // the native port's claim SQL (project/target_id/notification_key). So we emulate the claim store: the // INSERT ... ON CONFLICT(project, target_id, notification_key) DO NOTHING returns changes=1 the first time a // (project, target_id, notification_key) tuple is seen and changes=0 on a repeat (the per-hour throttle). diff --git a/test/unit/analytics-proxy.test.ts b/test/unit/analytics-proxy.test.ts index 23ca747642..ecc0ba94cd 100644 --- a/test/unit/analytics-proxy.test.ts +++ b/test/unit/analytics-proxy.test.ts @@ -35,7 +35,7 @@ describe("handleAnalyticsProxy", () => { expect( await handleAnalyticsProxy( - new Request("https://gittensory.aethereal.dev/stats/script.js"), + new Request("https://loopover.aethereal.dev/stats/script.js"), ), ).toBeUndefined(); expect(calls).toHaveLength(0); @@ -44,7 +44,7 @@ describe("handleAnalyticsProxy", () => { it("does not forward the visitor's cookies to the analytics upstream", async () => { const calls = captureUpstream(); const response = await handleAnalyticsProxy( - new Request("https://gittensory.aethereal.dev/stats/api/send", { + new Request("https://loopover.aethereal.dev/stats/api/send", { method: "POST", headers: { cookie: "loopover_session=secret; gh_oauth_state=abc", @@ -66,7 +66,7 @@ describe("handleAnalyticsProxy", () => { it("forwards only the trusted client IP, ignoring a spoofed x-forwarded-for", async () => { const calls = captureUpstream(); await handleAnalyticsProxy( - new Request("https://gittensory.aethereal.dev/stats/api/send", { + new Request("https://loopover.aethereal.dev/stats/api/send", { method: "POST", headers: { "x-forwarded-for": "1.2.3.4", @@ -86,16 +86,16 @@ describe("handleAnalyticsProxy", () => { captureUpstream(); expect( await handleAnalyticsProxy( - new Request("https://gittensory.aethereal.dev/stats/api/admin"), + new Request("https://loopover.aethereal.dev/stats/api/admin"), ), ).toBeUndefined(); expect( await handleAnalyticsProxy( - new Request("https://gittensory.aethereal.dev/about"), + new Request("https://loopover.aethereal.dev/about"), ), ).toBeUndefined(); const notAllowed = await handleAnalyticsProxy( - new Request("https://gittensory.aethereal.dev/stats/api/send", { + new Request("https://loopover.aethereal.dev/stats/api/send", { method: "GET", }), ); diff --git a/test/unit/auth.test.ts b/test/unit/auth.test.ts index 57ac1adb1c..1d62e9699c 100644 --- a/test/unit/auth.test.ts +++ b/test/unit/auth.test.ts @@ -179,7 +179,7 @@ describe("private-beta auth and rate limiting", () => { expect(observedKeys[1]).toMatch(/^normal:\/v1\/repos:token:/); observedKeys.length = 0; - await expect(enforceRateLimit(fakeContext(env, "/v1/public/github/repos/JSONbored/gittensory/stats", { "cf-connecting-ip": "203.0.113.9" }), "normal")).resolves.toBeNull(); + await expect(enforceRateLimit(fakeContext(env, "/v1/public/github/repos/JSONbored/loopover/stats", { "cf-connecting-ip": "203.0.113.9" }), "normal")).resolves.toBeNull(); await expect(enforceRateLimit(fakeContext(env, "/v1/public/github/repos/Attacker/missing-one/stats", { "cf-connecting-ip": "203.0.113.9" }), "normal")).resolves.toBeNull(); expect(observedKeys).toHaveLength(2); expect(observedKeys[0]).toBe(observedKeys[1]); @@ -499,19 +499,19 @@ describe("private-beta auth and rate limiting", () => { const fallbackObservedKeys: string[] = []; const fallbackHeaders = fakeContext( rateLimitTestEnv({}, fallbackObservedKeys), - "/v1/repos/JSONbored/gittensory", + "/v1/repos/JSONbored/loopover", trustedProxyHeaders({ "x-real-ip": "198.51.100.3", "x-forwarded-for": "198.51.100.2, 198.51.100.3" }), ); await expect(enforceRateLimit(fallbackHeaders, "normal")).resolves.toBeNull(); expect(fallbackObservedKeys).toHaveLength(1); - expect(fallbackObservedKeys[0]).toMatch(/^normal:\/v1\/repos\/JSONbored\/gittensory:ip:/); + expect(fallbackObservedKeys[0]).toMatch(/^normal:\/v1\/repos\/JSONbored\/loopover:ip:/); expect(fallbackHeaders.res.headers.get("x-ratelimit-limit")).toBe("120"); expect(fallbackHeaders.res.headers.get("x-ratelimit-remaining")).toBe("120"); expect(fallbackHeaders.res.headers.get("x-ratelimit-reset")).toBeNull(); const malformedDecision = fakeContext( createTestEnv({ RATE_LIMITER: rateLimiterNamespace({ status: 200, body: "not-json" }) as unknown as DurableObjectNamespace }), - "/v1/repos/JSONbored/gittensory", + "/v1/repos/JSONbored/loopover", ); await expect(enforceRateLimit(malformedDecision, "normal")).resolves.toBeNull(); expect(malformedDecision.res.headers.get("x-ratelimit-limit")).toBe("120"); @@ -519,7 +519,7 @@ describe("private-beta auth and rate limiting", () => { const allowed = fakeContext( createTestEnv({ RATE_LIMITER: rateLimiterNamespace({ status: 200, body: { limit: 3, remaining: 2, resetAt: "2026-05-25T00:01:00.000Z" } }) as unknown as DurableObjectNamespace }), - "/v1/repos/JSONbored/gittensory/pulls/123/reviewability", + "/v1/repos/JSONbored/loopover/pulls/123/reviewability", { authorization: "Bearer session-token" }, ); await expect(enforceRateLimit(allowed, "normal")).resolves.toBeNull(); @@ -704,7 +704,7 @@ describe("private-beta auth and rate limiting", () => { }); const started = await startGitHubWebOAuth( env, - "https://gittensory-api.aethereal.dev/v1/auth/github/start", + "https://loopover-api.aethereal.dev/v1/auth/github/start", "https://loopover.ai/app/workbench", ); expect(started.returnTo).toBe("https://loopover.ai/app/workbench"); @@ -713,7 +713,7 @@ describe("private-beta auth and rate limiting", () => { expect(started.authorizationUrl).toContain("redirect_uri=https%3A%2F%2Fapi.loopover.ai%2Fv1%2Fauth%2Fgithub%2Fcallback"); await expect( - startGitHubWebOAuth(createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "client-id" }), "https://gittensory-api.aethereal.dev/v1/auth/github/start", undefined), + startGitHubWebOAuth(createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "client-id" }), "https://loopover-api.aethereal.dev/v1/auth/github/start", undefined), ).rejects.toThrow(/not_configured/); vi.stubGlobal("fetch", async (input: RequestInfo | URL) => { @@ -723,7 +723,7 @@ describe("private-beta auth and rate limiting", () => { return Response.json({}); }); await expect( - completeGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/callback", { + completeGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/callback", { code: "code", state: started.state, cookieState: started.state, @@ -731,7 +731,7 @@ describe("private-beta auth and rate limiting", () => { ).resolves.toMatchObject({ login: "jsonbored", scopes: ["read:user"], returnTo: "https://loopover.ai/app/workbench" }); await expect( - completeGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/callback", { + completeGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/callback", { code: "code", state: started.state, cookieState: "wrong-state", @@ -744,7 +744,7 @@ describe("private-beta auth and rate limiting", () => { return Response.json({}); }); await expect( - completeGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/callback", { + completeGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/callback", { code: "code", state: started.state, cookieState: started.state, @@ -769,7 +769,7 @@ describe("private-beta auth and rate limiting", () => { expect(localhostReturnTo.returnTo).toBe("http://localhost:5173/app"); await expect( - completeGitHubWebOAuth(createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "client-id" }), "https://gittensory-api.aethereal.dev/v1/auth/github/callback", { + completeGitHubWebOAuth(createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "client-id" }), "https://loopover-api.aethereal.dev/v1/auth/github/callback", { code: "code", state: invalidReturnTo.state, cookieState: invalidReturnTo.state, @@ -879,9 +879,9 @@ describe("private-beta auth and rate limiting", () => { const own = await startGitHubWebOAuth(env, "https://my-instance.example.com/v1/auth/github/start", "https://my-instance.example.com/app/workbench"); expect(own.returnTo).toBe("https://my-instance.example.com/app/workbench"); - // The cloud gittensory.aethereal.dev origin is no longer accepted for THIS instance -- it falls back to + // The cloud loopover.aethereal.dev origin is no longer accepted for THIS instance -- it falls back to // this instance's own /app, proving the dead literal is gone rather than merely redundant. - const cloud = await startGitHubWebOAuth(env, "https://my-instance.example.com/v1/auth/github/start", "https://gittensory.aethereal.dev/app/workbench"); + const cloud = await startGitHubWebOAuth(env, "https://my-instance.example.com/v1/auth/github/start", "https://loopover.aethereal.dev/app/workbench"); expect(cloud.returnTo).toBe("https://my-instance.example.com/app"); // Localhost dev origins remain accepted regardless of PUBLIC_SITE_ORIGIN. @@ -893,35 +893,35 @@ describe("private-beta auth and rate limiting", () => { const env = createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "client-id", GITHUB_OAUTH_CLIENT_SECRET: "client-secret", - PUBLIC_SITE_ORIGIN: "https://gittensory.aethereal.dev", + PUBLIC_SITE_ORIGIN: "https://loopover.aethereal.dev", PUBLIC_SITE_ORIGIN_ALIASES: "https://loopover.ai, https://staging.loopover.ai", }); // The primary PUBLIC_SITE_ORIGIN still works exactly as before. - const primary = await startGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/start", "https://gittensory.aethereal.dev/app/workbench"); - expect(primary.returnTo).toBe("https://gittensory.aethereal.dev/app/workbench"); + const primary = await startGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/start", "https://loopover.aethereal.dev/app/workbench"); + expect(primary.returnTo).toBe("https://loopover.aethereal.dev/app/workbench"); // An aliased origin is accepted verbatim, not bounced to the primary origin's fallback. - const alias = await startGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/start", "https://loopover.ai/app/workbench"); + const alias = await startGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/start", "https://loopover.ai/app/workbench"); expect(alias.returnTo).toBe("https://loopover.ai/app/workbench"); // A second, comma-separated alias (with surrounding whitespace) is also accepted. - const secondAlias = await startGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/start", "https://staging.loopover.ai/app"); + const secondAlias = await startGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/start", "https://staging.loopover.ai/app"); expect(secondAlias.returnTo).toBe("https://staging.loopover.ai/app"); // An origin that is neither the primary nor an alias still falls back to the primary origin's /app. - const untrusted = await startGitHubWebOAuth(env, "https://gittensory-api.aethereal.dev/v1/auth/github/start", "https://evil.example/app"); - expect(untrusted.returnTo).toBe("https://gittensory.aethereal.dev/app"); + const untrusted = await startGitHubWebOAuth(env, "https://loopover-api.aethereal.dev/v1/auth/github/start", "https://evil.example/app"); + expect(untrusted.returnTo).toBe("https://loopover.aethereal.dev/app"); // Unset PUBLIC_SITE_ORIGIN_ALIASES behaves exactly as before this var existed -- only the primary origin. const noAliases = createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "client-id", GITHUB_OAUTH_CLIENT_SECRET: "client-secret", - PUBLIC_SITE_ORIGIN: "https://gittensory.aethereal.dev", + PUBLIC_SITE_ORIGIN: "https://loopover.aethereal.dev", }); delete (noAliases as Partial).PUBLIC_SITE_ORIGIN_ALIASES; - const rejected = await startGitHubWebOAuth(noAliases, "https://gittensory-api.aethereal.dev/v1/auth/github/start", "https://loopover.ai/app/workbench"); - expect(rejected.returnTo).toBe("https://gittensory.aethereal.dev/app"); + const rejected = await startGitHubWebOAuth(noAliases, "https://loopover-api.aethereal.dev/v1/auth/github/start", "https://loopover.ai/app/workbench"); + expect(rejected.returnTo).toBe("https://loopover.aethereal.dev/app"); }); it("verifies the GitHub token audience before minting a session on the token-exchange path", async () => { diff --git a/test/unit/auto-close-exempt-engine.test.ts b/test/unit/auto-close-exempt-engine.test.ts index 01aa54d013..8250c4aaa4 100644 --- a/test/unit/auto-close-exempt-engine.test.ts +++ b/test/unit/auto-close-exempt-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { isAutoCloseExempt, normalizeAutoCloseExemptLogins } from "../../packages/loopover-engine/src/settings/auto-close-exempt"; diff --git a/test/unit/auto-tune.test.ts b/test/unit/auto-tune.test.ts index 926d35a629..ebf6d6fb92 100644 --- a/test/unit/auto-tune.test.ts +++ b/test/unit/auto-tune.test.ts @@ -62,9 +62,9 @@ function stubFlags(over: Partial = {}): { describe("planAutoTune (#self-improve) — circuit-breaker is one-directional", () => { it("engages when merge precision drops below the floor over a real sample", () => { - const a = planAutoTune(report([row({ project: "gittensory", decided: 20, wouldMerge: 12, mergeConfirmed: 8, mergePrecision: 0.66 })])); + const a = planAutoTune(report([row({ project: "loopover", decided: 20, wouldMerge: 12, mergeConfirmed: 8, mergePrecision: 0.66 })])); expect(a).toHaveLength(1); - expect(a[0]?.project).toBe("gittensory"); + expect(a[0]?.project).toBe("loopover"); expect(a[0]?.message).toMatch(/Auto-merge DISABLED/); }); it("does NOT engage on a thin sample (< min decided)", () => { @@ -221,11 +221,11 @@ describe("shouldAutoClear — #2348 weighted anti-gaming cutover", () => { describe("planCloseAutoTune (#close-precision-breaker) — tightening-only, close direction", () => { it("engages when CLOSE precision drops below the floor over a real sample", () => { - const a = planCloseAutoTune(report([row({ project: "gittensory", decided: 20, wouldClose: 12, closeConfirmed: 8, closePrecision: 0.66 })])); + const a = planCloseAutoTune(report([row({ project: "loopover", decided: 20, wouldClose: 12, closeConfirmed: 8, closePrecision: 0.66 })])); expect(a).toHaveLength(1); - expect(a[0]?.project).toBe("gittensory"); + expect(a[0]?.project).toBe("loopover"); expect(a[0]?.message).toMatch(/Auto-CLOSE DISABLED/); - expect(a[0]?.message).toContain("closehold:gittensory"); + expect(a[0]?.message).toContain("closehold:loopover"); }); it("does NOT engage on a thin would-close sample even with enough total decided PRs", () => { expect(planCloseAutoTune(report([row({ project: "p", decided: 20, wouldClose: 1, closeConfirmed: 0, closePrecision: 0 })]))).toHaveLength(0); @@ -379,7 +379,7 @@ describe("shouldAutoClearClose — #2348 weighted anti-gaming cutover", () => { describe("computeTuningRecommendations (#self-improve)", () => { it("says READY when merge precision is high over a real sample with no false closes", () => { - const recs = computeTuningRecommendations(report([row({ project: "gittensory", decided: 20, wouldMerge: 18, mergeConfirmed: 18, mergePrecision: 1.0 })])); + const recs = computeTuningRecommendations(report([row({ project: "loopover", decided: 20, wouldMerge: 18, mergeConfirmed: 18, mergePrecision: 1.0 })])); expect(recs).toHaveLength(1); expect(recs[0]?.severity).toBe("good"); expect(recs[0]?.message).toMatch(/ready to flip live/i); diff --git a/test/unit/autonomy-engine.test.ts b/test/unit/autonomy-engine.test.ts index 1bd6430a87..08d799f193 100644 --- a/test/unit/autonomy-engine.test.ts +++ b/test/unit/autonomy-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { AGENT_ACTION_CLASSES, diff --git a/test/unit/backfill-file-hydration-scoping.test.ts b/test/unit/backfill-file-hydration-scoping.test.ts index 30e0c95d92..35a391eba3 100644 --- a/test/unit/backfill-file-hydration-scoping.test.ts +++ b/test/unit/backfill-file-hydration-scoping.test.ts @@ -29,7 +29,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { await persistRegistrySnapshot( asCloudEnv(env), normalizeRegistryPayload( - { "JSONbored/gittensory": { emission_share: 0.01, issue_discovery_share: 0, trusted_label_pipeline: true, label_multipliers: {} } }, + { "JSONbored/loopover": { emission_share: 0.01, issue_discovery_share: 0, trusted_label_pipeline: true, label_multipliers: {} } }, { kind: "raw-github", url: "https://example.test/master_repositories.json" }, "2026-05-23T00:00:00.000Z", ), @@ -51,7 +51,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { await seedRegisteredRepo(env); const urls = stubFetchTracking(() => Response.json([])); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 404); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 404); expect(result).toMatchObject({ status: "partial", warnings: ["Repository or pull request was not found."] }); expect(urls.some((url) => url.includes("/files"))).toBe(false); @@ -60,7 +60,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { it("does not re-fetch files for a closed PR that already has complete stored telemetry, but does when forced", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 20, title: "Closed PR", state: "closed", @@ -70,7 +70,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { body: "", }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 20, status: "complete", headSha: "closed-sha", @@ -78,7 +78,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); const urls = stubFetchTracking((url) => (url.includes("/files") ? new Response("must not be called", { status: 500 }) : Response.json([]))); - const unforced = await refreshPullRequestDetails(env, "JSONbored/gittensory", 20); + const unforced = await refreshPullRequestDetails(env, "JSONbored/loopover", 20); expect(unforced).toMatchObject({ status: "complete", warnings: [] }); expect(urls.some((url) => url.includes("/files"))).toBe(false); @@ -88,7 +88,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { urls.push(url); return url.includes("/pulls/20/files") ? Response.json([{ filename: "src/final.ts", status: "modified", additions: 1, deletions: 0, changes: 1 }]) : Response.json([]); }); - const forced = await refreshPullRequestDetails(env, "JSONbored/gittensory", 20, { force: true }); + const forced = await refreshPullRequestDetails(env, "JSONbored/loopover", 20, { force: true }); expect(forced).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/20/files"))).toBe(true); }); @@ -96,7 +96,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { it("still fetches a closed PR without a complete sync state (no stored telemetry yet to rely on)", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 21, title: "Closed PR, never synced", state: "closed", @@ -107,7 +107,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); const urls = stubFetchTracking(() => Response.json([])); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 21); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 21); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/21/files"))).toBe(true); @@ -116,7 +116,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { it("fetches PR files for a current open PR when no repo+PR+head snapshot exists", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 30, title: "Open PR, never synced", state: "open", @@ -129,18 +129,18 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { url.includes("/pulls/30/files") ? Response.json([{ filename: "src/a.ts", status: "modified", additions: 1, deletions: 0, changes: 1 }]) : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 30); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 30); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/30/files"))).toBe(true); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 30)).toEqual([expect.objectContaining({ path: "src/a.ts" })]); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 30)).toMatchObject({ headSha: "head-1", status: "complete" }); + expect(await listPullRequestFiles(env, "JSONbored/loopover", 30)).toEqual([expect.objectContaining({ path: "src/a.ts" })]); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 30)).toMatchObject({ headSha: "head-1", status: "complete" }); }); it("reuses the repo+PR+head file snapshot without calling GitHub when the head is unchanged", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 31, title: "Open PR, already synced", state: "open", @@ -150,7 +150,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { body: "", }); await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 31, path: "src/cached.ts", status: "modified", @@ -160,7 +160,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { payload: { filename: "src/cached.ts" }, }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 31, status: "complete", headSha: "head-1", @@ -168,17 +168,17 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); const urls = stubFetchTracking((url) => (url.includes("/files") ? new Response("must not be called", { status: 500 }) : Response.json([]))); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 31); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 31); expect(result).toMatchObject({ status: "complete", warnings: [] }); expect(urls.some((url) => url.includes("/pulls/31/files"))).toBe(false); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 31)).toEqual([expect.objectContaining({ path: "src/cached.ts", changes: 3 })]); + expect(await listPullRequestFiles(env, "JSONbored/loopover", 31)).toEqual([expect.objectContaining({ path: "src/cached.ts", changes: 3 })]); }); it("fetches fresh files and does not reuse the previous snapshot when the head SHA changes", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 32, title: "Open PR, new push", state: "open", @@ -188,7 +188,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { body: "", }); await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 32, path: "src/old.ts", status: "modified", @@ -198,7 +198,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { payload: { filename: "src/old.ts" }, }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 32, status: "complete", headSha: "head-1", @@ -208,18 +208,18 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { url.includes("/pulls/32/files") ? Response.json([{ filename: "src/new.ts", status: "added", additions: 5, deletions: 0, changes: 5 }]) : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 32); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 32); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/32/files"))).toBe(true); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 32)).toEqual([expect.objectContaining({ path: "src/new.ts" })]); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 32)).toMatchObject({ headSha: "head-2" }); + expect(await listPullRequestFiles(env, "JSONbored/loopover", 32)).toEqual([expect.objectContaining({ path: "src/new.ts" })]); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 32)).toMatchObject({ headSha: "head-2" }); }); it("does not stamp a new head-SHA file snapshot when the changed-head file fetch fails", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 33, title: "Open PR, new push with transient file failure", state: "open", @@ -229,7 +229,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { body: "", }); await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 33, path: "src/old.ts", status: "modified", @@ -239,7 +239,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { payload: { filename: "src/old.ts" }, }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 33, status: "complete", headSha: "head-1", @@ -254,29 +254,29 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { return Response.json([]); }); - const failed = await refreshPullRequestDetails(env, "JSONbored/gittensory", 33); + const failed = await refreshPullRequestDetails(env, "JSONbored/loopover", 33); expect(failed).toMatchObject({ status: "partial", warnings: [expect.stringContaining("File sync failed for #33")] }); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 33)).toEqual([expect.objectContaining({ path: "src/old.ts" })]); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 33)).toMatchObject({ + expect(await listPullRequestFiles(env, "JSONbored/loopover", 33)).toEqual([expect.objectContaining({ path: "src/old.ts" })]); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 33)).toMatchObject({ headSha: "head-1", filesSyncedAt: "2026-05-20T00:00:00.000Z", }); failFiles = false; urls.length = 0; - const retried = await refreshPullRequestDetails(env, "JSONbored/gittensory", 33); + const retried = await refreshPullRequestDetails(env, "JSONbored/loopover", 33); expect(retried).toMatchObject({ status: "complete", warnings: [] }); expect(urls.some((url) => url.includes("/pulls/33/files"))).toBe(true); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 33)).toEqual([expect.objectContaining({ path: "src/new.ts" })]); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 33)).toMatchObject({ headSha: "head-2" }); + expect(await listPullRequestFiles(env, "JSONbored/loopover", 33)).toEqual([expect.objectContaining({ path: "src/new.ts" })]); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 33)).toMatchObject({ headSha: "head-2" }); }); it("a failed file sync never regresses a marker a concurrent successful sync already advanced past it (gate review finding)", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 34, title: "Open PR, racing concurrent refresh", state: "open", @@ -287,7 +287,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); // This call's own initial state read (TOCTOU snapshot): stale head-1. await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 34, status: "complete", headSha: "head-1", @@ -299,7 +299,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { // its own (correct, newer) marker BETWEEN this call's initial state read and this call's own // failed-fetch persist below -- the exact interleaving the gate review flagged. void upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 34, status: "complete", headSha: "head-3", @@ -311,13 +311,13 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { return Response.json([]); }); - const failed = await refreshPullRequestDetails(env, "JSONbored/gittensory", 34); + const failed = await refreshPullRequestDetails(env, "JSONbored/loopover", 34); expect(failed).toMatchObject({ status: "partial", warnings: [expect.stringContaining("File sync failed for #34")] }); // The failed call must not stomp the concurrently-written newer marker back to its own stale head-1 // snapshot -- it must leave the column untouched (undefined-omit), so the concurrent success's head-3 // marker survives. - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 34)).toMatchObject({ + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 34)).toMatchObject({ headSha: "head-3", filesSyncedAt: "2026-05-25T00:00:00.000Z", }); @@ -332,7 +332,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { // Registry-only repo (no installation), so tokenForRepo resolves to the shared public token and // repoAdmissionKeyForToken scopes to that bucket (#audit-rate-scoping). await recordGitHubRateLimitObservation(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", admissionKey: "public-token", resource: "rest", path: "/pulls", @@ -350,13 +350,13 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { return Response.json([]); }); - const result = await backfillRepositorySegment(env, { repoFullName: "JSONbored/gittensory", segment: "recent_merged_pull_requests", mode: "full" }); + const result = await backfillRepositorySegment(env, { repoFullName: "JSONbored/loopover", segment: "recent_merged_pull_requests", mode: "full" }); // Not throttled at the segment's own entry check (default LOW_REST_RATE_LIMIT_REMAINING floor) — only the // historical file hydration inside it yields, at the stricter HISTORICAL_BACKFILL_RESERVED_HEADROOM floor. expect(result.status).not.toBe("waiting_rate_limit"); expect(urls.some((url) => url.includes("/files"))).toBe(false); - const stored = await listRecentMergedPullRequests(env, "JSONbored/gittensory"); + const stored = await listRecentMergedPullRequests(env, "JSONbored/loopover"); expect(stored.map((row) => row.number).sort()).toEqual([501, 502]); expect(stored.every((row) => row.changedFiles.length === 0)).toBe(true); }); @@ -365,14 +365,14 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); await recordGitHubRateLimitObservation(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", resource: "rest", path: "/pulls", statusCode: 200, remaining: 200, resetAt: "2999-01-01T00:00:00.000Z", }); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 40, title: "Open PR under reduced budget", state: "open", @@ -383,7 +383,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); const urls = stubFetchTracking((url) => (url.includes("/pulls/40/files") ? Response.json([{ filename: "src/x.ts", status: "modified", additions: 1, deletions: 0, changes: 1 }]) : Response.json([]))); - const result = await backfillOpenPullRequestDetails(env, { repoFullName: "JSONbored/gittensory", mode: "light", cursor: 0 }); + const result = await backfillOpenPullRequestDetails(env, { repoFullName: "JSONbored/loopover", mode: "light", cursor: 0 }); expect(result.status).toBe("complete"); expect(urls.some((url) => url.includes("/pulls/40/files"))).toBe(true); @@ -412,11 +412,11 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { return Response.json([]); }); - await backfillRepositorySegment(env, { repoFullName: "JSONbored/gittensory", segment: "recent_merged_pull_requests", mode: "light" }); + await backfillRepositorySegment(env, { repoFullName: "JSONbored/loopover", segment: "recent_merged_pull_requests", mode: "light" }); // MERGED_PR_FILE_HYDRATION_BATCH_SIZE.light === 10, far under the 25 un-hydrated candidates in this page. expect(fetchedFileNumbers.length).toBe(10); - const stored = await listRecentMergedPullRequests(env, "JSONbored/gittensory"); + const stored = await listRecentMergedPullRequests(env, "JSONbored/loopover"); expect(stored).toHaveLength(25); expect(stored.filter((row) => row.changedFiles.length > 0)).toHaveLength(10); }); @@ -425,7 +425,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { resetMetrics(); const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 50, title: "Open PR (backfill caller)", state: "open", @@ -440,8 +440,8 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); // #50 is the only open PR at this point, so this call attributes exactly one fetch to "backfill_open_pr_details". - await backfillOpenPullRequestDetails(env, { repoFullName: "JSONbored/gittensory", mode: "light", cursor: 0 }); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await backfillOpenPullRequestDetails(env, { repoFullName: "JSONbored/loopover", mode: "light", cursor: 0 }); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 51, title: "Open PR (live review caller)", state: "open", @@ -450,8 +450,8 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { labels: [], body: "", }); - await refreshPullRequestDetails(env, "JSONbored/gittensory", 51); - await backfillRepositorySegment(env, { repoFullName: "JSONbored/gittensory", segment: "recent_merged_pull_requests", mode: "light" }); + await refreshPullRequestDetails(env, "JSONbored/loopover", 51); + await backfillRepositorySegment(env, { repoFullName: "JSONbored/loopover", segment: "recent_merged_pull_requests", mode: "light" }); const metrics = await renderMetrics(); expect(metrics).toContain('loopover_github_pull_request_files_fetch_total{caller="backfill_open_pr_details"} 1'); @@ -466,10 +466,10 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); // backfillRegisteredRepositories now gates on isInstalled, not isRegistered (#5021). - await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: true, owner: { login: "JSONbored" } }, 456); + await upsertRepositoryFromGitHub(env, { name: "loopover", full_name: "JSONbored/loopover", private: true, owner: { login: "JSONbored" } }, 456); let filesCallCount = 0; stubFetchTracking((url) => { - if (url.endsWith("/repos/JSONbored/gittensory")) return Response.json({ name: "gittensory", full_name: "JSONbored/gittensory", default_branch: "main", owner: { login: "JSONbored" } }); + if (url.endsWith("/repos/JSONbored/loopover")) return Response.json({ name: "loopover", full_name: "JSONbored/loopover", default_branch: "main", owner: { login: "JSONbored" } }); if (url.includes("/pulls?state=open")) { return Response.json([{ number: 60, title: "Open PR", state: "open", user: { login: "a" }, head: { sha: "head-60" }, labels: [], body: "" }]); } @@ -481,12 +481,12 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { }); // First run: cold cache, must fetch and then WRITE the snapshot marker. - await backfillRegisteredRepositories(env, { repoFullName: "JSONbored/gittensory", limits: { issues: 10, pullRequests: 10, recentMergedPullRequests: 10, pullRequestDetails: 10 } }); + await backfillRegisteredRepositories(env, { repoFullName: "JSONbored/loopover", limits: { issues: 10, pullRequests: 10, recentMergedPullRequests: 10, pullRequestDetails: 10 } }); expect(filesCallCount).toBe(1); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 60)).toMatchObject({ headSha: "head-60", status: "complete" }); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 60)).toMatchObject({ headSha: "head-60", status: "complete" }); // Second run, same head: the cache this path itself just wrote must be reused, not re-fetched. - await backfillRegisteredRepositories(env, { repoFullName: "JSONbored/gittensory", force: true, limits: { issues: 10, pullRequests: 10, recentMergedPullRequests: 10, pullRequestDetails: 10 } }); + await backfillRegisteredRepositories(env, { repoFullName: "JSONbored/loopover", force: true, limits: { issues: 10, pullRequests: 10, recentMergedPullRequests: 10, pullRequestDetails: 10 } }); expect(filesCallCount).toBe(1); }); @@ -494,7 +494,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { it("preserves an existing headSha (and other fields) when a later upsert omits them, as every 'running' pre-fetch stamp does", async () => { const env = createTestEnv(); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 90, status: "complete", headSha: "sha-a", @@ -505,9 +505,9 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { // The "running" pre-fetch stamp every backfill path sends touches ONLY status — headSha/filesSyncedAt/ // errorSummary are omitted (undefined), not explicitly cleared. The file cache depends on this NOT // wiping the row it is about to read. - await upsertPullRequestDetailSyncState(env, { repoFullName: "JSONbored/gittensory", pullNumber: 90, status: "running" }); + await upsertPullRequestDetailSyncState(env, { repoFullName: "JSONbored/loopover", pullNumber: 90, status: "running" }); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 90)).toMatchObject({ + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 90)).toMatchObject({ status: "running", headSha: "sha-a", filesSyncedAt: "2026-05-20T00:00:00.000Z", @@ -517,11 +517,11 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { it("clears headSha when a caller explicitly passes null, distinguishing 'omitted' from 'cleared'", async () => { const env = createTestEnv(); - await upsertPullRequestDetailSyncState(env, { repoFullName: "JSONbored/gittensory", pullNumber: 91, status: "complete", headSha: "sha-b" }); + await upsertPullRequestDetailSyncState(env, { repoFullName: "JSONbored/loopover", pullNumber: 91, status: "complete", headSha: "sha-b" }); - await upsertPullRequestDetailSyncState(env, { repoFullName: "JSONbored/gittensory", pullNumber: 91, status: "complete", headSha: null }); + await upsertPullRequestDetailSyncState(env, { repoFullName: "JSONbored/loopover", pullNumber: 91, status: "complete", headSha: null }); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 91)).toMatchObject({ headSha: null }); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 91)).toMatchObject({ headSha: null }); }); }); @@ -537,7 +537,7 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { const paths = ["src/z.ts", "src/a.ts", "src/m.ts"]; for (const path of paths) { await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 200, path, status: "modified", @@ -547,8 +547,8 @@ describe("GitHub PR file hydration scoping (#audit-rate-headroom)", () => { payload: {}, }); } - const first = await listPullRequestFiles(env, "JSONbored/gittensory", 200); - const second = await listPullRequestFiles(env, "JSONbored/gittensory", 200); + const first = await listPullRequestFiles(env, "JSONbored/loopover", 200); + const second = await listPullRequestFiles(env, "JSONbored/loopover", 200); expect(first.map((file) => file.path)).toEqual(["src/a.ts", "src/m.ts", "src/z.ts"]); expect(second.map((file) => file.path)).toEqual(first.map((file) => file.path)); }); diff --git a/test/unit/backfill-reviews-cache-scoping.test.ts b/test/unit/backfill-reviews-cache-scoping.test.ts index a10f35d6dd..b518787196 100644 --- a/test/unit/backfill-reviews-cache-scoping.test.ts +++ b/test/unit/backfill-reviews-cache-scoping.test.ts @@ -32,7 +32,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { await persistRegistrySnapshot( asCloudEnv(env), normalizeRegistryPayload( - { "JSONbored/gittensory": { emission_share: 0.01, issue_discovery_share: 0, trusted_label_pipeline: true, label_multipliers: {} } }, + { "JSONbored/loopover": { emission_share: 0.01, issue_discovery_share: 0, trusted_label_pipeline: true, label_multipliers: {} } }, { kind: "raw-github", url: "https://example.test/master_repositories.json" }, "2026-05-23T00:00:00.000Z", ), @@ -52,7 +52,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { it("fetches and stores reviews on first sync when no sync-state row exists (cache miss)", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 60, title: "Open PR, never synced", state: "open", @@ -67,12 +67,12 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 60); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 60); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/60/reviews"))).toBe(true); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 60)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 60)).toMatchObject({ status: "complete" }); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 60)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 60)).toMatchObject({ status: "complete" }); }); it("does not re-fetch reviews when reviewsSyncedAt is set and no invalidation has been recorded (cache hit), and leaves stored rows untouched", async () => { @@ -82,7 +82,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { vi.useFakeTimers({ toFake: ["Date"] }); vi.setSystemTime(new Date("2026-05-20T01:00:00.000Z")); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 61, title: "Open PR, reviews already synced", state: "open", @@ -92,8 +92,8 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestReview(env, { - id: "JSONbored/gittensory#61#1", - repoFullName: "JSONbored/gittensory", + id: "JSONbored/loopover#61#1", + repoFullName: "JSONbored/loopover", pullNumber: 61, reviewerLogin: "maintainer", state: "APPROVED", @@ -102,7 +102,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { payload: { id: 1 }, }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 61, status: "complete", headSha: "head-61", @@ -111,11 +111,11 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { }); const urls = stubFetchTracking((url) => (url.includes("/reviews") ? new Response("must not be called", { status: 500 }) : Response.json([]))); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 61); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 61); expect(result).toMatchObject({ status: "complete", warnings: [] }); expect(urls.some((url) => url.includes("/pulls/61/reviews"))).toBe(false); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 61)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 61)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); }); it("does not re-fetch reviews when reviewsInvalidatedAt predates reviewsSyncedAt (stale invalidation, still a cache hit)", async () => { @@ -125,7 +125,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { vi.useFakeTimers({ toFake: ["Date"] }); vi.setSystemTime(new Date("2026-05-20T01:00:00.000Z")); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 62, title: "Open PR, invalidation predates sync", state: "open", @@ -135,7 +135,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 62, status: "complete", headSha: "head-62", @@ -144,7 +144,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { }); const urls = stubFetchTracking((url) => (url.includes("/reviews") ? new Response("must not be called", { status: 500 }) : Response.json([]))); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 62); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 62); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/62/reviews"))).toBe(false); @@ -153,7 +153,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { it("REGRESSION (bounded-age backstop): an unparseable reviewsSyncedAt is treated as stale (NaN branch, miss) rather than throwing", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 68, title: "Open PR, unparseable review marker", state: "open", @@ -163,7 +163,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 68, status: "complete", headSha: "head-68", @@ -175,7 +175,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 68); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 68); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/68/reviews"))).toBe(true); @@ -184,7 +184,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { it("re-fetches reviews on the next sync after markPullRequestReviewsInvalidated bumps reviewsInvalidatedAt past reviewsSyncedAt (cache invalidation)", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 63, title: "Open PR, invalidated after sync", state: "open", @@ -194,15 +194,15 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 63, status: "complete", headSha: "head-63", reviewsSyncedAt: "2026-05-20T00:00:00.000Z", }); - await markPullRequestReviewsInvalidated(env, "JSONbored/gittensory", 63); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 63)).toMatchObject({ + await markPullRequestReviewsInvalidated(env, "JSONbored/loopover", 63); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 63)).toMatchObject({ reviewsSyncedAt: "2026-05-20T00:00:00.000Z", status: "complete", headSha: "head-63", @@ -214,17 +214,17 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 63); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 63); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/63/reviews"))).toBe(true); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 63)).toEqual([expect.objectContaining({ reviewerLogin: "second-reviewer", state: "CHANGES_REQUESTED" })]); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 63)).toEqual([expect.objectContaining({ reviewerLogin: "second-reviewer", state: "CHANGES_REQUESTED" })]); }); it("REGRESSION (gate finding): a FAILED review fetch never advances reviewsSyncedAt, so the next sync retries instead of trusting a false cache hit", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 65, title: "Open PR, review fetch fails on first sync", state: "open", @@ -237,14 +237,14 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { // stub — any unstubbed URL, including the GraphQL fallback, falls through to a 404). const firstPassUrls = stubFetchTracking((url) => (url.includes("/pulls/65/reviews") ? new Response("review failure", { status: 503 }) : Response.json([]))); - const firstResult = await refreshPullRequestDetails(env, "JSONbored/gittensory", 65); + const firstResult = await refreshPullRequestDetails(env, "JSONbored/loopover", 65); expect(firstResult.status).toBe("partial"); expect(firstPassUrls.some((url) => url.includes("/pulls/65/reviews"))).toBe(true); // The FAILED attempt must NOT advance reviewsSyncedAt — a stored value here (as the pre-fix code produced, // stamping it unconditionally regardless of success) would let the next pass wrongly treat the failed // fetch as a valid cache hit and never retry. - expect((await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 65))?.reviewsSyncedAt).toBeFalsy(); + expect((await getPullRequestDetailSyncState(env, "JSONbored/loopover", 65))?.reviewsSyncedAt).toBeFalsy(); // Second pass: reviews now succeed — since reviewsSyncedAt is still unset, this MUST be treated as a cache // miss and genuinely refetched (not skipped). @@ -254,19 +254,19 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - const secondResult = await refreshPullRequestDetails(env, "JSONbored/gittensory", 65); + const secondResult = await refreshPullRequestDetails(env, "JSONbored/loopover", 65); expect(secondResult.status).toBe("complete"); expect(secondPassUrls.some((url) => url.includes("/pulls/65/reviews"))).toBe(true); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 65)).toEqual([expect.objectContaining({ reviewerLogin: "late-reviewer" })]); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 65)).toEqual([expect.objectContaining({ reviewerLogin: "late-reviewer" })]); // The now-successful sync DOES advance reviewsSyncedAt. - expect((await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 65))?.reviewsSyncedAt).toBeTruthy(); + expect((await getPullRequestDetailSyncState(env, "JSONbored/loopover", 65))?.reviewsSyncedAt).toBeTruthy(); }); it("REGRESSION (gate finding, TOCTOU race): a pull_request_review webhook racing in DURING a sync still forces a retry on the next pass", async () => { const env = createTestEnv({ GITHUB_PUBLIC_TOKEN: "public-token" }); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 68, title: "Open PR, invalidation races in mid-sync", state: "open", @@ -283,18 +283,18 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { let racingInvalidationDone = false; const urls = stubFetchTracking(async (url) => { if (url.includes("/pulls/68/reviews")) { - await markPullRequestReviewsInvalidated(env, "JSONbored/gittensory", 68); + await markPullRequestReviewsInvalidated(env, "JSONbored/loopover", 68); racingInvalidationDone = true; return Response.json([{ id: 1, user: { login: "reviewer" }, state: "APPROVED", author_association: "NONE", submitted_at: "2026-05-22T00:00:00.000Z" }]); } return Response.json([]); }); - await refreshPullRequestDetails(env, "JSONbored/gittensory", 68); + await refreshPullRequestDetails(env, "JSONbored/loopover", 68); expect(racingInvalidationDone).toBe(true); expect(urls.some((url) => url.includes("/pulls/68/reviews"))).toBe(true); - const stateAfterRace = await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 68); + const stateAfterRace = await getPullRequestDetailSyncState(env, "JSONbored/loopover", 68); expect(stateAfterRace?.reviewsSyncedAt).toBeTruthy(); expect(stateAfterRace?.reviewsInvalidatedAt).toBeTruthy(); // The stored reviewsSyncedAt was captured BEFORE the fetch started (and therefore no later than the @@ -313,10 +313,10 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - await refreshPullRequestDetails(env, "JSONbored/gittensory", 68); + await refreshPullRequestDetails(env, "JSONbored/loopover", 68); expect(followUpUrls.some((url) => url.includes("/pulls/68/reviews"))).toBe(true); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 68)).toEqual( + expect(await listPullRequestReviews(env, "JSONbored/loopover", 68)).toEqual( expect.arrayContaining([expect.objectContaining({ reviewerLogin: "second-reviewer", state: "CHANGES_REQUESTED" })]), ); }); @@ -328,7 +328,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { vi.useFakeTimers({ toFake: ["Date"] }); vi.setSystemTime(new Date("2026-05-20T01:00:00.000Z")); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 66, title: "Open PR, prior FILES failure only", state: "open", @@ -338,8 +338,8 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestReview(env, { - id: "JSONbored/gittensory#66#1", - repoFullName: "JSONbored/gittensory", + id: "JSONbored/loopover#66#1", + repoFullName: "JSONbored/loopover", pullNumber: 66, reviewerLogin: "maintainer", state: "APPROVED", @@ -348,7 +348,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { payload: { id: 1 }, }); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 66, status: "partial", // headSha intentionally omitted/mismatched so files remain "not up to date" too — the point of this @@ -358,11 +358,11 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { }); const urls = stubFetchTracking((url) => (url.includes("/pulls/66/reviews") ? new Response("must not be called", { status: 500 }) : Response.json([]))); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 66); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 66); expect(result).toMatchObject({ status: "complete" }); expect(urls.some((url) => url.includes("/pulls/66/reviews"))).toBe(false); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 66)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer" })]); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 66)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer" })]); }); it("REGRESSION: a head SHA change alone does not invalidate cached reviews (reviews are independent of the head, unlike files)", async () => { @@ -372,7 +372,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { vi.useFakeTimers({ toFake: ["Date"] }); vi.setSystemTime(new Date("2026-05-20T01:00:00.000Z")); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 64, title: "Open PR, new commit pushed", state: "open", @@ -382,8 +382,8 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestReview(env, { - id: "JSONbored/gittensory#64#1", - repoFullName: "JSONbored/gittensory", + id: "JSONbored/loopover#64#1", + repoFullName: "JSONbored/loopover", pullNumber: 64, reviewerLogin: "maintainer", state: "APPROVED", @@ -394,7 +394,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { // Sync state was stamped for a DIFFERENT (older) head SHA — files caching would treat this as stale, but // reviews caching must not, since reviews.reviewsSyncedAt has no head-SHA gate at all. await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 64, status: "complete", headSha: "head-old", @@ -409,14 +409,14 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 64); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 64); expect(result).toMatchObject({ status: "complete" }); // Files WERE refetched (head changed)... expect(urls.some((url) => url.includes("/pulls/64/files"))).toBe(true); // ...but reviews were NOT — the core distinction from the files cache. expect(urls.some((url) => url.includes("/pulls/64/reviews"))).toBe(false); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 64)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 64)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); }); it("REGRESSION (gate finding): a manual force-files refresh does not also force an unrelated reviews refetch", async () => { @@ -426,7 +426,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { vi.useFakeTimers({ toFake: ["Date"] }); vi.setSystemTime(new Date("2026-05-20T01:00:00.000Z")); await seedRegisteredRepo(env); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 67, title: "Open PR, manual force-files refresh", state: "open", @@ -436,8 +436,8 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { body: "", }); await upsertPullRequestReview(env, { - id: "JSONbored/gittensory#67#1", - repoFullName: "JSONbored/gittensory", + id: "JSONbored/loopover#67#1", + repoFullName: "JSONbored/loopover", pullNumber: 67, reviewerLogin: "maintainer", state: "APPROVED", @@ -450,7 +450,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { // skipped the whole sync-state row lookup whenever `forceFiles && headSha`, which zeroed out // `reviewsUpToDate` too and forced an unrelated reviews refetch on every manual files-only force). await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 67, status: "complete", headSha: "head-67", @@ -465,24 +465,24 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { : Response.json([]), ); - const result = await refreshPullRequestDetails(env, "JSONbored/gittensory", 67, { force: true }); + const result = await refreshPullRequestDetails(env, "JSONbored/loopover", 67, { force: true }); expect(result).toMatchObject({ status: "complete" }); // Files WERE refetched (force: true)... expect(urls.some((url) => url.includes("/pulls/67/files"))).toBe(true); // ...but reviews were NOT — forceFiles must never bleed into the (unrelated) reviews cache decision. expect(urls.some((url) => url.includes("/pulls/67/reviews"))).toBe(false); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 67)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 67)).toEqual([expect.objectContaining({ reviewerLogin: "maintainer", state: "APPROVED" })]); }); describe("markPullRequestReviewsInvalidated", () => { it("creates a sync-state row if none exists yet", async () => { const env = createTestEnv(); - expect(await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 70)).toBeNull(); + expect(await getPullRequestDetailSyncState(env, "JSONbored/loopover", 70)).toBeNull(); - await markPullRequestReviewsInvalidated(env, "JSONbored/gittensory", 70); + await markPullRequestReviewsInvalidated(env, "JSONbored/loopover", 70); - const state = await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 70); + const state = await getPullRequestDetailSyncState(env, "JSONbored/loopover", 70); expect(state).not.toBeNull(); expect(state?.reviewsInvalidatedAt).toBeTruthy(); }); @@ -490,7 +490,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { it("updates ONLY reviewsInvalidatedAt when a row already exists, leaving filesSyncedAt/reviewsSyncedAt/checksSyncedAt/headSha unchanged", async () => { const env = createTestEnv(); await upsertPullRequestDetailSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 71, status: "complete", headSha: "sha-preserved", @@ -500,9 +500,9 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { errorSummary: "prior warning", }); - await markPullRequestReviewsInvalidated(env, "JSONbored/gittensory", 71); + await markPullRequestReviewsInvalidated(env, "JSONbored/loopover", 71); - const state = await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 71); + const state = await getPullRequestDetailSyncState(env, "JSONbored/loopover", 71); expect(state).toMatchObject({ status: "complete", headSha: "sha-preserved", @@ -534,10 +534,10 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { return realPrepare(sql); }); - await markPullRequestReviewsInvalidated(env, "JSONbored/gittensory", 72); + await markPullRequestReviewsInvalidated(env, "JSONbored/loopover", 72); expect(calls).toBeGreaterThan(2); - const state = await getPullRequestDetailSyncState(env, "JSONbored/gittensory", 72); + const state = await getPullRequestDetailSyncState(env, "JSONbored/loopover", 72); expect(state?.reviewsInvalidatedAt).toBeTruthy(); }); @@ -554,7 +554,7 @@ describe("GitHub PR reviews cache scoping (#2537)", () => { }) as unknown as ReturnType, ); - await expect(markPullRequestReviewsInvalidated(env, "JSONbored/gittensory", 73)).rejects.toThrow(); + await expect(markPullRequestReviewsInvalidated(env, "JSONbored/loopover", 73)).rejects.toThrow(); }); }); diff --git a/test/unit/backup-script.test.ts b/test/unit/backup-script.test.ts index b33d00d94b..440759614c 100644 --- a/test/unit/backup-script.test.ts +++ b/test/unit/backup-script.test.ts @@ -80,10 +80,10 @@ exit 0 `; function createHarness() { - const dir = mkdtempSync(join(tmpdir(), "gittensory-backup-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-backup-")); const binDir = join(dir, "bin"); const outDir = join(dir, "backups"); - const dbPath = join(dir, "gittensory.sqlite"); + const dbPath = join(dir, "loopover.sqlite"); mkdirSync(binDir); writeFileSync(dbPath, "dummy-db"); // must exist so `[ -f "$DB" ]` is true const stub = join(binDir, "sqlite3"); @@ -218,7 +218,7 @@ describe("scripts/backup.sh sqlite online-backup verification (#2084)", () => { it("records a postgres dump artifact when postgres backup succeeds", () => { const res = runBackup(harness, "ok", { - databaseUrl: "postgresql://backup@example.invalid/gittensory", + databaseUrl: "postgresql://backup@example.invalid/loopover", }); expect(res.status).toBe(0); @@ -240,8 +240,8 @@ describe("scripts/backup.sh sqlite online-backup verification (#2084)", () => { // failed backup it would prune these down to 1, so preserving BOTH proves the skip. const sqliteDir = join(harness.outDir, "sqlite"); mkdirSync(sqliteDir, { recursive: true }); - writeFileSync(join(sqliteDir, "gittensory-OLD1.sqlite.gz"), "old-good-1"); - writeFileSync(join(sqliteDir, "gittensory-OLD2.sqlite.gz"), "old-good-2"); + writeFileSync(join(sqliteDir, "loopover-OLD1.sqlite.gz"), "old-good-1"); + writeFileSync(join(sqliteDir, "loopover-OLD2.sqlite.gz"), "old-good-2"); const res = runBackup(harness, "corrupt"); @@ -252,13 +252,13 @@ describe("scripts/backup.sh sqlite online-backup verification (#2084)", () => { // retention-skip is logged and the previously-good backups both survive expect(res.stdout).toContain("skipping sqlite retention"); const files = readdirSync(sqliteDir); - expect(files).toContain("gittensory-OLD1.sqlite.gz"); - expect(files).toContain("gittensory-OLD2.sqlite.gz"); + expect(files).toContain("loopover-OLD1.sqlite.gz"); + expect(files).toContain("loopover-OLD2.sqlite.gz"); // the corrupt/partial uncompressed file was removed, and no new gz was produced expect(files.filter((f) => f.endsWith(".sqlite")).length).toBe(0); expect(files.filter((f) => f.endsWith(".sqlite.gz")).sort()).toEqual([ - "gittensory-OLD1.sqlite.gz", - "gittensory-OLD2.sqlite.gz", + "loopover-OLD1.sqlite.gz", + "loopover-OLD2.sqlite.gz", ]); }); }); diff --git a/test/unit/changed-files-summary-collapsible.test.ts b/test/unit/changed-files-summary-collapsible.test.ts index df41861791..38e74ad8bc 100644 --- a/test/unit/changed-files-summary-collapsible.test.ts +++ b/test/unit/changed-files-summary-collapsible.test.ts @@ -226,7 +226,7 @@ describe("buildUnifiedCommentBody changedFilesSummary wiring (#1957 / #2145)", ( const body = buildUnifiedCommentBody({ ...base, changedFilesSummary: files, - beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }], + beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }], }); expect(body).toContain("Changed files"); expect(body).toContain("Visual preview"); diff --git a/test/unit/check-engine-parity-script.test.ts b/test/unit/check-engine-parity-script.test.ts index 65dfbd4793..f060397770 100644 --- a/test/unit/check-engine-parity-script.test.ts +++ b/test/unit/check-engine-parity-script.test.ts @@ -509,7 +509,7 @@ describe("check-engine-parity script", () => { it("runEngineParityMain returns 1 and logs failures when checks fail", () => { const errorLog = vi.spyOn(console, "error").mockImplementation(() => {}); - const exitCode = runEngineParityMain("/definitely-not-a-gittensory-root"); + const exitCode = runEngineParityMain("/definitely-not-a-loopover-root"); expect(exitCode).toBe(1); expect(errorLog).toHaveBeenCalled(); }); diff --git a/test/unit/ci-generated-artifact-drift-checks.test.ts b/test/unit/ci-generated-artifact-drift-checks.test.ts index dd2b5a694e..38fd6b7bbf 100644 --- a/test/unit/ci-generated-artifact-drift-checks.test.ts +++ b/test/unit/ci-generated-artifact-drift-checks.test.ts @@ -48,7 +48,7 @@ describe("generated-artifact drift checks are wired into CI, not just local test expect(String(step!.run)).toBe(command); // Gated on backend OR ui (not backend alone): the generated artifact each check validates lives under // apps/loopover-ui/**, so a UI-only edit that hand-desyncs it from its source of truth must still - // re-trigger the check, not just a backend source change (#gittensory-pr-3254-review). + // re-trigger the check, not just a backend source change (#loopover-pr-3254-review). const condition = String(step!.if); expect(condition).toContain("needs.changes.outputs.backend == 'true'"); expect(condition).toContain("needs.changes.outputs.ui == 'true'"); diff --git a/test/unit/command-authorization-engine.test.ts b/test/unit/command-authorization-engine.test.ts index 1c082bcefe..0d6c7d1bd5 100644 --- a/test/unit/command-authorization-engine.test.ts +++ b/test/unit/command-authorization-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { commandAuthorizationAllowedRoles, diff --git a/test/unit/command-feedback.test.ts b/test/unit/command-feedback.test.ts index 2ac8ffb27a..f81595a21e 100644 --- a/test/unit/command-feedback.test.ts +++ b/test/unit/command-feedback.test.ts @@ -15,7 +15,7 @@ describe("command usefulness feedback storage", () => { await recordAgentCommandFeedback(env, { id: "feedback-initial", answerId: "answer-preflight", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 77, command: "preflight", actorLogin: "Oktofeesh1", @@ -28,7 +28,7 @@ describe("command usefulness feedback storage", () => { }); await recordAgentCommandFeedback(env, { answerId: "answer-preflight", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 77, command: "preflight", actorLogin: "oktofeesh1", @@ -40,7 +40,7 @@ describe("command usefulness feedback storage", () => { }); await recordAgentCommandFeedback(env, { answerId: "answer-preflight", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 77, command: "preflight", actorLogin: "maintainer", @@ -85,13 +85,13 @@ describe("command usefulness feedback storage", () => { it("upserts answer metadata and filters usefulness windows deterministically", async () => { const env = createTestEnv(); await upsertAgentCommandAnswer(env, answer({ id: "answer-new", command: "blockers", responseCommentId: 10 })); - await upsertAgentCommandAnswer(env, answer({ id: "answer-new", command: "blockers", responseCommentId: 11, responseUrl: "https://github.com/JSONbored/gittensory/pull/1#issuecomment-11" })); + await upsertAgentCommandAnswer(env, answer({ id: "answer-new", command: "blockers", responseCommentId: 11, responseUrl: "https://github.com/JSONbored/loopover/pull/1#issuecomment-11" })); await upsertAgentCommandAnswer(env, answer({ id: "answer-old", command: "next-action" })); await expect(getAgentCommandAnswer(env, "answer-new")).resolves.toMatchObject({ id: "answer-new", responseCommentId: 11, - responseUrl: "https://github.com/JSONbored/gittensory/pull/1#issuecomment-11", + responseUrl: "https://github.com/JSONbored/loopover/pull/1#issuecomment-11", }); await recordAgentCommandFeedback(env, feedback({ answerId: "answer-new", command: "blockers", actorLogin: "reviewer", updatedAt: "2026-05-28T00:00:00.000Z" })); @@ -110,7 +110,7 @@ describe("command usefulness feedback storage", () => { function answer(overrides: Partial[1]> = {}): Parameters[1] { return { id: "answer", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 77, command: "preflight", requestCommentId: 1, @@ -127,7 +127,7 @@ function answer(overrides: Partial[1 function feedback(overrides: Partial[1]> = {}): Parameters[1] { return { answerId: "answer", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 77, command: "preflight", actorLogin: "reviewer", diff --git a/test/unit/content-lane-security-scan.test.ts b/test/unit/content-lane-security-scan.test.ts index d4ebb2ae77..0ed0c655de 100644 --- a/test/unit/content-lane-security-scan.test.ts +++ b/test/unit/content-lane-security-scan.test.ts @@ -21,7 +21,7 @@ describe("scanForSecrets", () => { }); // #4284: AWS's own officially published documentation placeholder caused 4 false-positive closes in - // gittensory's own subprocess-env-redaction-helper epic before this exclusion existed. Assembled from + // loopover's own subprocess-env-redaction-helper epic before this exclusion existed. Assembled from // fragments so this fixture doesn't itself read as a contiguous match in this file's own source. it("does NOT flag AWS's own officially published documentation example key", () => { expect(scanForSecrets("AKIA" + "IOSFODNN7EXAMPLE").kinds).not.toContain("aws_access_key"); @@ -144,7 +144,7 @@ describe("scanForSecrets", () => { }); // #4579-followup: confirmed live false positives (awesome-claude#4758 "embedded_secret: - // unsafe_install_or_secret"; the same known fixture shape as metagraphed/gittensory#4524's + // unsafe_install_or_secret"; the same known fixture shape as metagraphed/loopover#4524's // "token: default-session-token") -- these exact literals are enum/fixture names, not credentials. it.each([ ["session-token fixture", 'token: "default-session-token"'], diff --git a/test/unit/content-lane-wire.test.ts b/test/unit/content-lane-wire.test.ts index 84532e4875..f62dd8deb6 100644 --- a/test/unit/content-lane-wire.test.ts +++ b/test/unit/content-lane-wire.test.ts @@ -138,7 +138,7 @@ describe("applySurfaceGate", () => { code: "ai_consensus_defect", title: "AI reviewers agree on a likely critical defect", severity: "critical", - detail: "provider is set to \"gittensory\" (an unrelated tool's slug) instead of \"gittensor\"", + detail: "provider is set to \"loopover\" (an unrelated tool's slug) instead of \"gittensor\"", }; const genericAiOnly = gate({ conclusion: "failure", blockers: [providerMisattribution], warnings: [] }); const surfaceMerge = gate({ conclusion: "success", title: "Surface", summary: "structurally valid entry" }); @@ -408,7 +408,7 @@ describe("evaluateWithSurfaceLane (the processor seam helper)", () => { code: "ai_consensus_defect", title: "AI reviewers agree on a likely critical defect", severity: "critical", - detail: "provider is set to \"gittensory\" instead of \"gittensor\"", + detail: "provider is set to \"loopover\" instead of \"gittensor\"", }; const advisory = { findings: [providerMisattribution] }; const genericAiOnly = gate({ conclusion: "failure", blockers: [providerMisattribution], warnings: [] }); diff --git a/test/unit/contributor-blacklist-engine.test.ts b/test/unit/contributor-blacklist-engine.test.ts index 783bb08abc..17da65fc4b 100644 --- a/test/unit/contributor-blacklist-engine.test.ts +++ b/test/unit/contributor-blacklist-engine.test.ts @@ -1,4 +1,4 @@ -// AUTO-GENERATED-STYLE mirror of the app suite to cover the gittensory-engine copy (#2280). +// AUTO-GENERATED-STYLE mirror of the app suite to cover the loopover-engine copy (#2280). // DB round-trip cases stay in the app suite; the engine package only owns the pure normalizers. import { describe, expect, it } from "vitest"; import { findBlacklistEntry, isAuthorBlacklisted, mergeContributorBlacklists, normalizeContributorBlacklist } from "../../packages/loopover-engine/src/settings/contributor-blacklist"; diff --git a/test/unit/contributor-fit.test.ts b/test/unit/contributor-fit.test.ts index 24a59e1d8a..ba2ead76bf 100644 --- a/test/unit/contributor-fit.test.ts +++ b/test/unit/contributor-fit.test.ts @@ -10,7 +10,7 @@ function profile(overrides: Partial = {}): ContributorFit registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 9, - reposTouched: ["JSONbored/gittensory"], + reposTouched: ["JSONbored/loopover"], }, trustSignals: { level: "established", unlinkedOpenPullRequests: 0 }, ...overrides, @@ -33,24 +33,24 @@ describe("classifyContributorFit", () => { const result = profile({ trustSignals: { level: "established", unlinkedOpenPullRequests: 3 }, }); - const { fit, reasons } = classifyContributorFit(result, "JSONbored/gittensory"); + const { fit, reasons } = classifyContributorFit(result, "JSONbored/loopover"); expect(fit).toBe("weak"); expect(reasons).toContain("3 unlinked open pull request(s)"); }); it("is weak for a new profile whose few attempts mostly failed to merge", () => { const result = profile({ - registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 2, reposTouched: ["JSONbored/gittensory"] }, + registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 2, reposTouched: ["JSONbored/loopover"] }, trustSignals: { level: "new", unlinkedOpenPullRequests: 0 }, }); - const { fit, reasons } = classifyContributorFit(result, "JSONbored/gittensory"); + const { fit, reasons } = classifyContributorFit(result, "JSONbored/loopover"); expect(fit).toBe("weak"); expect(reasons).toContain("new profile with low merge ratio (2/10)"); }); it("is strong for an established profile with a clean queue and a high merge ratio", () => { const result = profile(); - const { fit, reasons } = classifyContributorFit(result, "JSONbored/gittensory"); + const { fit, reasons } = classifyContributorFit(result, "JSONbored/loopover"); expect(fit).toBe("strong"); expect(reasons).toContain("trust level is 'established'"); expect(reasons).toContain("no unlinked open pull requests"); @@ -59,10 +59,10 @@ describe("classifyContributorFit", () => { it("is neutral when history exists but signals are mixed (emerging, clean queue, mid merge ratio)", () => { const result = profile({ - registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 6, reposTouched: ["JSONbored/gittensory"] }, + registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 6, reposTouched: ["JSONbored/loopover"] }, trustSignals: { level: "emerging", unlinkedOpenPullRequests: 0 }, }); - const { fit, reasons } = classifyContributorFit(result, "JSONbored/gittensory"); + const { fit, reasons } = classifyContributorFit(result, "JSONbored/loopover"); expect(fit).toBe("neutral"); expect(reasons).toContain("no unlinked open pull requests"); expect(reasons.some((r) => r.startsWith("strong merge ratio"))).toBe(false); @@ -70,10 +70,10 @@ describe("classifyContributorFit", () => { it("is neutral for touched-repo history with no recorded pull-request count", () => { const result = profile({ - registeredRepoActivity: { pullRequests: 0, mergedPullRequests: 0, reposTouched: ["JSONbored/gittensory"] }, + registeredRepoActivity: { pullRequests: 0, mergedPullRequests: 0, reposTouched: ["JSONbored/loopover"] }, trustSignals: { level: "established", unlinkedOpenPullRequests: 0 }, }); - const { fit, reasons } = classifyContributorFit(result, "JSONbored/gittensory"); + const { fit, reasons } = classifyContributorFit(result, "JSONbored/loopover"); expect(fit).toBe("neutral"); expect(reasons).toContain("trust level is 'established'"); expect(reasons).toContain("no unlinked open pull requests"); @@ -84,22 +84,22 @@ describe("classifyContributorFit", () => { registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 9, - reposTouched: ["JSONbored/gittensory"], + reposTouched: ["JSONbored/loopover"], }, trustSignals: { level: "established", unlinkedOpenPullRequests: 0 }, }); - expect(classifyContributorFit(result, "jsonbored/gittensory").fit).toBe("strong"); - expect(classifyContributorFit(result, "JSONBORED/Gittensory").fit).toBe("strong"); + expect(classifyContributorFit(result, "jsonbored/loopover").fit).toBe("strong"); + expect(classifyContributorFit(result, "JSONBORED/Loopover").fit).toBe("strong"); }); it("matches the exact verdicts across the strong/neutral/weak axis", () => { const strong = profile(); const weak = profile({ trustSignals: { level: "established", unlinkedOpenPullRequests: 1 } }); const neutral = profile({ - registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 6, reposTouched: ["JSONbored/gittensory"] }, + registeredRepoActivity: { pullRequests: 10, mergedPullRequests: 6, reposTouched: ["JSONbored/loopover"] }, trustSignals: { level: "emerging", unlinkedOpenPullRequests: 0 }, }); - const verdicts = [strong, weak, neutral].map((p) => classifyContributorFit(p, "JSONbored/gittensory").fit); + const verdicts = [strong, weak, neutral].map((p) => classifyContributorFit(p, "JSONbored/loopover").fit); expect(verdicts).toEqual(["strong", "weak", "neutral"]); }); }); diff --git a/test/unit/contributor-issue-draft.test.ts b/test/unit/contributor-issue-draft.test.ts index cf087afdf8..a38b05f1fc 100644 --- a/test/unit/contributor-issue-draft.test.ts +++ b/test/unit/contributor-issue-draft.test.ts @@ -35,7 +35,7 @@ const LOOPOVER_MANIFEST = parseFocusManifestContent( function openIssue(number: number, title: string, body?: string): IssueRecord { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", number, title, state: "open", @@ -102,7 +102,7 @@ describe("contributor issue drafts", () => { }); it("builds candidates from policy warnings, upstream drift, and wanted paths", () => { - const repoFullName = "JSONbored/gittensory"; + const repoFullName = "JSONbored/loopover"; const repo = { fullName: repoFullName, isRegistered: true } as never; const issues: IssueRecord[] = []; const pullRequests: never[] = []; @@ -125,7 +125,7 @@ describe("contributor issue drafts", () => { contributorIntakeHealth, focusManifest: manifest, openIssues: [], - upstreamDriftWarnings: ["Upstream registry drift is open for JSONbored/gittensory: maintainerCut changed."], + upstreamDriftWarnings: ["Upstream registry drift is open for JSONbored/loopover: maintainerCut changed."], }); expect(candidates.some((entry) => entry.topic === "policy:focus_policy_missing")).toBe(true); expect(candidates.some((entry) => entry.topic === "upstream:registry_drift")).toBe(true); @@ -135,7 +135,7 @@ describe("contributor issue drafts", () => { it("dry-run no-create test leaves GitHub untouched", async () => { const fetchSpy = vi.spyOn(globalThis, "fetch"); const env = createTestEnv(); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { dryRun: true, limit: 2 }); + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: true, limit: 2 }); expect(result.dryRun).toBe(true); expect(result.createRequested).toBe(false); expect(result.created).toBe(0); @@ -146,8 +146,8 @@ describe("contributor issue drafts", () => { it("normalizes draft limits to at least one and caps excessive values", async () => { const env = createTestEnv(); - const low = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { dryRun: true, limit: 0 }); - const high = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { dryRun: true, limit: 100 }); + const low = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: true, limit: 0 }); + const high = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: true, limit: 100 }); expect(low.drafts.length).toBeLessThanOrEqual(1); expect(high.drafts.length).toBeLessThanOrEqual(20); }); @@ -158,7 +158,7 @@ describe("contributor issue drafts", () => { vi.fn(async () => Response.json({ number: 501, - html_url: "https://github.com/JSONbored/gittensory/issues/501", + html_url: "https://github.com/JSONbored/loopover/issues/501", }), ), ); @@ -168,21 +168,21 @@ describe("contributor issue drafts", () => { wantedPaths: ["src/unique-path-119/"], testExpectations: ["npm run test:ci"], }; - const repo = { fullName: "JSONbored/gittensory", isRegistered: true } as never; - const collisions = buildCollisionReport("JSONbored/gittensory", [], []); + const repo = { fullName: "JSONbored/loopover", isRegistered: true } as never; + const collisions = buildCollisionReport("JSONbored/loopover", [], []); const policy = buildRepoPolicyReadiness({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", focusManifest: manifest, settings: { requireLinkedIssue: false } as never, - lane: buildLaneAdvice(repo, "JSONbored/gittensory"), - configQuality: buildConfigQuality(repo, [], [], "JSONbored/gittensory"), - labelAudit: buildLabelAudit(repo, [], [], [], "JSONbored/gittensory"), + lane: buildLaneAdvice(repo, "JSONbored/loopover"), + configQuality: buildConfigQuality(repo, [], [], "JSONbored/loopover"), + labelAudit: buildLabelAudit(repo, [], [], [], "JSONbored/loopover"), queueHealth: buildQueueHealth(repo, [], [], collisions, { openIssues: 0, openPullRequests: 0 }), - contributorIntakeHealth: buildContributorIntakeHealth(repo, [], [], "JSONbored/gittensory", collisions, { openIssues: 0, openPullRequests: 0 }), + contributorIntakeHealth: buildContributorIntakeHealth(repo, [], [], "JSONbored/loopover", collisions, { openIssues: 0, openPullRequests: 0 }), }); expect(policy.publicWarnings.length).toBeGreaterThan(0); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: false, create: true, limit: 1, @@ -229,7 +229,7 @@ describe("contributor issue drafts", () => { }); it("detects declined drafts by stable marker with wontfix and cooldown policy", async () => { - const fingerprint = await contributorIssueDraftFingerprint("JSONbored/gittensory", "policy:focus_policy_missing", "policy:focus_policy_missing"); + const fingerprint = await contributorIssueDraftFingerprint("JSONbored/loopover", "policy:focus_policy_missing", "policy:focus_policy_missing"); const marker = contributorIssueDraftMarker(fingerprint); const closed = (over: Partial): IssueRecord => ({ ...openIssue(5, "feat(issues): address focus-policy-missing policy readiness for repo", marker), @@ -350,7 +350,7 @@ describe("contributor issue drafts", () => { const env = createTestEnv(); vi.spyOn(repositories, "listOpenIssues").mockResolvedValue([]); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: false, create: true, limit: 1, @@ -365,7 +365,7 @@ describe("contributor issue drafts", () => { const env = createTestEnv({ LOOPOVER_CONTRIBUTOR_ISSUE_TOKEN: "token" }); vi.spyOn(repositories, "listOpenIssues").mockResolvedValue([]); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: false, create: true, limit: 1, @@ -380,14 +380,14 @@ describe("contributor issue drafts", () => { vi.fn(async () => Response.json({ number: 501, - html_url: "https://github.com/JSONbored/gittensory/issues/501", + html_url: "https://github.com/JSONbored/loopover/issues/501", }), ), ); const auditSpy = vi.spyOn(repositories, "recordAuditEvent").mockResolvedValue(undefined); vi.spyOn(repositories, "listOpenIssues").mockResolvedValue([]); const env = createTestEnv({ LOOPOVER_CONTRIBUTOR_ISSUE_TOKEN: "token" }); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: false, create: true, limit: 1, @@ -495,7 +495,7 @@ describe("contributor issue drafts", () => { vi.stubGlobal("fetch", vi.fn(async () => Response.json({ html_url: "https://github.com/x/y/issues/1" }))); const env = createTestEnv({ LOOPOVER_CONTRIBUTOR_ISSUE_TOKEN: "token" }); vi.spyOn(repositories, "listOpenIssues").mockResolvedValue([]); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: false, create: true, limit: 1, @@ -530,14 +530,14 @@ describe("contributor issue drafts", () => { vi.fn(async () => Response.json({ number: 502, - html_url: "https://github.com/JSONbored/gittensory/issues/502", + html_url: "https://github.com/JSONbored/loopover/issues/502", }), ), ); const auditSpy = vi.spyOn(repositories, "recordAuditEvent").mockResolvedValue(undefined); vi.spyOn(repositories, "listOpenIssues").mockResolvedValue([]); const env = createTestEnv({ LOOPOVER_CONTRIBUTOR_ISSUE_TOKEN: "token" }); - const result = await generateContributorIssueDrafts(env, "JSONbored/gittensory", { + const result = await generateContributorIssueDrafts(env, "JSONbored/loopover", { dryRun: false, create: true, }); diff --git a/test/unit/crypto-secret.test.ts b/test/unit/crypto-secret.test.ts index 6c21647e2d..d8d5a56df5 100644 --- a/test/unit/crypto-secret.test.ts +++ b/test/unit/crypto-secret.test.ts @@ -17,8 +17,8 @@ describe("sha256Hex", () => { }); it("is deterministic and returns lowercase 64-char hex", async () => { - const first = await sha256Hex("gittensory"); - const second = await sha256Hex("gittensory"); + const first = await sha256Hex("loopover"); + const second = await sha256Hex("loopover"); expect(first).toBe(second); expect(first).toMatch(/^[0-9a-f]{64}$/); }); diff --git a/test/unit/cutover-gate.test.ts b/test/unit/cutover-gate.test.ts index cb2f9798b0..12e3742c1f 100644 --- a/test/unit/cutover-gate.test.ts +++ b/test/unit/cutover-gate.test.ts @@ -3,7 +3,7 @@ import { isConvergenceRepoAllowed, listConvergenceRepos } from "../../src/review describe("listConvergenceRepos — the configured repo set (for proactive RAG indexing)", () => { it("parses, trims, and drops empty entries", () => { - expect(listConvergenceRepos({ LOOPOVER_REVIEW_REPOS: " JSONbored/gittensory , JSONbored/metagraphed ,, " })).toEqual(["JSONbored/gittensory", "JSONbored/metagraphed"]); + expect(listConvergenceRepos({ LOOPOVER_REVIEW_REPOS: " JSONbored/loopover , JSONbored/metagraphed ,, " })).toEqual(["JSONbored/loopover", "JSONbored/metagraphed"]); }); it("returns [] when unset or empty", () => { expect(listConvergenceRepos({})).toEqual([]); @@ -11,48 +11,48 @@ describe("listConvergenceRepos — the configured repo set (for proactive RAG in expect(listConvergenceRepos({ LOOPOVER_REVIEW_REPOS: " , ,, " })).toEqual([]); }); it("dedupes case-insensitively, preserving the first occurrence's original case", () => { - expect(listConvergenceRepos({ LOOPOVER_REVIEW_REPOS: "JSONbored/Gittensory, jsonbored/gittensory, JSONbored/metagraphed" })).toEqual(["JSONbored/Gittensory", "JSONbored/metagraphed"]); + expect(listConvergenceRepos({ LOOPOVER_REVIEW_REPOS: "JSONbored/Loopover, jsonbored/loopover, JSONbored/metagraphed" })).toEqual(["JSONbored/Loopover", "JSONbored/metagraphed"]); }); }); describe("isConvergenceRepoAllowed — per-repo review allowlist", () => { it("empty / unset / whitespace-only allowlist → false for every repo (the dormant default)", () => { - expect(isConvergenceRepoAllowed({}, "JSONbored/gittensory")).toBe(false); - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: undefined }, "JSONbored/gittensory")).toBe(false); - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "" }, "JSONbored/gittensory")).toBe(false); - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: " " }, "JSONbored/gittensory")).toBe(false); - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: " , ,, " }, "JSONbored/gittensory")).toBe(false); + expect(isConvergenceRepoAllowed({}, "JSONbored/loopover")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: undefined }, "JSONbored/loopover")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "" }, "JSONbored/loopover")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: " " }, "JSONbored/loopover")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: " , ,, " }, "JSONbored/loopover")).toBe(false); }); it("activates a listed repo (exact owner/repo match)", () => { - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/gittensory" }, "JSONbored/gittensory")).toBe(true); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/loopover" }, "JSONbored/loopover")).toBe(true); }); it("does NOT activate an unlisted repo", () => { - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/gittensory" }, "JSONbored/awesome-claude")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/loopover" }, "JSONbored/awesome-claude")).toBe(false); }); it("is case-insensitive (GitHub repo full-names are case-insensitive)", () => { - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/Gittensory" }, "jsonbored/gittensory")).toBe(true); - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "jsonbored/gittensory" }, "JSONbored/GITTENSORY")).toBe(true); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/Loopover" }, "jsonbored/loopover")).toBe(true); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "jsonbored/loopover" }, "JSONbored/LOOPOVER")).toBe(true); }); it("handles a multi-repo list with surrounding whitespace + stray commas", () => { - const env = { LOOPOVER_REVIEW_REPOS: " JSONbored/gittensory , JSONbored/awesome-claude ,, " }; - expect(isConvergenceRepoAllowed(env, "JSONbored/gittensory")).toBe(true); + const env = { LOOPOVER_REVIEW_REPOS: " JSONbored/loopover , JSONbored/awesome-claude ,, " }; + expect(isConvergenceRepoAllowed(env, "JSONbored/loopover")).toBe(true); expect(isConvergenceRepoAllowed(env, "JSONbored/awesome-claude")).toBe(true); expect(isConvergenceRepoAllowed(env, "JSONbored/metagraphed")).toBe(false); }); it("an empty / whitespace `repoFullName` never matches", () => { - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/gittensory" }, "")).toBe(false); - expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/gittensory" }, " ")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/loopover" }, "")).toBe(false); + expect(isConvergenceRepoAllowed({ LOOPOVER_REVIEW_REPOS: "JSONbored/loopover" }, " ")).toBe(false); }); it("requires a FULL owner/repo match (a bare owner or partial does not match)", () => { - const env = { LOOPOVER_REVIEW_REPOS: "JSONbored/gittensory" }; + const env = { LOOPOVER_REVIEW_REPOS: "JSONbored/loopover" }; expect(isConvergenceRepoAllowed(env, "JSONbored")).toBe(false); - expect(isConvergenceRepoAllowed(env, "gittensory")).toBe(false); - expect(isConvergenceRepoAllowed(env, "JSONbored/gittensory-ui")).toBe(false); + expect(isConvergenceRepoAllowed(env, "loopover")).toBe(false); + expect(isConvergenceRepoAllowed(env, "JSONbored/loopover-ui")).toBe(false); }); }); diff --git a/test/unit/data-spine.test.ts b/test/unit/data-spine.test.ts index e764f4f7ac..bec2aec148 100644 --- a/test/unit/data-spine.test.ts +++ b/test/unit/data-spine.test.ts @@ -65,7 +65,7 @@ describe("data spine repositories", () => { expect(await listInstallations(env)).toMatchObject([{ id: 123, accountLogin: "JSONbored" }]); await upsertRepoSyncState(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", status: "partial", sourceKind: "github", primaryLanguage: "TypeScript", @@ -77,11 +77,11 @@ describe("data spine repositories", () => { labelsSyncedAt: "2026-05-23T00:00:00.000Z", warnings: ["truncated"], }); - expect(await getRepoSyncState(env, "JSONbored/gittensory")).toMatchObject({ status: "partial", warnings: ["truncated"] }); + expect(await getRepoSyncState(env, "JSONbored/loopover")).toMatchObject({ status: "partial", warnings: ["truncated"] }); expect(await listRepoSyncStates(env)).toHaveLength(1); await upsertRepoLabel(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", name: "bug", color: "cc0000", description: "Bug", @@ -89,11 +89,11 @@ describe("data spine repositories", () => { observedCount: 4, payload: { name: "bug" }, }); - expect(await listRepoLabels(env, "JSONbored/gittensory")).toMatchObject([{ name: "bug", isConfigured: true, observedCount: 4 }]); + expect(await listRepoLabels(env, "JSONbored/loopover")).toMatchObject([{ name: "bug", isConfigured: true, observedCount: 4 }]); await persistRepoSnapshot(env, { id: "snapshot-1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", snapshotKind: "github-backfill", sourceKind: "github", fetchedAt: "2026-05-23T00:00:00.000Z", @@ -106,7 +106,7 @@ describe("data spine repositories", () => { }); await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 5, path: "src/index.ts", status: "modified", @@ -117,7 +117,7 @@ describe("data spine repositories", () => { }); await upsertPullRequestReview(env, { id: "review-1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 5, reviewerLogin: "maintainer", state: "APPROVED", @@ -126,7 +126,7 @@ describe("data spine repositories", () => { }); await upsertCheckSummary(env, { id: "check-1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 5, headSha: "abc", name: "test", @@ -134,10 +134,10 @@ describe("data spine repositories", () => { conclusion: "success", payload: { name: "test" }, }); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 5)).toMatchObject([{ path: "src/index.ts", changes: 12 }]); + expect(await listPullRequestFiles(env, "JSONbored/loopover", 5)).toMatchObject([{ path: "src/index.ts", changes: 12 }]); for (let index = 0; index < 501; index += 1) { await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 6, path: `docs/file-${index}.md`, status: "modified", @@ -148,7 +148,7 @@ describe("data spine repositories", () => { }); } await upsertPullRequestFile(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 6, path: "scripts/deploy.sh", status: "modified", @@ -157,12 +157,12 @@ describe("data spine repositories", () => { changes: 1, payload: { filename: "scripts/deploy.sh" }, }); - expect(await listPullRequestFiles(env, "JSONbored/gittensory", 6)).toHaveLength(502); - expect(await listPullRequestReviews(env, "JSONbored/gittensory", 5)).toMatchObject([{ reviewerLogin: "maintainer" }]); - expect(await listCheckSummaries(env, "JSONbored/gittensory", 5)).toMatchObject([{ name: "test", conclusion: "success" }]); + expect(await listPullRequestFiles(env, "JSONbored/loopover", 6)).toHaveLength(502); + expect(await listPullRequestReviews(env, "JSONbored/loopover", 5)).toMatchObject([{ reviewerLogin: "maintainer" }]); + expect(await listCheckSummaries(env, "JSONbored/loopover", 5)).toMatchObject([{ name: "test", conclusion: "success" }]); await upsertRecentMergedPullRequest(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", number: 4, title: "Fix index handler", authorLogin: "oktofeesh1", @@ -172,7 +172,7 @@ describe("data spine repositories", () => { changedFiles: ["src/index.ts"], payload: { number: 4 }, }); - expect(await listRecentMergedPullRequests(env, "JSONbored/gittensory")).toMatchObject([{ number: 4, linkedIssues: [2] }]); + expect(await listRecentMergedPullRequests(env, "JSONbored/loopover")).toMatchObject([{ number: 4, linkedIssues: [2] }]); await upsertContributor(env, { login: "oktofeesh1", @@ -184,7 +184,7 @@ describe("data spine repositories", () => { }); await upsertContributorRepoStat(env, { login: "oktofeesh1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullRequests: 2, mergedPullRequests: 1, openPullRequests: 1, @@ -194,20 +194,20 @@ describe("data spine repositories", () => { dominantLabels: ["bug"], lastActivityAt: "2026-05-23T00:00:00.000Z", }); - expect(await listContributorRepoStats(env, "oktofeesh1")).toMatchObject([{ repoFullName: "JSONbored/gittensory", dominantLabels: ["bug"] }]); - expect(await listContributorRepoStats(env, "OKTOFEESH1")).toMatchObject([{ repoFullName: "JSONbored/gittensory", dominantLabels: ["bug"] }]); - expect(await listContributorRecentMergedPullRequests(env, "OKTOFEESH1")).toMatchObject([{ repoFullName: "JSONbored/gittensory", number: 4 }]); + expect(await listContributorRepoStats(env, "oktofeesh1")).toMatchObject([{ repoFullName: "JSONbored/loopover", dominantLabels: ["bug"] }]); + expect(await listContributorRepoStats(env, "OKTOFEESH1")).toMatchObject([{ repoFullName: "JSONbored/loopover", dominantLabels: ["bug"] }]); + expect(await listContributorRecentMergedPullRequests(env, "OKTOFEESH1")).toMatchObject([{ repoFullName: "JSONbored/loopover", number: 4 }]); await env.DB.prepare( "insert into contributor_repo_stats (id, login, repo_full_name, pull_requests, merged_pull_requests, open_pull_requests, issues, stale_pull_requests, unlinked_pull_requests, dominant_labels_json, last_activity_at) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", ) - .bind("legacy-case-stat", "OKTOFEESH1", "JSONbored/gittensory", 9, 8, 1, 7, 0, 0, '["ci"]', "2026-05-24T00:00:00.000Z") + .bind("legacy-case-stat", "OKTOFEESH1", "JSONbored/loopover", 9, 8, 1, 7, 0, 0, '["ci"]', "2026-05-24T00:00:00.000Z") .run(); - expect(await listContributorRepoStats(env, "oktofeesh1")).toMatchObject([{ repoFullName: "JSONbored/gittensory", pullRequests: 9, mergedPullRequests: 8, issues: 7 }]); + expect(await listContributorRepoStats(env, "oktofeesh1")).toMatchObject([{ repoFullName: "JSONbored/loopover", pullRequests: 9, mergedPullRequests: 8, issues: 7 }]); - await replaceCollisionEdges(env, "JSONbored/gittensory", [ + await replaceCollisionEdges(env, "JSONbored/loopover", [ { id: "edge-1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", leftType: "issue", leftNumber: 2, leftTitle: "Fix index handler", @@ -219,16 +219,16 @@ describe("data spine repositories", () => { sharedTerms: ["index", "handler"], }, ]); - expect(await listCollisionEdges(env, "JSONbored/gittensory")).toMatchObject([{ risk: "high", sharedTerms: ["index", "handler"] }]); + expect(await listCollisionEdges(env, "JSONbored/loopover")).toMatchObject([{ risk: "high", sharedTerms: ["index", "handler"] }]); await persistSignalSnapshot(env, { id: "signal-1", signalType: "queue-health", - targetKey: "JSONbored/gittensory", - repoFullName: "JSONbored/gittensory", + targetKey: "JSONbored/loopover", + repoFullName: "JSONbored/loopover", payload: { ok: true }, }); - expect(await listSignalSnapshots(env, "queue-health", "JSONbored/gittensory")).toMatchObject([{ signalType: "queue-health" }]); + expect(await listSignalSnapshots(env, "queue-health", "JSONbored/loopover")).toMatchObject([{ signalType: "queue-health" }]); await upsertInstallationHealth(env, { installationId: 123, diff --git a/test/unit/db-parsers.test.ts b/test/unit/db-parsers.test.ts index 7f31ad763f..828051480a 100644 --- a/test/unit/db-parsers.test.ts +++ b/test/unit/db-parsers.test.ts @@ -1166,7 +1166,7 @@ describe("database row parser hardening", () => { }, repositories: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullRequests: 1, mergedPullRequests: 1, openPullRequests: 0, @@ -1187,7 +1187,7 @@ describe("database row parser hardening", () => { ], pullRequests: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", number: 1, title: "Fix cache", state: "open", diff --git a/test/unit/db-persistence.test.ts b/test/unit/db-persistence.test.ts index 71404d0875..d6cf1afdf7 100644 --- a/test/unit/db-persistence.test.ts +++ b/test/unit/db-persistence.test.ts @@ -48,10 +48,10 @@ describe("database persistence helpers", () => { affectedAreas: ["registry", "source"], }); - await updateUpstreamDriftReportIssue(env, "registry:abc", { number: 42, url: "https://github.com/JSONbored/gittensory/issues/42" }); + await updateUpstreamDriftReportIssue(env, "registry:abc", { number: 42, url: "https://github.com/JSONbored/loopover/issues/42" }); expect(await getOpenUpstreamDriftReportByFingerprint(env, "registry:abc")).toMatchObject({ issueNumber: 42, - issueUrl: "https://github.com/JSONbored/gittensory/issues/42", + issueUrl: "https://github.com/JSONbored/loopover/issues/42", }); await upsertContributorScoringProfile(env, { @@ -68,7 +68,7 @@ describe("database persistence helpers", () => { await persistBountyLifecycleEvent(env, { id: "bounty-event-1", bountyId: "bounty-1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 7, status: "Completed", payload: { target_alpha: "74.0000" }, diff --git a/test/unit/deny-hook-engine-extraction.test.ts b/test/unit/deny-hook-engine-extraction.test.ts index dff28f7185..4b59b81a60 100644 --- a/test/unit/deny-hook-engine-extraction.test.ts +++ b/test/unit/deny-hook-engine-extraction.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -// #5667: the deny-hook pure logic now lives in gittensory-engine. This suite drives it through the ENGINE's +// #5667: the deny-hook pure logic now lives in loopover-engine. This suite drives it through the ENGINE's // public barrel ALONE (no @loopover/miner, no SQLite in the import graph), proving portability, and exercises // every branch of the extracted evaluator + synthesizer so the moved code carries its own coverage. import { diff --git a/test/unit/dlq.test.ts b/test/unit/dlq.test.ts index 3d643908eb..a852cb4490 100644 --- a/test/unit/dlq.test.ts +++ b/test/unit/dlq.test.ts @@ -5,7 +5,7 @@ import { renderMetrics, resetMetrics } from "../../src/selfhost/metrics"; import type { JobMessage } from "../../src/types"; import { createTestEnv } from "../helpers/d1"; -function makeBatch(messages: Array<{ id: string; body: unknown }>, queue = "gittensory-jobs-dlq") { +function makeBatch(messages: Array<{ id: string; body: unknown }>, queue = "loopover-jobs-dlq") { const acked: string[] = []; const retried: string[] = []; return { @@ -112,7 +112,7 @@ describe("DLQ consumer (processDlqBatch)", () => { const env = createTestEnv(); const sent = captureWebhooks(env); // No webhook_events row for fresh-1 → status is undefined (≠ processed) → recoverable, re-drive. - const batch = makeBatch([{ id: "wh-1", body: { type: "github-webhook", deliveryId: "fresh-1", eventName: "pull_request", payload: { action: "opened" } } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-1", body: { type: "github-webhook", deliveryId: "fresh-1", eventName: "pull_request", payload: { action: "opened" } } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); @@ -128,7 +128,7 @@ describe("DLQ consumer (processDlqBatch)", () => { const env = createTestEnv(); await recordWebhookEvent(env, { deliveryId: "done-1", eventName: "pull_request", payloadHash: "processed", status: "processed" }); const sent = captureWebhooks(env); - const batch = makeBatch([{ id: "wh-2", body: { type: "github-webhook", deliveryId: "done-1", eventName: "pull_request", payload: {} } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-2", body: { type: "github-webhook", deliveryId: "done-1", eventName: "pull_request", payload: {} } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); @@ -144,7 +144,7 @@ describe("DLQ consumer (processDlqBatch)", () => { throw new Error("queue unavailable"); }, } as unknown as Queue; - const batch = makeBatch([{ id: "wh-send-fail", body: { type: "github-webhook", deliveryId: "send-fail-1", eventName: "pull_request", payload: {} } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-send-fail", body: { type: "github-webhook", deliveryId: "send-fail-1", eventName: "pull_request", payload: {} } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); @@ -157,7 +157,7 @@ describe("DLQ consumer (processDlqBatch)", () => { it("REGRESSION (metrics): missing webhook queue binding does not increment the redriven counter", async () => { const env = createTestEnv(); delete (env as Partial).WEBHOOKS; - const batch = makeBatch([{ id: "wh-no-queue", body: { type: "github-webhook", deliveryId: "no-queue-1", eventName: "pull_request", payload: {} } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-no-queue", body: { type: "github-webhook", deliveryId: "no-queue-1", eventName: "pull_request", payload: {} } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); @@ -170,7 +170,7 @@ describe("DLQ consumer (processDlqBatch)", () => { it("REGRESSION (no DLQ loop): does NOT re-drive a webhook that was already re-driven once", async () => { const env = createTestEnv(); const sent = captureWebhooks(env); - const batch = makeBatch([{ id: "wh-3", body: { type: "github-webhook", deliveryId: "loop-1", eventName: "push", payload: {}, redriven: true } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-3", body: { type: "github-webhook", deliveryId: "loop-1", eventName: "push", payload: {}, redriven: true } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); @@ -184,7 +184,7 @@ describe("DLQ consumer (processDlqBatch)", () => { it("REGRESSION (no re-drive of maintenance jobs): a backfill job is audited and dropped, never re-driven", async () => { const env = createTestEnv(); const sent = captureWebhooks(env); - const batch = makeBatch([{ id: "mn-1", body: { type: "backfill-repo-segment" } }], "gittensory-jobs-dlq"); + const batch = makeBatch([{ id: "mn-1", body: { type: "backfill-repo-segment" } }], "loopover-jobs-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); @@ -198,7 +198,7 @@ describe("DLQ consumer (processDlqBatch)", () => { it("does not re-drive webhook jobs when webhook redrive is disabled for broker-only Cloudflare", async () => { const env = createTestEnv(); const sent = captureWebhooks(env); - const batch = makeBatch([{ id: "wh-broker-only", body: { type: "github-webhook", deliveryId: "broker-only-1", eventName: "pull_request", payload: {} } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-broker-only", body: { type: "github-webhook", deliveryId: "broker-only-1", eventName: "pull_request", payload: {} } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env, { redriveWebhooks: false }); @@ -213,7 +213,7 @@ describe("DLQ consumer (processDlqBatch)", () => { await recordGitHubRateLimitObservation(env, { repoFullName: "owner/repo", resource: "rest", path: "/x", statusCode: 200, limitValue: 5000, remaining: 5, resetAt: "2026-06-24T12:30:00.000Z", observedAt: "2026-06-24T12:00:00.000Z" }); const options: Array<{ delaySeconds?: number } | undefined> = []; env.WEBHOOKS = { send: async (_m: JobMessage, opts?: { delaySeconds?: number }) => void options.push(opts) } as unknown as Queue; - const batch = makeBatch([{ id: "wh-rl", body: { type: "github-webhook", deliveryId: "rl-1", eventName: "pull_request", payload: {} } }], "gittensory-webhooks-dlq"); + const batch = makeBatch([{ id: "wh-rl", body: { type: "github-webhook", deliveryId: "rl-1", eventName: "pull_request", payload: {} } }], "loopover-webhooks-dlq"); await processDlqBatch(batch as unknown as MessageBatch, env); diff --git a/test/unit/draft.test.ts b/test/unit/draft.test.ts index 41fe39eac4..150097fca0 100644 --- a/test/unit/draft.test.ts +++ b/test/unit/draft.test.ts @@ -27,7 +27,7 @@ function draftEnv(overrides: Partial = {}): Env { }); } -const ORIGIN = "https://gittensory.aethereal.dev"; +const ORIGIN = "https://loopover.aethereal.dev"; // The module's SUPPORTED_CATEGORIES is not exported; buildContributorMdx only needs the // submitted category present in config.categories. "skills" is the only one used here. @@ -68,7 +68,7 @@ describe("draftFlowEnabled — default OFF, truthy convention (#6275)", () => { }); describe("resolveDraftFlowManifestOverride — config-as-code lookup (#6275)", () => { - const SELF_REPO = "JSONbored/gittensory"; + const SELF_REPO = "JSONbored/loopover"; it("returns the self-repo's configured draftFlow block when present", async () => { const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: SELF_REPO }); @@ -144,7 +144,7 @@ describe("draft flow — flag OFF (LOOPOVER_REVIEW_DRAFT unset/false)", () => { }); describe("draft flow — config-as-code override end-to-end (#6275)", () => { - const SELF_REPO = "JSONbored/gittensory"; + const SELF_REPO = "JSONbored/loopover"; it("handleDraftCreate: a present draftFlow override enables the flow even when the env var is off", async () => { const env = createTestEnv({ GITHUB_OAUTH_CLIENT_ID: "Iv-test-client-id", GITHUB_OAUTH_CLIENT_SECRET: "test-oauth-client-secret", DRAFT_TOKEN_ENCRYPTION_SECRET: DRAFT_SECRET, LOOPOVER_DRIFT_ISSUE_REPO: SELF_REPO }); diff --git a/test/unit/e2e-test-gen-render.test.ts b/test/unit/e2e-test-gen-render.test.ts index b1c4c24a7b..c7ca642baf 100644 --- a/test/unit/e2e-test-gen-render.test.ts +++ b/test/unit/e2e-test-gen-render.test.ts @@ -90,8 +90,8 @@ describe("buildE2eTestGenCommentBody", () => { // #4613: the footer's attribution link honors a self-hoster's PUBLIC_SITE_ORIGIN instead of always // pointing at LOOPOVER_SITE_URL. it("#4613: honors env.PUBLIC_SITE_ORIGIN in the footer attribution link", () => { - const selfHosted = buildE2eTestGenCommentBody({ env: { PUBLIC_SITE_ORIGIN: "https://gittensory.example.org" }, actor: "maintainer", testSource: "test('x', () => {});" }); - expect(selfHosted).toContain("Checked by [LoopOver](https://gittensory.example.org)"); + const selfHosted = buildE2eTestGenCommentBody({ env: { PUBLIC_SITE_ORIGIN: "https://loopover.example.org" }, actor: "maintainer", testSource: "test('x', () => {});" }); + expect(selfHosted).toContain("Checked by [LoopOver](https://loopover.example.org)"); expect(selfHosted).not.toContain(LOOPOVER_SITE_URL); }); diff --git a/test/unit/engine-objective-anchor-config-classification.test.ts b/test/unit/engine-objective-anchor-config-classification.test.ts index c0def1c103..e7b7a1fdc2 100644 --- a/test/unit/engine-objective-anchor-config-classification.test.ts +++ b/test/unit/engine-objective-anchor-config-classification.test.ts @@ -4,7 +4,7 @@ import { extractObjectiveAnchorFeatures } from "../../packages/loopover-engine/s // packages/loopover-engine/src/objective-anchor.ts's CONFIG_FILENAMES set is exercised almost // exclusively by its own node:test suite (invisible to Codecov's vitest-based coverage), so // classifying ".loopover.yml" needs a real vitest-side assertion, not just a top-level module-load hit. -describe("gittensory-engine objective-anchor config-filename classification", () => { +describe("loopover-engine objective-anchor config-filename classification", () => { it("classifies .loopover.yml as a 'config' change kind", () => { const features = extractObjectiveAnchorFeatures({ paths: [".loopover.yml"], diff --git a/test/unit/export-d1-core.test.ts b/test/unit/export-d1-core.test.ts index 9811c3d3bf..c05420c906 100644 --- a/test/unit/export-d1-core.test.ts +++ b/test/unit/export-d1-core.test.ts @@ -197,8 +197,8 @@ describe("export-d1-core buildTableExport + manifest", () => { buildTableExport("auth_sessions", [{ id: 9, token_hash: "h" }]), buildTableExport("d1_migrations", [{ id: 1 }]), // null → excluded ]; - const manifest = buildExportManifest(exports, { database: "gittensory" }); - expect(manifest.database).toBe("gittensory"); + const manifest = buildExportManifest(exports, { database: "loopover" }); + expect(manifest.database).toBe("loopover"); expect(manifest.tableCount).toBe(2); expect(manifest.totalRows).toBe(3); expect(manifest.tables.map((t) => t.table).sort()).toEqual(["auth_sessions", "repositories"]); diff --git a/test/unit/extension-auth.test.ts b/test/unit/extension-auth.test.ts index 2a33e374d9..80338e43e0 100644 --- a/test/unit/extension-auth.test.ts +++ b/test/unit/extension-auth.test.ts @@ -18,10 +18,10 @@ const VALID_TOKEN = `gts_${"a".repeat(64)}`; describe("extension auth storage", () => { it("stores session tokens only in extension local storage and keeps sync storage token-free", async () => { const storage = fakeExtensionStorage({ - sync: { apiOrigin: "https://gittensory-api.aethereal.dev/ignored/path", sessionToken: "legacy-sync-token" }, + sync: { apiOrigin: "https://loopover-api.aethereal.dev/ignored/path", sessionToken: "legacy-sync-token" }, }); - await saveExtensionApiOrigin("https://api.gittensory.test/v1", storage); + await saveExtensionApiOrigin("https://api.loopover.test/v1", storage); await storeExtensionSessionToken( { token: VALID_TOKEN, @@ -34,14 +34,14 @@ describe("extension auth storage", () => { const session = await loadExtensionSession(storage); expect(session).toMatchObject({ - apiOrigin: "https://api.gittensory.test", + apiOrigin: "https://api.loopover.test", sessionToken: VALID_TOKEN, expiresAt: "2030-01-01T00:00:00.000Z", login: "oktofeesh1", scopes: ["extension:pull_context"], expired: false, }); - expect(storage.sync.dump()).toEqual({ apiOrigin: "https://api.gittensory.test" }); + expect(storage.sync.dump()).toEqual({ apiOrigin: "https://api.loopover.test" }); expect(storage.local.dump()).toMatchObject({ sessionToken: VALID_TOKEN, sessionScopes: ["extension:pull_context"] }); }); @@ -50,36 +50,36 @@ describe("extension auth storage", () => { expect(() => validateExtensionSessionToken("github_pat_123")).toThrow(/GitHub personal access tokens/i); await expect(storeExtensionSessionToken({ token: "ghp_123" }, storage)).rejects.toThrow(/GitHub personal access tokens/i); - await expect(storeExtensionSessionToken({ token: "not-a-gittensory-session" }, storage)).rejects.toThrow(/gts_/i); + await expect(storeExtensionSessionToken({ token: "not-a-loopover-session" }, storage)).rejects.toThrow(/gts_/i); expect(storage.local.dump()).toEqual({}); expect(storage.sync.dump()).toEqual({}); }); it("clears locally expired sessions without calling the API", async () => { const storage = fakeExtensionStorage({ - sync: { apiOrigin: "https://api.gittensory.test" }, + sync: { apiOrigin: "https://api.loopover.test" }, local: { sessionToken: VALID_TOKEN, sessionExpiresAt: "2020-01-01T00:00:00.000Z" }, }); const fetchImpl = vi.fn(); - await expect(requestPullContext({ owner: "JSONbored", repo: "gittensory", pullNumber: 148 }, { storage, fetchImpl })).rejects.toThrow(EXTENSION_SESSION_EXPIRED_MESSAGE); + await expect(requestPullContext({ owner: "JSONbored", repo: "loopover", pullNumber: 148 }, { storage, fetchImpl })).rejects.toThrow(EXTENSION_SESSION_EXPIRED_MESSAGE); expect(fetchImpl).not.toHaveBeenCalled(); expect(storage.local.dump()).toEqual({}); - expect(storage.sync.dump()).toEqual({ apiOrigin: "https://api.gittensory.test" }); + expect(storage.sync.dump()).toEqual({ apiOrigin: "https://api.loopover.test" }); }); it("clears revoked or insufficient-scope sessions returned by the API", async () => { const storage = fakeExtensionStorage({ - sync: { apiOrigin: "https://api.gittensory.test" }, + sync: { apiOrigin: "https://api.loopover.test" }, local: { sessionToken: VALID_TOKEN, sessionExpiresAt: "2030-01-01T00:00:00.000Z" }, }); const fetchImpl = vi.fn(async () => jsonResponse(403, { error: "extension_session_required" })); - await expect(requestPullContext({ owner: "JSONbored", repo: "gittensory", pullNumber: 148 }, { storage, fetchImpl })).rejects.toThrow(EXTENSION_SESSION_EXPIRED_MESSAGE); + await expect(requestPullContext({ owner: "JSONbored", repo: "loopover", pullNumber: 148 }, { storage, fetchImpl })).rejects.toThrow(EXTENSION_SESSION_EXPIRED_MESSAGE); expect(fetchImpl).toHaveBeenCalledWith( - "https://api.gittensory.test/v1/extension/pull-context?owner=JSONbored&repo=gittensory&pullNumber=148", + "https://api.loopover.test/v1/extension/pull-context?owner=JSONbored&repo=loopover&pullNumber=148", expect.objectContaining({ headers: expect.objectContaining({ authorization: `Bearer ${VALID_TOKEN}` }) }), ); expect(storage.local.dump()).toEqual({}); @@ -87,7 +87,7 @@ describe("extension auth storage", () => { it("returns public-safe pull context payloads and logs out by revoking then clearing local state", async () => { const storage = fakeExtensionStorage({ - sync: { apiOrigin: "https://api.gittensory.test" }, + sync: { apiOrigin: "https://api.loopover.test" }, local: { sessionToken: VALID_TOKEN, sessionExpiresAt: "2030-01-01T00:00:00.000Z" }, }); const fetchImpl = vi @@ -95,17 +95,17 @@ describe("extension auth storage", () => { .mockResolvedValueOnce(jsonResponse(200, { panels: [{ label: "Boundary", rows: [{ k: "public", v: "no" }] }] })) .mockRejectedValueOnce(new Error("already revoked")); - await expect(requestPullContext({ owner: "JSONbored", repo: "gittensory", pullNumber: 148 }, { storage, fetchImpl })).resolves.toMatchObject({ + await expect(requestPullContext({ owner: "JSONbored", repo: "loopover", pullNumber: 148 }, { storage, fetchImpl })).resolves.toMatchObject({ panels: [{ label: "Boundary", rows: [{ k: "public", v: "no" }] }], }); await expect(logoutExtensionSession({ storage, fetchImpl })).resolves.toEqual({ ok: true }); expect(fetchImpl).toHaveBeenLastCalledWith( - "https://api.gittensory.test/v1/auth/logout", + "https://api.loopover.test/v1/auth/logout", expect.objectContaining({ method: "POST", headers: expect.objectContaining({ authorization: `Bearer ${VALID_TOKEN}` }) }), ); expect(storage.local.dump()).toEqual({}); - expect(storage.sync.dump()).toEqual({ apiOrigin: "https://api.gittensory.test" }); + expect(storage.sync.dump()).toEqual({ apiOrigin: "https://api.loopover.test" }); }); }); diff --git a/test/unit/extension-content.test.ts b/test/unit/extension-content.test.ts index e1ab4c7a4f..b6634bf430 100644 --- a/test/unit/extension-content.test.ts +++ b/test/unit/extension-content.test.ts @@ -8,31 +8,31 @@ describe("extension content script", () => { it("detects GitHub pull request and issue routes while only mounting pull overlays", () => { const internals = loadContentInternals(); - expect(internals.matchGitHubPageTarget("/JSONbored/gittensory/pull/146")).toEqual({ + expect(internals.matchGitHubPageTarget("/JSONbored/loopover/pull/146")).toEqual({ kind: "pull_request", owner: "JSONbored", - repo: "gittensory", + repo: "loopover", pullNumber: 146, }); - expect(internals.matchGitHubPageTarget("/JSONbored/gittensory/issues/145")).toEqual({ + expect(internals.matchGitHubPageTarget("/JSONbored/loopover/issues/145")).toEqual({ kind: "issue", owner: "JSONbored", - repo: "gittensory", + repo: "loopover", issueNumber: 145, }); - expect(internals.matchGitHubPageTarget("/JSONbored/gittensory/pulls")).toBeNull(); - expect(internals.matchPullRequestTarget("/JSONbored/gittensory/pull/146")).toEqual({ + expect(internals.matchGitHubPageTarget("/JSONbored/loopover/pulls")).toBeNull(); + expect(internals.matchPullRequestTarget("/JSONbored/loopover/pull/146")).toEqual({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", pullNumber: 146, }); - expect(internals.matchPullRequestTarget("/JSONbored/gittensory/pull/146/files")).toEqual({ + expect(internals.matchPullRequestTarget("/JSONbored/loopover/pull/146/files")).toEqual({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", pullNumber: 146, }); - expect(internals.matchPullRequestTarget("/JSONbored/gittensory/issues/146")).toBeNull(); - expect(internals.matchPullRequestTarget("/JSONbored/gittensory")).toBeNull(); + expect(internals.matchPullRequestTarget("/JSONbored/loopover/issues/146")).toBeNull(); + expect(internals.matchPullRequestTarget("/JSONbored/loopover")).toBeNull(); }); it("renders private pull-context sections and escapes API text", () => { @@ -75,7 +75,7 @@ describe("extension content script", () => { function loadContentInternals() { const context: Record = { __LOOPOVER_EXTENSION_TEST__: true, - location: { pathname: "/JSONbored/gittensory/issues/146" }, + location: { pathname: "/JSONbored/loopover/issues/146" }, document: { querySelector: vi.fn(() => null), createElement: vi.fn(() => { diff --git a/test/unit/feature-activation.test.ts b/test/unit/feature-activation.test.ts index d527557261..013f9190f4 100644 --- a/test/unit/feature-activation.test.ts +++ b/test/unit/feature-activation.test.ts @@ -4,7 +4,7 @@ import { CONVERGED_FEATURE_KEYS, type ConvergedFeatureKey, type FocusManifest } import { upsertRepoFocusManifest } from "../../src/signals/focus-manifest-loader"; import { createTestEnv } from "../helpers/d1"; -const REPO = "JSONbored/gittensory"; +const REPO = "JSONbored/loopover"; // The global env flag (master kill-switch) name for each feature, so a test can flip exactly one feature on. const FLAG: Record = { diff --git a/test/unit/fix-handoff-collapsible.test.ts b/test/unit/fix-handoff-collapsible.test.ts index 7314959dc9..3e372e6c4e 100644 --- a/test/unit/fix-handoff-collapsible.test.ts +++ b/test/unit/fix-handoff-collapsible.test.ts @@ -104,7 +104,7 @@ describe("buildUnifiedCommentBody fixHandoff wiring (#1962)", () => { ...base, impactMap: impactEntries, fixHandoffBlocks: blocks, - beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }], + beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }], }); expect(body).toContain("Impact map"); expect(body).toContain("Fix handoff"); @@ -116,7 +116,7 @@ describe("buildUnifiedCommentBody fixHandoff wiring (#1962)", () => { // Visual preview still renders — the fix-handoff link in the collapsible chain must not drop it. const body = buildUnifiedCommentBody({ ...base, - beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }], + beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }], }); expect(body).toContain("Visual preview"); expect(body).not.toContain("Fix handoff"); diff --git a/test/unit/focus-manifest-engine-barrel.test.ts b/test/unit/focus-manifest-engine-barrel.test.ts index 49874af457..ab2a578b58 100644 --- a/test/unit/focus-manifest-engine-barrel.test.ts +++ b/test/unit/focus-manifest-engine-barrel.test.ts @@ -7,7 +7,7 @@ import { parseFocusManifestContent, } from "../../packages/loopover-engine/src/focus-manifest"; -describe("gittensory-engine focus-manifest barrel exports (#2280)", () => { +describe("loopover-engine focus-manifest barrel exports (#2280)", () => { it("re-exports the focus-manifest parse/compile API from the package barrel", async () => { const barrel = await import("../../packages/loopover-engine/src/index"); expect(typeof barrel.parseFocusManifest).toBe("function"); diff --git a/test/unit/focus-manifest-loader.test.ts b/test/unit/focus-manifest-loader.test.ts index c2fe1f1d87..4f74d7ec67 100644 --- a/test/unit/focus-manifest-loader.test.ts +++ b/test/unit/focus-manifest-loader.test.ts @@ -377,8 +377,8 @@ describe("focus-manifest loader", () => { }); it("falls back to bundled YAML for a configured self-repo alias when fetch is unavailable", async () => { - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "fork/gittensory" }); - const manifest = await loadRepoFocusManifest(env, "fork/gittensory", { fetcher: async () => null }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "fork/loopover" }); + const manifest = await loadRepoFocusManifest(env, "fork/loopover", { fetcher: async () => null }); expect(manifest.present).toBe(true); expect(manifest.wantedPaths).toContain("apps/loopover-ui/"); }); diff --git a/test/unit/focus-manifest.test.ts b/test/unit/focus-manifest.test.ts index 20499ae42d..c5221bc500 100644 --- a/test/unit/focus-manifest.test.ts +++ b/test/unit/focus-manifest.test.ts @@ -777,7 +777,7 @@ describe("buildFocusManifestGuidance", () => { }); describe("compileFocusManifestPolicy", () => { - const REPO = "JSONbored/gittensory"; + const REPO = "JSONbored/loopover"; const GENERATED_AT = "2026-06-03T00:00:00.000Z"; const opts = { generatedAt: GENERATED_AT }; @@ -2988,7 +2988,7 @@ describe("parseFocusManifest settings override + resolveEffectiveSettings", () = }); // #4618/#5373: the RepositorySettings.gateCheckMode field (a computed read-back of reviewCheckMode) was - // removed entirely in #5373, including the gittensory-engine yml-parsing layer's settings.gateCheckMode + // removed entirely in #5373, including the loopover-engine yml-parsing layer's settings.gateCheckMode // back-compat key (#5373 stage 2.10) -- it is now a fully unrecognized settings key, parsed into nothing // and deriving nothing. resolveEffectiveSettings no longer derives or exposes the field either. describe("settings.gateCheckMode is a fully removed, inert key (#4618/#5373)", () => { @@ -5009,15 +5009,15 @@ describe("review.visual.production_url (#3611 follow-up — per-repo override of }); it("overlay: a per-repo production_url wins over a global-default value", () => { - const globalDefault = parseReviewConfigMapping({ visual: { production_url: "https://gittensory.aethereal.dev" } }, []); + const globalDefault = parseReviewConfigMapping({ visual: { production_url: "https://loopover.aethereal.dev" } }, []); const perRepo = parseReviewConfigMapping({ visual: { production_url: "https://metagraph.sh" } }, []); expect(overlayReviewConfig(globalDefault, perRepo).visual.productionUrl).toBe("https://metagraph.sh"); }); it("overlay: an unset per-repo production_url falls back to the global-default value", () => { - const globalDefault = parseReviewConfigMapping({ visual: { production_url: "https://gittensory.aethereal.dev" } }, []); + const globalDefault = parseReviewConfigMapping({ visual: { production_url: "https://loopover.aethereal.dev" } }, []); const perRepo = parseReviewConfigMapping({ visual: { routes: { paths: ["/app"] } } }, []); - expect(overlayReviewConfig(globalDefault, perRepo).visual.productionUrl).toBe("https://gittensory.aethereal.dev"); + expect(overlayReviewConfig(globalDefault, perRepo).visual.productionUrl).toBe("https://loopover.aethereal.dev"); expect(overlayReviewConfig(globalDefault, perRepo).visual.routes.paths).toEqual(["/app"]); }); }); diff --git a/test/unit/footer.test.ts b/test/unit/footer.test.ts index 3386c896a5..409b07c8f9 100644 --- a/test/unit/footer.test.ts +++ b/test/unit/footer.test.ts @@ -16,7 +16,7 @@ describe("maintainerControlPanelUrl", () => { }); }); -describe("gittensory public-comment footer", () => { +describe("loopover public-comment footer", () => { it("always shows the earn CTA + attribution (permanent marketing surface on every PR)", () => { const footer = loopoverFooter({}); expect(footer).toMatch(/earn/i); @@ -26,8 +26,8 @@ describe("gittensory public-comment footer", () => { }); it("points the CTA at a specific repo's public miner page when given an earnUrl", () => { - const footer = loopoverFooter({}, { earnUrl: gittensorRepoEarnUrl("JSONbored/gittensory") }); - expect(footer).toContain("https://gittensor.io/miners/repository?name=JSONbored%2Fgittensory&tab=miners"); + const footer = loopoverFooter({}, { earnUrl: gittensorRepoEarnUrl("JSONbored/loopover") }); + expect(footer).toContain("https://gittensor.io/miners/repository?name=JSONbored%2Floopover&tab=miners"); }); it("falls back to the Gittensor home URL when no earnUrl is given", () => { @@ -42,7 +42,7 @@ describe("gittensory public-comment footer", () => { }); it("preserves maintainer custom lead text while appending the Gittensor CTA", () => { - const earnUrl = gittensorRepoEarnUrl("JSONbored/gittensory"); + const earnUrl = gittensorRepoEarnUrl("JSONbored/loopover"); const footer = loopoverFooter({}, { customText: "Thanks for contributing to LoopOver!", earnUrl }); expect(footer.startsWith("Thanks for contributing to LoopOver!")).toBe(true); expect(footer).toContain("register to start earning"); @@ -55,8 +55,8 @@ describe("gittensory public-comment footer", () => { // attribution link -- both the default-copy branch and the maintainer-customText branch splice it in, // and the Gittensor register link (a separate, shared network) is never rebranded. it("#4613: uses PUBLIC_SITE_ORIGIN in the attribution link when configured", () => { - const footer = loopoverFooter({ PUBLIC_SITE_ORIGIN: "https://gittensory.example.org" }); - expect(footer).toContain("Checked by [LoopOver](https://gittensory.example.org)"); + const footer = loopoverFooter({ PUBLIC_SITE_ORIGIN: "https://loopover.example.org" }); + expect(footer).toContain("Checked by [LoopOver](https://loopover.example.org)"); expect(footer).not.toContain(LOOPOVER_SITE_URL); expect(footer).toContain(GITTENSOR_HOME_URL); // the network link is never rebranded }); @@ -66,8 +66,8 @@ describe("gittensory public-comment footer", () => { }); it("#4613: uses PUBLIC_SITE_ORIGIN in the attribution link on the customText branch too", () => { - const footer = loopoverFooter({ PUBLIC_SITE_ORIGIN: "https://gittensory.example.org" }, { customText: "Thanks for contributing!" }); - expect(footer).toContain("Checked by [LoopOver](https://gittensory.example.org)"); + const footer = loopoverFooter({ PUBLIC_SITE_ORIGIN: "https://loopover.example.org" }, { customText: "Thanks for contributing!" }); + expect(footer).toContain("Checked by [LoopOver](https://loopover.example.org)"); expect(footer).not.toContain(LOOPOVER_SITE_URL); }); }); diff --git a/test/unit/github-labels.test.ts b/test/unit/github-labels.test.ts index 7f361c440e..1a0294b3b3 100644 --- a/test/unit/github-labels.test.ts +++ b/test/unit/github-labels.test.ts @@ -82,7 +82,7 @@ describe("GitHub PR labels", () => { }); await expect( - removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor"), + removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor"), ).resolves.toBeUndefined(); expect(calls.some((call) => call.startsWith("DELETE ") && call.includes("/labels/"))).toBe(true); }); @@ -100,7 +100,7 @@ describe("GitHub PR labels", () => { }); await expect( - removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor"), + removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor"), ).rejects.toMatchObject({ status }); } }); @@ -117,7 +117,7 @@ describe("GitHub PR labels", () => { }); await expect( - removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor"), + removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor"), ).resolves.toBeUndefined(); }); @@ -143,7 +143,7 @@ describe("GitHub PR labels", () => { const result = await ensurePullRequestLabel( createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 998877, - "JSONbored/gittensory", + "JSONbored/loopover", 4, "gittensor", { createMissingLabel: true }, @@ -174,7 +174,7 @@ describe("GitHub PR labels", () => { }); await expect( - removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 998877, "JSONbored/gittensory", 4, "gittensor"), + removePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 998877, "JSONbored/loopover", 4, "gittensor"), ).resolves.toBeUndefined(); expect(deleteAttempts).toBe(2); expect(tokenMints).toBe(2); @@ -190,12 +190,12 @@ describe("GitHub PR labels", () => { return new Response("unexpected", { status: 500 }); }); - const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor", { + const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor", { createMissingLabel: true, }); expect(result).toEqual({ applied: false, created: false }); - expect(calls.some((call) => call.includes("/repos/JSONbored/gittensory/labels"))).toBe(false); + expect(calls.some((call) => call.includes("/repos/JSONbored/loopover/labels"))).toBe(false); }); it("applies an existing repository label without creating it, even when the repo has more than 100 labels", async () => { @@ -206,7 +206,7 @@ describe("GitHub PR labels", () => { calls.push(`${method} ${url}`); if (url.includes("/access_tokens")) return Response.json({ token: "installation-token" }); if (url.includes("/issues/4/labels") && method === "GET") return Response.json([]); - if (url.includes("/repos/JSONbored/gittensory/labels") && method === "POST") { + if (url.includes("/repos/JSONbored/loopover/labels") && method === "POST") { // GitHub 422 "already_exists" — label is in the repo (possibly beyond page 100) return Response.json( { message: "Validation Failed", errors: [{ resource: "Label", code: "already_exists", field: "name" }] }, @@ -217,7 +217,7 @@ describe("GitHub PR labels", () => { return new Response("unexpected", { status: 500 }); }); - const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor", { + const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor", { createMissingLabel: true, }); @@ -230,7 +230,7 @@ describe("GitHub PR labels", () => { const method = init?.method ?? "GET"; if (url.includes("/access_tokens")) return Response.json({ token: "installation-token" }); if (url.includes("/issues/4/labels") && method === "GET") return Response.json([]); - if (url.includes("/repos/JSONbored/gittensory/labels") && method === "POST") { + if (url.includes("/repos/JSONbored/loopover/labels") && method === "POST") { return Response.json( { message: "Validation Failed", errors: [{ resource: "Label", code: "invalid", field: "name" }] }, { status: 422 }, @@ -240,7 +240,7 @@ describe("GitHub PR labels", () => { }); await expect( - ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor", { + ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor", { createMissingLabel: true, }), ).rejects.toMatchObject({ status: 422 }); @@ -254,8 +254,8 @@ describe("GitHub PR labels", () => { calls.push(`${method} ${url}`); if (url.includes("/access_tokens")) return Response.json({ token: "installation-token" }); if (url.includes("/issues/4/labels") && method === "GET") return Response.json([]); - if (url.includes("/repos/JSONbored/gittensory/labels") && method === "GET") return Response.json([]); - if (url.includes("/repos/JSONbored/gittensory/labels") && method === "POST") { + if (url.includes("/repos/JSONbored/loopover/labels") && method === "GET") return Response.json([]); + if (url.includes("/repos/JSONbored/loopover/labels") && method === "POST") { const body = JSON.parse(String(init?.body ?? "{}")) as { name?: string; color?: string }; expect(body).toMatchObject({ name: "gittensor", color: "7ee787" }); return Response.json({ name: "gittensor" }, { status: 201 }); @@ -264,12 +264,12 @@ describe("GitHub PR labels", () => { return new Response("unexpected", { status: 500 }); }); - const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor", { + const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor", { createMissingLabel: true, }); expect(result).toEqual({ applied: true, created: true }); - expect(calls).toEqual(expect.arrayContaining([expect.stringMatching(/^POST .*\/repos\/JSONbored\/gittensory\/labels$/)])); + expect(calls).toEqual(expect.arrayContaining([expect.stringMatching(/^POST .*\/repos\/JSONbored\/loopover\/labels$/)])); }); it("applies a configured label without creating the repository label when creation is disabled", async () => { @@ -284,12 +284,12 @@ describe("GitHub PR labels", () => { return new Response("unexpected", { status: 500 }); }); - const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/gittensory", 4, "gittensor", { + const result = await ensurePullRequestLabel(createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem() }), 123, "JSONbored/loopover", 4, "gittensor", { createMissingLabel: false, }); expect(result).toEqual({ applied: true, created: false }); - expect(calls.some((call) => call.includes("/repos/JSONbored/gittensory/labels"))).toBe(false); + expect(calls.some((call) => call.includes("/repos/JSONbored/loopover/labels"))).toBe(false); }); }); diff --git a/test/unit/github-webhook-coalesce.test.ts b/test/unit/github-webhook-coalesce.test.ts index 9126568c02..880aee651c 100644 --- a/test/unit/github-webhook-coalesce.test.ts +++ b/test/unit/github-webhook-coalesce.test.ts @@ -7,46 +7,46 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("check_suite", { action: "completed", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, check_suite: { head_sha: "ABC1234", pull_requests: [{ number: 12 }, { number: 3 }, { number: 7 }], }, } as never), - ).toBe("github-webhook:ci-completed:jsonbored/gittensory@abc1234#3,7,12"); + ).toBe("github-webhook:ci-completed:jsonbored/loopover@abc1234#3,7,12"); expect( githubWebhookCoalesceKey("check_run", { action: "completed", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, check_run: { check_suite: { head_sha: "DEF5678" }, pull_requests: [] }, } as never), - ).toBe("github-webhook:ci-completed:jsonbored/gittensory@def5678"); + ).toBe("github-webhook:ci-completed:jsonbored/loopover@def5678"); }); it("coalesces gate-triggering pull request events and ignores non-actionable or terminal actions", () => { expect( githubWebhookCoalesceKey("pull_request", { action: "synchronize", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, number: 99, pull_request: {}, } as never), - ).toBe("github-webhook:pr-refresh:jsonbored/gittensory#99"); + ).toBe("github-webhook:pr-refresh:jsonbored/loopover#99"); expect( githubWebhookCoalesceKey("pull_request", { action: "opened", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 100, head: { sha: "BEEF123" } }, } as GitHubWebhookPayload), - ).toBe("github-webhook:pr-refresh:jsonbored/gittensory#100@beef123"); + ).toBe("github-webhook:pr-refresh:jsonbored/loopover#100@beef123"); // "closed" is a terminal action -- merge/close has its own non-coalesced handling and must never collapse // with anything else. "labeled"/"unlabeled" now coalesce too (see the dedicated pr-label tests below) -- // they are no longer in this "returns null" list. expect( githubWebhookCoalesceKey("pull_request", { action: "closed", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 100, head: { sha: "BEEF123" } }, } as GitHubWebhookPayload), ).toBeNull(); @@ -59,28 +59,28 @@ describe("githubWebhookCoalesceKey", () => { const burstKeys = (["reopened", "synchronize", "ready_for_review"] as const).map((action) => githubWebhookCoalesceKey("pull_request", { action, - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 100, head: { sha: "BEEF123" } }, } as GitHubWebhookPayload), ); expect(new Set(burstKeys).size).toBe(1); - expect(burstKeys[0]).toBe("github-webhook:pr-refresh:jsonbored/gittensory#100@beef123"); + expect(burstKeys[0]).toBe("github-webhook:pr-refresh:jsonbored/loopover#100@beef123"); }); it("returns null for malformed or non-coalescible webhook shapes", () => { - expect(githubWebhookCoalesceKey("issues", { action: "closed", repository: { full_name: "JSONbored/Gittensory" } } as never)).toBeNull(); - expect(githubWebhookCoalesceKey("check_suite", { action: "requested", repository: { full_name: "JSONbored/Gittensory" } } as never)).toBeNull(); + expect(githubWebhookCoalesceKey("issues", { action: "closed", repository: { full_name: "JSONbored/Loopover" } } as never)).toBeNull(); + expect(githubWebhookCoalesceKey("check_suite", { action: "requested", repository: { full_name: "JSONbored/Loopover" } } as never)).toBeNull(); expect( githubWebhookCoalesceKey("check_suite", { action: "completed", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, check_suite: { pull_requests: [{ number: 7 }] }, } as never), ).toBeNull(); expect( githubWebhookCoalesceKey("pull_request", { action: "edited", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { head: { sha: "BEEF123" } }, } as GitHubWebhookPayload), ).toBeNull(); @@ -92,17 +92,17 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request", { action, - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 42, head: { sha: "BEEF123" } }, } as GitHubWebhookPayload), - ).toBe("github-webhook:pr-label:jsonbored/gittensory#42"); + ).toBe("github-webhook:pr-label:jsonbored/loopover#42"); } // A burst of add/remove churn on the same PR collapses to the identical key regardless of which label // action fired -- the handler re-syncs generically and doesn't act on the specific label. const burstKeys = ["labeled", "unlabeled", "labeled"].map((action) => githubWebhookCoalesceKey("pull_request", { action, - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 42 }, } as GitHubWebhookPayload), ); @@ -113,18 +113,18 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request", { action: "labeled", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: {}, number: 55, } as unknown as GitHubWebhookPayload), - ).toBe("github-webhook:pr-label:jsonbored/gittensory#55"); + ).toBe("github-webhook:pr-label:jsonbored/loopover#55"); }); it("returns null for a label event with no resolvable PR number", () => { expect( githubWebhookCoalesceKey("pull_request", { action: "labeled", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, } as GitHubWebhookPayload), ).toBeNull(); }); @@ -134,7 +134,7 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request_review", { action, - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload), ).toBeNull(); @@ -146,10 +146,10 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request_review_comment", { action, - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload), - ).toBe("github-webhook:pull_request_review_comment:jsonbored/gittensory#12@cafe123"); + ).toBe("github-webhook:pull_request_review_comment:jsonbored/loopover#12@cafe123"); } }); @@ -158,27 +158,27 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request_review_thread", { action, - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload), - ).toBe("github-webhook:pull_request_review_thread:jsonbored/gittensory#12@cafe123"); + ).toBe("github-webhook:pull_request_review_thread:jsonbored/loopover#12@cafe123"); } }); it("keeps distinct review-surface event families separate so coalescing cannot drop review-only side effects", () => { const reviewKey = githubWebhookCoalesceKey("pull_request_review", { action: "submitted", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload); const commentKey = githubWebhookCoalesceKey("pull_request_review_comment", { action: "created", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload); const threadKey = githubWebhookCoalesceKey("pull_request_review_thread", { action: "resolved", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload); @@ -190,17 +190,17 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request_review_comment", { action: "created", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12 }, } as GitHubWebhookPayload), - ).toBe("github-webhook:pull_request_review_comment:jsonbored/gittensory#12"); + ).toBe("github-webhook:pull_request_review_comment:jsonbored/loopover#12"); }); it("returns null for a review-surface event with no resolvable PR number", () => { expect( githubWebhookCoalesceKey("pull_request_review_comment", { action: "created", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, } as GitHubWebhookPayload), ).toBeNull(); }); @@ -209,21 +209,21 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("pull_request_review", { action: "requested_changes_dismissed", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload), ).toBeNull(); expect( githubWebhookCoalesceKey("pull_request_review_comment", { action: "resolved", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload), ).toBeNull(); expect( githubWebhookCoalesceKey("pull_request_review_thread", { action: "created", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as GitHubWebhookPayload), ).toBeNull(); @@ -233,7 +233,7 @@ describe("githubWebhookCoalesceKey", () => { expect( githubWebhookCoalesceKey("issue_comment", { action: "created", - repository: { full_name: "JSONbored/Gittensory" }, + repository: { full_name: "JSONbored/Loopover" }, pull_request: { number: 12, head: { sha: "CAFE123" } }, } as unknown as GitHubWebhookPayload), ).toBeNull(); diff --git a/test/unit/graphql-status-rollup.test.ts b/test/unit/graphql-status-rollup.test.ts index 31228e5d3d..c94122b1be 100644 --- a/test/unit/graphql-status-rollup.test.ts +++ b/test/unit/graphql-status-rollup.test.ts @@ -7,7 +7,7 @@ import { } from "../../src/github/backfill"; import { createTestEnv } from "../helpers/d1"; -const REPO = "JSONbored/gittensory"; +const REPO = "JSONbored/loopover"; const SHA = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; const TOKEN = "test-token"; diff --git a/test/unit/grounding-wiring.test.ts b/test/unit/grounding-wiring.test.ts index f0751367aa..dc6f380b74 100644 --- a/test/unit/grounding-wiring.test.ts +++ b/test/unit/grounding-wiring.test.ts @@ -116,7 +116,7 @@ describe("aiCiRefutationActive compatibility helper", () => { // ── buildCheckAggregate (CI summary source) ────────────────────────────────────────────────────── -describe("buildCheckAggregate maps gittensory check summaries → the grounding aggregate", () => { +describe("buildCheckAggregate maps loopover check summaries → the grounding aggregate", () => { it("returns undefined when there are no checks (no CI signal to assert)", () => { expect(buildCheckAggregate([])).toBeUndefined(); }); diff --git a/test/unit/impact-map-collapsible.test.ts b/test/unit/impact-map-collapsible.test.ts index 5f88180095..515259c91a 100644 --- a/test/unit/impact-map-collapsible.test.ts +++ b/test/unit/impact-map-collapsible.test.ts @@ -130,7 +130,7 @@ describe("buildUnifiedCommentBody impactMap wiring (#2185)", () => { const body = buildUnifiedCommentBody({ ...base, impactMap: entries, - beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }], + beforeAfter: [{ path: "/", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }], }); expect(body).toContain("Impact map"); expect(body).toContain("Visual preview"); diff --git a/test/unit/index.test.ts b/test/unit/index.test.ts index 609a0cb937..96c41ea9c5 100644 --- a/test/unit/index.test.ts +++ b/test/unit/index.test.ts @@ -17,16 +17,16 @@ describe("worker entrypoint", () => { it("delegates fetch requests to the Hono app", async () => { const env = createTestEnv(); - const response = await worker.fetch(new Request("https://gittensory.test/health"), env); + const response = await worker.fetch(new Request("https://loopover.test/health"), env); expect(response.status).toBe(200); }); - it("routes gittensory-jobs-dlq batches to the DLQ consumer (acks without retrying)", async () => { + it("routes loopover-jobs-dlq batches to the DLQ consumer (acks without retrying)", async () => { const env = createTestEnv(); const acked: string[] = []; const retried: string[] = []; const batch = { - queue: "gittensory-jobs-dlq", + queue: "loopover-jobs-dlq", messages: [ { id: "dlq-msg-1", @@ -43,12 +43,12 @@ describe("worker entrypoint", () => { expect(retried).toEqual([]); }); - it("routes the webhook lane's gittensory-webhooks-dlq batches to the DLQ consumer too (#1276)", async () => { + it("routes the webhook lane's loopover-webhooks-dlq batches to the DLQ consumer too (#1276)", async () => { const env = createTestEnv(); const acked: string[] = []; const retried: string[] = []; const batch = { - queue: "gittensory-webhooks-dlq", + queue: "loopover-webhooks-dlq", messages: [ { id: "wh-dlq-1", @@ -72,7 +72,7 @@ describe("worker entrypoint", () => { env.WEBHOOKS = { send: async (message: import("../../src/types").JobMessage) => void sent.push(message) } as unknown as Queue; const acked: string[] = []; const batch = { - queue: "gittensory-webhooks-dlq", + queue: "loopover-webhooks-dlq", messages: [ { id: "wh-dlq-broker-only", @@ -604,9 +604,9 @@ describe("worker entrypoint", () => { }); await (env.DB as unknown as { prepare: (s: string) => { bind: (...v: unknown[]) => { run: () => Promise } } }) .prepare("INSERT INTO repositories (full_name, owner, name, is_installed, is_registered) VALUES (?, ?, ?, 1, 0)") - .bind("JSONbored/gittensory", "JSONbored", "gittensory") + .bind("JSONbored/loopover", "JSONbored", "loopover") .run(); - await (await import("../../src/signals/focus-manifest-loader")).upsertRepoFocusManifest(env, "JSONbored/gittensory", { experimental: { gittensor: true } }); + await (await import("../../src/signals/focus-manifest-loader")).upsertRepoFocusManifest(env, "JSONbored/loopover", { experimental: { gittensor: true } }); const waitUntil: Promise[] = []; await worker.scheduled(controllerFor("2026-05-25T05:00:00.000Z"), env, executionContext(waitUntil)); @@ -771,9 +771,9 @@ describe("worker entrypoint", () => { sent.push(message); }, } as unknown as Queue, - LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory", + LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover", }); - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { ops: { enabled: true } }); + await upsertRepoFocusManifest(env, "JSONbored/loopover", { ops: { enabled: true } }); const waitUntil: Promise[] = []; await worker.scheduled(controllerFor("2026-05-25T05:00:00.000Z"), env, executionContext(waitUntil)); await Promise.all(waitUntil); @@ -789,9 +789,9 @@ describe("worker entrypoint", () => { sent.push(message); }, } as unknown as Queue, - LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory", + LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover", }); - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { ops: { enabled: false } }); + await upsertRepoFocusManifest(env, "JSONbored/loopover", { ops: { enabled: false } }); const waitUntil: Promise[] = []; await worker.scheduled(controllerFor("2026-05-25T05:00:00.000Z"), env, executionContext(waitUntil)); await Promise.all(waitUntil); diff --git a/test/unit/json-utils.test.ts b/test/unit/json-utils.test.ts index 2d13663c6b..cab1853a5b 100644 --- a/test/unit/json-utils.test.ts +++ b/test/unit/json-utils.test.ts @@ -18,8 +18,8 @@ describe("JSON and string utility helpers", () => { }); it("normalizes repo names and error messages without leaking arbitrary thrown values", () => { - expect(normalizeRepoFullName(" JSONbored/gittensory ")).toBe("JSONbored/gittensory"); - expect(repoParts("JSONbored/gittensory")).toEqual({ owner: "JSONbored", name: "gittensory" }); + expect(normalizeRepoFullName(" JSONbored/loopover ")).toBe("JSONbored/loopover"); + expect(repoParts("JSONbored/loopover")).toEqual({ owner: "JSONbored", name: "loopover" }); expect(repoParts("")).toEqual({ owner: "", name: "" }); expect(repoParts("owner/nested/name")).toEqual({ owner: "owner", name: "nested/name" }); @@ -42,7 +42,7 @@ describe("JSON and string utility helpers", () => { }); it("repoParts trims outer whitespace before splitting, matching normalizeRepoFullName", () => { - expect(repoParts(" JSONbored/gittensory ")).toEqual({ owner: "JSONbored", name: "gittensory" }); + expect(repoParts(" JSONbored/loopover ")).toEqual({ owner: "JSONbored", name: "loopover" }); expect(repoParts(" owner/nested/name ")).toEqual({ owner: "owner", name: "nested/name" }); expect(repoParts(" ")).toEqual({ owner: "", name: "" }); expect(repoParts("\towner/repo\n")).toEqual({ owner: "owner", name: "repo" }); diff --git a/test/unit/linked-issue-hard-rules.test.ts b/test/unit/linked-issue-hard-rules.test.ts index 319b4b9874..3dff483a28 100644 --- a/test/unit/linked-issue-hard-rules.test.ts +++ b/test/unit/linked-issue-hard-rules.test.ts @@ -261,7 +261,7 @@ describe("evaluateLinkedIssueHardRules", () => { describe("loadLinkedIssueHardRules", () => { it("returns the all-off default without requiring external policy storage", async () => { - expect(await loadLinkedIssueHardRules({} as Env, "JSONbored/gittensory")).toEqual(DEFAULT_LINKED_ISSUE_HARD_RULES); + expect(await loadLinkedIssueHardRules({} as Env, "JSONbored/loopover")).toEqual(DEFAULT_LINKED_ISSUE_HARD_RULES); }); it("ignores unrelated env data so stale hosted config cannot manufacture a close", async () => { @@ -281,7 +281,7 @@ describe("loadLinkedIssueHardRules", () => { }, }, } as unknown as Env, - "JSONbored/gittensory", + "JSONbored/loopover", ); expect(cfg).toEqual(DEFAULT_LINKED_ISSUE_HARD_RULES); }); diff --git a/test/unit/linked-issue-label-propagation-engine.test.ts b/test/unit/linked-issue-label-propagation-engine.test.ts index a5e7986028..932fe40edc 100644 --- a/test/unit/linked-issue-label-propagation-engine.test.ts +++ b/test/unit/linked-issue-label-propagation-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { DEFAULT_LINKED_ISSUE_LABEL_PROPAGATION, normalizeLinkedIssueLabelPropagationConfig } from "../../packages/loopover-engine/src/review/linked-issue-label-propagation"; diff --git a/test/unit/local-branch.test.ts b/test/unit/local-branch.test.ts index b63f88c66d..e242c68a91 100644 --- a/test/unit/local-branch.test.ts +++ b/test/unit/local-branch.test.ts @@ -1461,7 +1461,7 @@ describe("local branch analysis", () => { expect(largeUnverified.preflight.localDiff.changedLineCount).toBe(0); }); - it("keeps unregistered gittensory work in product/maintainer context instead of miner target context", () => { + it("keeps unregistered loopover work in product/maintainer context instead of miner target context", () => { const analysis = buildLocalBranchAnalysis({ input: { login: "jsonbored", @@ -1730,7 +1730,7 @@ describe("local MCP git metadata collection", () => { it("counts pending commits, emits CI hints, and tracks deleted or renamed paths", async () => { // @ts-expect-error package helper is plain JS because the local wrapper ships as a Node bin package. const { collectCiStatusHints, collectLocalBranchMetadata, collectPendingCommitCount } = await import("../../packages/loopover-mcp/lib/local-branch.js"); - tempDir = mkdtempSync(join(tmpdir(), "gittensory-local-")); + tempDir = mkdtempSync(join(tmpdir(), "loopover-local-")); git(tempDir, "init"); git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); @@ -1766,7 +1766,7 @@ describe("local MCP git metadata collection", () => { it("counts additions and deletions for cross-directory renames that share no prefix or suffix", async () => { // @ts-expect-error package helper is plain JS because the local wrapper ships as a Node bin package. const { collectLocalBranchMetadata } = await import("../../packages/loopover-mcp/lib/local-branch.js"); - tempDir = mkdtempSync(join(tmpdir(), "gittensory-local-")); + tempDir = mkdtempSync(join(tmpdir(), "loopover-local-")); git(tempDir, "init"); git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); @@ -1806,13 +1806,13 @@ describe("local MCP git metadata collection", () => { it("returns no lines when the git command fails", async () => { // @ts-expect-error package helper is plain JS because the local wrapper ships as a Node bin package. const { gitLines } = await import("../../packages/loopover-mcp/lib/local-branch.js"); - expect(gitLines(join(tmpdir(), "gittensory-no-such-repo-d8f3"), ["rev-parse", "HEAD"])).toEqual([]); + expect(gitLines(join(tmpdir(), "loopover-no-such-repo-d8f3"), ["rev-parse", "HEAD"])).toEqual([]); }); it("counts stats and keeps verbatim paths for non-ASCII filenames at the default core.quotePath", async () => { // @ts-expect-error package helper is plain JS because the local wrapper ships as a Node bin package. const { collectLocalBranchMetadata } = await import("../../packages/loopover-mcp/lib/local-branch.js"); - tempDir = mkdtempSync(join(tmpdir(), "gittensory-local-")); + tempDir = mkdtempSync(join(tmpdir(), "loopover-local-")); git(tempDir, "init"); git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); @@ -1921,12 +1921,12 @@ describe("local MCP git metadata collection", () => { // @ts-expect-error package helper is plain JS because the local wrapper ships as a Node bin package. const { collectLocalBranchMetadata, parseGitRemote } = await import("../../packages/loopover-mcp/lib/local-branch.js"); expect(parseGitRemote("git@github.com:entrius/allways-ui.git")).toBe("entrius/allways-ui"); - expect(parseGitRemote("https://github.com/JSONbored/gittensory.git")).toBe("JSONbored/gittensory"); - expect(parseGitRemote("https://github.com/JSONbored/gittensory/")).toBe("JSONbored/gittensory"); - expect(parseGitRemote("https://github.com/JSONbored/gittensory////")).toBe("JSONbored/gittensory"); + expect(parseGitRemote("https://github.com/JSONbored/loopover.git")).toBe("JSONbored/loopover"); + expect(parseGitRemote("https://github.com/JSONbored/loopover/")).toBe("JSONbored/loopover"); + expect(parseGitRemote("https://github.com/JSONbored/loopover////")).toBe("JSONbored/loopover"); expect(parseGitRemote(`x${"/".repeat(32_000)}x`)).toBeUndefined(); - tempDir = mkdtempSync(join(tmpdir(), "gittensory-local-")); + tempDir = mkdtempSync(join(tmpdir(), "loopover-local-")); git(tempDir, "init"); git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); @@ -1964,7 +1964,7 @@ describe("local MCP git metadata collection", () => { it("selects and validates cwd from MCP roots without leaking local paths", async () => { // @ts-expect-error package helper is plain JS because the local wrapper ships as a Node bin package. const { collectLocalBranchMetadata, normalizeMcpWorkspaceRoots, resolveWorkspaceCwd } = await import("../../packages/loopover-mcp/lib/local-branch.js"); - tempDir = mkdtempSync(join(tmpdir(), "gittensory-local-")); + tempDir = mkdtempSync(join(tmpdir(), "loopover-local-")); const workspace = join(tempDir, "workspace"); const outside = join(tempDir, "outside"); mkdirSync(workspace, { recursive: true }); diff --git a/test/unit/local-scorer-adapter.test.ts b/test/unit/local-scorer-adapter.test.ts index 58ea8ccd61..973970c3ac 100644 --- a/test/unit/local-scorer-adapter.test.ts +++ b/test/unit/local-scorer-adapter.test.ts @@ -88,7 +88,7 @@ describe("local scorer adapter", () => { const { buildBranchAnalysisPayload, collectLocalBranchMetadata } = await import("../../packages/loopover-mcp/lib/local-branch.js"); const payload = buildBranchAnalysisPayload({ cwd: process.cwd(), - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", baseRef: "HEAD", login: "local", scorePreviewCommand: fixtureCommand("scorer-nonzero.mjs"), @@ -99,7 +99,7 @@ describe("local scorer adapter", () => { expect(JSON.stringify(payload)).not.toMatch(/BEGIN (RSA )?PRIVATE KEY/); process.env.LOOPOVER_UPLOAD_SOURCE = "true"; - expect(() => collectLocalBranchMetadata({ cwd: process.cwd(), repoFullName: "JSONbored/gittensory", login: "local" })).toThrow(/not supported/); + expect(() => collectLocalBranchMetadata({ cwd: process.cwd(), repoFullName: "JSONbored/loopover", login: "local" })).toThrow(/not supported/); delete process.env.LOOPOVER_UPLOAD_SOURCE; }); @@ -121,7 +121,7 @@ describe("local scorer adapter", () => { previousGittensorRoot = process.env.GITTENSOR_ROOT; previousCommand = process.env.GITTENSOR_SCORE_PREVIEW_CMD; process.env.GITTENSOR_ROOT = "/secret/home/user/gittensor"; - process.env.GITTENSOR_SCORE_PREVIEW_CMD = `/secret/opt/tools/node /secret/home/user/gittensory-mcp/scripts/gittensor-score-preview.mjs`; + process.env.GITTENSOR_SCORE_PREVIEW_CMD = `/secret/opt/tools/node /secret/home/user/loopover-mcp/scripts/gittensor-score-preview.mjs`; expect(redactLocalPath("/secret/home/user/gittensor")).not.toContain("/secret/home/user"); expect(redactScorerCommand(process.env.GITTENSOR_SCORE_PREVIEW_CMD)).toBe("node /gittensor-score-preview.mjs"); diff --git a/test/unit/loopover-config-lint-script.test.ts b/test/unit/loopover-config-lint-script.test.ts index 422375237e..16dd1bfc26 100644 --- a/test/unit/loopover-config-lint-script.test.ts +++ b/test/unit/loopover-config-lint-script.test.ts @@ -42,7 +42,7 @@ describe("formatLintReport (#2906)", () => { describe("readManifestTextForLint (#2923 regression)", () => { function withTempDir(run: (dir: string) => void): void { - const dir = mkdtempSync(join(tmpdir(), "gittensory-config-lint-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-config-lint-")); try { run(dir); } finally { diff --git a/test/unit/loopover-focus-manifest.test.ts b/test/unit/loopover-focus-manifest.test.ts index 22a9bdc67d..4dd0ee10d9 100644 --- a/test/unit/loopover-focus-manifest.test.ts +++ b/test/unit/loopover-focus-manifest.test.ts @@ -112,8 +112,8 @@ describe("LoopOver repo focus manifest", () => { }); it("loads bundled manifest for the LoopOver repo when fetch is unavailable", async () => { - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); - const manifest = await loadRepoFocusManifest(env, "JSONbored/gittensory", { fetcher: async () => null }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); + const manifest = await loadRepoFocusManifest(env, "JSONbored/loopover", { fetcher: async () => null }); expect(manifest.present).toBe(true); expect(manifest.wantedPaths).toContain("packages/"); expect(manifest.wantedPaths).toContain("apps/loopover-ui/"); diff --git a/test/unit/maintainer-recap-per-repo.test.ts b/test/unit/maintainer-recap-per-repo.test.ts index cb5c7fb986..07162e2f92 100644 --- a/test/unit/maintainer-recap-per-repo.test.ts +++ b/test/unit/maintainer-recap-per-repo.test.ts @@ -81,7 +81,7 @@ describe("buildPerRepoRecapSection (#2241)", () => { it("redacts a local-path leak in a repo label before emitting (defense-in-depth)", () => { // A mis-shaped label that embeds an absolute local path must be scrubbed via PUBLIC_LOCAL_PATH_SCRUB_PATTERN. - const section = buildPerRepoRecapSection(source([repo("/tmp/evil-checkout/gittensory", 3, 2, 1)])); + const section = buildPerRepoRecapSection(source([repo("/tmp/evil-checkout/loopover", 3, 2, 1)])); expect(section.rows[0]?.repo).toBe(""); expect(section.lines[0]).toBe(": reviewed 3, merged 2, closed 1"); for (const line of section.lines) { diff --git a/test/unit/maintainer-recap-wire.test.ts b/test/unit/maintainer-recap-wire.test.ts index a5f8d388ab..856ba32872 100644 --- a/test/unit/maintainer-recap-wire.test.ts +++ b/test/unit/maintainer-recap-wire.test.ts @@ -6,7 +6,7 @@ import { recordGateBlockOutcome, updatePullRequestSlopAssessment, upsertPullRequ import { upsertRepoFocusManifest } from "../../src/signals/focus-manifest-loader"; import { createTestEnv } from "../helpers/d1"; -const SELF_REPO = "JSONbored/gittensory"; +const SELF_REPO = "JSONbored/loopover"; const HOOK = "https://discord.com/api/webhooks/123/abc"; diff --git a/test/unit/maintainer-settings-preview-ui.test.ts b/test/unit/maintainer-settings-preview-ui.test.ts index af41fe5082..05909c638a 100644 --- a/test/unit/maintainer-settings-preview-ui.test.ts +++ b/test/unit/maintainer-settings-preview-ui.test.ts @@ -15,17 +15,17 @@ describe("maintainer settings preview UI helpers", () => { expect( extractPreviewRepoOptions([ { pr: "entrius/allways-ui#12" }, - { pr: "JSONbored/gittensory#135" }, + { pr: "JSONbored/loopover#135" }, { pr: "entrius/allways-ui#14" }, { pr: "not-a-pr" }, ]), - ).toEqual(["entrius/allways-ui", "JSONbored/gittensory"]); + ).toEqual(["entrius/allways-ui", "JSONbored/loopover"]); }); it("validates owner/repo input before the UI calls the dry-run endpoint", () => { - expect(splitRepoFullName("JSONbored/gittensory")).toEqual({ + expect(splitRepoFullName("JSONbored/loopover")).toEqual({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", }); expect(splitRepoFullName("missing")).toBeNull(); expect(splitRepoFullName("/missing-owner")).toBeNull(); @@ -59,7 +59,7 @@ describe("maintainer settings preview UI helpers", () => { it("builds scenario-specific sample PR requests without private fields", () => { const request = buildSettingsPreviewRequest({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", scenarioId: "miner-api-unavailable", title: " ", labels: "bug, privacy", @@ -86,7 +86,7 @@ describe("maintainer settings preview UI helpers", () => { expect( buildSettingsPreviewRequest({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", scenarioId: "confirmed-miner", title: "Review cache preview", labels: "", @@ -130,12 +130,12 @@ describe("maintainer settings preview UI helpers", () => { expect( extractPreviewRepoOptions([ { pr: { split: () => [] } as unknown as string }, - { pr: "JSONbored/gittensory#251" }, + { pr: "JSONbored/loopover#251" }, ]), - ).toEqual(["JSONbored/gittensory"]); + ).toEqual(["JSONbored/loopover"]); const request = buildSettingsPreviewRequest({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", scenarioId: "confirmed-miner", title: "Export weekly report", labels: "", diff --git a/test/unit/mcp-automation-state.test.ts b/test/unit/mcp-automation-state.test.ts index 40d8ec4cd3..22c2dff1cc 100644 --- a/test/unit/mcp-automation-state.test.ts +++ b/test/unit/mcp-automation-state.test.ts @@ -61,7 +61,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-automation-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-automation-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-check-improvement-potential.test.ts b/test/unit/mcp-check-improvement-potential.test.ts index d569ff1e92..0af7234dbd 100644 --- a/test/unit/mcp-check-improvement-potential.test.ts +++ b/test/unit/mcp-check-improvement-potential.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-improvement-potential-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-improvement-potential-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-check-slop-risk.test.ts b/test/unit/mcp-check-slop-risk.test.ts index e354721bb2..6dcbe698c4 100644 --- a/test/unit/mcp-check-slop-risk.test.ts +++ b/test/unit/mcp-check-slop-risk.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-slop-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-slop-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-check-test-evidence.test.ts b/test/unit/mcp-check-test-evidence.test.ts index 34fa920a15..b2fa06f896 100644 --- a/test/unit/mcp-check-test-evidence.test.ts +++ b/test/unit/mcp-check-test-evidence.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-test-evidence-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-test-evidence-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-cli-analyze-branch.test.ts b/test/unit/mcp-cli-analyze-branch.test.ts index bc83f9f88b..8d85afdd3a 100644 --- a/test/unit/mcp-cli-analyze-branch.test.ts +++ b/test/unit/mcp-cli-analyze-branch.test.ts @@ -37,7 +37,7 @@ describe("loopover-mcp CLI — analyze-branch --format table", () => { }); const env = (url: string) => ({ LOOPOVER_API_URL: url, LOOPOVER_TOKEN: "session-token", LOOPOVER_SKIP_NPM_VERSION_CHECK: "true" }); - const args = (extra: string[]) => ["analyze-branch", "--login", "JSONbored", "--cwd", tempDir as string, "--repo", "JSONbored/gittensory", ...extra]; + const args = (extra: string[]) => ["analyze-branch", "--login", "JSONbored", "--cwd", tempDir as string, "--repo", "JSONbored/loopover", ...extra]; it("renders next actions and score blockers as aligned tables", async () => { tempDir = createPacketRepo(); diff --git a/test/unit/mcp-cli-basics.test.ts b/test/unit/mcp-cli-basics.test.ts index 4ca445fe53..7555a3bdc9 100644 --- a/test/unit/mcp-cli-basics.test.ts +++ b/test/unit/mcp-cli-basics.test.ts @@ -146,13 +146,13 @@ describe("loopover-mcp CLI — basics", () => { LOOPOVER_TOKEN: "session-token", LOOPOVER_SKIP_NPM_VERSION_CHECK: "true", }; - const jsonOutput = await runAsync(["preflight", "--login", "JSONbored", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env); + const jsonOutput = await runAsync(["preflight", "--login", "JSONbored", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], env); const payload = JSON.parse(jsonOutput) as { workspaceIntelligence: { blockers: { accountState: string[] }; rerunWhen: string } }; expect(payload.workspaceIntelligence.blockers.accountState).toEqual([]); expect(payload.workspaceIntelligence.rerunWhen).toBe("Rerun after any branch, base, or PR state changes before opening/submitting."); expect(jsonOutput).not.toMatch(/Open PR count|Credibility|account\/queue maturity|projected score/i); - const humanOutput = await runAsync(["preflight", "--login", "JSONbored", "--cwd", tempDir, "--repo", "JSONbored/gittensory"], env); + const humanOutput = await runAsync(["preflight", "--login", "JSONbored", "--cwd", tempDir, "--repo", "JSONbored/loopover"], env); expect(humanOutput).not.toContain("Account/queue blockers:"); expect(humanOutput).not.toMatch(/Open PR count|Credibility|account\/queue maturity|projected score/i); }); diff --git a/test/unit/mcp-cli-burden-forecast.test.ts b/test/unit/mcp-cli-burden-forecast.test.ts index eb8d2b3bfe..bb28678f7c 100644 --- a/test/unit/mcp-cli-burden-forecast.test.ts +++ b/test/unit/mcp-cli-burden-forecast.test.ts @@ -16,7 +16,7 @@ let apiUrl: string; let capturedRequests: Array<{ url: string; method: string }>; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-burden-forecast-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-burden-forecast-")); capturedRequests = []; apiUrl = await startFixtureServer({ onApiRequest: (request) => { diff --git a/test/unit/mcp-cli-doctor.test.ts b/test/unit/mcp-cli-doctor.test.ts index bf9777f028..e03bef097b 100644 --- a/test/unit/mcp-cli-doctor.test.ts +++ b/test/unit/mcp-cli-doctor.test.ts @@ -31,7 +31,7 @@ describe("loopover-mcp CLI — doctor", () => { mkdirSync(secretConfigDir, { recursive: true }); writeFileSync(join(secretConfigDir, "config.json"), JSON.stringify({ apiUrl: url }), { mode: 0o600 }); const payload = JSON.parse( - await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], { + await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], { LOOPOVER_API_URL: url, LOOPOVER_TOKEN: "session-token", LOOPOVER_CONFIG_DIR: secretConfigDir, @@ -107,7 +107,7 @@ describe("loopover-mcp CLI — doctor", () => { tempDir = mkdtempSync(join(tmpdir(), "loopover-cli-")); const url = await startFixtureServer(); const payload = JSON.parse( - await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], { + await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], { LOOPOVER_API_URL: url, LOOPOVER_API_TOKEN: "", LOOPOVER_TOKEN: "", @@ -223,7 +223,7 @@ describe("loopover-mcp CLI — doctor", () => { expect(status.package.updateAvailable).toBe(false); const doctor = JSON.parse( - await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], { + await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], { LOOPOVER_API_URL: url, LOOPOVER_NPM_REGISTRY_URL: url, LOOPOVER_TOKEN: "session-token", @@ -238,7 +238,7 @@ describe("loopover-mcp CLI — doctor", () => { tempDir = mkdtempSync(join(tmpdir(), "loopover-cli-")); const url = await startFixtureServer({ latestVersion: oneMinorAboveLocal }); const payload = JSON.parse( - await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], { + await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], { LOOPOVER_API_URL: url, LOOPOVER_NPM_REGISTRY_URL: url, LOOPOVER_TOKEN: "session-token", @@ -265,7 +265,7 @@ describe("loopover-mcp CLI — doctor", () => { expect(payload.apiCompatibility.status).toBe("unavailable"); const doctor = JSON.parse( - await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], { + await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], { LOOPOVER_API_URL: url, LOOPOVER_TOKEN: "session-token", LOOPOVER_CONFIG_DIR: tempDir, @@ -344,7 +344,7 @@ describe("loopover-mcp CLI — doctor", () => { upgradeCommand: "npm install -g @loopover/mcp@latest", }); - const doctor = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env)) as { + const doctor = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], env)) as { checklist: Array<{ id: string; status: string }>; nextCommand: { command: string; reason: string }; checks: Array<{ name: string; status: string; remediation?: string }>; @@ -369,7 +369,7 @@ describe("loopover-mcp CLI — doctor", () => { tempDir = mkdtempSync(join(tmpdir(), "loopover-cli-")); const url = await startFixtureServer(); const payload = JSON.parse( - await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], { + await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], { LOOPOVER_API_URL: url, LOOPOVER_TOKEN: "session-token", LOOPOVER_CONFIG_DIR: tempDir, @@ -428,8 +428,8 @@ describe("loopover-mcp CLI — doctor", () => { }; const statusOutput = await runAsync(["status"], env); const statusJsonOutput = await runAsync(["status", "--json"], env); - const doctorOutput = await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory"], env); - const doctorJsonOutput = await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env); + const doctorOutput = await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover"], env); + const doctorJsonOutput = await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], env); for (const output of [statusOutput, statusJsonOutput, doctorOutput, doctorJsonOutput]) { expect(output).not.toContain("session-token"); expect(output).not.toContain(tempDir); diff --git a/test/unit/mcp-cli-find-opportunities.test.ts b/test/unit/mcp-cli-find-opportunities.test.ts index a3b5791098..e3d63c24ef 100644 --- a/test/unit/mcp-cli-find-opportunities.test.ts +++ b/test/unit/mcp-cli-find-opportunities.test.ts @@ -16,7 +16,7 @@ let apiUrl: string; let capturedRequests: Array<{ url: string; method: string; body: string }>; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-find-opp-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-find-opp-")); capturedRequests = []; apiUrl = await startFixtureServer({ onApiRequest: (request) => { diff --git a/test/unit/mcp-cli-issue-rag.test.ts b/test/unit/mcp-cli-issue-rag.test.ts index 79b220de01..bd3af5d579 100644 --- a/test/unit/mcp-cli-issue-rag.test.ts +++ b/test/unit/mcp-cli-issue-rag.test.ts @@ -16,7 +16,7 @@ let apiUrl: string; let capturedRequests: Array<{ url: string; method: string; body: string }>; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-issue-rag-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-issue-rag-")); capturedRequests = []; apiUrl = await startFixtureServer({ onApiRequest: (request) => { @@ -69,7 +69,7 @@ describe("loopover_retrieve_issue_context stdio proxy", () => { name: "loopover_retrieve_issue_context", arguments: { owner: "JSONbored", - repo: "gittensory", + repo: "loopover", title: "Improve SQLite backup readiness checks", labels: ["selfhost"], topK: 6, @@ -88,7 +88,7 @@ describe("loopover_retrieve_issue_context stdio proxy", () => { body?: string; }; expect(parsedBody.owner).toBe("JSONbored"); - expect(parsedBody.repo).toBe("gittensory"); + expect(parsedBody.repo).toBe("loopover"); expect(parsedBody.title).toBe("Improve SQLite backup readiness checks"); expect(parsedBody.labels).toEqual(["selfhost"]); expect(parsedBody.topK).toBe(6); @@ -100,7 +100,7 @@ describe("loopover_retrieve_issue_context stdio proxy", () => { name: "loopover_retrieve_issue_context", arguments: { owner: "JSONbored", - repo: "gittensory", + repo: "loopover", title: "Improve SQLite backup readiness checks", }, }); diff --git a/test/unit/mcp-cli-issue-slop.test.ts b/test/unit/mcp-cli-issue-slop.test.ts index 177d4f0e79..ceb57293cd 100644 --- a/test/unit/mcp-cli-issue-slop.test.ts +++ b/test/unit/mcp-cli-issue-slop.test.ts @@ -92,7 +92,7 @@ describe("loopover-mcp CLI — issue-slop", () => { it("validates inputs and prints help", async () => { const e = await env(); - await expect(runAsync(["issue-slop", "--body-file", "/tmp/missing-gittensory-issue-body.md"], e)).rejects.toThrow(/Body file not found/); + await expect(runAsync(["issue-slop", "--body-file", "/tmp/missing-loopover-issue-body.md"], e)).rejects.toThrow(/Body file not found/); const help = run(["issue-slop", "--help"]); expect(help).toMatch(/Usage: loopover-mcp issue-slop/); expect(help).toMatch(/loopover_check_issue_slop/); diff --git a/test/unit/mcp-cli-label-audit.test.ts b/test/unit/mcp-cli-label-audit.test.ts index 55c1621d8b..43fbba430d 100644 --- a/test/unit/mcp-cli-label-audit.test.ts +++ b/test/unit/mcp-cli-label-audit.test.ts @@ -16,7 +16,7 @@ let apiUrl: string; let capturedRequests: Array<{ url: string; method: string }>; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-label-audit-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-label-audit-")); capturedRequests = []; apiUrl = await startFixtureServer({ onApiRequest: (request) => { diff --git a/test/unit/mcp-cli-lint-pr-text.test.ts b/test/unit/mcp-cli-lint-pr-text.test.ts index 40c7cface1..4d22d9f9d4 100644 --- a/test/unit/mcp-cli-lint-pr-text.test.ts +++ b/test/unit/mcp-cli-lint-pr-text.test.ts @@ -99,7 +99,7 @@ describe("loopover-mcp CLI — lint-pr-text", () => { it("validates inputs and prints help", async () => { const e = await env(); await expect(runAsync(["lint-pr-text", "--linked-issue", "0"], e)).rejects.toThrow(/positive integer/); - await expect(runAsync(["lint-pr-text", "--body-file", "/tmp/missing-gittensory-pr-body.md"], e)).rejects.toThrow(/Body file not found/); + await expect(runAsync(["lint-pr-text", "--body-file", "/tmp/missing-loopover-pr-body.md"], e)).rejects.toThrow(/Body file not found/); const help = run(["lint-pr-text", "--help"]); expect(help).toMatch(/Usage: loopover-mcp lint-pr-text/); expect(help).toMatch(/loopover_lint_pr_text/); diff --git a/test/unit/mcp-cli-monitor-open-prs.test.ts b/test/unit/mcp-cli-monitor-open-prs.test.ts index 8fef2eae5b..b6cb511451 100644 --- a/test/unit/mcp-cli-monitor-open-prs.test.ts +++ b/test/unit/mcp-cli-monitor-open-prs.test.ts @@ -68,7 +68,7 @@ describe("loopover_monitor_open_prs stdio proxy", () => { expect(captured.method).toBe("GET"); expect(result.isError).toBeFalsy(); const text = JSON.stringify(result); - expect(text).toContain("JSONbored/gittensory"); + expect(text).toContain("JSONbored/loopover"); expect(text).toContain("failing_checks"); // The tool summary is the API's own sentence, not a second one invented client-side. expect(text).toContain(openPrMonitorFixture().summary); @@ -92,7 +92,7 @@ describe("loopover-mcp monitor-open-prs CLI", () => { const fixture = openPrMonitorFixture(); expect(out).toContain(fixture.summary); expect(out).toContain(fixture.guidance[0]!); - expect(out).toContain("JSONbored/gittensory#42 [failing_checks] fix(queue): drain stale entries"); + expect(out).toContain("JSONbored/loopover#42 [failing_checks] fix(queue): drain stale entries"); expect(out).toContain(" - Fix the failing check, then push."); }); diff --git a/test/unit/mcp-cli-packets.test.ts b/test/unit/mcp-cli-packets.test.ts index 0bfd673e62..a3f566290f 100644 --- a/test/unit/mcp-cli-packets.test.ts +++ b/test/unit/mcp-cli-packets.test.ts @@ -59,7 +59,7 @@ describe("loopover-mcp CLI — packets", () => { expect(offline.cachedAt).toEqual(expect.any(String)); expect(offline.cache.rerunGuidance).toMatch(/Retry when LoopOver API access is restored/); - const repoDecision = JSON.parse(await runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/gittensory", "--json"], env)) as { + const repoDecision = JSON.parse(await runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/loopover", "--json"], env)) as { status: string; source: string; stale: boolean; @@ -69,7 +69,7 @@ describe("loopover-mcp CLI — packets", () => { status: "ready", source: "local_cache", stale: true, - decision: { repoFullName: "JSONbored/gittensory", recommendation: "pursue" }, + decision: { repoFullName: "JSONbored/loopover", recommendation: "pursue" }, }); }); @@ -244,7 +244,7 @@ describe("loopover-mcp CLI — packets", () => { fixtureOptions.repoDecisionErrorContentType = "text/html"; await expect(runAsync(["decision-pack", "--login", "JSONbored", "--json"], env)).rejects.toThrow(/LoopOver API 403/); - await expect(runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/gittensory", "--json"], env)).rejects.toThrow(/LoopOver API 403/); + await expect(runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/loopover", "--json"], env)).rejects.toThrow(/LoopOver API 403/); }); it("does not use stale decision-pack cache when local credentials are missing", async () => { @@ -265,7 +265,7 @@ describe("loopover-mcp CLI — packets", () => { }; await expect(runAsync(["decision-pack", "--login", "JSONbored", "--json"], withoutToken)).rejects.toThrow(/Run `loopover-mcp login`/); - await expect(runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/gittensory", "--json"], withoutToken)).rejects.toThrow( + await expect(runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/loopover", "--json"], withoutToken)).rejects.toThrow( /Run `loopover-mcp login`/, ); }); @@ -279,14 +279,14 @@ describe("loopover-mcp CLI — packets", () => { LOOPOVER_CONFIG_DIR: tempDir, }; - const plan = JSON.parse(await runAsync(["agent", "plan", "--login", "JSONbored", "--repo", "JSONbored/gittensory", "--json"], env)) as { + const plan = JSON.parse(await runAsync(["agent", "plan", "--login", "JSONbored", "--repo", "JSONbored/loopover", "--json"], env)) as { run: { id: string; status: string }; actions: Array<{ actionType: string }>; }; expect(plan.run).toMatchObject({ id: "run-1", status: "completed" }); expect(plan.actions[0]).toMatchObject({ actionType: "choose_next_work" }); - const planText = await runAsync(["agent", "plan", "--login", "JSONbored", "--repo", "JSONbored/gittensory"], env); + const planText = await runAsync(["agent", "plan", "--login", "JSONbored", "--repo", "JSONbored/loopover"], env); expect(planText).toContain("why now:"); expect(planText).toContain("impact:"); expect(planText).toContain("rerun:"); @@ -305,7 +305,7 @@ describe("loopover-mcp CLI — packets", () => { git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); git(tempDir, "config", "commit.gpgsign", "false"); - git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/gittensory.git"); + git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/loopover.git"); writeFileSync(join(tempDir, "README.md"), "fixture\n"); git(tempDir, "add", "README.md"); git(tempDir, "commit", "-m", "initial commit"); @@ -334,7 +334,7 @@ describe("loopover-mcp CLI — packets", () => { git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); git(tempDir, "config", "commit.gpgsign", "false"); - git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/gittensory.git"); + git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/loopover.git"); writeFileSync(join(tempDir, "README.md"), "fixture\n"); git(tempDir, "add", "README.md"); git(tempDir, "commit", "-m", "initial commit"); @@ -374,7 +374,7 @@ describe("loopover-mcp CLI — packets", () => { git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); git(tempDir, "config", "commit.gpgsign", "false"); - git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/gittensory.git"); + git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/loopover.git"); writeFileSync(join(tempDir, "README.md"), "fixture\n"); git(tempDir, "add", "README.md"); git(tempDir, "commit", "-m", "initial commit"); @@ -468,7 +468,7 @@ describe("loopover-mcp CLI — packets", () => { git(tempDir, "config", "user.email", "test@example.com"); git(tempDir, "config", "user.name", "LoopOver Test"); git(tempDir, "config", "commit.gpgsign", "false"); - git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/gittensory.git"); + git(tempDir, "remote", "add", "origin", "git@github.com:JSONbored/loopover.git"); writeFileSync(join(tempDir, "README.md"), "fixture\n"); git(tempDir, "add", "README.md"); git(tempDir, "commit", "-m", "initial commit"); diff --git a/test/unit/mcp-cli-pr-reviewability.test.ts b/test/unit/mcp-cli-pr-reviewability.test.ts index 6027ccd23c..54939381e9 100644 --- a/test/unit/mcp-cli-pr-reviewability.test.ts +++ b/test/unit/mcp-cli-pr-reviewability.test.ts @@ -16,7 +16,7 @@ let apiUrl: string; let capturedRequests: Array<{ url: string; method: string }>; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-pr-reviewability-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-pr-reviewability-")); capturedRequests = []; apiUrl = await startFixtureServer({ onApiRequest: (request) => { diff --git a/test/unit/mcp-cli-profiles.test.ts b/test/unit/mcp-cli-profiles.test.ts index 057965fe31..0fbc56c219 100644 --- a/test/unit/mcp-cli-profiles.test.ts +++ b/test/unit/mcp-cli-profiles.test.ts @@ -165,7 +165,7 @@ describe("loopover-mcp CLI — profiles", () => { const list = JSON.parse(await runAsync(["profile", "list", "--json"], env)) as { profiles: Array<{ name: string; authenticated: boolean; login: string | null }> }; const betaWhoami = JSON.parse(await runAsync(["whoami", "--profile", "beta", "--json"], env)) as { profile: string; login: string }; const missingStatus = JSON.parse(await runAsync(["status", "--profile", "missing", "--json"], env)) as { auth: { status: string }; profile: { name: string; configured: boolean; authenticated: boolean } }; - const doctor = JSON.parse(await runAsync(["doctor", "--profile", "missing", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env)) as { profile: { name: string; configured: boolean }; checks: Array<{ name: string; status: string; detail: string }> }; + const doctor = JSON.parse(await runAsync(["doctor", "--profile", "missing", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], env)) as { profile: { name: string; configured: boolean }; checks: Array<{ name: string; status: string; detail: string }> }; expect(logout).toMatchObject({ status: "logged_out", profile: "alpha" }); expect(list.profiles).toEqual( diff --git a/test/unit/mcp-cli-review-pr.test.ts b/test/unit/mcp-cli-review-pr.test.ts index 33dc847548..685e7aa685 100644 --- a/test/unit/mcp-cli-review-pr.test.ts +++ b/test/unit/mcp-cli-review-pr.test.ts @@ -38,7 +38,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--commit", "feat(mcp): add review-pr command", "--body", @@ -82,7 +82,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--commit", "feat(mcp): add review-pr command", "--body", @@ -118,7 +118,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--json", ], env, @@ -167,7 +167,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--commit", "fix(mcp): map preflight status", "--body", @@ -223,7 +223,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--commit", "fix(mcp): map preflight status", "--body", @@ -267,7 +267,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--body-file", bodyPath, "--linked-issue", @@ -298,7 +298,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--body", "Validated with npm test.", "--linked-issue", @@ -331,7 +331,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--body", "Validated with npm test.", "--linked-issue", @@ -361,7 +361,7 @@ describe("loopover-mcp CLI — review-pr", () => { "--cwd", tempDir, "--repo", - "JSONbored/gittensory", + "JSONbored/loopover", "--body", "Validated with npm test.", "--linked-issue", diff --git a/test/unit/mcp-cli-slop-risk.test.ts b/test/unit/mcp-cli-slop-risk.test.ts index ede477a214..88ddc5b0e9 100644 --- a/test/unit/mcp-cli-slop-risk.test.ts +++ b/test/unit/mcp-cli-slop-risk.test.ts @@ -116,7 +116,7 @@ describe("loopover-mcp CLI — slop-risk", () => { const e = await env(); await expect(runAsync(["slop-risk", "--changed-file", ":1:2"], e)).rejects.toThrow(/Invalid --changed-file/); await expect(runAsync(["slop-risk", "--changed-file", "src/a.ts:-1"], e)).rejects.toThrow(/Invalid additions/); - await expect(runAsync(["slop-risk", "--description-file", "/tmp/missing-gittensory-slop-description.md"], e)).rejects.toThrow(/Description file not found/); + await expect(runAsync(["slop-risk", "--description-file", "/tmp/missing-loopover-slop-description.md"], e)).rejects.toThrow(/Description file not found/); const help = run(["slop-risk", "--help"]); expect(help).toMatch(/Usage: loopover-mcp slop-risk/); expect(help).toMatch(/loopover_check_slop_risk/); diff --git a/test/unit/mcp-cli-telemetry.test.ts b/test/unit/mcp-cli-telemetry.test.ts index f290d20410..56342af644 100644 --- a/test/unit/mcp-cli-telemetry.test.ts +++ b/test/unit/mcp-cli-telemetry.test.ts @@ -69,7 +69,7 @@ describe("loopover-mcp CLI — telemetry opt-in", () => { // Default-off surfaces everywhere. const statusOff = JSON.parse(await runAsync(["status", "--json"], env)) as { telemetry: { enabled: boolean } }; const configOff = JSON.parse(await runAsync(["config", "--json"], env)) as { telemetry: { enabled: boolean } }; - const doctorOff = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env)) as { + const doctorOff = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], env)) as { telemetry: { enabled: boolean }; checklist: Array<{ id: string; checks?: Array<{ name: string; status: string }> }>; checks: Array<{ name: string; status: string; detail: string }>; @@ -88,7 +88,7 @@ describe("loopover-mcp CLI — telemetry opt-in", () => { await runAsync(["telemetry", "enable", "--json"], env); const statusOn = JSON.parse(await runAsync(["status", "--json"], env)) as { telemetry: { enabled: boolean } }; const configOn = JSON.parse(await runAsync(["config", "--json"], env)) as { telemetry: { enabled: boolean } }; - const doctorOn = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env)) as { + const doctorOn = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/loopover", "--json"], env)) as { telemetry: { enabled: boolean }; checks: Array<{ name: string; status: string; detail: string }>; }; diff --git a/test/unit/mcp-cli-terminal-sanitization.test.ts b/test/unit/mcp-cli-terminal-sanitization.test.ts index ec75f46984..9dae7f99c0 100644 --- a/test/unit/mcp-cli-terminal-sanitization.test.ts +++ b/test/unit/mcp-cli-terminal-sanitization.test.ts @@ -57,7 +57,7 @@ describe("loopover-mcp CLI — terminal-escape sanitization (#6261)", () => { }); it("repo-decision: a hostile nextActions entry and rerunGuidance cannot reach the terminal", async () => { - const out = await runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/gittensory"], await env()); + const out = await runAsync(["repo-decision", "--login", "JSONbored", "--repo", "JSONbored/loopover"], await env()); expectNeutralized(out); }); diff --git a/test/unit/mcp-discovery.test.ts b/test/unit/mcp-discovery.test.ts index b942066e3a..a7bcb48890 100644 --- a/test/unit/mcp-discovery.test.ts +++ b/test/unit/mcp-discovery.test.ts @@ -17,7 +17,7 @@ let transport: StdioClientTransport; let configDir: string; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-discovery-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-discovery-")); transport = new StdioClientTransport({ command: "node", args: [bin, "--stdio"], @@ -39,7 +39,7 @@ async function disconnect() { describe("MCP workspace root boundaries", () => { it("applies client-advertised roots to structured local status cwd requests", async () => { - const tempRoot = mkdtempSync(join(tmpdir(), "gittensory-roots-")); + const tempRoot = mkdtempSync(join(tmpdir(), "loopover-roots-")); const advertisedWorkspace = join(tempRoot, "advertised-workspace"); const privateRepo = join(tempRoot, "private-repo-outside-root"); const localConfigDir = join(tempRoot, "config"); diff --git a/test/unit/mcp-eligibility-plan.test.ts b/test/unit/mcp-eligibility-plan.test.ts index 7732702240..d53c6e76bf 100644 --- a/test/unit/mcp-eligibility-plan.test.ts +++ b/test/unit/mcp-eligibility-plan.test.ts @@ -21,7 +21,7 @@ async function connect(env: Env = createTestEnv()) { const server = new LoopoverMcp(env).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-eligibility-plan-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-eligibility-plan-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } @@ -128,7 +128,7 @@ describe("MCP loopover_get_eligibility_plan (#2222)", () => { const server = new LoopoverMcp(env).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-eligibility-plan-contributor-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-eligibility-plan-contributor-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); const plan = await callPlan(client, { diff --git a/test/unit/mcp-explain-gate-disposition.test.ts b/test/unit/mcp-explain-gate-disposition.test.ts index d84ae73d65..3c792cea68 100644 --- a/test/unit/mcp-explain-gate-disposition.test.ts +++ b/test/unit/mcp-explain-gate-disposition.test.ts @@ -11,7 +11,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-explain-gate-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-explain-gate-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-feasibility-gate.test.ts b/test/unit/mcp-feasibility-gate.test.ts index 6bfd4630eb..5d453e0648 100644 --- a/test/unit/mcp-feasibility-gate.test.ts +++ b/test/unit/mcp-feasibility-gate.test.ts @@ -14,7 +14,7 @@ let transport: StdioClientTransport; let configDir: string; async function connect() { - configDir = mkdtempSync(join(tmpdir(), "gittensory-feasibility-gate-")); + configDir = mkdtempSync(join(tmpdir(), "loopover-feasibility-gate-")); transport = new StdioClientTransport({ command: "node", args: [bin, "--stdio"], @@ -107,7 +107,7 @@ describe("loopover_feasibility_gate: local claim-ledger sourcing (#5157)", () => let ledgerConfigDir: string; async function connectWithLedgerDb(dbPath: string | undefined) { - ledgerConfigDir = mkdtempSync(join(tmpdir(), "gittensory-feasibility-gate-ledger-")); + ledgerConfigDir = mkdtempSync(join(tmpdir(), "loopover-feasibility-gate-ledger-")); const env: Record = { ...(process.env as Record), LOOPOVER_CONFIG_DIR: ledgerConfigDir }; if (dbPath !== undefined) env.LOOPOVER_MINER_CLAIM_LEDGER_DB = dbPath; else delete env.LOOPOVER_MINER_CLAIM_LEDGER_DB; @@ -117,7 +117,7 @@ describe("loopover_feasibility_gate: local claim-ledger sourcing (#5157)", () => } beforeEach(() => { - ledgerRoot = mkdtempSync(join(tmpdir(), "gittensory-feasibility-gate-ledger-db-")); + ledgerRoot = mkdtempSync(join(tmpdir(), "loopover-feasibility-gate-ledger-db-")); ledgerDbPath = join(ledgerRoot, "claim-ledger.sqlite3"); }); diff --git a/test/unit/mcp-find-opportunities.test.ts b/test/unit/mcp-find-opportunities.test.ts index f4d203c039..fe898bc3ed 100644 --- a/test/unit/mcp-find-opportunities.test.ts +++ b/test/unit/mcp-find-opportunities.test.ts @@ -52,7 +52,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = new LoopoverMcp(env, identity).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-find-opportunities-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-find-opportunities-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-finding-taxonomy.test.ts b/test/unit/mcp-finding-taxonomy.test.ts index e307064cdd..a61283de8f 100644 --- a/test/unit/mcp-finding-taxonomy.test.ts +++ b/test/unit/mcp-finding-taxonomy.test.ts @@ -11,7 +11,7 @@ async function connectTestClient() { const mcpServer = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await mcpServer.connect(serverTransport); - const client = new Client({ name: "gittensory-finding-taxonomy-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-finding-taxonomy-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return { client, mcpServer }; } diff --git a/test/unit/mcp-gate-precision.test.ts b/test/unit/mcp-gate-precision.test.ts index ee273a6631..9fee6f26b2 100644 --- a/test/unit/mcp-gate-precision.test.ts +++ b/test/unit/mcp-gate-precision.test.ts @@ -11,7 +11,7 @@ async function connect(env: Env) { const server = new LoopoverMcp(env).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-gate-precision-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-gate-precision-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-intake-idea.test.ts b/test/unit/mcp-intake-idea.test.ts index 0b4d8a8c2f..34c033ea20 100644 --- a/test/unit/mcp-intake-idea.test.ts +++ b/test/unit/mcp-intake-idea.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-intake-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-intake-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-issue-rag.test.ts b/test/unit/mcp-issue-rag.test.ts index dd8fb25921..bc28ca0d87 100644 --- a/test/unit/mcp-issue-rag.test.ts +++ b/test/unit/mcp-issue-rag.test.ts @@ -11,7 +11,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = new LoopoverMcp(env, identity).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-issue-rag-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-issue-rag-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-loop-escalation.test.ts b/test/unit/mcp-loop-escalation.test.ts index c62d4cdf03..c5a1a7aeca 100644 --- a/test/unit/mcp-loop-escalation.test.ts +++ b/test/unit/mcp-loop-escalation.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-escalation-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-escalation-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-loop-progress.test.ts b/test/unit/mcp-loop-progress.test.ts index 161681ce67..16b850290a 100644 --- a/test/unit/mcp-loop-progress.test.ts +++ b/test/unit/mcp-loop-progress.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-progress-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-progress-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-notifications.test.ts b/test/unit/mcp-notifications.test.ts index 2d7ceef7e5..87767f80c6 100644 --- a/test/unit/mcp-notifications.test.ts +++ b/test/unit/mcp-notifications.test.ts @@ -15,7 +15,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-notifications-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-notifications-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-output-schemas.test.ts b/test/unit/mcp-output-schemas.test.ts index 87332f9478..3599c4a92d 100644 --- a/test/unit/mcp-output-schemas.test.ts +++ b/test/unit/mcp-output-schemas.test.ts @@ -47,7 +47,7 @@ async function connectTestClient(env: Env = createTestEnv(), identity?: AuthIden const mcpServer = new LoopoverMcp(env, identity).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await mcpServer.connect(serverTransport); - const client = new Client({ name: "gittensory-output-schema-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-output-schema-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return { client, mcpServer }; } diff --git a/test/unit/mcp-plan-dag.test.ts b/test/unit/mcp-plan-dag.test.ts index 2b6b5a6f7d..d2ae150810 100644 --- a/test/unit/mcp-plan-dag.test.ts +++ b/test/unit/mcp-plan-dag.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-plan-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-plan-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-planning-elicitation.test.ts b/test/unit/mcp-planning-elicitation.test.ts index 70f7cdf584..09ca5d4045 100644 --- a/test/unit/mcp-planning-elicitation.test.ts +++ b/test/unit/mcp-planning-elicitation.test.ts @@ -17,7 +17,7 @@ async function connectTestClient(capabilities: ClientCapabilities) { const mcpServer = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await mcpServer.connect(serverTransport); - const client = new Client({ name: "gittensory-planning-elicitation-test", version: "0.1.0" }, { capabilities }); + const client = new Client({ name: "loopover-planning-elicitation-test", version: "0.1.0" }, { capabilities }); await client.connect(clientTransport); return { client, mcpServer }; } @@ -62,7 +62,7 @@ describe("MCP planning elicitation", () => { const choices = planningChoicesFromElicitationResult({ action: "accept", content: { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", contributionLane: "direct_pr", timeHorizon: "this_week", riskAppetite: "medium", @@ -72,7 +72,7 @@ describe("MCP planning elicitation", () => { }, }); expect(choices).toEqual({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", contributionLane: "direct_pr", timeHorizon: "this_week", riskAppetite: "medium", @@ -111,12 +111,12 @@ describe("MCP planning elicitation", () => { expect( applyMcpPlanningChoices( { login: "oktofeesh1" }, - { repoFullName: "JSONbored/gittensory" }, + { repoFullName: "JSONbored/loopover" }, ), ).toMatchObject({ login: "oktofeesh1", - repoFullName: "JSONbored/gittensory", - objective: expect.stringContaining("repo JSONbored/gittensory"), + repoFullName: "JSONbored/loopover", + objective: expect.stringContaining("repo JSONbored/loopover"), }); expect(applyMcpPlanningChoices({ login: "oktofeesh1" }, {})).toEqual({ login: "oktofeesh1" }); expect(applyMcpPlanningChoices({ login: "oktofeesh1" }, { cleanupFirst: false })).toMatchObject({ @@ -128,7 +128,7 @@ describe("MCP planning elicitation", () => { expect( buildMcpPlanningElicitationAudit( { supported: true, requested: true, accepted: true }, - { repoFullName: "JSONbored/gittensory", cleanupFirst: false }, + { repoFullName: "JSONbored/loopover", cleanupFirst: false }, ), ).toEqual({ supported: true, @@ -146,7 +146,7 @@ describe("MCP planning elicitation", () => { return { action: "accept", content: { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", contributionLane: "cleanup", timeHorizon: "today", riskAppetite: "low", @@ -166,7 +166,7 @@ describe("MCP planning elicitation", () => { accepted: true, fields: ["repoFullName", "contributionLane", "timeHorizon", "riskAppetite", "cleanupFirst"], }); - expect(data.planningChoices).toMatchObject({ repoFullName: "JSONbored/gittensory", cleanupFirst: true }); + expect(data.planningChoices).toMatchObject({ repoFullName: "JSONbored/loopover", cleanupFirst: true }); expect(JSON.stringify(data.planningChoices)).not.toMatch(/hotkey|should-be-ignored/i); await mcpServer.close(); }); @@ -175,13 +175,13 @@ describe("MCP planning elicitation", () => { const { client, mcpServer } = await connectTestClient({ elicitation: {} }); client.setRequestHandler(ElicitRequestSchema, async () => ({ action: "accept", - content: { repoFullName: "JSONbored/gittensory" }, + content: { repoFullName: "JSONbored/loopover" }, })); const result = await client.callTool({ name: "loopover_agent_plan_next_work", arguments: { login: "oktofeesh1" } }); expect(result.isError, JSON.stringify(result.content)).toBeFalsy(); const data = result.structuredContent as Record; expect(data.planningElicitation).toMatchObject({ supported: true, requested: true, accepted: true }); - expect(data.planningChoices).toEqual({ repoFullName: "JSONbored/gittensory" }); + expect(data.planningChoices).toEqual({ repoFullName: "JSONbored/loopover" }); await mcpServer.close(); }); @@ -194,7 +194,7 @@ describe("MCP planning elicitation", () => { }); const result = await client.callTool({ name: "loopover_agent_plan_next_work", - arguments: { login: "oktofeesh1", objective: "Use explicit context.", repoFullName: "JSONbored/gittensory" }, + arguments: { login: "oktofeesh1", objective: "Use explicit context.", repoFullName: "JSONbored/loopover" }, }); expect(result.isError, JSON.stringify(result.content)).toBeFalsy(); const data = result.structuredContent as Record; diff --git a/test/unit/mcp-pr-ai-review-findings.test.ts b/test/unit/mcp-pr-ai-review-findings.test.ts index 86bfc05971..dfb2c08fba 100644 --- a/test/unit/mcp-pr-ai-review-findings.test.ts +++ b/test/unit/mcp-pr-ai-review-findings.test.ts @@ -17,7 +17,7 @@ async function connect(env: Env, identity?: AuthIdentity): Promise { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-pr-ai-review-findings-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-pr-ai-review-findings-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-pr-reviewability.test.ts b/test/unit/mcp-pr-reviewability.test.ts index 0993bd2c8a..8cdace7270 100644 --- a/test/unit/mcp-pr-reviewability.test.ts +++ b/test/unit/mcp-pr-reviewability.test.ts @@ -14,7 +14,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-reviewability-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-reviewability-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-predict-gate.test.ts b/test/unit/mcp-predict-gate.test.ts index 6839525961..3fc8e963a8 100644 --- a/test/unit/mcp-predict-gate.test.ts +++ b/test/unit/mcp-predict-gate.test.ts @@ -11,7 +11,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-predict-gate-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-predict-gate-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } @@ -20,7 +20,7 @@ describe("MCP loopover_predict_gate", () => { afterEach(() => setLocalManifestReader(null)); it("predicts the gate from public config on an unregistered repo under oss-anti-slop", async () => { const env = createTestEnv(); - // A non-Gittensor repo: app-installed (so gittensory has "seen" it) but NOT Gittensor-registered, with + // A non-Gittensor repo: app-installed (so loopover has "seen" it) but NOT Gittensor-registered, with // public config only (gate.pack oss-anti-slop, linked-issue blocks any author). await upsertRepositoryFromGitHub(env, { name: "widgets", full_name: "acme/widgets" }); await upsertRepoFocusManifest(env, "acme/widgets", { gate: { pack: "oss-anti-slop", linkedIssue: "block" } }, "repo_file"); diff --git a/test/unit/mcp-refresh-repo-docs.test.ts b/test/unit/mcp-refresh-repo-docs.test.ts index 6f45b51f0f..4bc6f47020 100644 --- a/test/unit/mcp-refresh-repo-docs.test.ts +++ b/test/unit/mcp-refresh-repo-docs.test.ts @@ -28,7 +28,7 @@ async function connect(env: Env, identity?: AuthIdentity) { const server = (identity ? new LoopoverMcp(env, identity) : new LoopoverMcp(env)).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-refresh-repo-docs-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-refresh-repo-docs-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-release-candidate.test.ts b/test/unit/mcp-release-candidate.test.ts index 3d374b851e..a3d49dd292 100644 --- a/test/unit/mcp-release-candidate.test.ts +++ b/test/unit/mcp-release-candidate.test.ts @@ -97,7 +97,7 @@ describe("checkTarball", () => { }); it("passes for an allowlisted file set with no secret-like content (success fixture)", () => { - const result = checkTarball({ files: ALLOWED_FILES, contentsByFile: { "README.md": "# gittensory-mcp", "package.json": "{}" } }); + const result = checkTarball({ files: ALLOWED_FILES, contentsByFile: { "README.md": "# loopover-mcp", "package.json": "{}" } }); expect(result).toMatchObject({ ok: true, code: "tarball_ok" }); expect(result.unexpected).toEqual([]); }); diff --git a/test/unit/mcp-results-payload.test.ts b/test/unit/mcp-results-payload.test.ts index 8d08f7b1d8..1b9b4e0ab3 100644 --- a/test/unit/mcp-results-payload.test.ts +++ b/test/unit/mcp-results-payload.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-results-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-results-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-run-local-scorer.test.ts b/test/unit/mcp-run-local-scorer.test.ts index 241fb84f46..a7553be297 100644 --- a/test/unit/mcp-run-local-scorer.test.ts +++ b/test/unit/mcp-run-local-scorer.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-scorer-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-scorer-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-simulate-open-pr-pressure.test.ts b/test/unit/mcp-simulate-open-pr-pressure.test.ts index 943dabf56d..cc677f993e 100644 --- a/test/unit/mcp-simulate-open-pr-pressure.test.ts +++ b/test/unit/mcp-simulate-open-pr-pressure.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-open-pr-pressure-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-open-pr-pressure-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-suggest-boundary-tests.test.ts b/test/unit/mcp-suggest-boundary-tests.test.ts index 8e18d0a0d1..370e114830 100644 --- a/test/unit/mcp-suggest-boundary-tests.test.ts +++ b/test/unit/mcp-suggest-boundary-tests.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-boundary-tests-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-boundary-tests-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } diff --git a/test/unit/mcp-write-tools.test.ts b/test/unit/mcp-write-tools.test.ts index 60c4809252..4b81ea312e 100644 --- a/test/unit/mcp-write-tools.test.ts +++ b/test/unit/mcp-write-tools.test.ts @@ -8,7 +8,7 @@ async function connect() { const server = new LoopoverMcp(createTestEnv()).createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); await server.connect(serverTransport); - const client = new Client({ name: "gittensory-write-tools-test", version: "0.1.0" }, { capabilities: {} }); + const client = new Client({ name: "loopover-write-tools-test", version: "0.1.0" }, { capabilities: {} }); await client.connect(clientTransport); return client; } @@ -16,7 +16,7 @@ async function connect() { type Spec = { action: string; description: string; command: string; boundary: string; inputs: Record }; describe("MCP miner write-tools (#780)", () => { - it("open_pr returns a local-execution spec; gittensory performs no write", async () => { + it("open_pr returns a local-execution spec; loopover performs no write", async () => { const client = await connect(); const result = await client.callTool({ name: "loopover_open_pr", @@ -53,7 +53,7 @@ describe("MCP miner write-tools (#780)", () => { }); // #2188 (boundary-safe test-generation slice of #1972). - it("generate_tests returns a local-execution spec naming the framework and target files; gittensory performs no write", async () => { + it("generate_tests returns a local-execution spec naming the framework and target files; loopover performs no write", async () => { const client = await connect(); const result = await client.callTool({ name: "loopover_generate_tests", diff --git a/test/unit/miner-attempt-runner.test.ts b/test/unit/miner-attempt-runner.test.ts index 28f30efc5e..4c4c32f374 100644 --- a/test/unit/miner-attempt-runner.test.ts +++ b/test/unit/miner-attempt-runner.test.ts @@ -202,7 +202,7 @@ describe("runMinerAttempt (#2337) — the real create->review->gate->submit pipe expect(claimLedgerListClaims).not.toHaveBeenCalled(); }); - it("REGRESSION (#5395, gittensory review #5437): a real hard budget-ceiling breach abandons through the full real runMinerAttempt pipeline, even though the driver's own result would otherwise pass self-review", async () => { + it("REGRESSION (#5395, loopover review #5437): a real hard budget-ceiling breach abandons through the full real runMinerAttempt pipeline, even though the driver's own result would otherwise pass self-review", async () => { const claimLedgerListClaims = vi.fn(); const deps = baseDeps({ claimLedger: { listClaims: claimLedgerListClaims } }); // okDriverResult()'s default turnsUsed (5) immediately breaches this maxTurns:1 ceiling on iteration 1, diff --git a/test/unit/miner-calibration-types.test.ts b/test/unit/miner-calibration-types.test.ts index ad75875192..67dfa40a47 100644 --- a/test/unit/miner-calibration-types.test.ts +++ b/test/unit/miner-calibration-types.test.ts @@ -14,22 +14,22 @@ import type { describe("loopover-miner calibration types scaffold (#2332)", () => { const predicted: PredictedVerdictRecord = { - targetId: "pr:JSONbored/gittensory#42", - project: "JSONbored/gittensory", + targetId: "pr:JSONbored/loopover#42", + project: "JSONbored/loopover", predictedDecision: "merge", recordedAt: "2026-07-06T00:00:00.000Z", source: "reviewbot", }; const observed: ObservedOutcomeRecord = { - targetId: "pr:JSONbored/gittensory#42", - project: "JSONbored/gittensory", + targetId: "pr:JSONbored/loopover#42", + project: "JSONbored/loopover", outcomeDecision: "merged", recordedAt: "2026-07-06T01:00:00.000Z", }; const row: CalibrationRow = { - project: "JSONbored/gittensory", + project: "JSONbored/loopover", wouldMerge: 10, mergeConfirmed: 8, mergeFalse: 2, diff --git a/test/unit/miner-claim-ledger.test.ts b/test/unit/miner-claim-ledger.test.ts index 1d019a7b22..41245fa05c 100644 --- a/test/unit/miner-claim-ledger.test.ts +++ b/test/unit/miner-claim-ledger.test.ts @@ -64,9 +64,9 @@ describe("loopover-miner claim ledger (#2314)", () => { it("records a claim and lists it back", () => { const ledger = tempLedger(); - const claim = ledger.recordClaim({ repoFullName: "JSONbored/gittensory", issueNumber: 2314, note: "mine" }); + const claim = ledger.recordClaim({ repoFullName: "JSONbored/loopover", issueNumber: 2314, note: "mine" }); expect(claim).toMatchObject({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", issueNumber: 2314, status: "active", note: "mine", diff --git a/test/unit/miner-coding-task-spec.test.ts b/test/unit/miner-coding-task-spec.test.ts index ce0e290c71..0d59c78fb2 100644 --- a/test/unit/miner-coding-task-spec.test.ts +++ b/test/unit/miner-coding-task-spec.test.ts @@ -302,7 +302,7 @@ describe("buildCodingTaskSpec (#5132)", () => { expect(result.instructions).not.toContain("No build/test/lint/format commands were confidently inferred"); }); - it("REGRESSION (#4786): a fail-closed undetected stack still reaches the prompt (no silent gittensory default)", () => { + it("REGRESSION (#4786): a fail-closed undetected stack still reaches the prompt (no silent loopover default)", () => { const dir = tempDir(); const target = issue(); const result = buildCodingTaskSpec({ diff --git a/test/unit/miner-dashboard-commands.test.ts b/test/unit/miner-dashboard-commands.test.ts index 88536e08f5..ddda43f9a2 100644 --- a/test/unit/miner-dashboard-commands.test.ts +++ b/test/unit/miner-dashboard-commands.test.ts @@ -5,7 +5,7 @@ describe("miner dashboard command actions", () => { it("builds copyable miner commands for an authenticated repo context", () => { const commands = buildMinerCommandActions({ login: "JSONbored", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", }); expect(commands.map((command) => command.id)).toEqual([ @@ -28,13 +28,13 @@ describe("miner dashboard command actions", () => { commands.find((command) => command.id === "preflight"), ).toMatchObject({ command: - "loopover-mcp preflight --login JSONbored --repo JSONbored/gittensory --base origin/main --json", + "loopover-mcp preflight --login JSONbored --repo JSONbored/loopover --base origin/main --json", state: "ready", copyable: true, }); expect(commands.find((command) => command.id === "packet")).toMatchObject({ command: - "loopover-mcp agent packet --login JSONbored --repo JSONbored/gittensory --base origin/main --json", + "loopover-mcp agent packet --login JSONbored --repo JSONbored/loopover --base origin/main --json", state: "ready", copyable: true, }); diff --git a/test/unit/miner-dashboard-recommendations.test.ts b/test/unit/miner-dashboard-recommendations.test.ts index cb85478c2d..b9069218f7 100644 --- a/test/unit/miner-dashboard-recommendations.test.ts +++ b/test/unit/miner-dashboard-recommendations.test.ts @@ -50,7 +50,7 @@ describe("miner dashboard recommendation metadata", () => { actionPortfolio: { topActions: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", actionKind: "open_new_direct_pr", rerunWhen: "Rerun when queue changes, not wallet hotkey scoreability reward estimate ghp_abcd1234EFGH5678ijkl.", }, @@ -323,7 +323,7 @@ describe("miner dashboard recommendation metadata", () => { actionPortfolio: { topActions: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", actionKind: "open_new_direct_pr", // /root/ and /var/ were already covered here; C:/Users/ (forward-slash) and the lower-case drive // form (c:\Users\...) are now covered via the shared source, which matches the drive letter @@ -352,7 +352,7 @@ describe("miner dashboard recommendation metadata", () => { actionPortfolio: { topActions: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", actionKind: "open_new_direct_pr", rerunWhen: `Rerun once the broker recovers from enrollment ${fakeEnrollId} secret ${fakeSecret}.`, }, @@ -434,7 +434,7 @@ function decisionPack(overrides: Record = {}): ContributorDecis function repoDecision(overrides: Record = {}): Record { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", recommendation: "pursue", priorityScore: 82, queue: { openPullRequests: 1, openIssues: 2, mergedPullRequests: 1, closedUnmergedPullRequests: 0 }, @@ -452,7 +452,7 @@ function repoDecision(overrides: Record = {}): Record = {}): Record { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", actionKind: "open_new_direct_pr", recommendation: "pursue", priorityScore: 82, diff --git a/test/unit/miner-deployment-docs-audit.test.ts b/test/unit/miner-deployment-docs-audit.test.ts index bccdd947c1..d021e9cacb 100644 --- a/test/unit/miner-deployment-docs-audit.test.ts +++ b/test/unit/miner-deployment-docs-audit.test.ts @@ -21,7 +21,7 @@ const BIN_DIR = resolve(MINER_DIR, "bin"); const BIN_ENTRY = resolve(BIN_DIR, "loopover-miner.js"); const LIB_DIR = resolve(MINER_DIR, "lib"); // loopover-miner's coding-agent driver construction (MINER_CODING_AGENT_*) is implemented in the -// gittensory-engine package it depends on, not under packages/loopover-miner/** -- an env var read only +// loopover-engine package it depends on, not under packages/loopover-miner/** -- an env var read only // there would otherwise false-positive as undocumented-in-code. Source (not dist/, which is gitignored and // may not be built) so this stays accurate on a fresh checkout without a build step. const ENGINE_MINER_DIR = resolve(REPO_ROOT, "packages/loopover-engine/src/miner"); @@ -70,7 +70,7 @@ describe("loopover-miner DEPLOYMENT.md docs-accuracy audit (#5180)", () => { expect(result.failures).toEqual([]); }); - it("REGRESSION: sees env var reads implemented in gittensory-engine's miner source, not just packages/loopover-miner/**", () => { + it("REGRESSION: sees env var reads implemented in loopover-engine's miner source, not just packages/loopover-miner/**", () => { // MINER_CODING_AGENT_CLAUDE_MODEL / MINER_CODING_AGENT_CODEX_MODEL / MINER_CODING_AGENT_TIMEOUT_MS are // read in packages/loopover-engine/src/miner/driver-factory.ts, a real dependency of loopover-miner // for coding-agent driver construction -- scanning only LIB_DIR/BIN_DIR previously false-flagged them diff --git a/test/unit/miner-docker-compose.test.ts b/test/unit/miner-docker-compose.test.ts index 4c9bcf3bbd..8f748629ba 100644 --- a/test/unit/miner-docker-compose.test.ts +++ b/test/unit/miner-docker-compose.test.ts @@ -28,7 +28,7 @@ describe("docker-compose.miner.yml (#5177)", () => { it("tags the built image with the post-rename name (loopover-miner:latest)", () => { // Regression for #5935: the image tag must match the Dockerfile's `loopover-miner` ENTRYPOINT and the name // every other fleet-mode doc uses (DEPLOYMENT.md, k8s/miner-deployment.yaml), not the pre-rename - // `gittensory-miner:latest`, so `docker images` cross-references from those docs actually resolve. + // `loopover-miner:latest`, so `docker images` cross-references from those docs actually resolve. expect(compose.services.miner.image).toBe("loopover-miner:latest"); }); diff --git a/test/unit/miner-event-ledger.test.ts b/test/unit/miner-event-ledger.test.ts index b96bc700a3..2ded43ea15 100644 --- a/test/unit/miner-event-ledger.test.ts +++ b/test/unit/miner-event-ledger.test.ts @@ -50,13 +50,13 @@ describe("loopover-miner event ledger (#2290)", () => { const ledger = tempLedger(); const entry = ledger.appendEvent({ type: "discovered_issue", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", payload: { issueNumber: 2290, labels: ["gittensor:feature"] }, }); expect(entry).toMatchObject({ seq: 1, type: "discovered_issue", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", payload: { issueNumber: 2290, labels: ["gittensor:feature"] }, }); expect(typeof entry.id).toBe("number"); diff --git a/test/unit/miner-extension-content.test.ts b/test/unit/miner-extension-content.test.ts index 9935e3122f..e414ad260f 100644 --- a/test/unit/miner-extension-content.test.ts +++ b/test/unit/miner-extension-content.test.ts @@ -15,15 +15,15 @@ const NOW = Date.parse("2026-07-03T12:00:00.000Z"); function rawIssue(overrides: Record = {}) { return { owner: "JSONbored", - repo: "gittensory", - repoFullName: "JSONbored/gittensory", + repo: "loopover", + repoFullName: "JSONbored/loopover", issueNumber: 145, title: "Add miner extension badge", labels: ["help wanted", "gittensor:feature"], commentsCount: 1, createdAt: "2026-07-01T00:00:00.000Z", updatedAt: "2026-07-02T00:00:00.000Z", - htmlUrl: "https://github.com/JSONbored/gittensory/issues/145", + htmlUrl: "https://github.com/JSONbored/loopover/issues/145", aiPolicyAllowed: true as const, aiPolicySource: "CONTRIBUTING.md" as const, ...overrides, @@ -61,13 +61,13 @@ describe("miner extension opportunity badge", () => { it("detects GitHub issue routes without matching pull requests", () => { const internals = loadContentInternals(); - expect(internals.matchGitHubIssueTarget("/JSONbored/gittensory/issues/145")).toEqual({ + expect(internals.matchGitHubIssueTarget("/JSONbored/loopover/issues/145")).toEqual({ kind: "issue", owner: "JSONbored", - repo: "gittensory", + repo: "loopover", issueNumber: 145, }); - expect(internals.matchGitHubIssueTarget("/JSONbored/gittensory/pull/146")).toBeNull(); + expect(internals.matchGitHubIssueTarget("/JSONbored/loopover/pull/146")).toBeNull(); }); it("looks up ranked opportunities using the same repo#issue key as the miner ranker", () => { @@ -76,10 +76,10 @@ describe("miner extension opportunity badge", () => { }); const badge = loadBadgeInternals(); - const match = badge.lookupRankedOpportunity(ranked, "JSONbored/gittensory", 145); + const match = badge.lookupRankedOpportunity(ranked, "JSONbored/loopover", 145); expect(match?.issueNumber).toBe(145); expect(match?.rankScore).toBeGreaterThan(0); - expect(badge.lookupRankedOpportunity(ranked, "JSONbored/gittensory", 404)).toBeNull(); + expect(badge.lookupRankedOpportunity(ranked, "JSONbored/loopover", 404)).toBeNull(); }); it("formats tier, score, and a short why without duplicating ranking math", () => { @@ -118,13 +118,13 @@ describe("miner extension opportunity badge", () => { it("returns ready context when watched repo has a cached ranked candidate", async () => { const ranked = rankCandidateIssues([rawIssue()], { nowMs: NOW }); const internals = loadBackgroundInternals({ - watchedRepos: ["JSONbored/gittensory"], + watchedRepos: ["JSONbored/loopover"], rankedCandidates: ranked, }); const payload = await internals.loadIssueOpportunityContext({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", issueNumber: 145, }); @@ -135,13 +135,13 @@ describe("miner extension opportunity badge", () => { it("omits badge context when repo is watched but no ranked signal exists", async () => { const internals = loadBackgroundInternals({ - watchedRepos: ["JSONbored/gittensory"], + watchedRepos: ["JSONbored/loopover"], rankedCandidates: [], }); const payload = await internals.loadIssueOpportunityContext({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", issueNumber: 145, }); @@ -151,8 +151,8 @@ describe("miner extension opportunity badge", () => { it("parses watched repos and ranked candidate JSON for options storage", () => { const internals = loadOptionsInternals(); - expect(internals.parseWatchedRepos("JSONbored/gittensory\nowner/repo")).toEqual([ - "JSONbored/gittensory", + expect(internals.parseWatchedRepos("JSONbored/loopover\nowner/repo")).toEqual([ + "JSONbored/loopover", "owner/repo", ]); expect(internals.parseRankedCandidatesJson("[]")).toEqual([]); @@ -204,7 +204,7 @@ describe("miner extension opportunity badge", () => { const elements = { "#settings": createFormMock(), "#status": { textContent: "" }, - "#watchedRepos": { value: "JSONbored/gittensory" }, + "#watchedRepos": { value: "JSONbored/loopover" }, "#rankedCandidatesJson": { value: "" }, "#minerUiUrl": { value: "" }, "#syncNow": { addEventListener: () => {} }, @@ -311,26 +311,26 @@ describe("miner extension opportunity badge", () => { const ranked = rankCandidateIssues([rawIssue()], { nowMs: NOW }); const savedAt = NOW - 60_000; const ready = loadBackgroundInternals({ - watchedRepos: ["JSONbored/gittensory"], + watchedRepos: ["JSONbored/loopover"], rankedCandidates: ranked, rankedCandidatesSavedAt: savedAt, }); const readyPayload = await ready.loadIssueOpportunityContext({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", issueNumber: 145, }); expect(readyPayload.status).toBe("ready"); expect(readyPayload.savedAt).toBe(savedAt); const noSignal = loadBackgroundInternals({ - watchedRepos: ["JSONbored/gittensory"], + watchedRepos: ["JSONbored/loopover"], rankedCandidates: [], rankedCandidatesSavedAt: savedAt, }); const noSignalPayload = await noSignal.loadIssueOpportunityContext({ owner: "JSONbored", - repo: "gittensory", + repo: "loopover", issueNumber: 145, }); expect(noSignalPayload.status).toBe("no-signal"); @@ -343,7 +343,7 @@ describe("miner extension opportunity badge", () => { const elements = { "#settings": createFormMock(), "#status": { textContent: "" }, - "#watchedRepos": { value: "JSONbored/gittensory" }, + "#watchedRepos": { value: "JSONbored/loopover" }, "#rankedCandidatesJson": { value: "[]" }, "#minerUiUrl": { value: "" }, "#syncNow": { addEventListener: () => {} }, @@ -434,12 +434,12 @@ describe("miner extension opportunity badge", () => { // Re-seed as if another synced device still has the legacy key, then confirm save also purges it. synced.discoveryIndexUrl = "https://legacy.example.test/index.json"; - elements["#watchedRepos"].value = "JSONbored/gittensory"; + elements["#watchedRepos"].value = "JSONbored/loopover"; await elements["#settings"].dispatchSubmit(); expect(setCalls).toHaveLength(1); expect(setCalls[0]).toEqual({ - watchedRepos: ["JSONbored/gittensory"], + watchedRepos: ["JSONbored/loopover"], minerUiUrl: "http://localhost:5174", }); expect(removeCalls).toEqual(["discoveryIndexUrl", "discoveryIndexUrl"]); @@ -503,7 +503,7 @@ function loadContentInternals() { const context: Record = { __LOOPOVER_MINER_EXTENSION_TEST__: true, __loopoverMinerOpportunityBadge: badge, - location: { pathname: "/JSONbored/gittensory/pull/146" }, + location: { pathname: "/JSONbored/loopover/pull/146" }, document: { querySelector: () => null, createElement: () => createMockContainer(), diff --git a/test/unit/miner-forge-config.test.ts b/test/unit/miner-forge-config.test.ts index 5e360cd3e9..a3752234c8 100644 --- a/test/unit/miner-forge-config.test.ts +++ b/test/unit/miner-forge-config.test.ts @@ -5,7 +5,7 @@ import { } from "../../packages/loopover-miner/lib/forge-config.js"; describe("resolveForgeConfig (#4784)", () => { - it("returns gittensory's github.com defaults when no overrides are supplied", () => { + it("returns loopover's github.com defaults when no overrides are supplied", () => { expect(resolveForgeConfig()).toEqual({ apiBaseUrl: "https://api.github.com", apiVersion: "2022-11-28", @@ -17,7 +17,7 @@ describe("resolveForgeConfig (#4784)", () => { searchQualifiers: "state:open type:issue", tokenEnvVar: "GITHUB_TOKEN", }); - // A no-override resolve must exactly equal the shared default baseline (the "unchanged gittensory path" contract). + // A no-override resolve must exactly equal the shared default baseline (the "unchanged loopover path" contract). expect(resolveForgeConfig()).toEqual({ ...DEFAULT_FORGE_CONFIG }); }); diff --git a/test/unit/miner-governor-ledger.test.ts b/test/unit/miner-governor-ledger.test.ts index 299df09fb6..9df88b3db9 100644 --- a/test/unit/miner-governor-ledger.test.ts +++ b/test/unit/miner-governor-ledger.test.ts @@ -58,7 +58,7 @@ describe("loopover-miner governor ledger (#2328)", () => { const ledger = tempLedger(); const entry = ledger.appendGovernorEvent({ eventType: "denied", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", actionClass: "write", decision: "block", reason: "kill switch active", @@ -67,14 +67,14 @@ describe("loopover-miner governor ledger (#2328)", () => { expect(entry).toMatchObject({ id: 1, eventType: "denied", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", actionClass: "write", decision: "block", reason: "kill switch active", payload: { rule: "global_kill_switch" }, }); expect(ledger.readGovernorEvents()).toEqual([entry]); - expect(ledger.readGovernorEvents({ repoFullName: "JSONbored/gittensory" })).toEqual([entry]); + expect(ledger.readGovernorEvents({ repoFullName: "JSONbored/loopover" })).toEqual([entry]); expect(ledger.readGovernorEvents({ repoFullName: "acme/other" })).toEqual([]); }); diff --git a/test/unit/miner-mcp-calibration-report.test.ts b/test/unit/miner-mcp-calibration-report.test.ts index 24c41e4e6e..3c943a5c26 100644 --- a/test/unit/miner-mcp-calibration-report.test.ts +++ b/test/unit/miner-mcp-calibration-report.test.ts @@ -19,12 +19,12 @@ type EventLedgerHandle = ReturnType; const roots: string[] = []; function tempPredictionLedger(): PredictionLedgerHandle { - const root = mkdtempSync(join(tmpdir(), "gittensory-miner-mcp-calibration-pred-")); + const root = mkdtempSync(join(tmpdir(), "loopover-miner-mcp-calibration-pred-")); roots.push(root); return initPredictionLedger(join(root, "prediction-ledger.sqlite3")); } function tempEventLedger(): EventLedgerHandle { - const root = mkdtempSync(join(tmpdir(), "gittensory-miner-mcp-calibration-event-")); + const root = mkdtempSync(join(tmpdir(), "loopover-miner-mcp-calibration-event-")); roots.push(root); return initEventLedger(join(root, "event-ledger.sqlite3")); } diff --git a/test/unit/miner-orb-export.test.ts b/test/unit/miner-orb-export.test.ts index db1f75ea78..a6d4d39431 100644 --- a/test/unit/miner-orb-export.test.ts +++ b/test/unit/miner-orb-export.test.ts @@ -182,7 +182,7 @@ describe("filterBatchSinceCursor / latestClosedAt (#5681)", () => { }); describe("resolveAmsCollectorUrl (#5681)", () => { - it("defaults to gittensory's hosted collector; an explicit env var overrides it", () => { + it("defaults to loopover's hosted collector; an explicit env var overrides it", () => { expect(resolveAmsCollectorUrl({})).toBe(DEFAULT_AMS_COLLECTOR_URL); expect(resolveAmsCollectorUrl({ LOOPOVER_MINER_AMS_COLLECTOR_URL: " " })).toBe(DEFAULT_AMS_COLLECTOR_URL); expect(resolveAmsCollectorUrl({ LOOPOVER_MINER_AMS_COLLECTOR_URL: "https://example.test/ingest" })).toBe("https://example.test/ingest"); diff --git a/test/unit/miner-rejection-state-machine.test.ts b/test/unit/miner-rejection-state-machine.test.ts index 620271aca5..25cd410a4f 100644 --- a/test/unit/miner-rejection-state-machine.test.ts +++ b/test/unit/miner-rejection-state-machine.test.ts @@ -7,7 +7,7 @@ import { resolveRejection, } from "../../packages/loopover-miner/lib/rejection-state-machine.js"; -const CONTEXT = { repoFullName: "JSONbored/gittensory", prNumber: 4278 } as const; +const CONTEXT = { repoFullName: "JSONbored/loopover", prNumber: 4278 } as const; const closedUnmerged = { state: "closed", merged: false, merged_at: null, closed_at: "2026-07-09T18:00:00Z" }; describe("loopover-miner rejection state machine (#4278)", () => { @@ -58,7 +58,7 @@ describe("loopover-miner rejection state machine (#4278)", () => { expect(result).not.toBeNull(); expect(result?.outcome).toBe(DISENGAGED_OUTCOME); expect(result?.reason).toBe(reason); - expect(result?.note).toContain("JSONbored/gittensory"); + expect(result?.note).toContain("JSONbored/loopover"); expect(result?.note).toContain("#4278"); expect(result?.note).not.toMatch(/\{[^}]+\}/); // renderer left no unresolved placeholder } diff --git a/test/unit/miner-rejection-templates.test.ts b/test/unit/miner-rejection-templates.test.ts index 64611702de..1ecb4dcc4c 100644 --- a/test/unit/miner-rejection-templates.test.ts +++ b/test/unit/miner-rejection-templates.test.ts @@ -5,7 +5,7 @@ import { renderRejectionMessage, } from "../../packages/loopover-miner/lib/rejection-templates.js"; -const CONTEXT = { repoFullName: "JSONbored/gittensory", prNumber: 2751 } as const; +const CONTEXT = { repoFullName: "JSONbored/loopover", prNumber: 2751 } as const; describe("loopover-miner rejection templates (#2324)", () => { it("exposes the frozen reason vocabulary", () => { @@ -17,7 +17,7 @@ describe("loopover-miner rejection templates (#2324)", () => { for (const reason of REJECTION_REASONS) { const message = renderRejectionMessage(reason, CONTEXT); expect(message).not.toMatch(/\{[^}]+\}/); // no unresolved {placeholder} - expect(message).toContain("JSONbored/gittensory"); + expect(message).toContain("JSONbored/loopover"); expect(message).toContain("#2751"); } }); @@ -60,8 +60,8 @@ describe("loopover-miner rejection templates (#2324)", () => { ); } // A well-formed owner/repo with the allowed punctuation still renders. - expect(renderRejectionMessage("gate_close", { repoFullName: "JSONbored/gittensory.io_test-1", prNumber: 9 })).toContain( - "JSONbored/gittensory.io_test-1", + expect(renderRejectionMessage("gate_close", { repoFullName: "JSONbored/loopover.io_test-1", prNumber: 9 })).toContain( + "JSONbored/loopover.io_test-1", ); }); }); diff --git a/test/unit/miner-run-state.test.ts b/test/unit/miner-run-state.test.ts index 90b1bc7fa1..25d3f0d606 100644 --- a/test/unit/miner-run-state.test.ts +++ b/test/unit/miner-run-state.test.ts @@ -57,7 +57,7 @@ describe("loopover-miner run-state store (#2289)", () => { try { expect(existsSync(dbPath)).toBe(true); expect(statSync(dbPath).mode & 0o077).toBe(0); - expect(store.getRunState("JSONbored/gittensory")).toBeNull(); + expect(store.getRunState("JSONbored/loopover")).toBeNull(); const db = new DatabaseSync(dbPath, { readOnly: true }); try { @@ -78,11 +78,11 @@ describe("loopover-miner run-state store (#2289)", () => { const store = initRunStateStore(dbPath); try { for (const state of RUN_STATES) { - const write = store.setRunState(" JSONbored/gittensory ", state); - expect(write.repoFullName).toBe("JSONbored/gittensory"); + const write = store.setRunState(" JSONbored/loopover ", state); + expect(write.repoFullName).toBe("JSONbored/loopover"); expect(write.state).toBe(state); expect(Date.parse(write.updatedAt)).not.toBeNaN(); - expect(store.getRunState("JSONbored/gittensory")).toBe(state); + expect(store.getRunState("JSONbored/loopover")).toBe(state); } } finally { store.close(); diff --git a/test/unit/miner-status.test.ts b/test/unit/miner-status.test.ts index 1921d0b421..a25fa0949e 100644 --- a/test/unit/miner-status.test.ts +++ b/test/unit/miner-status.test.ts @@ -226,7 +226,7 @@ describe("loopover-miner status/doctor (#2288)", () => { it("readInstalledEnginePackageVersionFromPaths falls back to the workspace engine package", () => { const root = tempRoot(); - const workspacePkg = join(root, "gittensory-engine-package.json"); + const workspacePkg = join(root, "loopover-engine-package.json"); writeFileSync(workspacePkg, JSON.stringify({ version: "0.2.0" })); expect(readInstalledEnginePackageVersionFromPaths("/missing/entry", workspacePkg)).toBe("0.2.0"); writeFileSync(workspacePkg, "not-json"); diff --git a/test/unit/miner-wire-cli-modules.test.ts b/test/unit/miner-wire-cli-modules.test.ts index db4391bff0..52e0a52547 100644 --- a/test/unit/miner-wire-cli-modules.test.ts +++ b/test/unit/miner-wire-cli-modules.test.ts @@ -21,7 +21,7 @@ const closeables: Array<{ close(): void }> = []; let logs: string[] = []; function tempDir() { - const root = mkdtempSync(join(tmpdir(), "gittensory-wire-cli-")); + const root = mkdtempSync(join(tmpdir(), "loopover-wire-cli-")); roots.push(root); return root; } diff --git a/test/unit/moderation-rules-engine.test.ts b/test/unit/moderation-rules-engine.test.ts index c8052349b8..8caef1e4c4 100644 --- a/test/unit/moderation-rules-engine.test.ts +++ b/test/unit/moderation-rules-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { DEFAULT_GLOBAL_MODERATION_CONFIG, diff --git a/test/unit/notifications-events.test.ts b/test/unit/notifications-events.test.ts index 7f1113f616..7d6c1330e7 100644 --- a/test/unit/notifications-events.test.ts +++ b/test/unit/notifications-events.test.ts @@ -4,19 +4,19 @@ import type { GitHubWebhookPayload } from "../../src/types"; const basePayload: GitHubWebhookPayload = { action: "submitted", - repository: { name: "gittensory", full_name: "JSONbored/gittensory", owner: { login: "JSONbored" } }, + repository: { name: "loopover", full_name: "JSONbored/loopover", owner: { login: "JSONbored" } }, pull_request: { number: 42, title: "Add feature", state: "open", user: { login: "contributor", type: "User" }, - html_url: "https://github.com/JSONbored/gittensory/pull/42", + html_url: "https://github.com/JSONbored/loopover/pull/42", }, review: { state: "changes_requested", user: { login: "maintainer", type: "User" }, submitted_at: "2026-05-28T12:00:00.000Z", - html_url: "https://github.com/JSONbored/gittensory/pull/42#pullrequestreview-1", + html_url: "https://github.com/JSONbored/loopover/pull/42#pullrequestreview-1", }, sender: { login: "maintainer", type: "User" }, }; @@ -29,10 +29,10 @@ describe("detectNotificationEvents", () => { { eventType: "pull_request_changes_requested", recipientLogin: "contributor", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 42, - dedupKey: "changes_requested:JSONbored/gittensory#42:maintainer:2026-05-28T12:00:00.000Z", - deeplink: "https://github.com/JSONbored/gittensory/pull/42#pullrequestreview-1", + dedupKey: "changes_requested:JSONbored/loopover#42:maintainer:2026-05-28T12:00:00.000Z", + deeplink: "https://github.com/JSONbored/loopover/pull/42#pullrequestreview-1", actorLogin: "maintainer", detectedAt: "2026-05-28T12:00:01.000Z", }, @@ -100,7 +100,7 @@ describe("detectNotificationEvents", () => { "pull_request_review", { action: "submitted", - repository: { name: "gittensory", full_name: "JSONbored/gittensory", owner: { login: "JSONbored" } }, + repository: { name: "loopover", full_name: "JSONbored/loopover", owner: { login: "JSONbored" } }, pull_request: { number: 7, title: "Sparse review", @@ -118,10 +118,10 @@ describe("detectNotificationEvents", () => { { eventType: "pull_request_changes_requested", recipientLogin: "contributor", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 7, - dedupKey: "changes_requested:JSONbored/gittensory#7:unknown:2026-05-28T13:00:00.000Z", - deeplink: "https://github.com/JSONbored/gittensory/pull/7", + dedupKey: "changes_requested:JSONbored/loopover#7:unknown:2026-05-28T13:00:00.000Z", + deeplink: "https://github.com/JSONbored/loopover/pull/7", actorLogin: "unknown", detectedAt: "2026-05-28T13:00:00.000Z", }, @@ -165,13 +165,13 @@ describe("detectNotificationEvents", () => { describe("detectNotificationEvents — merged PR (#702)", () => { const mergedPayload: GitHubWebhookPayload = { action: "closed", - repository: { name: "gittensory", full_name: "JSONbored/gittensory", owner: { login: "JSONbored" } }, + repository: { name: "loopover", full_name: "JSONbored/loopover", owner: { login: "JSONbored" } }, pull_request: { number: 42, title: "Add feature", state: "closed", user: { login: "contributor", type: "User" }, - html_url: "https://github.com/JSONbored/gittensory/pull/42", + html_url: "https://github.com/JSONbored/loopover/pull/42", merged_at: "2026-05-29T00:00:00.000Z", }, }; @@ -182,10 +182,10 @@ describe("detectNotificationEvents — merged PR (#702)", () => { { eventType: "pull_request_merged", recipientLogin: "contributor", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 42, - dedupKey: "pull_request_merged:JSONbored/gittensory#42:2026-05-29T00:00:00.000Z", - deeplink: "https://github.com/JSONbored/gittensory/pull/42", + dedupKey: "pull_request_merged:JSONbored/loopover#42:2026-05-29T00:00:00.000Z", + deeplink: "https://github.com/JSONbored/loopover/pull/42", actorLogin: "contributor", detectedAt: "2026-05-29T00:00:01.000Z", }, @@ -201,6 +201,6 @@ describe("detectNotificationEvents — merged PR (#702)", () => { it("falls back to the canonical PR URL when html_url is absent", () => { const events = detectNotificationEvents("pull_request", { ...mergedPayload, pull_request: { ...mergedPayload.pull_request!, html_url: undefined as never } }, "2026-05-29T00:00:01.000Z"); - expect(events[0]?.deeplink).toBe("https://github.com/JSONbored/gittensory/pull/42"); + expect(events[0]?.deeplink).toBe("https://github.com/JSONbored/loopover/pull/42"); }); }); diff --git a/test/unit/notify-discord.test.ts b/test/unit/notify-discord.test.ts index 7010e8e202..db71c16580 100644 --- a/test/unit/notify-discord.test.ts +++ b/test/unit/notify-discord.test.ts @@ -67,7 +67,7 @@ describe("notify-discord resolveWebhook (modular self-host fallback)", () => { expect(calls).toEqual([HOOK]); }); - it("a repo secret outside the loopover/gittensory mapping (METAGRAPHED_/AWESOME_) never reads LOOPOVER_DISCORD_WEBHOOK", async () => { + it("a repo secret outside the loopover/loopover mapping (METAGRAPHED_/AWESOME_) never reads LOOPOVER_DISCORD_WEBHOOK", async () => { const calls = stubFetch(); const NEW_HOOK = "https://discord.com/api/webhooks/456/def"; await notify(withEnv({ METAGRAPHED_DISCORD_WEBHOOK: HOOK, LOOPOVER_DISCORD_WEBHOOK: NEW_HOOK }), "JSONbored/metagraphed"); @@ -99,7 +99,7 @@ describe("notify-discord resolveWebhook (modular self-host fallback)", () => { const calls = stubFetch(); const env = withEnv({ DISCORD_WEBHOOK_URL: FALLBACK }); // JSONbored/metagraphed is in the legacy map. If its dedicated secret is missing, posting to the global - // fallback sends metagraphed events into the gittensory channel. + // fallback sends metagraphed events into the loopover channel. await notify(env, "JSONbored/metagraphed"); expect(calls).toEqual([]); expect(await externalNotificationAudit(env, "discord")).toEqual([expect.objectContaining({ outcome: "denied", detail: "missing_repo_webhook" })]); @@ -142,13 +142,13 @@ describe("notify-discord resolveWebhook (modular self-host fallback)", () => { it("audits successful Discord sends without storing the webhook URL", async () => { const calls = stubFetch(); - const env = withEnv({ DISCORD_REPO_WEBHOOKS: JSON.stringify({ "jsonbored/gittensory": HOOK }) }); - await notify(env, "JSONbored/gittensory"); + const env = withEnv({ DISCORD_REPO_WEBHOOKS: JSON.stringify({ "jsonbored/loopover": HOOK }) }); + await notify(env, "JSONbored/loopover"); expect(calls).toEqual([HOOK]); const rows = await externalNotificationAudit(env, "discord"); expect(rows).toEqual([expect.objectContaining({ outcome: "completed", detail: "sent" })]); const metadata = JSON.parse(rows[0]?.metadata_json ?? "{}"); - expect(metadata).toMatchObject({ repoFullName: "JSONbored/gittensory", pullNumber: 1, actionOutcome: "merged", source: "repo_map" }); + expect(metadata).toMatchObject({ repoFullName: "JSONbored/loopover", pullNumber: 1, actionOutcome: "merged", source: "repo_map" }); expect(rows[0]?.metadata_json).not.toContain("webhooks/123"); }); @@ -158,8 +158,8 @@ describe("notify-discord resolveWebhook (modular self-host fallback)", () => { calls.push({ url: String(url), body: JSON.parse(String(init?.body ?? "{}")) }); return new Response(null, { status: 204 }); }); - await notifyActionToDiscord(withEnv({ DISCORD_REPO_WEBHOOKS: JSON.stringify({ "jsonbored/gittensory": HOOK }) }), { - repoFullName: "JSONbored/gittensory", + await notifyActionToDiscord(withEnv({ DISCORD_REPO_WEBHOOKS: JSON.stringify({ "jsonbored/loopover": HOOK }) }), { + repoFullName: "JSONbored/loopover", pullNumber: 2, outcome: "closed", summary: "", @@ -172,8 +172,8 @@ describe("notify-discord resolveWebhook (modular self-host fallback)", () => { it("REGRESSION: audits rejected Discord webhook HTTP responses as errors", async () => { const calls = stubFetch(429); - const env = withEnv({ DISCORD_REPO_WEBHOOKS: JSON.stringify({ "jsonbored/gittensory": HOOK }) }); - await notify(env, "JSONbored/gittensory"); + const env = withEnv({ DISCORD_REPO_WEBHOOKS: JSON.stringify({ "jsonbored/loopover": HOOK }) }); + await notify(env, "JSONbored/loopover"); expect(calls).toEqual([HOOK]); expect(await externalNotificationAudit(env, "discord")).toEqual([expect.objectContaining({ outcome: "error", detail: "discord_webhook_http_429" })]); }); diff --git a/test/unit/notify-pagerduty.test.ts b/test/unit/notify-pagerduty.test.ts index 0838d284be..9b01efc361 100644 --- a/test/unit/notify-pagerduty.test.ts +++ b/test/unit/notify-pagerduty.test.ts @@ -229,13 +229,13 @@ describe("triggerPagerDutyIncident — cooldown gate (alert fatigue control #2)" expect(calls).toHaveLength(1); }); - it("REGRESSION: a recent page recorded under the pre-rebrand 'gittensory' actor still suppresses a duplicate within the cooldown window", async () => { + it("REGRESSION: a recent page recorded under the pre-rebrand 'loopover' actor still suppresses a duplicate within the cooldown window", async () => { const calls = stubFetch(); const env = enabledEnv(); const tenMinutesAgo = new Date(Date.now() - 10 * 60 * 1000).toISOString(); await recordAuditEvent(env, { eventType: "external_notification.pagerduty", - actor: "gittensory", + actor: "loopover", targetKey: "ops_anomaly:acme/widgets", outcome: "completed", detail: "triggered", diff --git a/test/unit/onboarding-pack.test.ts b/test/unit/onboarding-pack.test.ts index 2d8f90f38c..a9a6967679 100644 --- a/test/unit/onboarding-pack.test.ts +++ b/test/unit/onboarding-pack.test.ts @@ -18,7 +18,7 @@ const FORBIDDEN_PUBLIC_LANGUAGE = /wallet|hotkey|coldkey|mnemonic|payout|reward estimate|raw trust|trust score|public score|private reviewability|private scoreability|farming/i; const POLICY_COMPILER_FIXTURE: RepoPolicyCompilerOutput = { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", generatedAt: "2026-06-02T12:00:00.000Z", contributionLanes: [ { @@ -66,7 +66,7 @@ describe("buildRepoOnboardingPackPreview", () => { const preview = buildRepoOnboardingPackPreview(POLICY_COMPILER_FIXTURE); expect(preview).toMatchObject({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", generatedAt: "2026-06-02T12:00:00.000Z", source: "policy_compiler", previewOnly: true, @@ -120,7 +120,7 @@ describe("buildRepoOnboardingPackPreview", () => { it("drops unsafe public policy text without echoing the unsafe values", () => { const preview = buildRepoOnboardingPackPreview({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", contributionLanes: [ { title: "Wallet setup lane", @@ -219,11 +219,11 @@ describe("buildRepoOnboardingPackPreview", () => { "repo_file", ); const compiled = compileRepoPolicyCompilerOutput({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", manifest, }); const fromCompiler = buildRepoOnboardingPackPreview(compiled); - const fromService = buildRepoOnboardingPackPreviewFromManifest("JSONbored/gittensory", manifest); + const fromService = buildRepoOnboardingPackPreviewFromManifest("JSONbored/loopover", manifest); expect(fromService.preview.contributionLanes.length).toBe(fromCompiler.contributionLanes.length); expect(fromService.preview.publication.status).toBe("preview_only"); expect(isRepoOnboardingPackPublicSafe(fromService.preview)).toBe(true); @@ -232,7 +232,7 @@ describe("buildRepoOnboardingPackPreview", () => { it("uses stable defaults when optional policy sections are omitted", () => { const preview = buildRepoOnboardingPackPreview( { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", }, { generatedAt: "2026-06-02T13:00:00.000Z" }, ); @@ -306,10 +306,10 @@ describe("buildRepoOnboardingPackPreviewForRepo", () => { const env = createTestEnv(); await upsertRepositoryFromGitHub( env, - { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }, + { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }, 1, ); - const response = await buildRepoOnboardingPackPreviewForRepo(env, "JSONbored/gittensory"); + const response = await buildRepoOnboardingPackPreviewForRepo(env, "JSONbored/loopover"); expect("error" in response).toBe(false); if ("error" in response) return; expect(response.accepted).toBe(true); diff --git a/test/unit/ops.test.ts b/test/unit/ops.test.ts index 804ed8f653..a537158a5c 100644 --- a/test/unit/ops.test.ts +++ b/test/unit/ops.test.ts @@ -280,7 +280,7 @@ function healthEnv(): Env { } as unknown as Env; } -const healthConfig: OpsAgentConfig = { slug: "gittensory", confidenceFloor: 0.9, secrets: { internalSecret: "INTERNAL_SECRET" } }; +const healthConfig: OpsAgentConfig = { slug: "loopover", confidenceFloor: 0.9, secrets: { internalSecret: "INTERNAL_SECRET" } }; describe("computeAgentHealth (native D1, default gate deps)", () => { it("computes terminal/manual-rate/reversals from the ledger; defaults to no config issues / unfrozen", async () => { diff --git a/test/unit/parse-github-issue-url.test.ts b/test/unit/parse-github-issue-url.test.ts index ebdbc3ae82..5dc3c9c7d1 100644 --- a/test/unit/parse-github-issue-url.test.ts +++ b/test/unit/parse-github-issue-url.test.ts @@ -37,9 +37,9 @@ describe("parseGitHubIssueUrl", () => { name: "repo", number: 123, }); - expect(parseGitHubIssueUrl("https://github.com/JSONbored/gittensory/issues/1719")).toEqual({ + expect(parseGitHubIssueUrl("https://github.com/JSONbored/loopover/issues/1719")).toEqual({ owner: "JSONbored", - name: "gittensory", + name: "loopover", number: 1719, }); }); diff --git a/test/unit/policy-sanitizer.test.ts b/test/unit/policy-sanitizer.test.ts index 66e920cc30..6f3e68bfaf 100644 --- a/test/unit/policy-sanitizer.test.ts +++ b/test/unit/policy-sanitizer.test.ts @@ -234,10 +234,10 @@ describe("compileFocusManifestPolicy — public-safe output boundaries", () => { preferredLabels: ["feature", "settings"], publicNotes: ["Keep PRs narrow and tied to accepted scope."], }); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(policy.present).toBe(true); - expect(policy.repoFullName).toBe("JSONbored/gittensory"); + expect(policy.repoFullName).toBe("JSONbored/loopover"); expect(policy.generatedAt).toBe(FIXED_DATE); expect(policy.publicSafe.labelPolicy.preferredLabels).toContain("feature"); expect(policy.publicSafe.validation.linkedIssuePolicy).toBe("required"); @@ -251,7 +251,7 @@ describe("compileFocusManifestPolicy — public-safe output boundaries", () => { maintainerNotes: ["Internal: hotkey validation context only visible to maintainers."], publicNotes: ["Contribute only to accepted scope."], }); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(JSON.stringify(policy.publicSafe)).not.toMatch(/hotkey/i); expect(policy.authenticated.privateNoteCount).toBe(1); @@ -263,7 +263,7 @@ describe("compileFocusManifestPolicy — public-safe output boundaries", () => { wantedPaths: ["src/"], publicNotes: ["wallet setup guidance for contributors", "Keep PRs focused."], }); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(policy.publicSafe.publicNotes).not.toContain("wallet setup guidance for contributors"); expect(policy.publicSafe.publicNotes).toContain("Keep PRs focused."); @@ -272,14 +272,14 @@ describe("compileFocusManifestPolicy — public-safe output boundaries", () => { it("emits readiness warnings when scope and validation are missing", () => { const manifest = parseFocusManifest({ issueDiscoveryPolicy: "neutral" }); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(policy.present).toBe(false); expect(policy.publicSafe.readinessWarnings).toEqual([]); }); it("treats legacy blocked-only manifests as absent", () => { const manifest = parseFocusManifest({ blockedPaths: ["migrations/"], wantedPaths: [], preferredLabels: [], testExpectations: [] }); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(policy.present).toBe(false); expect(policy.publicSafe.readinessWarnings).toEqual([]); expect(JSON.stringify(policy.publicSafe)).not.toMatch(FORBIDDEN_POLICY_PATTERN); @@ -287,7 +287,7 @@ describe("compileFocusManifestPolicy — public-safe output boundaries", () => { it("produces an absent policy for an empty manifest with no parse warnings", () => { const manifest = parseFocusManifest(null); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(policy.present).toBe(false); expect(policy.publicSafe.contributionLanes).toEqual([]); expect(policy.authenticated.parseWarnings).toEqual([]); @@ -295,7 +295,7 @@ describe("compileFocusManifestPolicy — public-safe output boundaries", () => { it("records parse warnings in authenticated context without leaking to publicSafe", () => { const manifest = parseFocusManifest({ wantedPaths: "src/" }); - const policy = compileFocusManifestPolicy("JSONbored/gittensory", manifest, { generatedAt: FIXED_DATE }); + const policy = compileFocusManifestPolicy("JSONbored/loopover", manifest, { generatedAt: FIXED_DATE }); expect(policy.authenticated.manifestWarningCount).toBeGreaterThan(0); expect(policy.authenticated.parseWarnings.length).toBeGreaterThan(0); expect(JSON.stringify(policy.publicSafe)).not.toMatch(/wantedPaths.*must be a list/i); diff --git a/test/unit/pr-reconciliation.test.ts b/test/unit/pr-reconciliation.test.ts index fea01f2da2..8da2f3b768 100644 --- a/test/unit/pr-reconciliation.test.ts +++ b/test/unit/pr-reconciliation.test.ts @@ -13,7 +13,7 @@ import { upsertRepoFocusManifest } from "../../src/signals/focus-manifest-loader import * as focusManifestLoaderModule from "../../src/signals/focus-manifest-loader"; import { createTestEnv } from "../helpers/d1"; -const SELF_REPO = "JSONbored/gittensory"; +const SELF_REPO = "JSONbored/loopover"; describe("isPrReconciliationEnabled — default OFF, truthy convention", () => { it("matches the codebase's shared truthy-string convention", () => { diff --git a/test/unit/pr-type-label-engine.test.ts b/test/unit/pr-type-label-engine.test.ts index 2436d1049c..4480f83c31 100644 --- a/test/unit/pr-type-label-engine.test.ts +++ b/test/unit/pr-type-label-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { DEFAULT_TYPE_LABELS, MAX_TYPE_LABEL_CATEGORIES, MAX_TYPE_LABEL_NAME_LENGTH, deriveKindFromTitle, normalizeTypeLabelSet, resolvePrTypeLabel } from "../../packages/loopover-engine/src/settings/pr-type-label"; import type { LinkedIssueLabelPropagationConfig } from "../../packages/loopover-engine/src/types/manifest-deps-types"; diff --git a/test/unit/predicted-gate-engine-barrel.test.ts b/test/unit/predicted-gate-engine-barrel.test.ts index ce30c0ed3c..dc777795ff 100644 --- a/test/unit/predicted-gate-engine-barrel.test.ts +++ b/test/unit/predicted-gate-engine-barrel.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { buildPredictedGateVerdict, type PredictedGateInput } from "../../packages/loopover-engine/src/predicted-gate"; -describe("gittensory-engine predicted-gate barrel exports (#2283)", () => { +describe("loopover-engine predicted-gate barrel exports (#2283)", () => { it("re-exports predicted-gate symbols from the package barrel", async () => { const barrel = await import("../../packages/loopover-engine/src/index"); expect(typeof barrel.buildPredictedGateVerdict).toBe("function"); diff --git a/test/unit/predicted-gate.test.ts b/test/unit/predicted-gate.test.ts index ea8b231d32..7ef7bd8de4 100644 --- a/test/unit/predicted-gate.test.ts +++ b/test/unit/predicted-gate.test.ts @@ -523,7 +523,7 @@ describe("pack-aware prediction (#693)", () => { const result = buildPredictedGateVerdict({ input: { ...BASE_INPUT, body: "no issue", linkedIssues: [] }, manifest: parseFocusManifest({ gate: { pack: "oss-anti-slop", linkedIssue: "block" } }), - // App-installed but NOT Gittensor-registered: a real repo record (not null → gittensory has "seen" it). + // App-installed but NOT Gittensor-registered: a real repo record (not null → loopover has "seen" it). repo: { ...REPO, isRegistered: false }, issues: [], pullRequests: [], diff --git a/test/unit/private-config.test.ts b/test/unit/private-config.test.ts index 78887b32b2..cdd71d4c60 100644 --- a/test/unit/private-config.test.ts +++ b/test/unit/private-config.test.ts @@ -540,27 +540,27 @@ describe("makeLocalReviewContextReader (#review-skills)", () => { it("reads the owner-qualified review/AGENTS.md + skills/*.md (sorted, .md only)", async () => { const dir = mkdtempSync(join(tmpdir(), "gt-review-")); - const rev = join(dir, "jsonbored__gittensory", "review"); + const rev = join(dir, "jsonbored__loopover", "review"); mkdirSync(join(rev, "skills"), { recursive: true }); - writeFileSync(join(rev, "AGENTS.md"), "Review gittensory carefully.\n"); + writeFileSync(join(rev, "AGENTS.md"), "Review loopover carefully.\n"); writeFileSync(join(rev, "CLAUDE.md"), "Legacy guide should not win.\n"); writeFileSync(join(rev, "skills", "b-second.md"), "---\nname: second\nwhen: always\n---\nSecond.\n"); writeFileSync(join(rev, "skills", "a-first.md"), "First with no frontmatter.\n"); writeFileSync(join(rev, "skills", "notes.txt"), "ignored — not .md\n"); const reader = makeLocalReviewContextReader(dir)!; - const ctx = await reader("JSONbored/gittensory"); - expect(ctx.guide).toContain("Review gittensory carefully."); + const ctx = await reader("JSONbored/loopover"); + expect(ctx.guide).toContain("Review loopover carefully."); expect(ctx.guide).not.toContain("Legacy guide should not win."); expect(ctx.skills.map((s) => s.name)).toEqual(["a-first", "second"]); // sorted by filename; .txt ignored }); it("omits a skill whose frontmatter sets enabled: false", async () => { const dir = mkdtempSync(join(tmpdir(), "gt-review-")); - const rev = join(dir, "jsonbored__gittensory", "review"); + const rev = join(dir, "jsonbored__loopover", "review"); mkdirSync(join(rev, "skills"), { recursive: true }); writeFileSync(join(rev, "skills", "a-active.md"), "---\nname: active\nwhen: always\n---\nActive rubric.\n"); writeFileSync(join(rev, "skills", "b-disabled.md"), "---\nname: disabled\nenabled: false\n---\nParked rubric.\n"); - const ctx = await makeLocalReviewContextReader(dir)!("JSONbored/gittensory"); + const ctx = await makeLocalReviewContextReader(dir)!("JSONbored/loopover"); expect(ctx.skills.map((s) => s.name)).toEqual(["active"]); // the disabled skill is dropped, not deleted }); diff --git a/test/unit/product-usage.test.ts b/test/unit/product-usage.test.ts index 1f6abd756b..a730390547 100644 --- a/test/unit/product-usage.test.ts +++ b/test/unit/product-usage.test.ts @@ -91,7 +91,7 @@ describe("product usage events", () => { eventName: "local_branch_analysis_completed", actor: "bob", repoFullName: "bob/private-tool", - targetKey: "bob:JSONbored/gittensory:feature-x", + targetKey: "bob:JSONbored/loopover:feature-x", metadata: { viewer: "bob", note: "for bob, but bobcat stays readable", @@ -104,7 +104,7 @@ describe("product usage events", () => { expect(row).toBeDefined(); if (!row) throw new Error("expected product usage event"); expect(row.repoFullName).toBe("/private-tool"); - expect(row.targetKey).toBe(":JSONbored/gittensory:feature-x"); + expect(row.targetKey).toBe(":JSONbored/loopover:feature-x"); expect(row.metadata).toMatchObject({ viewer: "", note: "for , but bobcat stays readable", @@ -164,8 +164,8 @@ describe("product usage events", () => { surface: "api", eventName: "local_branch_analysis_completed", actor: "oktofeesh1", - repoFullName: "JSONbored/gittensory", - targetKey: "JSONbored/gittensory#136", + repoFullName: "JSONbored/loopover", + targetKey: "JSONbored/loopover#136", metadata: { command: "packet", authorization: "Bearer github_pat_secret", @@ -494,7 +494,7 @@ describe("product usage events", () => { surface: "api", eventName: "agent_pr_packet_completed", actor: "oktofeesh1", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "success", route: "/v1/agent/prepare-pr-packet", metadata: { command: "packet" }, @@ -504,7 +504,7 @@ describe("product usage events", () => { surface: "github_app", eventName: "github_installation_created", actor: "repo-owner", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "completed", metadata: { action: "created" }, occurredAt: `${day}T02:00:00.000Z`, @@ -513,7 +513,7 @@ describe("product usage events", () => { surface: "github_app", eventName: "agent_command_replied", actor: "repo-owner", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "completed", metadata: { command: "blockers", actorKind: "maintainer" }, occurredAt: `${day}T02:05:00.000Z`, @@ -555,7 +555,7 @@ describe("product usage events", () => { surface: "control_panel", eventName: "command_previewed", actor: "late-user", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "success", metadata: { command: "reviewability" }, occurredAt: `${day}T23:55:00.000Z`, @@ -652,7 +652,7 @@ describe("product usage events", () => { surface: "github_app", eventName: "github_installation_created", actor: "late-owner", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "completed", occurredAt: `${day}T23:00:00.000Z`, }); @@ -826,7 +826,7 @@ describe("product usage events", () => { surface: "github_app", eventName: "agent_command_replied", actor: "maintainer-retained", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "completed", metadata: { command: "blockers", actorKind: "maintainer" }, occurredAt: `${day}T02:00:00.000Z`, @@ -835,7 +835,7 @@ describe("product usage events", () => { surface: "github_app", eventName: "github_installation_created", actor: "new-owner", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", outcome: "completed", occurredAt: `${day}T03:00:00.000Z`, }); @@ -894,7 +894,7 @@ describe("product usage events", () => { { eventName: "pull_context_viewed", route: "/v1/extension/pull-context", actor: "extension-user", outcome: "success" }, { eventName: "github_installation_created", route: "/v1/github/webhook", actor: "github-user", outcome: "completed" }, { eventName: "repair_data_fidelity_completed", route: "/v1/internal/jobs/repair-data-fidelity", actor: "internal-user", outcome: "completed" }, - { eventName: "repo_snapshot_opened", route: "/v1/repos/JSONbored/gittensory", actor: "repo-user", outcome: "success" }, + { eventName: "repo_snapshot_opened", route: "/v1/repos/JSONbored/loopover", actor: "repo-user", outcome: "success" }, { eventName: "api_report_viewed", route: "/v1/reports/summary", actor: "api-user", outcome: "success", metadata: { toolName: "summary" } }, { eventName: "route_missing", actor: "unknown-user", outcome: "success" }, ] as const; @@ -1011,7 +1011,7 @@ describe("product usage events", () => { "/v1/agent/prepare-pr-packet", null, null, - "JSONbored/gittensory", + "JSONbored/loopover", null, "success", null, @@ -1032,7 +1032,7 @@ describe("product usage events", () => { sourceEventCount: 5001, maxEventCapacity: 5000, byEvent: [{ eventName: "agent_pr_packet_completed", count: 5000 }], - byRepo: [{ key: "JSONbored/gittensory", count: 5000 }], + byRepo: [{ key: "JSONbored/loopover", count: 5000 }], activation: expect.objectContaining({ firstUsefulActionActors: 0 }), }); await expect(getProductUsageRollupStatus(env, { nowIso: "2026-05-30T00:20:00.000Z" })).resolves.toMatchObject({ diff --git a/test/unit/public-accuracy-trend.test.ts b/test/unit/public-accuracy-trend.test.ts index a57ab36993..ed87f85bda 100644 --- a/test/unit/public-accuracy-trend.test.ts +++ b/test/unit/public-accuracy-trend.test.ts @@ -89,27 +89,27 @@ describe("buildPublicAccuracyTrend", () => { describe("loadPublicAccuracyTrend — end-to-end over the real live tables", () => { it("combines own-ledger merged/closed/reversed and Orb-fleet merged/closed into a consistent weekly trend", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const thisMonday = isoWeekStart(NOW); const thisWeekIso = `${thisMonday}T09:00:00.000Z`; const laterInWeekIso = new Date(Date.parse(thisWeekIso) + 86_400_000).toISOString(); // Own-ledger: PR #1 published+merged this week (no reversal). - await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }, 1); - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { number: 1, title: "PR 1", state: "closed", merged_at: thisWeekIso, user: { login: "a" }, head: { sha: "s1" }, labels: [] }); - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#1", outcome: "completed", createdAt: thisWeekIso }); + await upsertRepositoryFromGitHub(env, { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }, 1); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 1, title: "PR 1", state: "closed", merged_at: thisWeekIso, user: { login: "a" }, head: { sha: "s1" }, labels: [] }); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#1", outcome: "completed", createdAt: thisWeekIso }); // Own-ledger: PR #2 auto-closed by the engine this week, then REVERTED (reopened) -- must count in `reversed`. - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { number: 2, title: "PR 2", state: "open", user: { login: "b" }, head: { sha: "s2" }, labels: [] }); - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#2", outcome: "completed", createdAt: thisWeekIso }); - await recordAuditEvent(env, { eventType: "agent.action.close", targetKey: "JSONbored/gittensory#2", outcome: "completed", createdAt: thisWeekIso }); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 2, title: "PR 2", state: "open", user: { login: "b" }, head: { sha: "s2" }, labels: [] }); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#2", outcome: "completed", createdAt: thisWeekIso }); + await recordAuditEvent(env, { eventType: "agent.action.close", targetKey: "JSONbored/loopover#2", outcome: "completed", createdAt: thisWeekIso }); // Own-ledger: PR #3 closes WITHOUT merging (no reversal), on a DAY WITH NO PRIOR own-ledger merge -- exercises // the closedRows fold's `map.get(day)?.merged ?? 0` fallback branch (a day the mergedRows loop never touched), // distinct from the mergedRows loop above. - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { number: 3, title: "PR 3", state: "closed", user: { login: "c" }, head: { sha: "s3" }, labels: [] }); - await env.DB.prepare("UPDATE pull_requests SET updated_at = ? WHERE repo_full_name = ? AND number = 3").bind(laterInWeekIso, "JSONbored/gittensory").run(); - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#3", outcome: "completed", createdAt: laterInWeekIso }); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 3, title: "PR 3", state: "closed", user: { login: "c" }, head: { sha: "s3" }, labels: [] }); + await env.DB.prepare("UPDATE pull_requests SET updated_at = ? WHERE repo_full_name = ? AND number = 3").bind(laterInWeekIso, "JSONbored/loopover").run(); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#3", outcome: "completed", createdAt: laterInWeekIso }); // Orb fleet: a registered installation with a merge on the SAME later day as PR #3's close -- so the // own-ledger and Orb day-maps each have a day the OTHER source has no entry for at all (exercises both diff --git a/test/unit/public-review-volume-trend.test.ts b/test/unit/public-review-volume-trend.test.ts index 5ab706a7de..6f47c1e800 100644 --- a/test/unit/public-review-volume-trend.test.ts +++ b/test/unit/public-review-volume-trend.test.ts @@ -82,25 +82,25 @@ describe("buildPublicReviewVolumeTrend", () => { describe("loadPublicReviewVolumeTrend — end-to-end over the real live tables", () => { it("credits a PR's week by its FIRST-PUBLISHED day, not its (possibly later) merge day, and folds in the Orb fleet", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const thisMonday = isoWeekStart(NOW); const thisWeekIso = `${thisMonday}T09:00:00.000Z`; const laterInWeekIso = new Date(Date.parse(thisWeekIso) + 86_400_000).toISOString(); const priorMonday = isoWeekStart(NOW - 7 * 86_400_000); const priorWeekIso = `${priorMonday}T09:00:00.000Z`; - await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }, 1); + await upsertRepositoryFromGitHub(env, { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }, 1); // PR #1: published LAST week, merged THIS week -- must credit `reviewed`/`merged` to LAST week's cohort // (its publish day), not to the week it actually merged in. - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { number: 1, title: "PR 1", state: "closed", merged_at: thisWeekIso, user: { login: "a" }, head: { sha: "s1" }, labels: [] }); - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#1", outcome: "completed", createdAt: priorWeekIso }); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 1, title: "PR 1", state: "closed", merged_at: thisWeekIso, user: { login: "a" }, head: { sha: "s1" }, labels: [] }); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#1", outcome: "completed", createdAt: priorWeekIso }); // PR #2: published and closed (no merge) THIS week -- a genuinely filtered PR in THIS week's own cohort, on // a day with no prior own-ledger publish (exercises the day-map's `?? 0` fallback branch for a fresh day). - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { number: 2, title: "PR 2", state: "closed", user: { login: "b" }, head: { sha: "s2" }, labels: [] }); - await env.DB.prepare("UPDATE pull_requests SET updated_at = ? WHERE repo_full_name = ? AND number = 2").bind(laterInWeekIso, "JSONbored/gittensory").run(); - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#2", outcome: "completed", createdAt: laterInWeekIso }); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 2, title: "PR 2", state: "closed", user: { login: "b" }, head: { sha: "s2" }, labels: [] }); + await env.DB.prepare("UPDATE pull_requests SET updated_at = ? WHERE repo_full_name = ? AND number = 2").bind(laterInWeekIso, "JSONbored/loopover").run(); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#2", outcome: "completed", createdAt: laterInWeekIso }); // Orb fleet: a registered installation with a merge on the SAME later day as PR #2 -- own-ledger and Orb // day-maps each have a day the OTHER source has no entry for (exercises both directions of the ownLedger/ @@ -133,19 +133,19 @@ describe("loadPublicReviewVolumeTrend — end-to-end over the real live tables", // trend's own window, so the PR must be excluded entirely, not misattributed to the recent event's week. // A naive single-pass query that filtered raw events by `created_at >= sinceIso` BEFORE taking MIN() would // get this wrong: it would see only the recent event and wrongly count the PR in the current week. - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const thisMonday = isoWeekStart(NOW); const thisWeekIso = `${thisMonday}T09:00:00.000Z`; // 20 weeks ago: well outside the 8-week trend window, but still a real, storable timestamp. const longAgoIso = new Date(Date.parse(thisWeekIso) - 20 * 7 * 86_400_000).toISOString(); - await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }, 1); + await upsertRepositoryFromGitHub(env, { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }, 1); // Still open today (a long-lived PR that keeps getting re-reviewed) -- not merged, not closed. - await upsertPullRequestFromGitHub(env, "JSONbored/gittensory", { number: 9, title: "PR 9", state: "open", user: { login: "a" }, head: { sha: "s9" }, labels: [] }); + await upsertPullRequestFromGitHub(env, "JSONbored/loopover", { number: 9, title: "PR 9", state: "open", user: { login: "a" }, head: { sha: "s9" }, labels: [] }); // Its TRUE first publish, 20 weeks ago -- outside the trend window on its own. - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#9", outcome: "completed", createdAt: longAgoIso }); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#9", outcome: "completed", createdAt: longAgoIso }); // A legitimate re-publish THIS week (e.g. a fresh push triggered another review pass). - await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/gittensory#9", outcome: "completed", createdAt: thisWeekIso }); + await recordAuditEvent(env, { eventType: "github_app.pr_public_surface_published", targetKey: "JSONbored/loopover#9", outcome: "completed", createdAt: thisWeekIso }); const trend = await loadPublicReviewVolumeTrend(env, NOW); const currentWeek = trend[trend.length - 1]; diff --git a/test/unit/public-stats.test.ts b/test/unit/public-stats.test.ts index 41a37cbf8b..8b43d56ba6 100644 --- a/test/unit/public-stats.test.ts +++ b/test/unit/public-stats.test.ts @@ -9,7 +9,7 @@ import { resolvePublicStatsManifestOverride, } from "../../src/review/public-stats"; -const SELF_REPO = "JSONbored/gittensory"; +const SELF_REPO = "JSONbored/loopover"; type Row = Record; @@ -26,7 +26,7 @@ function stubEnv(handler: (sql: string, args: unknown[]) => Row[]): Env { return { DB: { prepare: (sql: string) => make(sql, []) }, LOOPOVER_PUBLIC_STATS_REPOS: - "JSONbored/gittensory,JSONbored/awesome-claude,JSONbored/metagraphed", + "JSONbored/loopover,JSONbored/awesome-claude,JSONbored/metagraphed", } as unknown as Env; } @@ -164,7 +164,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { inReview: 80, }, { - project: "JSONbored/gittensory", + project: "JSONbored/loopover", reviewed: 315, merged: 24, closed: 24, @@ -176,7 +176,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { return [ { project: "JSONbored/awesome-claude", reversed: 20 }, { project: "JSONbored/metagraphed", reversed: 10 }, - { project: "JSONbored/gittensory", reversed: 3 }, + { project: "JSONbored/loopover", reversed: 3 }, ]; } return []; @@ -203,7 +203,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { expect(out.byProject.map((p) => p.project)).toEqual([ "JSONbored/awesome-claude", "JSONbored/metagraphed", - "JSONbored/gittensory", + "JSONbored/loopover", ]); expect(out.updatedAt).toBe(out.generatedAt); }); @@ -232,7 +232,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { // #2070: mixed ledgers must COALESCE missing per-PR estimates to MINUTES_SAVED_PER_PR, not AVG-skip them. it("sums mixed per-PR effort with fallback when one published PR lacks reviewEffortMinutes", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const db = env.DB; await db @@ -242,13 +242,13 @@ describe("getPublicStats — live aggregate over the review ledger", () => { ) .bind( "pr-a", - "JSONbored/gittensory", + "JSONbored/loopover", 10, "small fix", "closed", "2026-06-01T00:00:00.000Z", "pr-b", - "JSONbored/gittensory", + "JSONbored/loopover", 11, "legacy publish", "closed", @@ -263,12 +263,12 @@ describe("getPublicStats — live aggregate over the review ledger", () => { .bind( "published-a", "github_app.pr_public_surface_published", - "JSONbored/gittensory#10", + "JSONbored/loopover#10", "completed", JSON.stringify({ reviewEffortMinutes: 4 }), "published-b", "github_app.pr_public_surface_published", - "JSONbored/gittensory#11", + "JSONbored/loopover#11", "completed", "{}", ) @@ -335,11 +335,11 @@ describe("getPublicStats — live aggregate over the review ledger", () => { }); it("clamps review accuracy to 0 when reopened auto-closes push reversals above the decided count", async () => { - // JSONbored/gittensory: 1 auto-merge that held, plus 2 auto-closes that were reopened (now open, so out + // JSONbored/loopover: 1 auto-merge that held, plus 2 auto-closes that were reopened (now open, so out // of merged+closed but still counted as reversals). decided=1, reversed=2 → an unclamped 1 - 2/1 = -100%. const handler = (sql: string): Row[] => { - if (isDispositions(sql)) return [{ project: "JSONbored/gittensory", reviewed: 3, merged: 1, closed: 0, inReview: 2 }]; - if (isReversal(sql)) return [{ project: "JSONbored/gittensory", reversed: 2 }]; + if (isDispositions(sql)) return [{ project: "JSONbored/loopover", reviewed: 3, merged: 1, closed: 0, inReview: 2 }]; + if (isReversal(sql)) return [{ project: "JSONbored/loopover", reversed: 2 }]; return []; }; const out = await getPublicStats(stubEnv(handler), NOW); @@ -352,14 +352,14 @@ describe("getPublicStats — live aggregate over the review ledger", () => { stubEnv((sql, args) => { if (isReversal(sql)) { return [ - { project: "JSONbored/gittensory", reversed: 1 }, + { project: "JSONbored/loopover", reversed: 1 }, { project: "CustomerCo/stealth-product", reversed: 1 }, ].filter((row) => args.includes(String(row.project).toLowerCase())); } if (isWeekly(sql)) { const allowed = args.slice(2); // [sinceIso, sinceIso, ...projects] const weeklyRows = [ - { project: "JSONbored/gittensory", reviewed: 2, merged: 1 }, + { project: "JSONbored/loopover", reviewed: 2, merged: 1 }, { project: "CustomerCo/stealth-product", reviewed: 3, merged: 3 }, ].filter((row) => allowed.includes(String(row.project).toLowerCase()), @@ -377,7 +377,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { if (isDispositions(sql)) { return [ { - project: "JSONbored/gittensory", + project: "JSONbored/loopover", reviewed: 2, merged: 1, closed: 1, @@ -402,12 +402,12 @@ describe("getPublicStats — live aggregate over the review ledger", () => { expect(out.totals.reversed).toBe(1); expect(out.weekly).toEqual({ reviewed: 2, merged: 1 }); expect(out.byProject.map((p) => p.project)).toEqual([ - "JSONbored/gittensory", + "JSONbored/loopover", ]); }); it("excludes dry-run terminal actions from live reversal counts", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const db = env.DB; await db @@ -417,13 +417,13 @@ describe("getPublicStats — live aggregate over the review ledger", () => { ) .bind( "pr-real", - "JSONbored/gittensory", + "JSONbored/loopover", 1, "real auto-closed PR", "closed", null, "pr-dry-run", - "JSONbored/gittensory", + "JSONbored/loopover", 2, "dry-run close shadow", "open", @@ -438,22 +438,22 @@ describe("getPublicStats — live aggregate over the review ledger", () => { .bind( "published-real", "github_app.pr_public_surface_published", - "JSONbored/gittensory#1", + "JSONbored/loopover#1", "completed", "{}", "published-dry-run", "github_app.pr_public_surface_published", - "JSONbored/gittensory#2", + "JSONbored/loopover#2", "completed", "{}", "live-close", "agent.action.close", - "JSONbored/gittensory#1", + "JSONbored/loopover#1", "completed", JSON.stringify({ mode: "live" }), "dry-run-close", "agent.action.close", - "JSONbored/gittensory#2", + "JSONbored/loopover#2", "completed", JSON.stringify({ mode: "dry_run" }), ) @@ -470,7 +470,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { // #1955/#2070: end-to-end over REAL D1/SQLite — published reviewEffortMinutes round-trip through // json_extract/SUM(COALESCE(...)) into minutesSaved. it("averages a real reviewEffortMinutes value out of metadata_json via json_extract (real D1)", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const db = env.DB; await db @@ -480,13 +480,13 @@ describe("getPublicStats — live aggregate over the review ledger", () => { ) .bind( "pr-a", - "JSONbored/gittensory", + "JSONbored/loopover", 10, "small fix", "closed", "2026-06-01T00:00:00.000Z", "pr-b", - "JSONbored/gittensory", + "JSONbored/loopover", 11, "bigger change", "closed", @@ -501,12 +501,12 @@ describe("getPublicStats — live aggregate over the review ledger", () => { .bind( "published-a", "github_app.pr_public_surface_published", - "JSONbored/gittensory#10", + "JSONbored/loopover#10", "completed", JSON.stringify({ reviewEffortMinutes: 4 }), "published-b", "github_app.pr_public_surface_published", - "JSONbored/gittensory#11", + "JSONbored/loopover#11", "completed", JSON.stringify({ reviewEffortMinutes: 96 }), ) @@ -521,7 +521,7 @@ describe("getPublicStats — live aggregate over the review ledger", () => { }); it("deduplicates repeated public-surface publishes before averaging reviewEffortMinutes (real D1)", async () => { - const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_PUBLIC_STATS_REPOS: "JSONbored/loopover" }); const db = env.DB; await db @@ -531,13 +531,13 @@ describe("getPublicStats — live aggregate over the review ledger", () => { ) .bind( "pr-republished", - "JSONbored/gittensory", + "JSONbored/loopover", 20, "republished large review", "closed", "2026-06-01T00:00:00.000Z", "pr-single", - "JSONbored/gittensory", + "JSONbored/loopover", 21, "single tiny review", "closed", @@ -552,22 +552,22 @@ describe("getPublicStats — live aggregate over the review ledger", () => { .bind( "published-republished-a", "github_app.pr_public_surface_published", - "JSONbored/gittensory#20", + "JSONbored/loopover#20", "completed", JSON.stringify({ reviewEffortMinutes: 100 }), "published-republished-b", "github_app.pr_public_surface_published", - "JSONbored/gittensory#20", + "JSONbored/loopover#20", "completed", JSON.stringify({ reviewEffortMinutes: 100 }), "published-republished-c", "github_app.pr_public_surface_published", - "JSONbored/gittensory#20", + "JSONbored/loopover#20", "completed", JSON.stringify({ reviewEffortMinutes: 100 }), "published-single", "github_app.pr_public_surface_published", - "JSONbored/gittensory#21", + "JSONbored/loopover#21", "completed", JSON.stringify({ reviewEffortMinutes: 1 }), ) diff --git a/test/unit/recommendation-snapshots.test.ts b/test/unit/recommendation-snapshots.test.ts index 485bf79b16..73c51bf511 100644 --- a/test/unit/recommendation-snapshots.test.ts +++ b/test/unit/recommendation-snapshots.test.ts @@ -28,7 +28,7 @@ describe("recommendation snapshot envelopes", () => { generatedAt: "2026-06-01T00:00:00.000Z", publicSafe: true, target: { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 12, }, provenance: { @@ -49,10 +49,10 @@ describe("recommendation snapshot envelopes", () => { it("attaches the id and envelope without removing existing action payload", () => { const attached = attachRecommendationSnapshot( - action({ payload: { decision: { repoFullName: "JSONbored/gittensory" } } }), + action({ payload: { decision: { repoFullName: "JSONbored/loopover" } } }), context(), ); - expect(attached.payload.decision).toEqual({ repoFullName: "JSONbored/gittensory" }); + expect(attached.payload.decision).toEqual({ repoFullName: "JSONbored/loopover" }); expect(attached.payload.recommendationSnapshotId).toBe("recommendation:context-123:run-1:00:choose_next_work"); expect(attached.payload.recommendationSnapshot).toMatchObject({ snapshotId: "recommendation:context-123:run-1:00:choose_next_work", @@ -75,7 +75,7 @@ describe("recommendation snapshot envelopes", () => { ]); expect(attached[1]?.payload.recommendationSnapshot).toMatchObject({ actionType: "explain_repo_fit", - target: { repoFullName: "JSONbored/gittensory", issueNumber: 7 }, + target: { repoFullName: "JSONbored/loopover", issueNumber: 7 }, }); }); @@ -231,7 +231,7 @@ function action(overrides: Partial = {}): AgentActionRecord { id: "run-1:00:choose_next_work", runId: "run-1", actionType: "choose_next_work", - targetRepoFullName: "JSONbored/gittensory", + targetRepoFullName: "JSONbored/loopover", targetPullNumber: 12, status: "recommended", recommendation: "Pick narrow work.", diff --git a/test/unit/redaction.test.ts b/test/unit/redaction.test.ts index e28b51e264..43a6cef8cd 100644 --- a/test/unit/redaction.test.ts +++ b/test/unit/redaction.test.ts @@ -49,7 +49,7 @@ describe("isPublicSafeText (#542 shared public/private boundary)", () => { expect(isPublicSafeText("/var/log/app.log")).toBe(false); expect(isPublicSafeText("/var/folders/alice/work/private-repo/cache.ts")).toBe(false); expect(isPublicSafeText("/tmp/scratch")).toBe(false); - expect(isPublicSafeText("/private/tmp/gittensory/cache")).toBe(false); + expect(isPublicSafeText("/private/tmp/loopover/cache")).toBe(false); expect(isPublicSafeText("C:\\Users\\carol\\repo")).toBe(false); expect(isPublicSafeText("C:/Users/carol/repo")).toBe(false); expect(isPublicSafeText("/opt/homebrew/var/log")).toBe(false); diff --git a/test/unit/registration-workspace-ui.test.ts b/test/unit/registration-workspace-ui.test.ts index 56728c6aa0..62d7d662e7 100644 --- a/test/unit/registration-workspace-ui.test.ts +++ b/test/unit/registration-workspace-ui.test.ts @@ -18,7 +18,7 @@ const FORBIDDEN = function readyFixture(overrides: Partial = {}): RegistrationReadinessPayload { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", generatedAt: "2026-06-01T00:00:00.000Z", ready: true, recommendedRegistrationMode: "direct_pr", @@ -81,7 +81,7 @@ function readyFixture(overrides: Partial = {}): Re function configFixture(): GittensorConfigRecommendationPayload { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", generatedAt: "2026-06-01T00:00:00.000Z", privateOnly: true, current: { maintainerCut: 0 }, @@ -124,7 +124,7 @@ describe("registration workspace UI helpers", () => { it("stale data fixture marks freshness degraded and keeps warnings", () => { const freshness = resolveRegistrationWorkspaceFreshness( - { status: "degraded", partial: true, warnings: ["Burden forecast unavailable for JSONbored/gittensory."] }, + { status: "degraded", partial: true, warnings: ["Burden forecast unavailable for JSONbored/loopover."] }, { status: "complete", partial: false, warnings: [] }, ); expect(freshness.status).toBe("degraded"); @@ -482,7 +482,7 @@ describe("registration workspace UI helpers", () => { }); it("splitRepoFullName validates owner/repo slugs for the owner panel", () => { - expect(splitRepoFullName("JSONbored/gittensory")).toEqual({ owner: "JSONbored", repo: "gittensory" }); + expect(splitRepoFullName("JSONbored/loopover")).toEqual({ owner: "JSONbored", repo: "loopover" }); expect(splitRepoFullName("bad")).toBeNull(); }); diff --git a/test/unit/registry.test.ts b/test/unit/registry.test.ts index 1a3d16c24d..a78b470e2f 100644 --- a/test/unit/registry.test.ts +++ b/test/unit/registry.test.ts @@ -138,7 +138,7 @@ describe("registry normalization", () => { it("normalizes repository-list and array payload shapes defensively", () => { const fromObjectMap = normalizeRegistryPayload( { - "JSONbored/gittensory": { emission_share: 0.03 }, + "JSONbored/loopover": { emission_share: 0.03 }, "ignored/null": null, "ignored/array": [], }, @@ -169,7 +169,7 @@ describe("registry normalization", () => { const fromArray = normalizeRegistryPayload( [ { - repository_full_name: "JSONbored/gittensory", + repository_full_name: "JSONbored/loopover", emission_share: 0.03, issue_discovery_share: 0, maintainer_cut: 0.1, @@ -193,12 +193,12 @@ describe("registry normalization", () => { labelMultipliers: { bug: 1.2 }, trustedLabelPipeline: true, }); - expect(fromObjectMap.repositories.map((repo) => repo.repo)).toEqual(["JSONbored/gittensory"]); + expect(fromObjectMap.repositories.map((repo) => repo.repo)).toEqual(["JSONbored/loopover"]); expect(fromObjectMap.repositories[0]).toMatchObject({ - repo: "JSONbored/gittensory", + repo: "JSONbored/loopover", issueDiscoveryShare: DEFAULT_ISSUE_DISCOVERY_SHARE, }); - expect(fromArray.repositories.map((repo) => repo.repo)).toEqual(["JSONbored/gittensory", "bad/numbers"]); + expect(fromArray.repositories.map((repo) => repo.repo)).toEqual(["JSONbored/loopover", "bad/numbers"]); expect(fromArray.repositories.find((repo) => repo.repo === "bad/numbers")).toMatchObject({ emissionShare: 0, issueDiscoveryShare: DEFAULT_ISSUE_DISCOVERY_SHARE, @@ -209,7 +209,7 @@ describe("registry normalization", () => { it("persists and reads the latest snapshot from D1", async () => { const env = createTestEnv(); const snapshot = normalizeRegistryPayload( - { "JSONbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0.5 } }, + { "JSONbored/loopover": { emission_share: 0.02, issue_discovery_share: 0.5 } }, { kind: "raw-github", url: "https://example.test/master_repositories.json" }, "2026-05-22T00:00:00.000Z", ); @@ -217,7 +217,7 @@ describe("registry normalization", () => { await persistRegistrySnapshot(env, snapshot); const latest = await getLatestRegistrySnapshot(env); - expect(latest?.repositories[0]?.repo).toBe("JSONbored/gittensory"); + expect(latest?.repositories[0]?.repo).toBe("JSONbored/loopover"); expect(latest?.source.kind).toBe("raw-github"); }); @@ -227,7 +227,7 @@ describe("registry normalization", () => { env, normalizeRegistryPayload( { - "JSONbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0 }, + "JSONbored/loopover": { emission_share: 0.02, issue_discovery_share: 0 }, "JSONbored/awesome-claude": { emission_share: 0.01, issue_discovery_share: 0 }, }, { kind: "raw-github", url: "fixture://old-registry" }, @@ -245,7 +245,7 @@ describe("registry normalization", () => { ), ); - await expect(getRepository(env, "JSONbored/gittensory")).resolves.toMatchObject({ + await expect(getRepository(env, "JSONbored/loopover")).resolves.toMatchObject({ isRegistered: false, registryConfig: null, }); @@ -258,39 +258,39 @@ describe("registry normalization", () => { it("updates an existing case-variant repo row instead of inserting a duplicate", async () => { const env = createCloudTestEnv(); // A GitHub-sourced row already exists under canonical casing. - await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }); + await upsertRepositoryFromGitHub(env, { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }); // The registry supplies the same repo with different casing. await persistRegistrySnapshot( env, normalizeRegistryPayload( - { "jsonbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0 } }, + { "jsonbored/loopover": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://registry" }, "2026-05-22T00:00:00.000Z", ), ); // The existing canonical row is updated to registered -- no duplicate primary-key row. - await expect(getRepository(env, "JSONbored/gittensory")).resolves.toMatchObject({ isRegistered: true }); - const rows = await env.DB.prepare("SELECT full_name FROM repositories WHERE lower(full_name) = ?").bind("jsonbored/gittensory").all(); + await expect(getRepository(env, "JSONbored/loopover")).resolves.toMatchObject({ isRegistered: true }); + const rows = await env.DB.prepare("SELECT full_name FROM repositories WHERE lower(full_name) = ?").bind("jsonbored/loopover").all(); expect(rows.results).toHaveLength(1); - expect((rows.results[0] as { full_name: string }).full_name).toBe("JSONbored/gittensory"); + expect((rows.results[0] as { full_name: string }).full_name).toBe("JSONbored/loopover"); }); it("does not de-register a repo whose snapshot casing differs from the stored row", async () => { const env = createCloudTestEnv(); await persistRegistrySnapshot( env, - normalizeRegistryPayload({ "JSONbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://old" }, "2026-05-22T00:00:00.000Z"), + normalizeRegistryPayload({ "JSONbored/loopover": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://old" }, "2026-05-22T00:00:00.000Z"), ); // The next snapshot uses different casing for the same repo. await persistRegistrySnapshot( env, - normalizeRegistryPayload({ "jsonbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://new" }, "2026-05-23T00:00:00.000Z"), + normalizeRegistryPayload({ "jsonbored/loopover": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://new" }, "2026-05-23T00:00:00.000Z"), ); - await expect(getRepository(env, "JSONbored/gittensory")).resolves.toMatchObject({ isRegistered: true }); - const rows = await env.DB.prepare("SELECT full_name FROM repositories WHERE lower(full_name) = ?").bind("jsonbored/gittensory").all(); + await expect(getRepository(env, "JSONbored/loopover")).resolves.toMatchObject({ isRegistered: true }); + const rows = await env.DB.prepare("SELECT full_name FROM repositories WHERE lower(full_name) = ?").bind("jsonbored/loopover").all(); expect(rows.results).toHaveLength(1); }); @@ -298,11 +298,11 @@ describe("registry normalization", () => { const env = createCloudTestEnv(); await persistRegistrySnapshot( env, - normalizeRegistryPayload({ "JSONbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://seed" }, "2026-05-22T00:00:00.000Z"), + normalizeRegistryPayload({ "JSONbored/loopover": { emission_share: 0.02, issue_discovery_share: 0 } }, { kind: "raw-github", url: "fixture://seed" }, "2026-05-22T00:00:00.000Z"), ); // An empty snapshot (e.g. a failed/empty registry fetch) must preserve registrations, not wipe them. await persistRegistrySnapshot(env, normalizeRegistryPayload({}, { kind: "raw-github", url: "fixture://empty" }, "2026-05-23T00:00:00.000Z")); - await expect(getRepository(env, "JSONbored/gittensory")).resolves.toMatchObject({ isRegistered: true }); + await expect(getRepository(env, "JSONbored/loopover")).resolves.toMatchObject({ isRegistered: true }); }); it("collapses case-variant duplicates within a single snapshot to one row", async () => { @@ -311,23 +311,23 @@ describe("registry normalization", () => { env, normalizeRegistryPayload( { - "JSONbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0 }, - "jsonbored/gittensory": { emission_share: 0.03, issue_discovery_share: 0 }, + "JSONbored/loopover": { emission_share: 0.02, issue_discovery_share: 0 }, + "jsonbored/loopover": { emission_share: 0.03, issue_discovery_share: 0 }, }, { kind: "raw-github", url: "fixture://dup-casing" }, "2026-05-22T00:00:00.000Z", ), ); - const rows = await env.DB.prepare("SELECT full_name FROM repositories WHERE lower(full_name) = ?").bind("jsonbored/gittensory").all(); + const rows = await env.DB.prepare("SELECT full_name FROM repositories WHERE lower(full_name) = ?").bind("jsonbored/loopover").all(); expect(rows.results).toHaveLength(1); - await expect(getRepository(env, "JSONbored/gittensory")).resolves.toMatchObject({ isRegistered: true }); + await expect(getRepository(env, "JSONbored/loopover")).resolves.toMatchObject({ isRegistered: true }); }); it("falls back to raw GitHub when registry API probes fail", async () => { vi.stubGlobal("fetch", async (input: RequestInfo | URL) => { const url = input.toString(); if (url.includes("raw.githubusercontent.com")) { - return Response.json({ "JSONbored/gittensory": { emission_share: 0.02, issue_discovery_share: 0.5 } }); + return Response.json({ "JSONbored/loopover": { emission_share: 0.02, issue_discovery_share: 0.5 } }); } return new Response("not found", { status: 404 }); }); @@ -336,6 +336,6 @@ describe("registry normalization", () => { expect(snapshot.source.kind).toBe("raw-github"); expect(snapshot.warnings.length).toBeGreaterThan(0); - expect(snapshot.repositories[0]?.repo).toBe("JSONbored/gittensory"); + expect(snapshot.repositories[0]?.repo).toBe("JSONbored/loopover"); }); }); diff --git a/test/unit/repo-doc-pr.test.ts b/test/unit/repo-doc-pr.test.ts index cc56023ea2..d844f9cd27 100644 --- a/test/unit/repo-doc-pr.test.ts +++ b/test/unit/repo-doc-pr.test.ts @@ -217,7 +217,7 @@ describe("openRepoDocPullRequest (#3000)", () => { // LOOPOVER_SITE_URL's own string), so envWithKey() alone does NOT exercise the `??` fallback's nullish // side -- the paired test below overrides it to `undefined` explicitly to cover that branch too. it("#4613: uses env.PUBLIC_SITE_ORIGIN in the generated AGENTS.md attribution link when configured", async () => { - const env = createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem(), PUBLIC_SITE_ORIGIN: "https://gittensory.example.org" }); + const env = createTestEnv({ GITHUB_APP_PRIVATE_KEY: generateRsaPrivateKeyPem(), PUBLIC_SITE_ORIGIN: "https://loopover.example.org" }); await seedInstalledRepo(env, { defaultBranch: "main" }); await seedProfileData(env); await seedRepoDocGenerationConfig(env, REPO); @@ -243,7 +243,7 @@ describe("openRepoDocPullRequest (#3000)", () => { const treeCall = calls.find((c) => c.url.endsWith("/git/trees")); const tree = treeCall?.body.tree as Array<{ path: string; content: string }>; const agentsContent = tree.find((entry) => entry.path === "AGENTS.md")?.content; - expect(agentsContent).toContain("This file is generated by [LoopOver](https://gittensory.example.org)"); + expect(agentsContent).toContain("This file is generated by [LoopOver](https://loopover.example.org)"); expect(agentsContent).not.toContain(LOOPOVER_SITE_URL); }); diff --git a/test/unit/repo-doc-render.test.ts b/test/unit/repo-doc-render.test.ts index c8a42a2612..eeb19cae6e 100644 --- a/test/unit/repo-doc-render.test.ts +++ b/test/unit/repo-doc-render.test.ts @@ -51,14 +51,14 @@ describe("renderRepoDocContent (#3000)", () => { // LOOPOVER_SITE_URL in the attribution link -- the SAME (profile, siteUrl) pair still renders // identically on repeat calls, preserving the purity/determinism the diff-aware refresh depends on. it("#4613: renders the caller-provided siteUrl in the attribution link instead of LOOPOVER_SITE_URL", () => { - const selfHostedUrl = "https://gittensory.example.org"; + const selfHostedUrl = "https://loopover.example.org"; const content = renderRepoDocContent(presentProfile(), selfHostedUrl); expect(content).toContain(`This file is generated by [LoopOver](${selfHostedUrl})`); expect(content).not.toContain(LOOPOVER_SITE_URL); }); it("#4613: renders byte-identical output for the same (profile, siteUrl) pair on repeat calls", () => { - const selfHostedUrl = "https://gittensory.example.org"; + const selfHostedUrl = "https://loopover.example.org"; const a = renderRepoDocContent(presentProfile(), selfHostedUrl); const b = renderRepoDocContent(presentProfile(), selfHostedUrl); expect(a).toEqual(b); diff --git a/test/unit/retention.test.ts b/test/unit/retention.test.ts index ae583ce0a0..ef1ec2e49f 100644 --- a/test/unit/retention.test.ts +++ b/test/unit/retention.test.ts @@ -31,7 +31,7 @@ async function insertSignalSnapshot(env: Env, id: string, signalType: string, ta await env.DB.prepare( "INSERT INTO signal_snapshots (id, signal_type, target_key, repo_full_name, payload_json, generated_at) VALUES (?,?,?,?,?,?)", ) - .bind(id, signalType, targetKey, "JSONbored/gittensory", "{}", generatedAt) + .bind(id, signalType, targetKey, "JSONbored/loopover", "{}", generatedAt) .run(); } @@ -69,7 +69,7 @@ describe("pruneExpiredRecords", () => { await env.DB.prepare( `INSERT INTO audit_events (id, event_type, target_key, outcome, created_at) VALUES - ('published-old', 'github_app.pr_public_surface_published', 'JSONbored/gittensory#1', 'completed', ?), + ('published-old', 'github_app.pr_public_surface_published', 'JSONbored/loopover#1', 'completed', ?), ('rate-limit-old', 'rate_limit.denied', 'actor', 'completed', ?), ('rate-limit-recent', 'rate_limit.denied', 'actor', 'completed', ?)`, ) @@ -138,8 +138,8 @@ describe("dedupeSignalSnapshots", () => { it("dry-run counts duplicates per signal_type without deleting anything", async () => { const env = createTestEnv(); - await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); await insertSignalSnapshot(env, "s-3", "repo-culture-profile", "other/repo", "2026-06-01T00:00:00.000Z"); // distinct key, not a duplicate const results = await dedupeSignalSnapshots(env, { dryRun: true }); expect(results).toEqual([{ signalType: "repo-culture-profile", deleted: 1 }]); @@ -148,10 +148,10 @@ describe("dedupeSignalSnapshots", () => { it("keeps only the highest-rowid row for latest-only signal types and preserves historical signal types", async () => { const env = createTestEnv(); - await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); - await insertSignalSnapshot(env, "s-3", "repo-culture-profile", "JSONbored/gittensory", "2026-06-03T00:00:00.000Z"); // latest, kept - await insertSignalSnapshot(env, "s-4", "queue-health", "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); // historical type, not deduped + await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-3", "repo-culture-profile", "JSONbored/loopover", "2026-06-03T00:00:00.000Z"); // latest, kept + await insertSignalSnapshot(env, "s-4", "queue-health", "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); // historical type, not deduped const results = await dedupeSignalSnapshots(env); expect(results.find((r) => r.signalType === "repo-culture-profile")?.deleted).toBe(2); @@ -164,10 +164,10 @@ describe("dedupeSignalSnapshots", () => { it("dedupes private and public focus-manifest cache snapshots (regression for storage exhaustion)", async () => { const env = createTestEnv(); - await insertSignalSnapshot(env, "private-old", REPO_FOCUS_MANIFEST_SIGNAL, "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "private-latest", REPO_FOCUS_MANIFEST_SIGNAL, "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); - await insertSignalSnapshot(env, "public-old", REPO_PUBLIC_FOCUS_MANIFEST_SIGNAL, "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "public-latest", REPO_PUBLIC_FOCUS_MANIFEST_SIGNAL, "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "private-old", REPO_FOCUS_MANIFEST_SIGNAL, "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "private-latest", REPO_FOCUS_MANIFEST_SIGNAL, "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "public-old", REPO_PUBLIC_FOCUS_MANIFEST_SIGNAL, "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "public-latest", REPO_PUBLIC_FOCUS_MANIFEST_SIGNAL, "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); const results = await dedupeSignalSnapshots(env); @@ -185,8 +185,8 @@ describe("dedupeSignalSnapshots", () => { const env = createTestEnv(); await insertSignalSnapshot(env, "decision-prev", "contributor-decision-pack", "alice", "2026-06-01T00:00:00.000Z"); await insertSignalSnapshot(env, "decision-current", "contributor-decision-pack", "alice", "2026-06-02T00:00:00.000Z"); - await insertSignalSnapshot(env, "queue-old", "queue-health", "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "queue-current", "queue-health", "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "queue-old", "queue-health", "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "queue-current", "queue-health", "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); expect(await dedupeSignalSnapshots(env)).toEqual([]); @@ -197,7 +197,7 @@ describe("dedupeSignalSnapshots", () => { it("deletes across multiple batches per signal_type and stops at the per-type cap", async () => { const env = createTestEnv(); for (let i = 0; i < 6; i++) { - await insertSignalSnapshot(env, `s-${i}`, "repo-culture-profile", "JSONbored/gittensory", `2026-06-0${i + 1}T00:00:00.000Z`); + await insertSignalSnapshot(env, `s-${i}`, "repo-culture-profile", "JSONbored/loopover", `2026-06-0${i + 1}T00:00:00.000Z`); } // The 6th insert (highest generated_at, inserted last so it also has the highest rowid) is kept, leaving 5 // duplicates; batchSize 2 forces multiple full (changes === batchSize) delete iterations before maxPerType 4 @@ -252,8 +252,8 @@ describe("runRetentionPrune + processJob", () => { it("processJob prune-retention deletes, dedupes signal_snapshots, and audits both", async () => { const env = createTestEnv(); await seed(env); - await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); await processJob(env, { type: "prune-retention", requestedBy: "schedule" }); expect(await countWebhook(env)).toBe(3); expect(await countSignalSnapshots(env, "repo-culture-profile")).toBe(1); @@ -268,8 +268,8 @@ describe("retention preview route", () => { const app = createApp(); const env = createTestEnv(); await seed(env); - await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/gittensory", "2026-06-01T00:00:00.000Z"); - await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/gittensory", "2026-06-02T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-1", "repo-culture-profile", "JSONbored/loopover", "2026-06-01T00:00:00.000Z"); + await insertSignalSnapshot(env, "s-2", "repo-culture-profile", "JSONbored/loopover", "2026-06-02T00:00:00.000Z"); const res = await app.request("/v1/internal/retention/preview", { headers: { authorization: `Bearer ${env.INTERNAL_JOB_TOKEN}` } }, env); expect(res.status).toBe(200); const body = (await res.json()) as { diff --git a/test/unit/reward-risk-freshness.test.ts b/test/unit/reward-risk-freshness.test.ts index 90dd4cf55c..f30e929f93 100644 --- a/test/unit/reward-risk-freshness.test.ts +++ b/test/unit/reward-risk-freshness.test.ts @@ -71,7 +71,7 @@ function toFreshnessIssues(issues: IssueRecord[]): FreshnessIssue[] { })); } -describe("reward-risk freshness parity with gittensory-engine", () => { +describe("reward-risk freshness parity with loopover-engine", () => { const collab = repo("owner/collab-repo"); const profile = buildContributorProfile("dev", { login: "dev", topLanguages: [], source: "github" }, [], []); const history = buildContributorOutcomeHistory({ diff --git a/test/unit/reward-risk-reports.test.ts b/test/unit/reward-risk-reports.test.ts index f7462a99b8..3fed21f64f 100644 --- a/test/unit/reward-risk-reports.test.ts +++ b/test/unit/reward-risk-reports.test.ts @@ -86,7 +86,7 @@ function issue( function makeFiles(count: number, pathPrefix = "src/file", additions = 10): PullRequestFileRecord[] { return Array.from({ length: count }, (_, i) => ({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 1, path: `${pathPrefix}-${i}.ts`, additions, @@ -99,7 +99,7 @@ function makeFiles(count: number, pathPrefix = "src/file", additions = 10): Pull function failingCheck(pullNumber: number, name = "ci"): CheckSummaryRecord { return { id: `${name}-1`, - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber, name, status: "completed", @@ -110,7 +110,7 @@ function failingCheck(pullNumber: number, name = "ci"): CheckSummaryRecord { describe("buildMaintainerNoiseReport (#2093)", () => { it("falls back to the empty-noise message when no source fires", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const report = buildMaintainerNoiseReport(r, [], [], [], r.fullName); expect(report.repoFullName).toBe(r.fullName); expect(typeof report.generatedAt).toBe("string"); @@ -120,7 +120,7 @@ describe("buildMaintainerNoiseReport (#2093)", () => { }); it("reports the unlinked open PR arm and the three level thresholds", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const makeUnlinked = (n: number) => Array.from({ length: n }, (_, i) => pr(r.fullName, 200 + i, `Focused fix ${i}`, { linkedIssues: [], updatedAt: new Date().toISOString() }), @@ -132,7 +132,7 @@ describe("buildMaintainerNoiseReport (#2093)", () => { }); it("reports the high-risk collision cluster arm", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const relatedIssue = issue(r.fullName, 1, "Fix cache bug"); const collidingPr = pr(r.fullName, 100, "Fix cache bug duplicate", { linkedIssues: [1] }); const recentMerged: RecentMergedPullRequestRecord[] = [ @@ -144,7 +144,7 @@ describe("buildMaintainerNoiseReport (#2093)", () => { }); it("reports the stale PR arm", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const stale = pr(r.fullName, 50, "Old PR", { linkedIssues: [], updatedAt: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString(), @@ -155,7 +155,7 @@ describe("buildMaintainerNoiseReport (#2093)", () => { }); it("reports the broad-diff title arm", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const broad = pr(r.fullName, 60, "Refactor and cleanup of various modules across the codebase".padEnd(140, " x"), { linkedIssues: [], }); @@ -164,7 +164,7 @@ describe("buildMaintainerNoiseReport (#2093)", () => { }); it("excludes already-merged/closed broad-title PRs from the broad-diff noise arm (only open PRs are live noise)", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); // A merged and a closed PR whose titles hit the churn regex must NOT be counted as live queue noise. const merged = pr(r.fullName, 61, "Refactor cleanup of various modules", { state: "merged" }); const closed = pr(r.fullName, 62, "Misc cleanup", { state: "closed" }); @@ -176,7 +176,7 @@ describe("buildMaintainerNoiseReport (#2093)", () => { }); it("reports the strained intake arm via deduped maintainerActions", () => { - const r = repo("JSONbored/gittensory", { issueDiscoveryShare: 0 }); + const r = repo("JSONbored/loopover", { issueDiscoveryShare: 0 }); const unlinked = Array.from({ length: 4 }, (_, i) => pr(r.fullName, 300 + i, `Open ${i}`, { linkedIssues: [], updatedAt: new Date(Date.now() - 45 * 24 * 60 * 60 * 1000).toISOString() }), ); @@ -199,7 +199,7 @@ function closedRateHistory(login: string, r: RepositoryRecord, closed: number, m describe("buildPullRequestReviewability (#2093)", () => { it("returns the empty-blocker fallback and review_now action with approval", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 1, "Patch integration helper", { linkedIssues: [42], authorLogin: "dev", @@ -227,7 +227,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the missing-linked-issue arm and picks needs_author action", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 20, "Small unlinked code fix", { linkedIssues: [], updatedAt: new Date().toISOString() }); const result = buildPullRequestReviewability({ repo: r, @@ -247,7 +247,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the non-open PR arm and picks close_or_redirect action", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const closed = pr(r.fullName, 21, "Closed broad PR", { state: "closed", linkedIssues: [], updatedAt: new Date().toISOString() }); const result = buildPullRequestReviewability({ repo: r, @@ -267,7 +267,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the maintainer_lane action when the PR author is the repo owner", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const ownerPr = pr(r.fullName, 30, "Owner follow-up", { authorLogin: "JSONbored", linkedIssues: [], updatedAt: new Date().toISOString() }); const result = buildPullRequestReviewability({ repo: r, @@ -286,7 +286,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the collision-cluster arm and picks likely_duplicate action", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const relatedIssue = issue(r.fullName, 5, "Fix cache invalidation"); const targetPr = pr(r.fullName, 40, "Fix cache invalidation", { linkedIssues: [5], authorLogin: "dev", updatedAt: new Date().toISOString() }); const recentMerged: RecentMergedPullRequestRecord[] = [ @@ -310,7 +310,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the code-without-test arm when only non-test files changed", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 50, "Refactor cache", { linkedIssues: [9], authorLogin: "dev", updatedAt: new Date().toISOString() }); const result = buildPullRequestReviewability({ repo: r, @@ -328,7 +328,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the failing-checks arm", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 60, "WIP", { linkedIssues: [], authorLogin: "dev", updatedAt: new Date().toISOString() }); const result = buildPullRequestReviewability({ repo: r, @@ -346,7 +346,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the broad-diff arm at fileCount >= 12 and at additions+deletions >= 800", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 70, "Wide refactor", { linkedIssues: [], authorLogin: "dev", updatedAt: new Date().toISOString() }); const eleven = makeFiles(11); const twelve = makeFiles(12); @@ -411,7 +411,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("reports the high closed-PR-rate arm and falls to watch action", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 80, "Another try", { linkedIssues: [], authorLogin: "dev", updatedAt: new Date().toISOString() }); const outcomeHistory = closedRateHistory("dev", r, 4, 1); const result = buildPullRequestReviewability({ @@ -432,7 +432,7 @@ describe("buildPullRequestReviewability (#2093)", () => { }); it("exposes generatedAt and summary shape without leaking private score internals to public fields", () => { - const r = repo("JSONbored/gittensory"); + const r = repo("JSONbored/loopover"); const p = pr(r.fullName, 90, "Shape check", { linkedIssues: [], authorLogin: "dev", updatedAt: new Date().toISOString() }); const result = buildPullRequestReviewability({ repo: r, diff --git a/test/unit/routes-contributor-issue-draft.test.ts b/test/unit/routes-contributor-issue-draft.test.ts index af3b0aef1c..8402aa251c 100644 --- a/test/unit/routes-contributor-issue-draft.test.ts +++ b/test/unit/routes-contributor-issue-draft.test.ts @@ -5,7 +5,7 @@ import { upsertInstallation, upsertPullRequestFromGitHub, upsertRepositoryFromGi import { getRepositoryCollaboratorPermission } from "../../src/github/app"; import { createTestEnv } from "../helpers/d1"; -const DRAFTS_PATH = "/v1/repos/JSONbored/gittensory/contributor-issue-drafts/generate"; +const DRAFTS_PATH = "/v1/repos/JSONbored/loopover/contributor-issue-drafts/generate"; const OWNED_REPO_PATH = "/v1/repos/repo-owner/owned-repo/contributor-issue-drafts/generate"; vi.mock("../../src/github/app", async (importOriginal) => ({ @@ -185,7 +185,7 @@ describe("contributor-issue-drafts route auth", () => { it("returns dry-run drafts for authorized static-token callers", async () => { const app = createApp(); - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); const response = await app.request( DRAFTS_PATH, { method: "POST", headers: apiHeaders(env), body: JSON.stringify({ dryRun: true, limit: 2 }) }, @@ -193,7 +193,7 @@ describe("contributor-issue-drafts route auth", () => { ); expect(response.status).toBe(200); await expect(response.json()).resolves.toMatchObject({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", dryRun: true, createRequested: false, drafts: expect.any(Array), diff --git a/test/unit/routes-focus-manifest.test.ts b/test/unit/routes-focus-manifest.test.ts index 50a38017c0..2f3015dfd2 100644 --- a/test/unit/routes-focus-manifest.test.ts +++ b/test/unit/routes-focus-manifest.test.ts @@ -12,7 +12,7 @@ vi.mock("../../src/github/app", async (importOriginal) => ({ const mockedPermission = vi.mocked(getRepositoryCollaboratorPermission); -const FOCUS_MANIFEST_PATH = "/v1/repos/JSONbored/gittensory/focus-manifest"; +const FOCUS_MANIFEST_PATH = "/v1/repos/JSONbored/loopover/focus-manifest"; const OWNED_REPO_PATH = "/v1/repos/repo-owner/owned-repo/focus-manifest"; function apiHeaders(env: Env): Record { @@ -209,11 +209,11 @@ describe("focus-manifest route auth", () => { it("returns bundled manifest and policy for authorized static-token callers", async () => { const app = createApp(); - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); const response = await app.request(FOCUS_MANIFEST_PATH, { headers: apiHeaders(env) }, env); expect(response.status).toBe(200); await expect(response.json()).resolves.toMatchObject({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", manifest: { present: true, wantedPaths: expect.arrayContaining(["apps/loopover-ui/"]), @@ -234,7 +234,7 @@ describe("focus-manifest route auth", () => { it("does not refresh cached manifests from GET query parameters", async () => { const app = createApp(); - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); const headers = apiHeaders(env); const putResponse = await app.request( FOCUS_MANIFEST_PATH, @@ -252,7 +252,7 @@ describe("focus-manifest route auth", () => { it("refreshes cached manifests from an unsafe POST endpoint", async () => { const app = createApp(); - const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/gittensory" }); + const env = createTestEnv({ LOOPOVER_DRIFT_ISSUE_REPO: "JSONbored/loopover" }); const headers = apiHeaders(env); const putResponse = await app.request( FOCUS_MANIFEST_PATH, @@ -311,7 +311,7 @@ describe("focus-manifest route auth", () => { ); expect(response.status).toBe(200); await expect(response.json()).resolves.toMatchObject({ - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", manifest: { present: true, source: "api_record", diff --git a/test/unit/rules.test.ts b/test/unit/rules.test.ts index ea637d1762..75a6cc0d90 100644 --- a/test/unit/rules.test.ts +++ b/test/unit/rules.test.ts @@ -19,14 +19,14 @@ import type { CollisionReport } from "../../src/signals/engine"; import type { IssueRecord, PullRequestRecord, PullRequestFileRecord, RepositoryRecord } from "../../src/types"; const repo: RepositoryRecord = { - fullName: "JSONbored/gittensory", + fullName: "JSONbored/loopover", owner: "JSONbored", - name: "gittensory", + name: "loopover", isInstalled: true, isRegistered: true, isPrivate: true, registryConfig: { - repo: "JSONbored/gittensory", + repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: { feature: 1.5 }, @@ -1598,7 +1598,7 @@ describe("green-CI compatibility reconciliation of the public comment gate", () function emptyCollisions(): CollisionReport { return { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", generatedAt: "2026-06-10T00:00:00.000Z", summary: { clusterCount: 0, highRiskCount: 0, itemsReviewed: 0 }, clusters: [], diff --git a/test/unit/safe-url-engine.test.ts b/test/unit/safe-url-engine.test.ts index b50f370c1f..e58ee37c33 100644 --- a/test/unit/safe-url-engine.test.ts +++ b/test/unit/safe-url-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { isSafeEndpointUrl, isSafeHttpUrl } from "../../packages/loopover-engine/src/review/safe-url"; diff --git a/test/unit/safety-wiring.test.ts b/test/unit/safety-wiring.test.ts index 6caa568c3c..e657e35e55 100644 --- a/test/unit/safety-wiring.test.ts +++ b/test/unit/safety-wiring.test.ts @@ -494,7 +494,7 @@ describe("gate treats secret_leak as a hard blocker", () => { }); }); -// #5346: gittensory PR #5346 was auto-closed on a "possible leaked secret" that was really two inert +// #5346: loopover PR #5346 was auto-closed on a "possible leaked secret" that was really two inert // test-fixture strings matching the generic_secret_assignment SHAPE heuristic. This heuristic (unlike every // concrete-format kind above) is no longer an unconditional hard blocker — it surfaces as an advisory finding // that a human/AI reviewer can verify, matching how REES's own copy of this rule already rates it diff --git a/test/unit/safety.test.ts b/test/unit/safety.test.ts index 12259564a0..1f99819c87 100644 --- a/test/unit/safety.test.ts +++ b/test/unit/safety.test.ts @@ -59,15 +59,15 @@ function safetyMinerSnapshot(login: string) { async function seedGateEnabledRepo(env: Env): Promise { await persistRegistrySnapshot( env, - normalizeRegistryPayload({ "JSONbored/gittensory": { emission_share: 0.01, issue_discovery_share: 0 } }, { kind: "raw-github", url: "https://example.test" }, "2026-05-23T00:00:00.000Z"), + normalizeRegistryPayload({ "JSONbored/loopover": { emission_share: 0.01, issue_discovery_share: 0 } }, { kind: "raw-github", url: "https://example.test" }, "2026-05-23T00:00:00.000Z"), ); - await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }, 123); + await upsertRepositoryFromGitHub(env, { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }, 123); await upsertRepositorySettings(env, { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", autoLabelEnabled: false, slopGateMode: "advisory", // turns the shared gateFiles load on so the reuse branch is hit }); - await upsertRepoFocusManifest(env, "JSONbored/gittensory", { settings: { commentMode: "off", publicSurface: "off", checkRunMode: "off", reviewCheckMode: "required" } }); + await upsertRepoFocusManifest(env, "JSONbored/loopover", { settings: { commentMode: "off", publicSurface: "off", checkRunMode: "off", reviewCheckMode: "required" } }); await upsertOfficialMinerDetection(env, "contributor", { status: "confirmed", snapshot: safetyMinerSnapshot("contributor") }, 60_000); } @@ -76,7 +76,7 @@ async function seedLeakedSecretFile(env: Env): Promise { await env.DB.prepare( "INSERT INTO pull_request_files (repo_full_name, pull_number, path, status, additions, deletions, changes, payload_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", ) - .bind("JSONbored/gittensory", 42, "src/config.ts", "modified", 1, 0, 1, JSON.stringify({ patch: `@@\n+const token = "${LEAKED_TOKEN}";` })) + .bind("JSONbored/loopover", 42, "src/config.ts", "modified", 1, 0, 1, JSON.stringify({ patch: `@@\n+const token = "${LEAKED_TOKEN}";` })) .run(); } @@ -107,7 +107,7 @@ function prWebhook(deliveryId: string) { payload: { action: "opened", installation: { id: 123, account: { login: "JSONbored", id: 1, type: "User" } }, - repository: { name: "gittensory", full_name: "JSONbored/gittensory", private: false, owner: { login: "JSONbored" } }, + repository: { name: "loopover", full_name: "JSONbored/loopover", private: false, owner: { login: "JSONbored" } }, pull_request: { number: 42, title: "Add config", state: "open", user: { login: "contributor" }, head: { sha: "gate123" }, labels: [], body: "Adds a token." }, }, }; diff --git a/test/unit/schema-timestamp-defaults.test.ts b/test/unit/schema-timestamp-defaults.test.ts index d52e94deb5..16f4c44ba4 100644 --- a/test/unit/schema-timestamp-defaults.test.ts +++ b/test/unit/schema-timestamp-defaults.test.ts @@ -31,7 +31,7 @@ describe("timestamp column defaults", () => { it("keeps orb relay pending coalesce keys wired through the drizzle schema", async () => { const env = createTestEnv(); const db = getDb(env.DB); - const coalesceKey = `github-webhook:ci-completed:jsonbored/gittensory@${"a".repeat(40)}#1838`; + const coalesceKey = `github-webhook:ci-completed:jsonbored/loopover@${"a".repeat(40)}#1838`; await db.insert(orbRelayPending).values({ deliveryId: "relay-schema-1", installationId: 1838, diff --git a/test/unit/scoring-engine-barrel.test.ts b/test/unit/scoring-engine-barrel.test.ts index d49847d017..c7d81fc831 100644 --- a/test/unit/scoring-engine-barrel.test.ts +++ b/test/unit/scoring-engine-barrel.test.ts @@ -4,7 +4,7 @@ import { DEFAULT_SCORING_CONSTANTS, parsePythonNumberConstants } from "../../pac import { buildScorePreview } from "../../packages/loopover-engine/src/scoring/preview"; import { classifyOpenPullRequest } from "../../packages/loopover-engine/src/scoring/pending-pr-scenarios"; -describe("gittensory-engine scoring barrel exports (#2282)", () => { +describe("loopover-engine scoring barrel exports (#2282)", () => { it("re-exports scoring namespaces from the package barrel", async () => { const barrel = await import("../../packages/loopover-engine/src/index"); expect(typeof barrel.scoringPreview.buildScorePreview).toBe("function"); diff --git a/test/unit/scoring.test.ts b/test/unit/scoring.test.ts index 460a7f007b..9dd4c2be03 100644 --- a/test/unit/scoring.test.ts +++ b/test/unit/scoring.test.ts @@ -352,7 +352,7 @@ NOVELTY_BONUS_SCALAR = 3 expect(refreshed.warnings.join(" ")).toMatch(/recognized active-model indicator/i); }); - it("flags upstream scoring constants gittensory does not model (staleness visibility)", () => { + it("flags upstream scoring constants loopover does not model (staleness visibility)", () => { // SRC_TOK_SATURATION_SCALE and the TIME_DECAY_* constants are now modeled (#703); a hypothetical new // upstream dimension is NOT — so only that surfaces as unmodeled drift. const unmodeled = findUnmodeledUpstreamConstants( diff --git a/test/unit/screenshot-table-gate-engine.test.ts b/test/unit/screenshot-table-gate-engine.test.ts index a5f4086d41..87c0ae5d8b 100644 --- a/test/unit/screenshot-table-gate-engine.test.ts +++ b/test/unit/screenshot-table-gate-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { buildScreenshotMatrixMessage, diff --git a/test/unit/secret-patterns.test.ts b/test/unit/secret-patterns.test.ts index 73c253a139..17cbbb3e01 100644 --- a/test/unit/secret-patterns.test.ts +++ b/test/unit/secret-patterns.test.ts @@ -35,7 +35,7 @@ describe("secret-patterns — shared secret-detection primitives (#4608)", () => expect(HARD_SECRET_KINDS.has("seed_or_mnemonic")).toBe(false); expect(HARD_SECRET_KINDS.has("bittensor_key")).toBe(false); // generic_secret_assignment is a keyword-plus-quoted-value SHAPE heuristic, not a concrete credential - // format -- gittensory PR #5346 auto-closed a legitimate contributor PR over two inert test-fixture + // format -- loopover PR #5346 auto-closed a legitimate contributor PR over two inert test-fixture // strings that matched this shape but weren't real secrets. Split out into ADVISORY_ONLY_SECRET_KINDS // below (regression guard for that incident). expect(HARD_SECRET_KINDS.has("generic_secret_assignment")).toBe(false); @@ -166,7 +166,7 @@ describe("secret-patterns — shared secret-detection primitives (#4608)", () => expect(isPlaceholderSecretValue("aK9xQ2mZw7Ln4Rv8Pt3Bh6")).toBe(false); }); - it("flags the two real false-positive fixture values from gittensory PR #5346/#5341 (regression)", () => { + it("flags the two real false-positive fixture values from loopover PR #5346/#5341 (regression)", () => { // Neither contains a PLACEHOLDER_VALUE_PATTERN keyword (no "fake"/"dummy"/"sample"/etc.), so before // looksLikeDescriptivePlaceholderPhrase these both slipped through as "looks like a secret" and // hard-closed a legitimate contributor PR twice in a row. @@ -176,7 +176,7 @@ describe("secret-patterns — shared secret-detection primitives (#4608)", () => }); describe("looksLikeDescriptivePlaceholderPhrase", () => { - it("flags the two real false-positive fixture values from gittensory PR #5346/#5341 (regression)", () => { + it("flags the two real false-positive fixture values from loopover PR #5346/#5341 (regression)", () => { expect(looksLikeDescriptivePlaceholderPhrase("present-value-not-a-real-token")).toBe(true); expect(looksLikeDescriptivePlaceholderPhrase("test-value-should-never-appear-in-doctor-output")).toBe(true); }); @@ -225,7 +225,7 @@ describe("secret-patterns — shared secret-detection primitives (#4608)", () => expect(hasGenericSecretAssignment('benign prose first.\nsecret = "aK9xQ2mZw7Ln4Rv8Pt3Bh6"')).toBe(true); }); - it("returns false for the two real false-positive assignments from gittensory PR #5346/#5341 (regression)", () => { + it("returns false for the two real false-positive assignments from loopover PR #5346/#5341 (regression)", () => { expect(hasGenericSecretAssignment('GITHUB_TOKEN: "present-value-not-a-real-token"')).toBe(false); expect( hasGenericSecretAssignment('const secretToken = "test-value-should-never-appear-in-doctor-output";'), diff --git a/test/unit/secrets-scan.test.ts b/test/unit/secrets-scan.test.ts index 6c47a237ee..d86eeac199 100644 --- a/test/unit/secrets-scan.test.ts +++ b/test/unit/secrets-scan.test.ts @@ -30,7 +30,7 @@ describe("scanForSecrets — deterministic secret-pattern scanner", () => { }); // #4284: AWS's own officially published documentation placeholder caused 4 false-positive PR closes in - // gittensory's own subprocess-env-redaction-helper epic before this exclusion existed. Assembled from + // loopover's own subprocess-env-redaction-helper epic before this exclusion existed. Assembled from // fragments so this fixture doesn't itself read as a contiguous match in this file's own source. it("does NOT flag AWS's own officially published documentation example key", () => { expect(scanForSecrets("AKIA" + "IOSFODNN7EXAMPLE").kinds).not.toContain("aws_access_key"); @@ -247,7 +247,7 @@ describe("scanForSecrets — deterministic secret-pattern scanner", () => { expect(scanForSecrets(`token = "${singleWord}"`).kinds).toContain("generic_secret_assignment"); }); - // #4579-followup: confirmed live false positives (metagraphed/gittensory#4524, #4224) closed PRs for + // #4579-followup: confirmed live false positives (metagraphed/loopover#4524, #4224) closed PRs for // "missing before/after screenshot table"-unrelated reasons -- a leaked secret that never existed. These // exact session-token literals are known test fixtures. it.each([ diff --git a/test/unit/self-dogfood-registration-pack.test.ts b/test/unit/self-dogfood-registration-pack.test.ts index 7e31f9129a..c1fed6e0a7 100644 --- a/test/unit/self-dogfood-registration-pack.test.ts +++ b/test/unit/self-dogfood-registration-pack.test.ts @@ -330,7 +330,7 @@ describe("buildSelfDogfoodRegistrationPack", () => { }); it("public wording regression stays free of forbidden language", () => { - const repo = repoFor("JSONbored/gittensory", configFor({ repo: "JSONbored/gittensory" })); + const repo = repoFor("JSONbored/loopover", configFor({ repo: "JSONbored/loopover" })); const pack = packFromRepo(repo); expect(JSON.stringify(pack)).not.toMatch(FORBIDDEN_PUBLIC_LANGUAGE); }); diff --git a/test/unit/selfhost-audit.test.ts b/test/unit/selfhost-audit.test.ts index 24bf3bc383..2a13e2e374 100644 --- a/test/unit/selfhost-audit.test.ts +++ b/test/unit/selfhost-audit.test.ts @@ -81,15 +81,15 @@ describe("extractPayloadType", () => { describe("extractPayloadContext", () => { it("returns top-level repo and PR fields from internal PR jobs", () => { - expect(extractPayloadContext(JSON.stringify({ type: "agent-regate-pr", repoFullName: "JSONbored/gittensory", prNumber: 2087 }))).toEqual({ - repo: "JSONbored/gittensory", + expect(extractPayloadContext(JSON.stringify({ type: "agent-regate-pr", repoFullName: "JSONbored/loopover", prNumber: 2087 }))).toEqual({ + repo: "JSONbored/loopover", pr_number: 2087, }); }); it("returns repo-only context for repo-scoped background jobs", () => { - expect(extractPayloadContext(JSON.stringify({ type: "rag-index-repo", repoFullName: "JSONbored/gittensory" }))).toEqual({ - repo: "JSONbored/gittensory", + expect(extractPayloadContext(JSON.stringify({ type: "rag-index-repo", repoFullName: "JSONbored/loopover" }))).toEqual({ + repo: "JSONbored/loopover", }); }); @@ -104,11 +104,11 @@ describe("extractPayloadContext", () => { extractPayloadContext(JSON.stringify({ type: "github-webhook", payload: { - repository: { full_name: "JSONbored/gittensory" }, + repository: { full_name: "JSONbored/loopover" }, pull_request: { number: 2087 }, }, })), - ).toEqual({ repo: "JSONbored/gittensory", pr_number: 2087 }); + ).toEqual({ repo: "JSONbored/loopover", pr_number: 2087 }); }); it("falls back from wrong top-level fields to nested webhook context", () => { @@ -118,11 +118,11 @@ describe("extractPayloadContext", () => { repoFullName: 123, prNumber: "2087", payload: { - repository: { full_name: "JSONbored/gittensory" }, + repository: { full_name: "JSONbored/loopover" }, pull_request: { number: 2087 }, }, })), - ).toEqual({ repo: "JSONbored/gittensory", pr_number: 2087 }); + ).toEqual({ repo: "JSONbored/loopover", pr_number: 2087 }); }); it("extracts PR numbers from PR issue-comment payloads without treating regular issues as PRs", () => { @@ -130,20 +130,20 @@ describe("extractPayloadContext", () => { extractPayloadContext(JSON.stringify({ type: "github-webhook", payload: { - repository: { full_name: "JSONbored/gittensory" }, + repository: { full_name: "JSONbored/loopover" }, issue: { number: 2087, pull_request: {} }, }, })), - ).toEqual({ repo: "JSONbored/gittensory", pr_number: 2087 }); + ).toEqual({ repo: "JSONbored/loopover", pr_number: 2087 }); expect( extractPayloadContext(JSON.stringify({ type: "github-webhook", payload: { - repository: { full_name: "JSONbored/gittensory" }, + repository: { full_name: "JSONbored/loopover" }, issue: { number: 2087 }, }, })), - ).toEqual({ repo: "JSONbored/gittensory" }); + ).toEqual({ repo: "JSONbored/loopover" }); }); it("extracts PR numbers from check-run and check-suite pull request arrays", () => { @@ -151,20 +151,20 @@ describe("extractPayloadContext", () => { extractPayloadContext(JSON.stringify({ type: "github-webhook", payload: { - repository: { full_name: "JSONbored/gittensory" }, + repository: { full_name: "JSONbored/loopover" }, check_run: { pull_requests: [null, { number: "bad" }, { number: 2087 }] }, }, })), - ).toEqual({ repo: "JSONbored/gittensory", pr_number: 2087 }); + ).toEqual({ repo: "JSONbored/loopover", pr_number: 2087 }); expect( extractPayloadContext(JSON.stringify({ type: "github-webhook", payload: { - repository: { full_name: "JSONbored/gittensory" }, + repository: { full_name: "JSONbored/loopover" }, check_suite: { pull_requests: [{ number: 2088 }] }, }, })), - ).toEqual({ repo: "JSONbored/gittensory", pr_number: 2088 }); + ).toEqual({ repo: "JSONbored/loopover", pr_number: 2088 }); }); it("returns undefined for missing, malformed, and non-object payloads", () => { diff --git a/test/unit/selfhost-backup-metrics-script.test.ts b/test/unit/selfhost-backup-metrics-script.test.ts index e1c5964535..2c22175489 100644 --- a/test/unit/selfhost-backup-metrics-script.test.ts +++ b/test/unit/selfhost-backup-metrics-script.test.ts @@ -7,7 +7,7 @@ import { afterEach, describe, expect, it } from "vitest"; const tmpRoots: string[] = []; function tmpRoot(): string { - const dir = mkdtempSync(join(tmpdir(), "gittensory-backup-metrics-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-backup-metrics-")); tmpRoots.push(dir); return dir; } @@ -43,9 +43,9 @@ afterEach(() => { describe("backup-metrics.sh", () => { it("exports newest retained backup timestamps and file counts by target", () => { const root = tmpRoot(); - writeBackup(root, "postgres", "gittensory-older.dump", "2026-07-01T01:00:00Z"); - const newestPostgres = writeBackup(root, "postgres", "gittensory-newer.dump", "2026-07-01T02:00:00Z"); - const sqlite = writeBackup(root, "sqlite", "gittensory.sqlite.gz", "2026-07-01T03:00:00Z"); + writeBackup(root, "postgres", "loopover-older.dump", "2026-07-01T01:00:00Z"); + const newestPostgres = writeBackup(root, "postgres", "loopover-newer.dump", "2026-07-01T02:00:00Z"); + const sqlite = writeBackup(root, "sqlite", "loopover.sqlite.gz", "2026-07-01T03:00:00Z"); const qdrant = writeBackup(root, "qdrant", "snapshot", "2026-07-01T04:00:00Z"); const metrics = runExporterOnce(root); diff --git a/test/unit/selfhost-backup-script.test.ts b/test/unit/selfhost-backup-script.test.ts index f0a624b09e..81863296e4 100644 --- a/test/unit/selfhost-backup-script.test.ts +++ b/test/unit/selfhost-backup-script.test.ts @@ -7,7 +7,7 @@ import { afterEach, describe, expect, it } from "vitest"; const tmpRoots: string[] = []; function tmpRoot(): string { - const dir = mkdtempSync(join(tmpdir(), "gittensory-backup-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-backup-")); tmpRoots.push(dir); return dir; } @@ -110,7 +110,7 @@ describe("self-host backup script", () => { writeFileSync(staleSqlite, "stale sqlite"); const output = runBackup(root, { - DATABASE_URL: "postgres://gittensory:pw@postgres:5432/gittensory", + DATABASE_URL: "postgres://loopover:pw@postgres:5432/loopover", PG_DUMP_ARGS_FILE: join(root, "pg-dump.args"), PG_DUMP_ENV_FILE: join(root, "pg-dump.env"), DATABASE_PATH: staleSqlite, @@ -131,7 +131,7 @@ describe("self-host backup script", () => { const envFile = join(root, "pg-dump.env"); runBackup(root, { - DATABASE_URL: "postgresql://app_user:SuperSecret123%21@db.example:6543/gittensory", + DATABASE_URL: "postgresql://app_user:SuperSecret123%21@db.example:6543/loopover", PATH: `${pgBin}:${process.env.PATH ?? ""}`, PG_DUMP_ARGS_FILE: argsFile, PG_DUMP_ENV_FILE: envFile, @@ -146,7 +146,7 @@ describe("self-host backup script", () => { expect(args).not.toContain("app_user:"); // Host/port/dbname/user are pg_dump's connection info, not secrets -- libpq resolves them from this // sanitized (password-free) URL exactly as it would have from the original. - expect(args).toContain("postgresql://app_user@db.example:6543/gittensory"); + expect(args).toContain("postgresql://app_user@db.example:6543/loopover"); // The password reaches pg_dump out-of-band via a 600-permission PGPASSFILE, url-decoded. Match on the // basename only, not a hardcoded /tmp/ prefix: mktemp resolves under $TMPDIR, which macOS sets to a // per-user private directory rather than /tmp (the CI runner's Linux environment does default to /tmp, @@ -164,13 +164,13 @@ describe("self-host backup script", () => { // No authority host at all -- the actual connection target is supplied entirely via the query string // (a valid, real-world libpq URI form for connecting over a Unix socket at a non-default path). runBackup(root, { - DATABASE_URL: "postgresql:///gittensory?host=/var/run/postgresql", + DATABASE_URL: "postgresql:///loopover?host=/var/run/postgresql", PATH: `${pgBin}:${process.env.PATH ?? ""}`, PG_DUMP_ARGS_FILE: argsFile, }); const args = execFileSync("cat", [argsFile], { encoding: "utf8" }); - expect(args).toContain("postgresql:///gittensory?host=/var/run/postgresql"); + expect(args).toContain("postgresql:///loopover?host=/var/run/postgresql"); }); it("strips a password supplied via the libpq query-string form, not just userinfo", () => { @@ -183,7 +183,7 @@ describe("self-host backup script", () => { // password -- entirely independent of the userinfo form this function already strips. Includes other // query parameters on both sides of `password` to prove they survive, in order, untouched. runBackup(root, { - DATABASE_URL: "postgresql://app_user@db.example:6543/gittensory?sslmode=require&password=SuperSecret123%21&application_name=app", + DATABASE_URL: "postgresql://app_user@db.example:6543/loopover?sslmode=require&password=SuperSecret123%21&application_name=app", PATH: `${pgBin}:${process.env.PATH ?? ""}`, PG_DUMP_ARGS_FILE: argsFile, PG_DUMP_ENV_FILE: envFile, @@ -193,7 +193,7 @@ describe("self-host backup script", () => { const [, passfileContent] = execFileSync("cat", [envFile], { encoding: "utf8" }).trim().split("|"); expect(args).not.toContain("SuperSecret123"); expect(args).not.toContain("password="); - expect(args).toContain("postgresql://app_user@db.example:6543/gittensory?sslmode=require&application_name=app"); + expect(args).toContain("postgresql://app_user@db.example:6543/loopover?sslmode=require&application_name=app"); expect(passfileContent).toBe("*:*:*:*:SuperSecret123!"); }); @@ -267,9 +267,9 @@ describe("self-host backup script", () => { // No userinfo here at all -- the '@' and ':' both belong to a query parameter VALUE. Userinfo can // only appear in the authority (before the first '/', '?', or '#'); scanning the whole remaining - // string for the first '@' would wrongly treat "gittensory?application_name=a:b" as userinfo and + // string for the first '@' would wrongly treat "loopover?application_name=a:b" as userinfo and // strip ":b" out as a fake password, corrupting the URL passed to pg_dump. - const url = "postgresql://db.example/gittensory?application_name=a:b@worker"; + const url = "postgresql://db.example/loopover?application_name=a:b@worker"; runBackup(root, { DATABASE_URL: url, PATH: `${pgBin}:${process.env.PATH ?? ""}`, @@ -339,7 +339,7 @@ describe("self-host backup script", () => { it("keeps the SQLite online backup path when no Postgres URL is configured", () => { const root = tmpRoot(); const sqliteBin = fakeSqlite(root); - const appDb = join(root, "gittensory.sqlite"); + const appDb = join(root, "loopover.sqlite"); writeFileSync(appDb, "sqlite db"); const output = runBackup(root, { diff --git a/test/unit/selfhost-blob-store.test.ts b/test/unit/selfhost-blob-store.test.ts index e2833f646d..db91b42311 100644 --- a/test/unit/selfhost-blob-store.test.ts +++ b/test/unit/selfhost-blob-store.test.ts @@ -12,26 +12,26 @@ describe("createFsBlobStore (#10 — self-host visual screenshot persistence)", it("round-trips a PNG: put then get streams the same bytes back (parent dirs created)", async () => { const store = createFsBlobStore(dir); const png = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 1, 2, 3]); - await store.put("gittensory/shots/abc.png", png); - const obj = await store.get("gittensory/shots/abc.png"); + await store.put("loopover/shots/abc.png", png); + const obj = await store.get("loopover/shots/abc.png"); expect(obj).not.toBeNull(); expect(Array.from(new Uint8Array(await new Response(obj!.body).arrayBuffer()))).toEqual(Array.from(png)); }); it("returns null on a miss", async () => { - expect(await createFsBlobStore(dir).get("gittensory/shots/missing.png")).toBeNull(); + expect(await createFsBlobStore(dir).get("loopover/shots/missing.png")).toBeNull(); }); it("accepts a string value too (any R2 put body type)", async () => { const store = createFsBlobStore(dir); - await store.put("gittensory/shots/s.png", "hello"); - expect(await new Response((await store.get("gittensory/shots/s.png"))!.body).text()).toBe("hello"); + await store.put("loopover/shots/s.png", "hello"); + expect(await new Response((await store.get("loopover/shots/s.png"))!.body).text()).toBe("hello"); }); it("accepts a null value (stores an empty object), satisfying the R2 put body type", async () => { const store = createFsBlobStore(dir); - await store.put("gittensory/shots/empty.png", null); - expect((await new Response((await store.get("gittensory/shots/empty.png"))!.body).arrayBuffer()).byteLength).toBe(0); + await store.put("loopover/shots/empty.png", null); + expect((await new Response((await store.get("loopover/shots/empty.png"))!.body).arrayBuffer()).byteLength).toBe(0); }); it("rejects a key that escapes the base dir — put throws, get is a safe miss (no traversal)", async () => { @@ -49,7 +49,7 @@ describe("createFsBlobStore (#10 — self-host visual screenshot persistence)", const store = createFsBlobStore(dir); const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); try { - expect(await store.get("gittensory/shots/missing.png")).toBeNull(); + expect(await store.get("loopover/shots/missing.png")).toBeNull(); expect(warn).not.toHaveBeenCalled(); expect(await store.get("../../etc/passwd")).toBeNull(); @@ -68,13 +68,13 @@ describe("createFsBlobStore (#10 — self-host visual screenshot persistence)", it("delete removes a stored object — a subsequent get is a miss", async () => { const store = createFsBlobStore(dir); - await store.put("gittensory/shots/gone.png", new Uint8Array([1, 2, 3])); - expect(await store.get("gittensory/shots/gone.png")).not.toBeNull(); - await store.delete("gittensory/shots/gone.png"); - expect(await store.get("gittensory/shots/gone.png")).toBeNull(); + await store.put("loopover/shots/gone.png", new Uint8Array([1, 2, 3])); + expect(await store.get("loopover/shots/gone.png")).not.toBeNull(); + await store.delete("loopover/shots/gone.png"); + expect(await store.get("loopover/shots/gone.png")).toBeNull(); }); it("delete on a key that was never written does not throw (idempotent, matches R2)", async () => { - await expect(createFsBlobStore(dir).delete("gittensory/shots/never-existed.png")).resolves.toBeUndefined(); + await expect(createFsBlobStore(dir).delete("loopover/shots/never-existed.png")).resolves.toBeUndefined(); }); }); diff --git a/test/unit/selfhost-deploy-common.test.ts b/test/unit/selfhost-deploy-common.test.ts index ef2b800742..eb3813ece0 100644 --- a/test/unit/selfhost-deploy-common.test.ts +++ b/test/unit/selfhost-deploy-common.test.ts @@ -15,7 +15,7 @@ function readOptional(path: string): string { } function createHarness() { - const dir = mkdtempSync(join(tmpdir(), "gittensory-selfhost-deploy-common-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-selfhost-deploy-common-")); const binDir = join(dir, "bin"); const infisicalLog = join(dir, "infisical-calls.log"); mkdirSync(binDir); diff --git a/test/unit/selfhost-docker-prune-script.test.ts b/test/unit/selfhost-docker-prune-script.test.ts index 07b2faa6df..d009ab6c7e 100644 --- a/test/unit/selfhost-docker-prune-script.test.ts +++ b/test/unit/selfhost-docker-prune-script.test.ts @@ -7,7 +7,7 @@ import { afterEach, describe, expect, it } from "vitest"; const tmpRoots: string[] = []; function tmpRoot(): string { - const dir = mkdtempSync(join(tmpdir(), "gittensory-docker-prune-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-docker-prune-")); tmpRoots.push(dir); return dir; } diff --git a/test/unit/selfhost-grafana-datasource-uids.test.ts b/test/unit/selfhost-grafana-datasource-uids.test.ts index c34a4a96fa..17d3cdd3b2 100644 --- a/test/unit/selfhost-grafana-datasource-uids.test.ts +++ b/test/unit/selfhost-grafana-datasource-uids.test.ts @@ -9,7 +9,7 @@ import { describe, expect, it } from "vitest"; // one-time migration of that already-deployed instance's own DB row, Grafana's datasource-provisioning // module hard-fails on boot ("Datasource provisioning error: data source not found") -- crash-looping the // ENTIRE Grafana container, not just showing one broken panel. This actually happened live: `sqlite.yml`'s -// `LoopoverDB` datasource was renamed `gittensory-db` -> `loopover-db` as part of the loopover rebrand, but +// `LoopoverDB` datasource was renamed `loopover-db` -> `loopover-db` as part of the loopover rebrand, but // an already-running box's Grafana DB still had it registered under the old uid, and the very next // container recreate crashed it outright. Fixed with a one-time `UPDATE data_source SET uid = ...` on that // instance (not a code change, and not reproducible from a fresh install). This test pins the uids so a diff --git a/test/unit/selfhost-grafana-miner-usage-dashboard.test.ts b/test/unit/selfhost-grafana-miner-usage-dashboard.test.ts index 771033429a..e52057acf9 100644 --- a/test/unit/selfhost-grafana-miner-usage-dashboard.test.ts +++ b/test/unit/selfhost-grafana-miner-usage-dashboard.test.ts @@ -91,7 +91,7 @@ function substituteProvider(query: string, value: string): string { } function tmpRoot(): string { - const dir = mkdtempSync(join(tmpdir(), "gittensory-grafana-miner-usage-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-grafana-miner-usage-")); tmpRoots.push(dir); return dir; } diff --git a/test/unit/selfhost-image-deploy.test.ts b/test/unit/selfhost-image-deploy.test.ts index 60fb6a87aa..54c54e4852 100644 --- a/test/unit/selfhost-image-deploy.test.ts +++ b/test/unit/selfhost-image-deploy.test.ts @@ -17,7 +17,7 @@ const defaultImage = "ghcr.io/jsonbored/loopover-selfhost:latest"; // already-published tags/digests keep resolving forever -- an operator who pinned it explicitly (CLI // arg, env var, or .env value) must keep resolving to that exact string unmodified, even though // DEFAULT_IMAGE above now points at the new name. -const legacyPinnedImage = "ghcr.io/jsonbored/gittensory-selfhost:orb-v0.1.0"; +const legacyPinnedImage = "ghcr.io/jsonbored/loopover-selfhost:orb-v0.1.0"; interface RunOptions { args?: string[]; @@ -28,7 +28,7 @@ interface RunOptions { } function createHarness() { - const dir = mkdtempSync(join(tmpdir(), "gittensory-selfhost-image-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-selfhost-image-")); const binDir = join(dir, "bin"); const dockerCalls = join(dir, "docker-calls.log"); const dockerImages = join(dir, "docker-images.log"); @@ -147,21 +147,21 @@ describe("self-host image deploy script", () => { it.each([ { name: "CLI argument", - args: ["ghcr.io/jsonbored/gittensory-selfhost:cli"], - env: { LOOPOVER_IMAGE: "ghcr.io/jsonbored/gittensory-selfhost:env" }, - envFile: "LOOPOVER_IMAGE=ghcr.io/jsonbored/gittensory-selfhost:file\n", - expected: "ghcr.io/jsonbored/gittensory-selfhost:cli", + args: ["ghcr.io/jsonbored/loopover-selfhost:cli"], + env: { LOOPOVER_IMAGE: "ghcr.io/jsonbored/loopover-selfhost:env" }, + envFile: "LOOPOVER_IMAGE=ghcr.io/jsonbored/loopover-selfhost:file\n", + expected: "ghcr.io/jsonbored/loopover-selfhost:cli", }, { name: "environment variable", - env: { LOOPOVER_IMAGE: "ghcr.io/jsonbored/gittensory-selfhost:env" }, - envFile: "LOOPOVER_IMAGE=ghcr.io/jsonbored/gittensory-selfhost:file\n", - expected: "ghcr.io/jsonbored/gittensory-selfhost:env", + env: { LOOPOVER_IMAGE: "ghcr.io/jsonbored/loopover-selfhost:env" }, + envFile: "LOOPOVER_IMAGE=ghcr.io/jsonbored/loopover-selfhost:file\n", + expected: "ghcr.io/jsonbored/loopover-selfhost:env", }, { name: ".env value", - envFile: "LOOPOVER_IMAGE=ghcr.io/jsonbored/gittensory-selfhost:file\n", - expected: "ghcr.io/jsonbored/gittensory-selfhost:file", + envFile: "LOOPOVER_IMAGE=ghcr.io/jsonbored/loopover-selfhost:file\n", + expected: "ghcr.io/jsonbored/loopover-selfhost:file", }, { name: "default image", @@ -188,7 +188,7 @@ describe("self-host image deploy script", () => { }); // REGRESSION (#4777): DEFAULT_IMAGE moved to the new "loopover-selfhost" name, but a self-hoster who - // explicitly pinned the pre-rename "gittensory-selfhost" image (as a CLI argument, LOOPOVER_IMAGE env + // explicitly pinned the pre-rename "loopover-selfhost" image (as a CLI argument, LOOPOVER_IMAGE env // var, or .env value) must keep resolving to that exact string, unmodified -- GHCR keeps already-published // tags/digests resolving forever with no server-side alias needed, and this script must not rewrite an // operator's existing pin either way. @@ -204,7 +204,7 @@ describe("self-host image deploy script", () => { }); it("persists the image only after the service reports healthy", () => { - const image = "ghcr.io/jsonbored/gittensory-selfhost:ordered"; + const image = "ghcr.io/jsonbored/loopover-selfhost:ordered"; const { harness, result } = runHarness({ args: [image], envFile: "EXISTING=1\n" }); try { expect(result.status, result.stderr).toBe(0); @@ -218,7 +218,7 @@ describe("self-host image deploy script", () => { }); it("does not persist the image when health times out", () => { - const image = "ghcr.io/jsonbored/gittensory-selfhost:bad-health"; + const image = "ghcr.io/jsonbored/loopover-selfhost:bad-health"; const { harness, result } = runHarness({ args: [image], envFile: "EXISTING=1\n", @@ -237,9 +237,9 @@ describe("self-host image deploy script", () => { }); it.each([ - "registry.example/gittensory:${GITHUB_OAUTH_CLIENT_SECRET}", - "registry.example/gittensory:$GITHUB_OAUTH_CLIENT_SECRET", - "registry.example/gittensory:{GITHUB_OAUTH_CLIENT_SECRET}", + "registry.example/loopover:${GITHUB_OAUTH_CLIENT_SECRET}", + "registry.example/loopover:$GITHUB_OAUTH_CLIENT_SECRET", + "registry.example/loopover:{GITHUB_OAUTH_CLIENT_SECRET}", ])("rejects compose interpolation characters in image %s", (image) => { const { harness, result } = runHarness({ args: [image], envFile: "EXISTING=1\n" }); try { diff --git a/test/unit/selfhost-load-file-secrets.test.ts b/test/unit/selfhost-load-file-secrets.test.ts index 295bfbb3a7..91104b2de8 100644 --- a/test/unit/selfhost-load-file-secrets.test.ts +++ b/test/unit/selfhost-load-file-secrets.test.ts @@ -26,7 +26,7 @@ describe("loadFileSecrets (#4403)", () => { errorSpy.mockRestore(); }); - it("dereferences a real gittensory secret _FILE var into its target name", () => { + it("dereferences a real loopover secret _FILE var into its target name", () => { const readFile = vi.fn(() => "s3cr3t-value\n"); const env: Record = { SENTRY_DSN_FILE: "/run/secrets/sentry_dsn" }; loadFileSecrets(env, readFile); diff --git a/test/unit/selfhost-otel.test.ts b/test/unit/selfhost-otel.test.ts index 4e04e76b8a..e26515f5a6 100644 --- a/test/unit/selfhost-otel.test.ts +++ b/test/unit/selfhost-otel.test.ts @@ -92,9 +92,9 @@ describe("self-host OpenTelemetry", () => { env({ OTEL_TRACES_EXPORTER: "console,otlp", OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4318/", - OTEL_SERVICE_NAME: "gittensory-test", + OTEL_SERVICE_NAME: "loopover-test", SENTRY_ENVIRONMENT: "selfhost-test", - LOOPOVER_VERSION: "gittensory-selfhost@test", + LOOPOVER_VERSION: "loopover-selfhost@test", }), ), ).toBe(true); @@ -134,8 +134,8 @@ describe("self-host OpenTelemetry", () => { expect(span.attributes.badNumber).toBeUndefined(); expect(span.attributes.longText).toHaveLength(160); expect(span.resource.attributes).toMatchObject({ - "service.name": "gittensory-test", - "service.version": "gittensory-selfhost@test", + "service.name": "loopover-test", + "service.version": "loopover-selfhost@test", "deployment.environment.name": "selfhost-test", }); expect(otelMocks.OTLPTraceExporter).toHaveBeenCalledTimes(1); @@ -594,7 +594,7 @@ describe("self-host OpenTelemetry", () => { "selfhost.review.gate", { installationId: 143010787, - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", pullNumber: 1001, operation: "gate_decision", agent: "dual-ai", @@ -607,7 +607,7 @@ describe("self-host OpenTelemetry", () => { const span = otelMocks.exportedSpans.find((entry) => entry.name === "selfhost.review.gate"); expect(span.attributes).toMatchObject({ - "github.repository": "JSONbored/gittensory", + "github.repository": "JSONbored/loopover", "github.pull_request.number": 1001, "github.installation_id_hash": "68b9c2136087c5ca", "loopover.operation": "gate_decision", @@ -631,7 +631,7 @@ describe("self-host OpenTelemetry", () => { it("keeps only primitive, finite, non-secret attributes", () => { expect( otelSafeAttributes({ - repo: "JSONbored/gittensory", + repo: "JSONbored/loopover", count: 1, ok: false, authHeader: "Bearer nope", @@ -640,6 +640,6 @@ describe("self-host OpenTelemetry", () => { nan: Number.NaN, obj: { x: 1 }, }), - ).toEqual({ repo: "JSONbored/gittensory", count: 1, ok: false }); + ).toEqual({ repo: "JSONbored/loopover", count: 1, ok: false }); }); }); diff --git a/test/unit/selfhost-post-update-check-script.test.ts b/test/unit/selfhost-post-update-check-script.test.ts index 656d594829..f5055b4208 100644 --- a/test/unit/selfhost-post-update-check-script.test.ts +++ b/test/unit/selfhost-post-update-check-script.test.ts @@ -19,7 +19,7 @@ function writeExecutable(path: string, contents: string) { } function createSandbox() { - const base = mkdtempSync(join(tmpdir(), "gittensory-selfhost-post-update-")); + const base = mkdtempSync(join(tmpdir(), "loopover-selfhost-post-update-")); sandboxDirs.push(base); const bin = join(base, "bin"); mkdirSync(bin, { recursive: true }); @@ -40,7 +40,7 @@ if [ "$1" = "inspect" ] && [ "$2" = "--format" ]; then if [[ "$3" == *'.State.Health'* ]]; then printf 'healthy\\n' else - printf 'ghcr.io/jsonbored/gittensory-selfhost:test\\n' + printf 'ghcr.io/jsonbored/loopover-selfhost:test\\n' fi exit 0 fi @@ -80,7 +80,7 @@ function run(env: Record) { describe("selfhost-post-update-check.sh", () => { it("falls back for non-numeric readiness retry settings without evaluating them as Bash arithmetic", () => { - const marker = join(tmpdir(), `gittensory-ready-injection-${process.pid}`); + const marker = join(tmpdir(), `loopover-ready-injection-${process.pid}`); rmSync(marker, { force: true }); const result = run({ diff --git a/test/unit/selfhost-post-update-regression-gate-script.test.ts b/test/unit/selfhost-post-update-regression-gate-script.test.ts index 17ef4ed3a8..d1d165cecf 100644 --- a/test/unit/selfhost-post-update-regression-gate-script.test.ts +++ b/test/unit/selfhost-post-update-regression-gate-script.test.ts @@ -24,7 +24,7 @@ function writeExecutable(path: string, contents: string) { // `compose ... exec -T postgres psql ...` (the kill-switch write, controlled via PSQL_EXIT_CODE and // recorded to PSQL_CALL_LOG so a test can assert on the exact SQL sent). function createSandbox() { - const base = mkdtempSync(join(tmpdir(), "gittensory-selfhost-regression-gate-")); + const base = mkdtempSync(join(tmpdir(), "loopover-selfhost-regression-gate-")); sandboxDirs.push(base); const bin = join(base, "bin"); mkdirSync(bin, { recursive: true }); @@ -161,7 +161,7 @@ describe("selfhost-post-update-regression-gate.sh", () => { }); it("falls back to safe defaults for non-numeric window/threshold settings without evaluating them as Bash arithmetic", () => { - const marker = join(tmpdir(), `gittensory-regression-gate-injection-${process.pid}`); + const marker = join(tmpdir(), `loopover-regression-gate-injection-${process.pid}`); rmSync(marker, { force: true }); const result = run({ diff --git a/test/unit/selfhost-pre-deploy-summary-script.test.ts b/test/unit/selfhost-pre-deploy-summary-script.test.ts index 9247109372..4a053cb1f1 100644 --- a/test/unit/selfhost-pre-deploy-summary-script.test.ts +++ b/test/unit/selfhost-pre-deploy-summary-script.test.ts @@ -45,7 +45,7 @@ afterEach(() => { }); function createSandbox() { - const base = mkdtempSync(join(tmpdir(), "gittensory-selfhost-pre-deploy-summary-")); + const base = mkdtempSync(join(tmpdir(), "loopover-selfhost-pre-deploy-summary-")); sandboxDirs.push(base); const originDir = join(base, "origin.git"); diff --git a/test/unit/selfhost-preflight.test.ts b/test/unit/selfhost-preflight.test.ts index 37c9b2e564..1256ce75f6 100644 --- a/test/unit/selfhost-preflight.test.ts +++ b/test/unit/selfhost-preflight.test.ts @@ -31,7 +31,7 @@ describe("self-host environment preflight (#2080)", () => { REDIS_URL: " redis://redis:6379 ", GITHUB_APP_ID: " 123 ", GITHUB_APP_PRIVATE_KEY: ` ${privateKey} `, - DATABASE_URL: " postgres://gittensory:secret@postgres:5432/gittensory ", + DATABASE_URL: " postgres://loopover:secret@postgres:5432/loopover ", }), ).toEqual({ ok: true, problems: [] }); @@ -40,7 +40,7 @@ describe("self-host environment preflight (#2080)", () => { REDIS_URL: "redis://redis:6379", GITHUB_APP_ID: "123", GITHUB_APP_PRIVATE_KEY: privateKey, - DATABASE_URL: "postgresql://gittensory:secret@postgres:5432/gittensory", + DATABASE_URL: "postgresql://loopover:secret@postgres:5432/loopover", }), ).toEqual({ ok: true, problems: [] }); @@ -49,7 +49,7 @@ describe("self-host environment preflight (#2080)", () => { REDIS_URL: "redis://redis:6379", GITHUB_APP_ID: "123", GITHUB_APP_PRIVATE_KEY: privateKey, - DATABASE_URL: "postgresql:///gittensory?host=/var/run/postgresql", + DATABASE_URL: "postgresql:///loopover?host=/var/run/postgresql", }), ).toEqual({ ok: true, problems: [] }); @@ -177,8 +177,8 @@ describe("self-host environment preflight (#2080)", () => { for (const DATABASE_URL of [ "postgres://", "postgres://postgres", - "postgresql:///gittensory", - "sqlite:///tmp/gittensory.sqlite?password=super-secret-db", + "postgresql:///loopover", + "sqlite:///tmp/loopover.sqlite?password=super-secret-db", ]) { const result = preflightEnv({ REDIS_URL: "redis://redis:6379", @@ -197,7 +197,7 @@ describe("self-host environment preflight (#2080)", () => { REDIS_URL: "redis://redis:6379", GITHUB_APP_ID: "123", GITHUB_APP_PRIVATE_KEY: privateKey, - DATABASE_URL: "postgres://user:super-secret-db@/gittensory", + DATABASE_URL: "postgres://user:super-secret-db@/loopover", }); expect(JSON.stringify(secretBearing)).not.toContain("super-secret-db"); }); @@ -305,7 +305,7 @@ describe("self-host environment preflight (#2080)", () => { REDIS_URL: " ", SELFHOST_SETUP_TOKEN: "secret-setup-token-with-enough-entropy", PUBLIC_API_ORIGIN: "https://selfhost.example", - DATABASE_URL: "sqlite:///tmp/gittensory.sqlite?password=super-secret-db", + DATABASE_URL: "sqlite:///tmp/loopover.sqlite?password=super-secret-db", }); expect(result).toEqual({ diff --git a/test/unit/selfhost-s3-blob-store.test.ts b/test/unit/selfhost-s3-blob-store.test.ts index 93c85c14c1..e662f7821c 100644 --- a/test/unit/selfhost-s3-blob-store.test.ts +++ b/test/unit/selfhost-s3-blob-store.test.ts @@ -3,7 +3,7 @@ import { createS3BlobStore } from "../../src/selfhost/s3-blob-store"; const CONFIG = { endpoint: "https://abc123.r2.cloudflarestorage.com", - bucket: "gittensory-shots", + bucket: "loopover-shots", accessKeyId: "test-access-key-id", secretAccessKey: "test-secret-access-key", }; @@ -23,99 +23,99 @@ describe("createS3BlobStore (self-host visual screenshot persistence, S3-compati it("get: a successful response streams the object body", async () => { fetchMock.mockResolvedValueOnce(new Response(new Uint8Array([1, 2, 3]), { status: 200 })); const store = createS3BlobStore(CONFIG); - const object = await store.get("gittensory/shots/abc.png"); + const object = await store.get("loopover/shots/abc.png"); expect(object).not.toBeNull(); expect(Array.from(new Uint8Array(await new Response(object!.body).arrayBuffer()))).toEqual([1, 2, 3]); const [request] = fetchMock.mock.calls[0] as [Request]; - expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/gittensory-shots/gittensory/shots/abc.png"); + expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/loopover-shots/loopover/shots/abc.png"); expect(request.method).toBe("GET"); }); it("get: a 404 response is a miss (returns null), not an error", async () => { fetchMock.mockResolvedValueOnce(new Response("not found", { status: 404 })); - expect(await createS3BlobStore(CONFIG).get("gittensory/shots/missing.png")).toBeNull(); + expect(await createS3BlobStore(CONFIG).get("loopover/shots/missing.png")).toBeNull(); }); it("get: a network failure degrades to null (never throws)", async () => { fetchMock.mockRejectedValueOnce(new Error("network down")); - await expect(createS3BlobStore(CONFIG).get("gittensory/shots/x.png")).resolves.toBeNull(); + await expect(createS3BlobStore(CONFIG).get("loopover/shots/x.png")).resolves.toBeNull(); }); it("put: a successful response returns the key and carries the content-type", async () => { fetchMock.mockResolvedValueOnce(new Response(null, { status: 200 })); const store = createS3BlobStore(CONFIG); - const result = await store.put("gittensory/shots/new.png", new Uint8Array([9, 9]), { httpMetadata: { contentType: "image/png" } }); - expect(result.key).toBe("gittensory/shots/new.png"); + const result = await store.put("loopover/shots/new.png", new Uint8Array([9, 9]), { httpMetadata: { contentType: "image/png" } }); + expect(result.key).toBe("loopover/shots/new.png"); const [request] = fetchMock.mock.calls[0] as [Request]; - expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/gittensory-shots/gittensory/shots/new.png"); + expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/loopover-shots/loopover/shots/new.png"); expect(request.method).toBe("PUT"); expect(request.headers.get("content-type")).toBe("image/png"); }); it("put: accepts a null value (stores an empty body), satisfying the R2 put body type", async () => { fetchMock.mockResolvedValueOnce(new Response(null, { status: 200 })); - await createS3BlobStore(CONFIG).put("gittensory/shots/empty.png", null); + await createS3BlobStore(CONFIG).put("loopover/shots/empty.png", null); const [request] = fetchMock.mock.calls[0] as [Request]; expect((await request.arrayBuffer()).byteLength).toBe(0); }); it("put: omitted httpMetadata sends no content-type header (both branches of the optional covered)", async () => { fetchMock.mockResolvedValueOnce(new Response(null, { status: 200 })); - await createS3BlobStore(CONFIG).put("gittensory/shots/no-type.png", new Uint8Array([1])); + await createS3BlobStore(CONFIG).put("loopover/shots/no-type.png", new Uint8Array([1])); const [request] = fetchMock.mock.calls[0] as [Request]; expect(request.headers.get("content-type")).toBeNull(); }); it("put: a non-2xx response throws", async () => { fetchMock.mockResolvedValueOnce(new Response("access denied", { status: 403 })); - await expect(createS3BlobStore(CONFIG).put("gittensory/shots/x.png", new Uint8Array([1]))).rejects.toThrow(/S3 put failed: 403/); + await expect(createS3BlobStore(CONFIG).put("loopover/shots/x.png", new Uint8Array([1]))).rejects.toThrow(/S3 put failed: 403/); }); it("delete: a successful response resolves", async () => { fetchMock.mockResolvedValueOnce(new Response(null, { status: 204 })); - await expect(createS3BlobStore(CONFIG).delete("gittensory/shots/x.png")).resolves.toBeUndefined(); + await expect(createS3BlobStore(CONFIG).delete("loopover/shots/x.png")).resolves.toBeUndefined(); const [request] = fetchMock.mock.calls[0] as [Request]; expect(request.method).toBe("DELETE"); }); it("delete: a 404 is treated as already-deleted (idempotent, matches R2/fs-store semantics), not an error", async () => { fetchMock.mockResolvedValueOnce(new Response("not found", { status: 404 })); - await expect(createS3BlobStore(CONFIG).delete("gittensory/shots/already-gone.png")).resolves.toBeUndefined(); + await expect(createS3BlobStore(CONFIG).delete("loopover/shots/already-gone.png")).resolves.toBeUndefined(); }); it("delete: any other failure throws", async () => { // aws4fetch retries a 5xx internally (default up to 10x) before giving up -- mockResolvedValue (not // -Once) so every retry attempt sees the same persistent failure, matching a genuinely-down upstream. fetchMock.mockResolvedValue(new Response("server error", { status: 500 })); - await expect(createS3BlobStore(CONFIG).delete("gittensory/shots/x.png")).rejects.toThrow(/S3 delete failed: 500/); + await expect(createS3BlobStore(CONFIG).delete("loopover/shots/x.png")).rejects.toThrow(/S3 delete failed: 500/); }); it("URL-encodes each key segment while preserving the / path structure", async () => { fetchMock.mockResolvedValueOnce(new Response(null, { status: 200 })); - await createS3BlobStore(CONFIG).put("gittensory/shots/a b#c.png", new Uint8Array([1])); + await createS3BlobStore(CONFIG).put("loopover/shots/a b#c.png", new Uint8Array([1])); const [request] = fetchMock.mock.calls[0] as [Request]; - expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/gittensory-shots/gittensory/shots/a%20b%23c.png"); + expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/loopover-shots/loopover/shots/a%20b%23c.png"); }); it("strips a trailing slash from the configured endpoint", async () => { fetchMock.mockResolvedValueOnce(new Response(new Uint8Array([1]), { status: 200 })); - await createS3BlobStore({ ...CONFIG, endpoint: `${CONFIG.endpoint}/` }).get("gittensory/shots/x.png"); + await createS3BlobStore({ ...CONFIG, endpoint: `${CONFIG.endpoint}/` }).get("loopover/shots/x.png"); const [request] = fetchMock.mock.calls[0] as [Request]; - expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/gittensory-shots/gittensory/shots/x.png"); + expect(request.url).toBe("https://abc123.r2.cloudflarestorage.com/loopover-shots/loopover/shots/x.png"); }); it("defaults the SigV4 region to \"auto\" (R2's convention) when not configured", async () => { fetchMock.mockResolvedValueOnce(new Response(new Uint8Array([1]), { status: 200 })); - await createS3BlobStore(CONFIG).get("gittensory/shots/x.png"); + await createS3BlobStore(CONFIG).get("loopover/shots/x.png"); const [request] = fetchMock.mock.calls[0] as [Request]; expect(request.headers.get("authorization")).toContain("/auto/s3/aws4_request"); }); it("uses a configured region instead of the \"auto\" default when provided", async () => { fetchMock.mockResolvedValueOnce(new Response(new Uint8Array([1]), { status: 200 })); - await createS3BlobStore({ ...CONFIG, region: "us-east-1" }).get("gittensory/shots/x.png"); + await createS3BlobStore({ ...CONFIG, region: "us-east-1" }).get("loopover/shots/x.png"); const [request] = fetchMock.mock.calls[0] as [Request]; expect(request.headers.get("authorization")).toContain("/us-east-1/s3/aws4_request"); }); diff --git a/test/unit/selfhost-update-script.test.ts b/test/unit/selfhost-update-script.test.ts index 5b5528a517..320e2db623 100644 --- a/test/unit/selfhost-update-script.test.ts +++ b/test/unit/selfhost-update-script.test.ts @@ -68,7 +68,7 @@ afterEach(() => { }); function createSandbox() { - const base = mkdtempSync(join(tmpdir(), "gittensory-selfhost-update-")); + const base = mkdtempSync(join(tmpdir(), "loopover-selfhost-update-")); sandboxDirs.push(base); const originDir = join(base, "origin.git"); @@ -272,7 +272,7 @@ describe("selfhost-update.sh", () => { }); it("fails fast outside a git checkout", () => { - const outside = mkdtempSync(join(tmpdir(), "gittensory-selfhost-update-nogit-")); + const outside = mkdtempSync(join(tmpdir(), "loopover-selfhost-update-nogit-")); sandboxDirs.push(outside); mkdirSync(join(outside, "scripts"), { recursive: true }); writeFileSync(join(outside, "scripts", "selfhost-update.sh"), REAL_SCRIPT); diff --git a/test/unit/selfhost-verify-backup-script.test.ts b/test/unit/selfhost-verify-backup-script.test.ts index cadc135f4e..55a9379673 100644 --- a/test/unit/selfhost-verify-backup-script.test.ts +++ b/test/unit/selfhost-verify-backup-script.test.ts @@ -8,7 +8,7 @@ import { afterEach, describe, expect, it } from "vitest"; const tmpRoots: string[] = []; function tmpRoot(): string { - const dir = mkdtempSync(join(tmpdir(), "gittensory-verify-")); + const dir = mkdtempSync(join(tmpdir(), "loopover-verify-")); tmpRoots.push(dir); return dir; } @@ -187,7 +187,7 @@ function runVerify( describe("self-host verify-backup script", () => { it("validates the newest Postgres dump with pg_restore --list", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-20240101T000000Z.dump", true); + writePgDump(root, "loopover-20240101T000000Z.dump", true); const r = runVerify(root, [], { LOOPOVER_BACKUP_SOURCE_DATABASE_URL: "postgres://u:p@h/db" }, { pg_restore: PG_RESTORE }); @@ -199,7 +199,7 @@ describe("self-host verify-backup script", () => { it("fails when the Postgres dump is unreadable", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-bad.dump", false); + writePgDump(root, "loopover-bad.dump", false); const r = runVerify(root, [], { LOOPOVER_BACKUP_SOURCE_DATABASE_URL: "postgres://u:p@h/db" }, { pg_restore: PG_RESTORE }); @@ -219,7 +219,7 @@ describe("self-host verify-backup script", () => { it("refuses the opt-in scratch restore when no scratch URL is configured", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const r = runVerify( root, @@ -234,7 +234,7 @@ describe("self-host verify-backup script", () => { it("refuses the scratch restore when the scratch URL is byte-for-byte the live database", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const live = "postgres://u:p@h/live"; const r = runVerify( @@ -254,11 +254,11 @@ describe("self-host verify-backup script", () => { it("refuses the scratch restore when a DIFFERENTLY-SPELLED URL resolves to the SAME database (regression: naive string compare bypass)", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); // Same database, deliberately spelled differently: scheme (postgres vs postgresql) AND an explicit vs // default port — a `[ "$scratch" = "$PG_DB" ]` string compare would wrongly treat these as distinct. - const live = "postgres://gittensory:pw@postgres/gittensory"; - const scratch = "postgresql://gittensory:pw@postgres:5432/gittensory"; + const live = "postgres://loopover:pw@postgres/loopover"; + const scratch = "postgresql://loopover:pw@postgres:5432/loopover"; expect(scratch).not.toBe(live); const r = runVerify( @@ -274,8 +274,8 @@ describe("self-host verify-backup script", () => { // Both URLs resolve to the identical real connection identity, exactly as they would in production // if they point at the same Postgres server/database despite the different spelling. psql: fakePsql({ - [sanitizedUrl(live)]: "gittensory@10.0.0.5:5432", - [sanitizedUrl(scratch)]: "gittensory@10.0.0.5:5432", + [sanitizedUrl(live)]: "loopover@10.0.0.5:5432", + [sanitizedUrl(scratch)]: "loopover@10.0.0.5:5432", }), }, ); @@ -286,7 +286,7 @@ describe("self-host verify-backup script", () => { it("refuses (fails closed) when the scratch database's identity cannot be determined", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const r = runVerify( root, @@ -307,7 +307,7 @@ describe("self-host verify-backup script", () => { it("refuses (fails closed) when the live database's identity cannot be determined", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const scratch = "postgres://u:p@h/scratch"; const r = runVerify( @@ -319,7 +319,7 @@ describe("self-host verify-backup script", () => { LOOPOVER_VERIFY_SCRATCH_DATABASE_URL: scratch, }, // Scratch resolves fine, but the live URL has no mapping — its identity query fails. - { pg_restore: PG_RESTORE, psql: fakePsql({ [sanitizedUrl(scratch)]: "gittensory@10.0.0.9:5432/scratch" }) }, + { pg_restore: PG_RESTORE, psql: fakePsql({ [sanitizedUrl(scratch)]: "loopover@10.0.0.9:5432/scratch" }) }, ); expect(r.status).toBe(1); @@ -328,7 +328,7 @@ describe("self-host verify-backup script", () => { it("runs the guarded scratch restore into a throwaway database and sanity-checks it", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const live = "postgres://u:p@h/live"; const scratch = "postgres://u:p@h/scratch"; @@ -343,7 +343,7 @@ describe("self-host verify-backup script", () => { { pg_restore: PG_RESTORE, psql: fakePsql( - { [sanitizedUrl(live)]: "gittensory@10.0.0.5:5432/live", [sanitizedUrl(scratch)]: "gittensory@10.0.0.5:5432/scratch" }, + { [sanitizedUrl(live)]: "loopover@10.0.0.5:5432/live", [sanitizedUrl(scratch)]: "loopover@10.0.0.5:5432/scratch" }, "42", ), }, @@ -355,12 +355,12 @@ describe("self-host verify-backup script", () => { it("never passes a password to psql/pg_restore argv across the full scratch-restore flow, and never leaks one URL's password onto a different URL's connection", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); // live has NO password; scratch supplies its password via the libpq query-string form (not userinfo) // -- both must be handled, and the live connection (checked between two scratch connections) must // never see a PGPASSFILE left over from scratch's. - const live = "postgres://gittensory@postgres/gittensory"; - const scratch = "postgresql://gittensory@postgres/scratch?password=SuperSecret123%21"; + const live = "postgres://loopover@postgres/loopover"; + const scratch = "postgresql://loopover@postgres/scratch?password=SuperSecret123%21"; const captureFile = join(root, "pg-capture.log"); const r = runVerify( @@ -375,7 +375,7 @@ describe("self-host verify-backup script", () => { { pg_restore: PG_RESTORE, psql: fakePsql( - { [sanitizedUrl(scratch)]: "gittensory@10.0.0.5:5432/scratch", [sanitizedUrl(live)]: "gittensory@10.0.0.5:5432/live" }, + { [sanitizedUrl(scratch)]: "loopover@10.0.0.5:5432/scratch", [sanitizedUrl(live)]: "loopover@10.0.0.5:5432/live" }, "7", ), }, @@ -411,7 +411,7 @@ describe("self-host verify-backup script", () => { it("strips EVERY occurrence of a repeated query-string password, not just the first", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const captureFile = join(root, "pg-capture.log"); // A malformed URL repeating `password=` isn't rejected by libpq's own parser -- stripping only the // first occurrence would leave a second one sitting in argv, still a leaked credential regardless of @@ -443,7 +443,7 @@ describe("self-host verify-backup script", () => { it("strips a query-string password even when its KEY NAME is percent-encoded", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const captureFile = join(root, "pg-capture.log"); // libpq percent-decodes query KEY NAMES before matching them against connection keywords, so // pass%77ord (%77 = 'w') is just as much `password` as the literal spelling -- a literal string match @@ -473,13 +473,13 @@ describe("self-host verify-backup script", () => { it("proves the userinfo-password form through the same full scratch-restore flow as the query-string form", () => { const root = tmpRoot(); - writePgDump(root, "gittensory-a.dump", true); + writePgDump(root, "loopover-a.dump", true); const captureFile = join(root, "pg-capture.log"); // Mirrors the query-string-password test above, but with the password in userinfo instead -- both // forms must be proven through the identical multi-connection flow (identity checks, the actual // restore, and the sanity query), not just in isolation. - const live = "postgresql://gittensory@postgres/gittensory"; - const scratch = "postgres://gittensory:SuperSecret123%21@postgres/scratch"; + const live = "postgresql://loopover@postgres/loopover"; + const scratch = "postgres://loopover:SuperSecret123%21@postgres/scratch"; const r = runVerify( root, @@ -493,7 +493,7 @@ describe("self-host verify-backup script", () => { { pg_restore: PG_RESTORE, psql: fakePsql( - { [sanitizedUrl(scratch)]: "gittensory@10.0.0.5:5432/scratch", [sanitizedUrl(live)]: "gittensory@10.0.0.5:5432/live" }, + { [sanitizedUrl(scratch)]: "loopover@10.0.0.5:5432/scratch", [sanitizedUrl(live)]: "loopover@10.0.0.5:5432/live" }, "9", ), }, @@ -518,7 +518,7 @@ describe("self-host verify-backup script", () => { it("validates the newest SQLite backup with an integrity check", () => { const root = tmpRoot(); - writeSqliteGz(root, "gittensory-20240101T000000Z.sqlite.gz"); + writeSqliteGz(root, "loopover-20240101T000000Z.sqlite.gz"); const r = runVerify(root, [], {}, { sqlite3: SQLITE3 }); @@ -528,7 +528,7 @@ describe("self-host verify-backup script", () => { it("fails when the SQLite backup fails its integrity check", () => { const root = tmpRoot(); - writeSqliteGz(root, "gittensory-a.sqlite.gz"); + writeSqliteGz(root, "loopover-a.sqlite.gz"); const r = runVerify(root, [], { FAKE_SQLITE_INTEGRITY: "malformed database disk image" }, { sqlite3: SQLITE3 }); @@ -538,7 +538,7 @@ describe("self-host verify-backup script", () => { it("fails when the SQLite backup is not valid gzip", () => { const root = tmpRoot(); - writeSqliteGz(root, "gittensory-a.sqlite.gz", "not gzip at all", false); + writeSqliteGz(root, "loopover-a.sqlite.gz", "not gzip at all", false); const r = runVerify(root, [], {}, { sqlite3: SQLITE3 }); diff --git a/test/unit/selftune-wiring.test.ts b/test/unit/selftune-wiring.test.ts index 20379f8efc..c55e71e106 100644 --- a/test/unit/selftune-wiring.test.ts +++ b/test/unit/selftune-wiring.test.ts @@ -74,7 +74,7 @@ describe("isSelfTuneEnabled — default OFF, truthy convention", () => { // ── Eval mapping (pure) — tightening-only by construction ────────────────────────────────────────────────── -describe("evalRowFromCalibration — gittensory outcome data → ported GateEvalRow (tightening-only)", () => { +describe("evalRowFromCalibration — loopover outcome data → ported GateEvalRow (tightening-only)", () => { it("maps the recommendation positive/negative split onto the would-MERGE side only", () => { const row = evalRowFromCalibration("owner/repo", 7, 5); expect(row).toMatchObject({ @@ -150,7 +150,7 @@ describe("0047 self-improve tunables migration — round-trip on the 3 tables", const ACTING_AUTONOMY = JSON.stringify({ review: "auto" }); // opts the repo into the acting-autonomy surface -describe("runSelfTune — shadow-soak over gittensory's own outcome data", () => { +describe("runSelfTune — shadow-soak over loopover's own outcome data", () => { it("FLAG-ON: a low-precision repo gets a TIGHTENING override SHADOW-SOAKED (not live yet) + audited", async () => { const env = createTestEnv({ LOOPOVER_REVIEW_SELFTUNE: "true" }); await seedRegisteredRepo(env, "owner/repo", ACTING_AUTONOMY); diff --git a/test/unit/signals-v2.test.ts b/test/unit/signals-v2.test.ts index 9baba08e42..6d9f6f211a 100644 --- a/test/unit/signals-v2.test.ts +++ b/test/unit/signals-v2.test.ts @@ -44,15 +44,15 @@ import type { ContributorRepoStatRecord, IssueRecord, PullRequestRecord, RecentM const isoDaysAgo = (days: number): string => new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString(); const repo: RepositoryRecord = { - fullName: "JSONbored/gittensory", + fullName: "JSONbored/loopover", owner: "JSONbored", - name: "gittensory", + name: "loopover", isInstalled: true, isRegistered: true, isPrivate: true, defaultBranch: "main", registryConfig: { - repo: "JSONbored/gittensory", + repo: "JSONbored/loopover", emissionShare: 0.01, issueDiscoveryShare: 0, labelMultipliers: { bug: 1.2, "status:ready": 0.2, missing: 0.5 }, @@ -675,10 +675,10 @@ describe("v2 signal builders", () => { it("reports registry changes between snapshots", () => { const current = snapshot("new", [ - { repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: { bug: 1.1 } }, + { repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: { bug: 1.1 } }, { repo: "JSONbored/awesome-claude", emissionShare: 0.01, issueDiscoveryShare: 0, labelMultipliers: {} }, ]); - const previous = snapshot("old", [{ repo: "JSONbored/gittensory", emissionShare: 0.01, issueDiscoveryShare: 0, labelMultipliers: {} }]); + const previous = snapshot("old", [{ repo: "JSONbored/loopover", emissionShare: 0.01, issueDiscoveryShare: 0, labelMultipliers: {} }]); const report = buildRegistryChangeReport([current, previous]); expect(report.addedRepos).toEqual(["JSONbored/awesome-claude"]); expect(report.changedRepos[0]?.changes).toContain("emission_share 0.01 -> 0.02"); @@ -687,23 +687,23 @@ describe("v2 signal builders", () => { it("reports changes to fixed base score, default label multiplier, and eligibility mode", () => { // Only fixedBaseScore changes; every other compared field is identical. The base // score override is the highest-impact registry change, so it must be surfaced. - const previous = snapshot("old", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, fixedBaseScore: 2 }]); - const current = snapshot("new", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, fixedBaseScore: 50 }]); + const previous = snapshot("old", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, fixedBaseScore: 2 }]); + const current = snapshot("new", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, fixedBaseScore: 50 }]); const report = buildRegistryChangeReport([current, previous]); expect(report.changedRepos).toHaveLength(1); expect(report.changedRepos[0]?.changes).toContain("fixed_base_score 2 -> 50"); expect(report.summary).toContain("1 changed"); // eligibility_mode and default_label_multiplier are tracked too. - const beforeMode = snapshot("old2", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, eligibilityMode: "branch_required", defaultLabelMultiplier: 1 }]); - const afterMode = snapshot("new2", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, eligibilityMode: "any_branch", defaultLabelMultiplier: 1.2 }]); + const beforeMode = snapshot("old2", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, eligibilityMode: "branch_required", defaultLabelMultiplier: 1 }]); + const afterMode = snapshot("new2", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, eligibilityMode: "any_branch", defaultLabelMultiplier: 1.2 }]); const modeReport = buildRegistryChangeReport([afterMode, beforeMode]); expect(modeReport.changedRepos[0]?.changes).toEqual( expect.arrayContaining(["eligibility_mode branch_required -> any_branch", "default_label_multiplier 1 -> 1.2"]), ); - const beforeDecay = snapshot("old3", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, timeDecay: { gracePeriodHours: 12 } }]); - const afterDecay = snapshot("new3", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, timeDecay: { gracePeriodHours: 24 } }]); + const beforeDecay = snapshot("old3", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, timeDecay: { gracePeriodHours: 12 } }]); + const afterDecay = snapshot("new3", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {}, timeDecay: { gracePeriodHours: 24 } }]); const decayReport = buildRegistryChangeReport([afterDecay, beforeDecay]); expect(decayReport.changedRepos).toHaveLength(1); expect(decayReport.changedRepos[0]?.changes).toContain("time_decay changed"); @@ -849,19 +849,19 @@ describe("v2 signal builders", () => { }); it("handles registry change report boundaries and all tracked fields", () => { - const onlyCurrent = snapshot("only", [{ repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {} }]); + const onlyCurrent = snapshot("only", [{ repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {} }]); const current = snapshot("current", [ - { repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 1, labelMultipliers: { bug: 1 } }, + { repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 1, labelMultipliers: { bug: 1 } }, ]); current.repositories[0]!.maintainerCut = 0.5; current.repositories[0]!.trustedLabelPipeline = true; const previous = snapshot("previous", [ - { repo: "JSONbored/gittensory", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {} }, + { repo: "JSONbored/loopover", emissionShare: 0.02, issueDiscoveryShare: 0, labelMultipliers: {} }, { repo: "old/repo", emissionShare: 0.01, issueDiscoveryShare: 0, labelMultipliers: {} }, ]); expect(buildRegistryChangeReport([]).summary).toMatch(/No registry snapshots/); - expect(buildRegistryChangeReport([onlyCurrent]).addedRepos).toEqual(["JSONbored/gittensory"]); + expect(buildRegistryChangeReport([onlyCurrent]).addedRepos).toEqual(["JSONbored/loopover"]); const changed = buildRegistryChangeReport([current, previous]); expect(changed.removedRepos).toEqual(["old/repo"]); expect(changed.changedRepos[0]?.changes).toEqual( @@ -1792,9 +1792,9 @@ describe("v2 signal builders", () => { }; const unregisteredProject: RepositoryRecord = { ...repo, - fullName: "JSONbored/gittensory", + fullName: "JSONbored/loopover", owner: "JSONbored", - name: "gittensory", + name: "loopover", isRegistered: false, registryConfig: null, }; @@ -1945,7 +1945,7 @@ describe("v2 signal builders", () => { expect(inactive.scoreBlockers).toContain("Repository allocation is inactive."); expect(maintainer.roleContext.maintainerLane).toBe(true); expect(maintainer.actions.map((action) => action.actionKind)).toEqual(expect.arrayContaining(["maintainer_lane_improve_repo", "maintainer_cut_readiness"])); - expect(strategy.repoAnalyses.map((analysis) => analysis.repoFullName)).not.toContain("JSONbored/gittensory"); + expect(strategy.repoAnalyses.map((analysis) => analysis.repoFullName)).not.toContain("JSONbored/loopover"); expect(strategy.topActions[0]?.actionKind).toBe("cleanup_existing_prs"); expect(JSON.stringify(strategy)).not.toMatch(/wallet|hotkey|guaranteed payout|farming/i); }); diff --git a/test/unit/signals.test.ts b/test/unit/signals.test.ts index 8df900400f..75fa0c5dbe 100644 --- a/test/unit/signals.test.ts +++ b/test/unit/signals.test.ts @@ -1207,10 +1207,10 @@ describe("world-class backend signals", () => { it("builds private contributor outcome and strategy reports across maintainer and cleanup lanes", () => { const ownerRepo: RepositoryRecord = { ...repo, - fullName: "jsonbored/gittensory", + fullName: "jsonbored/loopover", owner: "jsonbored", - name: "gittensory", - registryConfig: { ...repo.registryConfig!, repo: "jsonbored/gittensory", maintainerCut: 0.1 }, + name: "loopover", + registryConfig: { ...repo.registryConfig!, repo: "jsonbored/loopover", maintainerCut: 0.1 }, }; const riskyRepo: RepositoryRecord = { ...repo, diff --git a/test/unit/smoke-selfhost-script.test.ts b/test/unit/smoke-selfhost-script.test.ts index ef47196891..f4eae09dc3 100644 --- a/test/unit/smoke-selfhost-script.test.ts +++ b/test/unit/smoke-selfhost-script.test.ts @@ -37,7 +37,7 @@ esac `, ); - const result = spawnSync("bash", [SCRIPT_PATH, "gittensory:rc-candidate"], { + const result = spawnSync("bash", [SCRIPT_PATH, "loopover:rc-candidate"], { cwd: process.cwd(), env: { ...process.env, diff --git a/test/unit/snapshot-replay-ui.test.ts b/test/unit/snapshot-replay-ui.test.ts index b738ba4719..be79e8ec58 100644 --- a/test/unit/snapshot-replay-ui.test.ts +++ b/test/unit/snapshot-replay-ui.test.ts @@ -12,7 +12,7 @@ describe("buildSnapshotReplayView", () => { expect(view.confidence).toBe("high"); expect(view.freshness).toBe("fresh"); expect(view.scoringModelId).toBe("scoring-1"); - expect(view.target).toEqual({ repoFullName: "JSONbored/gittensory", pullNumber: 12, issueNumber: null }); + expect(view.target).toEqual({ repoFullName: "JSONbored/loopover", pullNumber: 12, issueNumber: null }); expect(view.sources).toEqual([ { name: "contributor_decision_pack", freshness: "fresh", generatedAt: "2026-06-08T00:00:00.000Z" }, ]); @@ -58,7 +58,7 @@ describe("buildSnapshotReplayView", () => { expect(view.notice).toBe("This snapshot has no provenance to replay."); expect(view.snapshotId).toBe("recommendation:context-1:run-1:00:choose_next_work"); expect(view.actionType).toBe("choose_next_work"); - expect(view.target.repoFullName).toBe("JSONbored/gittensory"); + expect(view.target.repoFullName).toBe("JSONbored/loopover"); }); it("shows private counterfactual detail for authenticated viewers", () => { @@ -69,7 +69,7 @@ describe("buildSnapshotReplayView", () => { }); expect(view.counterfactuals).toEqual([ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", recommendation: "contribute_now", alternatives: [ { @@ -111,7 +111,7 @@ describe("buildSnapshotReplayView", () => { viewer: "authenticated", }); expect(view.counterfactuals).toHaveLength(1); - expect(view.counterfactuals[0]?.repoFullName).toBe("JSONbored/gittensory"); + expect(view.counterfactuals[0]?.repoFullName).toBe("JSONbored/loopover"); }); it("narrows unknown confidence/freshness and skips malformed sources and alternatives", () => { @@ -124,7 +124,7 @@ describe("buildSnapshotReplayView", () => { }), }), counterfactuals: [ - { repoFullName: "JSONbored/gittensory", recommendation: "contribute_now", rejectedAlternatives: ["x", {}, { facts: [] }] }, + { repoFullName: "JSONbored/loopover", recommendation: "contribute_now", rejectedAlternatives: ["x", {}, { facts: [] }] }, ], viewer: "authenticated", }); @@ -160,7 +160,7 @@ function snapshot(overrides: Record = {}): Record = {}): Record> { return [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", recommendation: "contribute_now", rejectedAlternatives: [ { diff --git a/test/unit/stats.test.ts b/test/unit/stats.test.ts index 456a6216d3..aeaaca31dd 100644 --- a/test/unit/stats.test.ts +++ b/test/unit/stats.test.ts @@ -24,7 +24,7 @@ function stubEnv(extra: Record = {}): Env { const decisions = [ { bucket: "2026-06-01", project: "awesome-claude", verdict: "merge", n: 5 }, { bucket: "2026-06-01", project: "awesome-claude", verdict: "close", n: 3 }, - { bucket: "2026-06-01", project: "gittensory", verdict: "comment", n: 2 }, + { bucket: "2026-06-01", project: "loopover", verdict: "comment", n: 2 }, ]; const reversals = [{ bucket: "2026-06-01", project: "awesome-claude", n: 1 }]; const gateActions = [ @@ -76,7 +76,7 @@ const NOW = Date.parse("2026-06-14T00:00:00Z"); describe("computeStats — D1 aggregate for the dashboard", () => { it("returns sorted projects/verdicts, rows, reversals, and the window", async () => { const out = await computeStats(stubEnv(), { days: 90, bucket: "week", nowMs: NOW }); - expect(out.projects).toEqual(["awesome-claude", "gittensory"]); + expect(out.projects).toEqual(["awesome-claude", "loopover"]); expect(out.verdicts).toEqual(["close", "comment", "merge"]); expect(out.rows).toHaveLength(3); expect(out.reversals).toEqual([{ bucket: "2026-06-01", project: "awesome-claude", n: 1 }]); @@ -122,7 +122,7 @@ describe("computeStats — D1 aggregate for the dashboard", () => { computeTuningRecommendations: () => [{ project: "p", severity: "warn", message: "tighten" }], computeGateParity: async () => ({ authoritative: "reviewbot", - shadow: "gittensory", + shadow: "loopover", hasSignal: true, rows: [{ project: "p", pairedSamples: 40, bothMerge: 40, bothClose: 0, bothHold: 0, disagree: 0, agreementRate: 1, unsafeDisagreements: 0, byReasonCode: [] }], }), @@ -215,13 +215,13 @@ describe("computeStats — review-effort read is fail-safe", () => { .bind( "published-a", "github_app.pr_public_surface_published", - "JSONbored/gittensory#10", + "JSONbored/loopover#10", "completed", JSON.stringify({ reviewEffortMinutes: 4 }), "2026-06-10T00:00:00.000Z", "published-b", "github_app.pr_public_surface_published", - "JSONbored/gittensory#11", + "JSONbored/loopover#11", "completed", JSON.stringify({ reviewEffortMinutes: 96 }), "2026-06-11T00:00:00.000Z", @@ -297,7 +297,7 @@ describe("handleStats — query-param default branches", () => { return { rows: [], hasSignal: false }; }, computeTuningRecommendations: () => [], - computeGateParity: async () => ({ authoritative: "reviewbot", shadow: "gittensory", hasSignal: false, rows: [] }), + computeGateParity: async () => ({ authoritative: "reviewbot", shadow: "loopover", hasSignal: false, rows: [] }), }; // No days / bucket query params → days ?? 90, bucket ?? "day". const r = new Request("https://w.dev/stats/data", { method: "GET", headers: { authorization: "Bearer s3cret" } }); diff --git a/test/unit/subnet-interface.test.ts b/test/unit/subnet-interface.test.ts index e5802856fe..ce7bf22126 100644 --- a/test/unit/subnet-interface.test.ts +++ b/test/unit/subnet-interface.test.ts @@ -4,7 +4,7 @@ import { buildSubnetInterfaceDescriptor, GITTENSOR_NETUID } from "../../src/serv describe("buildSubnetInterfaceDescriptor", () => { it("declares LoopOver as gittensor SN74's contribution interface", () => { const descriptor = buildSubnetInterfaceDescriptor({ - origin: "https://gittensory-api.aethereal.dev/", + origin: "https://loopover-api.aethereal.dev/", generatedAt: "2026-06-14T00:00:00.000Z", upstreamRepo: "entrius/gittensor", }); @@ -13,7 +13,7 @@ describe("buildSubnetInterfaceDescriptor", () => { expect(descriptor.subnet).toMatchObject({ netuid: 74, name: "gittensor", upstreamRepo: "entrius/gittensor" }); expect(descriptor.provider).toMatchObject({ name: "LoopOver", role: "contribution_interface" }); // Trailing slash on origin is normalized before appending /mcp. - expect(descriptor.interfaces.mcp.endpoint).toBe("https://gittensory-api.aethereal.dev/mcp"); + expect(descriptor.interfaces.mcp.endpoint).toBe("https://loopover-api.aethereal.dev/mcp"); expect(descriptor.interfaces.mcp.transport).toBe("http"); // The publicly installable App slug is a stable hardcoded product identity, not derived from any Worker // var (the old review App's GITHUB_APP_SLUG was removed; loopover-orb is the real, current, installable App). diff --git a/test/unit/support/mcp-cli-harness.ts b/test/unit/support/mcp-cli-harness.ts index fa2eec3666..56da17fd0d 100644 --- a/test/unit/support/mcp-cli-harness.ts +++ b/test/unit/support/mcp-cli-harness.ts @@ -96,7 +96,7 @@ export function createPacketRepo() { git(cwd, "config", "user.email", "test@example.com"); git(cwd, "config", "user.name", "LoopOver Test"); git(cwd, "config", "commit.gpgsign", "false"); - git(cwd, "remote", "add", "origin", "git@github.com:JSONbored/gittensory.git"); + git(cwd, "remote", "add", "origin", "git@github.com:JSONbored/loopover.git"); writeFileSync(join(cwd, "README.md"), "fixture\n"); git(cwd, "add", "README.md"); git(cwd, "commit", "-m", "initial commit"); @@ -275,7 +275,7 @@ export async function startFixtureServer( response.end(JSON.stringify({ ...openPrMonitorFixture(), ...(options.openPrMonitor ?? {}) })); return; } - if (request.url === "/v1/contributors/JSONbored/repos/JSONbored/gittensory/decision" && request.method === "GET") { + if (request.url === "/v1/contributors/JSONbored/repos/JSONbored/loopover/decision" && request.method === "GET") { if (options.repoDecisionStatus && options.repoDecisionStatus >= 400) { response.statusCode = options.repoDecisionStatus; if (options.repoDecisionErrorContentType) response.setHeader("content-type", options.repoDecisionErrorContentType); @@ -287,7 +287,7 @@ export async function startFixtureServer( JSON.stringify({ status: "ready", login: "JSONbored", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", decision: options.terminalInjection ? { ...repoDecision, nextActions: [options.terminalInjection] } : repoDecision, ...(options.terminalInjection ? { cache: { rerunGuidance: options.terminalInjection } } : {}), }), @@ -374,11 +374,11 @@ export async function startFixtureServer( const lane = body.goalSpec?.lane ?? "default"; const minRank = body.goalSpec?.minRankScore ?? 0; const candidates = [ - { owner: "JSONbored", repo: "gittensory", issueNumber: 100, title: "Improve REES test retry", rankScore: 85, laneFit: lane, freshness: 0.9, dupRisk: 0.1, aiPolicyAllowed: true }, - { owner: "JSONbored", repo: "gittensory", issueNumber: 101, title: "Add label-audit coverage", rankScore: 72, laneFit: lane, freshness: 0.7, dupRisk: 0.2, aiPolicyAllowed: true }, - { owner: "JSONbored", repo: "gittensory", issueNumber: 102, title: "Fix flaky buildBrief test", rankScore: 68, laneFit: lane, freshness: 0.5, dupRisk: 0.3, aiPolicyAllowed: true }, - { owner: "JSONbored", repo: "gittensory", issueNumber: 103, title: "Normalize path matchers", rankScore: 55, laneFit: lane, freshness: 0.4, dupRisk: 0.1, aiPolicyAllowed: true }, - { owner: "JSONbored", repo: "gittensory", issueNumber: 104, title: "Document score breakdown", rankScore: 45, laneFit: lane, freshness: 0.3, dupRisk: 0.1, aiPolicyAllowed: true }, + { owner: "JSONbored", repo: "loopover", issueNumber: 100, title: "Improve REES test retry", rankScore: 85, laneFit: lane, freshness: 0.9, dupRisk: 0.1, aiPolicyAllowed: true }, + { owner: "JSONbored", repo: "loopover", issueNumber: 101, title: "Add label-audit coverage", rankScore: 72, laneFit: lane, freshness: 0.7, dupRisk: 0.2, aiPolicyAllowed: true }, + { owner: "JSONbored", repo: "loopover", issueNumber: 102, title: "Fix flaky buildBrief test", rankScore: 68, laneFit: lane, freshness: 0.5, dupRisk: 0.3, aiPolicyAllowed: true }, + { owner: "JSONbored", repo: "loopover", issueNumber: 103, title: "Normalize path matchers", rankScore: 55, laneFit: lane, freshness: 0.4, dupRisk: 0.1, aiPolicyAllowed: true }, + { owner: "JSONbored", repo: "loopover", issueNumber: 104, title: "Document score breakdown", rankScore: 45, laneFit: lane, freshness: 0.3, dupRisk: 0.1, aiPolicyAllowed: true }, ]; const ranked = candidates.filter((c) => c.rankScore >= minRank).slice(0, limit); response.end(JSON.stringify({ ranked, totalCandidates: candidates.length, appliedLane: lane, appliedMinRankScore: minRank })); @@ -629,7 +629,7 @@ export function agentPacketFixture(markdown = "# Public-safe PR packet\n\n## Lin export function localBranchAnalysisFixture() { return { login: "JSONbored", - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", generatedAt: "2026-06-01T00:00:00.000Z", summary: "Local branch preflight fixture.", nextActions: [{ actionKind: "prepare_pr_packet", whyThisHelps: ["Keeps public packet safe."] }], @@ -670,11 +670,11 @@ export function openPrMonitorFixture() { registeredRepoCount: 2, cleanupFirst: true, summary: "1 open PR needs attention before starting new work.", - guidance: ["Clear the failing check on JSONbored/gittensory#42 before opening anything new."], + guidance: ["Clear the failing check on JSONbored/loopover#42 before opening anything new."], pendingScenarios: [], pullRequests: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", number: 42, title: "fix(queue): drain stale entries", classification: "failing_checks", @@ -709,16 +709,16 @@ export function decisionPackFixture() { opportunities: [], repoDecisions: [ { - repoFullName: "JSONbored/gittensory", + repoFullName: "JSONbored/loopover", recommendation: "pursue", nextActions: ["Pick one narrow change."], changedFiles: [{ path: "src/cache.ts", content: "must stay local" }], localPath: "/tmp/source/private.ts", }, ], - topActions: [{ actionKind: "open_new_direct_pr", repoFullName: "JSONbored/gittensory", priorityScore: 50 }], + topActions: [{ actionKind: "open_new_direct_pr", repoFullName: "JSONbored/loopover", priorityScore: 50 }], cleanupFirst: [], - pursueRepos: [{ repoFullName: "JSONbored/gittensory", recommendation: "pursue" }], + pursueRepos: [{ repoFullName: "JSONbored/loopover", recommendation: "pursue" }], avoidRepos: [], maintainerLaneRepos: [], scoreBlockers: [], diff --git a/test/unit/support/miner-cli-harness.ts b/test/unit/support/miner-cli-harness.ts index 654199c73c..c06b242fd3 100644 --- a/test/unit/support/miner-cli-harness.ts +++ b/test/unit/support/miner-cli-harness.ts @@ -139,7 +139,7 @@ export async function startRegistryFixture( } export function tempEnvPrefix() { - return mkdtempSync(join(tmpdir(), "gittensory-miner-cli-")); + return mkdtempSync(join(tmpdir(), "loopover-miner-cli-")); } function defaultForgeIssue(number: number, owner: string, repo: string) { diff --git a/test/unit/sweep-watchdog.test.ts b/test/unit/sweep-watchdog.test.ts index 0b99f26198..c2f2c25e2d 100644 --- a/test/unit/sweep-watchdog.test.ts +++ b/test/unit/sweep-watchdog.test.ts @@ -14,7 +14,7 @@ import { upsertRepoFocusManifest } from "../../src/signals/focus-manifest-loader import * as focusManifestLoaderModule from "../../src/signals/focus-manifest-loader"; import { createTestEnv } from "../helpers/d1"; -const SELF_REPO = "JSONbored/gittensory"; +const SELF_REPO = "JSONbored/loopover"; describe("isSweepWatchdogEnabled — default OFF, truthy convention", () => { it("matches the codebase's shared truthy-string convention", () => { diff --git a/test/unit/unified-comment.test.ts b/test/unit/unified-comment.test.ts index 83848dcd9c..588d8f34ad 100644 --- a/test/unit/unified-comment.test.ts +++ b/test/unit/unified-comment.test.ts @@ -134,7 +134,7 @@ describe("renderUnifiedReviewComment", () => { footerMarkdown: "Checked by LoopOver.", }; - it("renders the ready/auto-merged state in the gittensory shape", () => { + it("renders the ready/auto-merged state in the loopover shape", () => { const md = renderUnifiedReviewComment( { ...base, decision: "merge", merged: true, readiness: { ciState: "passed" }, nits: ["Document the new property."] }, ctx, diff --git a/test/unit/unlinked-issue-guardrail-config-engine.test.ts b/test/unit/unlinked-issue-guardrail-config-engine.test.ts index de20bcaddc..57cbd83904 100644 --- a/test/unit/unlinked-issue-guardrail-config-engine.test.ts +++ b/test/unit/unlinked-issue-guardrail-config-engine.test.ts @@ -1,4 +1,4 @@ -// Mirror of the app suite pointed at the gittensory-engine copy so the extracted module owns its branch coverage (#2280). +// Mirror of the app suite pointed at the loopover-engine copy so the extracted module owns its branch coverage (#2280). import { describe, expect, it } from "vitest"; import { DEFAULT_UNLINKED_ISSUE_GUARDRAIL, diff --git a/test/unit/unmodeled-scoring-drift.test.ts b/test/unit/unmodeled-scoring-drift.test.ts index d3a5f6dd40..06866bca4b 100644 --- a/test/unit/unmodeled-scoring-drift.test.ts +++ b/test/unit/unmodeled-scoring-drift.test.ts @@ -48,12 +48,12 @@ describe("unmodeled scoring constant drift", () => { await syncUnmodeledScoringConstantDrift(env, { unmodeledConstants: ["ALPHA"] }); await updateUpstreamDriftReportIssue(env, fingerprint, { number: 811, - url: "https://github.com/JSONbored/gittensory/issues/811", + url: "https://github.com/JSONbored/loopover/issues/811", }); const updated = await syncUnmodeledScoringConstantDrift(env, { unmodeledConstants: ["ALPHA", "BETA"] }); expect(updated).toMatchObject({ issueNumber: 811, - issueUrl: "https://github.com/JSONbored/gittensory/issues/811", + issueUrl: "https://github.com/JSONbored/loopover/issues/811", payload: expect.objectContaining({ unmodeledUpstreamConstants: ["ALPHA", "BETA"] }), }); }); @@ -116,7 +116,7 @@ describe("unmodeled scoring constant drift", () => { ...opened!, updatedAt: "2020-01-01T00:00:00.000Z", issueNumber: 811, - issueUrl: "https://github.com/JSONbored/gittensory/issues/811", + issueUrl: "https://github.com/JSONbored/loopover/issues/811", }); for (let index = 0; index < 51; index++) { await upsertUpstreamDriftReport(env, { @@ -143,7 +143,7 @@ describe("unmodeled scoring constant drift", () => { fingerprint, status: "open", issueNumber: 811, - issueUrl: "https://github.com/JSONbored/gittensory/issues/811", + issueUrl: "https://github.com/JSONbored/loopover/issues/811", payload: expect.objectContaining({ unmodeledUpstreamConstants: ["ALPHA", "BETA"] }), }); diff --git a/test/unit/visual-capture.test.ts b/test/unit/visual-capture.test.ts index 3fc75cd721..3eed20326d 100644 --- a/test/unit/visual-capture.test.ts +++ b/test/unit/visual-capture.test.ts @@ -474,7 +474,7 @@ describe("mapFilesToRoutes app-folder generalization (#3611 follow-up)", () => { describe("review.visual.production_url (#3611 follow-up)", () => { it("prefers visualConfig.productionUrl over the global PUBLIC_SITE_ORIGIN env var for the 'before' shot", async () => { const result = await buildCapture( - createTestEnv({ PUBLIC_API_ORIGIN: "https://worker.example", PUBLIC_SITE_ORIGIN: "https://gittensory.example.com" }), + createTestEnv({ PUBLIC_API_ORIGIN: "https://worker.example", PUBLIC_SITE_ORIGIN: "https://loopover.example.com" }), "installation-token", { repoFullName: "owner/metagraphed", prNumber: 50, previewUrl: "https://preview.example.com" }, ["apps/ui/src/routes/index.tsx"], @@ -482,27 +482,27 @@ describe("review.visual.production_url (#3611 follow-up)", () => { { productionUrl: "https://metagraph.example.com" }, ); expect(result.routes[0]?.beforeUrl).toContain(encodeURIComponent("https://metagraph.example.com/")); - expect(result.routes[0]?.beforeUrl).not.toContain(encodeURIComponent("https://gittensory.example.com")); + expect(result.routes[0]?.beforeUrl).not.toContain(encodeURIComponent("https://loopover.example.com")); }); it("falls back to the global PUBLIC_SITE_ORIGIN when visualConfig.productionUrl is null/unset", async () => { const withNull = await buildCapture( - createTestEnv({ PUBLIC_API_ORIGIN: "https://worker.example", PUBLIC_SITE_ORIGIN: "https://gittensory.example.com" }), + createTestEnv({ PUBLIC_API_ORIGIN: "https://worker.example", PUBLIC_SITE_ORIGIN: "https://loopover.example.com" }), "installation-token", { repoFullName: "owner/repo", prNumber: 51, previewUrl: "https://preview.example.com" }, ["apps/loopover-ui/src/routes/app.index.tsx"], undefined, { productionUrl: null }, ); - expect(withNull.routes[0]?.beforeUrl).toContain(encodeURIComponent("https://gittensory.example.com/app")); + expect(withNull.routes[0]?.beforeUrl).toContain(encodeURIComponent("https://loopover.example.com/app")); const withoutConfig = await buildCapture( - createTestEnv({ PUBLIC_API_ORIGIN: "https://worker.example", PUBLIC_SITE_ORIGIN: "https://gittensory.example.com" }), + createTestEnv({ PUBLIC_API_ORIGIN: "https://worker.example", PUBLIC_SITE_ORIGIN: "https://loopover.example.com" }), "installation-token", { repoFullName: "owner/repo", prNumber: 52, previewUrl: "https://preview.example.com" }, ["apps/loopover-ui/src/routes/app.index.tsx"], ); - expect(withoutConfig.routes[0]?.beforeUrl).toContain(encodeURIComponent("https://gittensory.example.com/app")); + expect(withoutConfig.routes[0]?.beforeUrl).toContain(encodeURIComponent("https://loopover.example.com/app")); }); it("degrades to an empty 'before' base (no page, no shot) when NEITHER productionUrl nor PUBLIC_SITE_ORIGIN is set at all", async () => { @@ -1739,8 +1739,8 @@ describe("buildCapture scroll-GIF wiring (#3612)", () => { }); describe("hasSuccessfulBotCapture (#4110)", () => { - const REAL_BEFORE = "https://api.example/loopover/shot?key=gittensory%2Fshots%2Fbefore.png"; - const REAL_AFTER = "https://api.example/loopover/shot?key=gittensory%2Fshots%2Fafter.png"; + const REAL_BEFORE = "https://api.example/loopover/shot?key=loopover%2Fshots%2Fbefore.png"; + const REAL_AFTER = "https://api.example/loopover/shot?key=loopover%2Fshots%2Fafter.png"; const ON_DEMAND_BEFORE = "https://api.example/loopover/shot?url=https%3A%2F%2Fprod.example%2Fapp&w=1440&h=900"; const ON_DEMAND_AFTER = "https://api.example/loopover/shot?url=https%3A%2F%2Fpreview.example%2Fapp&w=1440&h=900"; const LOADING_PLACEHOLDER = "https://api.example/loopover/shot?placeholder=loading"; diff --git a/test/unit/visual-collapsible.test.ts b/test/unit/visual-collapsible.test.ts index 1188d97b49..401f48a910 100644 --- a/test/unit/visual-collapsible.test.ts +++ b/test/unit/visual-collapsible.test.ts @@ -24,8 +24,8 @@ const footer = "💰 Earn for open-source contributions. Checked by LoopOver."; const routes: CaptureRoute[] = [ { path: "/app/analytics", - beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc.png", - afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/def.png", + beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/abc.png", + afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/def.png", }, ]; @@ -39,26 +39,26 @@ describe("buildBeforeAfterCollapsible", () => { expect(c?.body).toContain("| Route | Viewport | Before (production) | After (this PR's preview) |"); expect(c?.body).toContain("`/app/analytics`"); // Clickable thumbnail: a small wrapped in an to the SAME full-resolution shot. - expect(c?.body).toContain(' { - const c = buildBeforeAfterCollapsible([{ path: "/", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }]); + const c = buildBeforeAfterCollapsible([{ path: "/", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }]); expect(c?.body).toContain("| `/` | desktop | — | { const c = buildBeforeAfterCollapsible(routes); // The caption text is the SAME string already used as the (invisible) alt attribute -- now also visible. - expect(c?.body).toContain('before /app/analytics
before /app/analytics'); - expect(c?.body).toContain('after /app/analytics
after /app/analytics'); + expect(c?.body).toContain('before /app/analytics
before /app/analytics'); + expect(c?.body).toContain('after /app/analytics
after /app/analytics'); }); it("#6324: a dash cell has no caption to escape (no
emitted for a missing slot)", () => { - const c = buildBeforeAfterCollapsible([{ path: "/", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }]); + const c = buildBeforeAfterCollapsible([{ path: "/", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }]); expect(c?.body).toContain("| `/` | desktop | — | "); }); @@ -67,25 +67,25 @@ describe("buildBeforeAfterCollapsible", () => { const c = buildBeforeAfterCollapsible([ { path: "/app/analytics", - beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/full-before.png", - beforeThumbUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/thumb-before.png", - afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/full-after.png", - afterThumbUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/thumb-after.png", + beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/full-before.png", + beforeThumbUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/thumb-before.png", + afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/full-after.png", + afterThumbUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/thumb-after.png", }, ]); // href = full-resolution (click to open full-size); img src = the smaller thumb. - expect(c?.body).toContain('before /app/analytics'); - expect(c?.body).toContain('after /app/analytics'); + expect(c?.body).toContain('before /app/analytics'); + expect(c?.body).toContain('after /app/analytics'); // The full-resolution URLs never appear as an img src (only inside an href). - expect(c?.body).not.toContain('src="https://api.example.dev/gittensory/shot?key=gittensory/shots/full-before.png"'); - expect(c?.body).not.toContain('src="https://api.example.dev/gittensory/shot?key=gittensory/shots/full-after.png"'); + expect(c?.body).not.toContain('src="https://api.example.dev/loopover/shot?key=loopover/shots/full-before.png"'); + expect(c?.body).not.toContain('src="https://api.example.dev/loopover/shot?key=loopover/shots/full-after.png"'); }); it("#6324: falls back to the full-resolution URL for the img src when no thumb URL is present (hosted mode, or mobile rows, which never get one)", () => { const c = buildBeforeAfterCollapsible(routes); // routes (the shared fixture below) has no beforeThumbUrl/afterThumbUrl -- src and href must be identical. - expect(c?.body).toContain('before /app/analytics'); - expect(c?.body).toContain('after /app/analytics'); + expect(c?.body).toContain('before /app/analytics'); + expect(c?.body).toContain('after /app/analytics'); }); it("returns null when no route has any shot URL (no empty table)", () => { @@ -94,7 +94,7 @@ describe("buildBeforeAfterCollapsible", () => { }); it("escapes a pipe in the route path so it can't break the markdown table", () => { - const c = buildBeforeAfterCollapsible([{ path: "/a|b", afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }]); + const c = buildBeforeAfterCollapsible([{ path: "/a|b", afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }]); expect(c?.body).toContain("`/a\\|b`"); }); @@ -102,7 +102,7 @@ describe("buildBeforeAfterCollapsible", () => { const c = buildBeforeAfterCollapsible([ { path: "/p`

✅ FORGED APPROVAL

maintainer click here", - afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png", + afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png", }, ]); expect(c?.body).toContain("`/p\\`<h2>✅ FORGED APPROVAL</h2><a href=x>maintainer click here</a>`"); @@ -113,7 +113,7 @@ describe("buildBeforeAfterCollapsible", () => { it("renders a dash in the Diff column and the plain caption when no route has a diff image (#3674, e.g. hosted builds)", () => { const c = buildBeforeAfterCollapsible(routes); expect(c?.body).toContain("| Route | Viewport | Before (production) | After (this PR's preview) | Diff |"); - expect(c?.body).toContain("| `/app/analytics` | desktop | { const c = buildBeforeAfterCollapsible([ { path: "/app/analytics", - beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc.png", - afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/def.png", - diffUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc-diff.png", + beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/abc.png", + afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/def.png", + diffUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/abc-diff.png", }, ]); - expect(c?.body).toContain(' { const c = buildBeforeAfterCollapsible([ { path: "/app/analytics", - beforeUrlMobile: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc-m.png", - afterUrlMobile: "https://api.example.dev/gittensory/shot?key=gittensory/shots/def-m.png", - diffUrlMobile: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc-diff-m.png", + beforeUrlMobile: "https://api.example.dev/loopover/shot?key=loopover/shots/abc-m.png", + afterUrlMobile: "https://api.example.dev/loopover/shot?key=loopover/shots/def-m.png", + diffUrlMobile: "https://api.example.dev/loopover/shot?key=loopover/shots/abc-diff-m.png", }, ]); expect(c?.body).toContain("| `/app/analytics` | mobile |"); - expect(c?.body).toContain(' { { path: "/app/analytics", theme: "dark", - beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc.png", - afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/def.png", + beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/abc.png", + afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/def.png", }, ]); expect(c?.body).toContain("| `/app/analytics` | desktop (dark) |"); @@ -171,8 +171,8 @@ describe("buildBeforeAfterCollapsible", () => { { path: "/app/analytics", theme: "dark", - beforeUrlMobile: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc-m.png", - afterUrlMobile: "https://api.example.dev/gittensory/shot?key=gittensory/shots/def-m.png", + beforeUrlMobile: "https://api.example.dev/loopover/shot?key=loopover/shots/abc-m.png", + afterUrlMobile: "https://api.example.dev/loopover/shot?key=loopover/shots/def-m.png", }, ]); expect(c?.body).toContain("| `/app/analytics` | mobile (dark) |"); @@ -181,8 +181,8 @@ describe("buildBeforeAfterCollapsible", () => { it("renders one row set per theme when the same route appears twice with different themes", () => { const c = buildBeforeAfterCollapsible([ - { path: "/", theme: "light", beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/light.png" }, - { path: "/", theme: "dark", beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/dark.png" }, + { path: "/", theme: "light", beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/light.png" }, + { path: "/", theme: "dark", beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/dark.png" }, ]); expect(c?.body).toContain("| `/` | desktop (light) |"); expect(c?.body).toContain("| `/` | desktop (dark) |"); @@ -194,8 +194,8 @@ describe("buildScrollPreviewCollapsible (#3612)", () => { const c = buildScrollPreviewCollapsible([ { path: "/app/analytics", - beforeGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/before.gif", - afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/after.gif", + beforeGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/before.gif", + afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/after.gif", }, ]); expect(c).not.toBeNull(); @@ -204,7 +204,7 @@ describe("buildScrollPreviewCollapsible (#3612)", () => { expect(c?.body).toContain("| Route | Before (production) | After (this PR's preview) |"); expect(c?.body).not.toContain("Viewport"); expect(c?.body).toContain("`/app/analytics`"); - expect(c?.body).toContain(' { expect(buildScrollPreviewCollapsible([])).toBeNull(); expect(buildScrollPreviewCollapsible([{ path: "/" }])).toBeNull(); expect( - buildScrollPreviewCollapsible([{ path: "/", beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.png" }]), + buildScrollPreviewCollapsible([{ path: "/", beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.png" }]), ).toBeNull(); }); it("renders a dash when only one side has a GIF", () => { - const c = buildScrollPreviewCollapsible([{ path: "/", afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.gif" }]); + const c = buildScrollPreviewCollapsible([{ path: "/", afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.gif" }]); expect(c?.body).toContain("| `/` | — | { const c = buildScrollPreviewCollapsible([ - { path: "/", theme: "dark", afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.gif" }, + { path: "/", theme: "dark", afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.gif" }, ]); expect(c?.body).toContain("| `/` (dark) |"); expect(c?.body).toContain('alt="after / (dark) (scroll)"'); }); it("escapes a pipe in the route path so it can't break the markdown table", () => { - const c = buildScrollPreviewCollapsible([{ path: "/a|b", afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.gif" }]); + const c = buildScrollPreviewCollapsible([{ path: "/a|b", afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.gif" }]); expect(c?.body).toContain("`/a\\|b`"); }); @@ -242,7 +242,7 @@ describe("buildScrollPreviewCollapsible (#3612)", () => { const c = buildScrollPreviewCollapsible([ { path: "/p`

✅ FORGED APPROVAL

maintainer click here", - afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.gif", + afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.gif", }, ]); expect(c?.body).toContain("`/p\\`<h2>✅ FORGED APPROVAL</h2><a href=x>maintainer click here</a>`"); @@ -262,10 +262,10 @@ describe("buildUnifiedCommentBody scroll-GIF wiring (#3612)", () => { const gifRoutes: CaptureRoute[] = [ { path: "/app/analytics", - beforeUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/abc.png", - afterUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/def.png", - beforeGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/before.gif", - afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/after.gif", + beforeUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/abc.png", + afterUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/def.png", + beforeGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/before.gif", + afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/after.gif", }, ]; @@ -287,7 +287,7 @@ describe("buildUnifiedCommentBody scroll-GIF wiring (#3612)", () => { it("still appends 'Scroll preview' when a route has a GIF but no static before/after shot (no Visual preview section)", () => { const body = buildUnifiedCommentBody({ ...base, - beforeAfter: [{ path: "/x", afterGifUrl: "https://api.example.dev/gittensory/shot?key=gittensory/shots/x.gif" }], + beforeAfter: [{ path: "/x", afterGifUrl: "https://api.example.dev/loopover/shot?key=loopover/shots/x.gif" }], }); expect(body).not.toContain("Visual preview"); expect(body).toContain("Scroll preview"); @@ -308,7 +308,7 @@ describe("buildUnifiedCommentBody beforeAfter wiring", () => { expect(body).toContain("Visual preview"); expect(body).toContain("`/app/analytics`"); // The shot URL survives the renderer's escaping intact (markdown image syntax, no angle brackets). - expect(body).toContain("https://api.example.dev/gittensory/shot?key=gittensory/shots/abc.png"); + expect(body).toContain("https://api.example.dev/loopover/shot?key=loopover/shots/abc.png"); expect(body).not.toContain("<img"); }); diff --git a/test/unit/visual-findings.test.ts b/test/unit/visual-findings.test.ts index 50116c9ab7..6df3821816 100644 --- a/test/unit/visual-findings.test.ts +++ b/test/unit/visual-findings.test.ts @@ -15,14 +15,14 @@ import type { Advisory } from "../../src/types"; const changedRoute = (path: string): CaptureRoute => ({ path, - beforeUrl: `https://api.example.dev/gittensory/shot?key=before-${path}`, - afterUrl: `https://api.example.dev/gittensory/shot?key=after-${path}`, - diffUrl: `https://api.example.dev/gittensory/shot?key=diff-${path}`, + beforeUrl: `https://api.example.dev/loopover/shot?key=before-${path}`, + afterUrl: `https://api.example.dev/loopover/shot?key=after-${path}`, + diffUrl: `https://api.example.dev/loopover/shot?key=diff-${path}`, }); const unchangedRoute = (path: string): CaptureRoute => ({ path, - beforeUrl: `https://api.example.dev/gittensory/shot?key=before-${path}`, - afterUrl: `https://api.example.dev/gittensory/shot?key=after-${path}`, + beforeUrl: `https://api.example.dev/loopover/shot?key=before-${path}`, + afterUrl: `https://api.example.dev/loopover/shot?key=after-${path}`, }); const providerKey: AiReviewProviderKey = { provider: "anthropic", key: "sk-ant" }; diff --git a/test/unit/visual-vision-wiring.test.ts b/test/unit/visual-vision-wiring.test.ts index 5e2e28cf88..b97564d1d2 100644 --- a/test/unit/visual-vision-wiring.test.ts +++ b/test/unit/visual-vision-wiring.test.ts @@ -41,7 +41,7 @@ function anthropicOk(text: string) { } /** Routes fetch (shot PNGs) vs the AI provider call (api.anthropic.com) by URL, mirroring the shot-URL - * convention (`/gittensory/shot?key=...`) so a single fetch mock can serve both without a real network. */ + * convention (`/loopover/shot?key=...`) so a single fetch mock can serve both without a real network. */ function stubShotsAndProvider(providerResponseText: string | null) { vi.stubGlobal("fetch", vi.fn(async (input: RequestInfo | URL) => { const url = input.toString(); @@ -50,7 +50,7 @@ function stubShotsAndProvider(providerResponseText: string | null) { ? new Response("upstream error", { status: 500 }) : anthropicOk(providerResponseText); } - if (url.includes("/gittensory/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200, headers: { "content-type": "image/png" } }); + if (url.includes("/loopover/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200, headers: { "content-type": "image/png" } }); return new Response("not found", { status: 404 }); })); } @@ -119,7 +119,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: false, settings: byokSettings({ aiReviewByok: false }), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=b", afterUrl: "https://x/gittensory/shot?key=a" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=b", afterUrl: "https://x/loopover/shot?key=a" })], }); expect(adv.findings).toEqual([]); expect(fetchMock).not.toHaveBeenCalled(); @@ -139,7 +139,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", beforeUrl: "https://x/gittensory/shot?key=b", afterUrl: "https://x/gittensory/shot?key=a" })], + routes: [route({ path: "/app", beforeUrl: "https://x/loopover/shot?key=b", afterUrl: "https://x/loopover/shot?key=a" })], }); expect(adv.findings).toEqual([]); // The only network activity is the (unrelated) confirmed-official-miner identity check -- never a @@ -171,7 +171,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=b", afterUrl: "https://x/gittensory/shot?key=a" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=b", afterUrl: "https://x/loopover/shot?key=a" })], }); expect(adv.findings).toEqual([]); expect(fetchMock).not.toHaveBeenCalled(); @@ -190,7 +190,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings({ aiReviewByok: false }), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=b", afterUrl: "https://x/gittensory/shot?key=a" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=b", afterUrl: "https://x/loopover/shot?key=a" })], }); expect(adv.findings).toEqual([]); expect(fetchMock.mock.calls.map((c) => String(c[0]))).toEqual(["https://api.gittensor.io/miners"]); @@ -210,7 +210,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: false, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=b", afterUrl: "https://x/gittensory/shot?key=a" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=b", afterUrl: "https://x/loopover/shot?key=a" })], }); expect(adv.findings).toEqual([]); expect(fetchMock.mock.calls.map((c) => String(c[0]))).toEqual(["https://api.gittensor.io/miners"]); @@ -230,7 +230,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings({ aiReviewProvider: "openai" }), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=b", afterUrl: "https://x/gittensory/shot?key=a" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=b", afterUrl: "https://x/loopover/shot?key=a" })], }); expect(adv.findings).toEqual([]); expect(fetchMock.mock.calls.map((c) => String(c[0]))).toEqual(["https://api.gittensor.io/miners"]); @@ -258,9 +258,9 @@ describe("runVisualVisionForAdvisory", () => { routes: [ route({ path: "/app", - diffUrl: "https://x/gittensory/shot?key=diff", - beforeUrl: "https://x/gittensory/shot?key=before", - afterUrl: "https://x/gittensory/shot?key=after", + diffUrl: "https://x/loopover/shot?key=diff", + beforeUrl: "https://x/loopover/shot?key=before", + afterUrl: "https://x/loopover/shot?key=after", }), ], }); @@ -303,9 +303,9 @@ describe("runVisualVisionForAdvisory", () => { routes: [ route({ path: "/app", - diffUrl: "https://x/gittensory/shot?key=diff", - beforeUrl: "https://x/gittensory/shot?key=before", - afterUrl: "https://x/gittensory/shot?key=after", + diffUrl: "https://x/loopover/shot?key=diff", + beforeUrl: "https://x/loopover/shot?key=before", + afterUrl: "https://x/loopover/shot?key=after", }), ], }); @@ -329,11 +329,11 @@ describe("runVisualVisionForAdvisory", () => { routes: [ route({ path: "/app", - diffUrl: "https://x/gittensory/shot?key=diff-desktop", - beforeUrl: "https://x/gittensory/shot?key=before-desktop", - afterUrl: "https://x/gittensory/shot?key=after-desktop", - beforeUrlMobile: "https://x/gittensory/shot?key=before-mobile", - afterUrlMobile: "https://x/gittensory/shot?key=after-mobile", + diffUrl: "https://x/loopover/shot?key=diff-desktop", + beforeUrl: "https://x/loopover/shot?key=before-desktop", + afterUrl: "https://x/loopover/shot?key=after-desktop", + beforeUrlMobile: "https://x/loopover/shot?key=before-mobile", + afterUrlMobile: "https://x/loopover/shot?key=after-mobile", }), ], }); @@ -356,7 +356,7 @@ describe("runVisualVisionForAdvisory", () => { const url = input.toString(); requestedUrls.push(url); if (url === "https://api.anthropic.com/v1/messages") return anthropicOk(findingsResponse([])); - if (url.includes("/gittensory/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200 }); + if (url.includes("/loopover/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200 }); return new Response("not found", { status: 404 }); })); const adv = findingsHolder(); @@ -371,18 +371,18 @@ describe("runVisualVisionForAdvisory", () => { routes: [ route({ path: "/app", - diffUrlMobile: "https://x/gittensory/shot?key=diff-mobile", - beforeUrl: "https://x/gittensory/shot?key=before-desktop", - afterUrl: "https://x/gittensory/shot?key=after-desktop", - beforeUrlMobile: "https://x/gittensory/shot?key=before-mobile", - afterUrlMobile: "https://x/gittensory/shot?key=after-mobile", + diffUrlMobile: "https://x/loopover/shot?key=diff-mobile", + beforeUrl: "https://x/loopover/shot?key=before-desktop", + afterUrl: "https://x/loopover/shot?key=after-desktop", + beforeUrlMobile: "https://x/loopover/shot?key=before-mobile", + afterUrlMobile: "https://x/loopover/shot?key=after-mobile", }), ], }); - expect(requestedUrls).toContain("https://x/gittensory/shot?key=before-mobile"); - expect(requestedUrls).toContain("https://x/gittensory/shot?key=after-mobile"); - expect(requestedUrls).not.toContain("https://x/gittensory/shot?key=before-desktop"); - expect(requestedUrls).not.toContain("https://x/gittensory/shot?key=after-desktop"); + expect(requestedUrls).toContain("https://x/loopover/shot?key=before-mobile"); + expect(requestedUrls).toContain("https://x/loopover/shot?key=after-mobile"); + expect(requestedUrls).not.toContain("https://x/loopover/shot?key=before-desktop"); + expect(requestedUrls).not.toContain("https://x/loopover/shot?key=after-desktop"); }); it("skips a route whose confirmed-changed viewport is missing its before/after shot URLs", async () => { @@ -399,7 +399,7 @@ describe("runVisualVisionForAdvisory", () => { settings: byokSettings(), advisory: adv, // diffUrl set (confirmed changed) but no beforeUrl/afterUrl at all -- degrades to "no images from this route". - routes: [route({ path: "/broken", diffUrl: "https://x/gittensory/shot?key=diff" })], + routes: [route({ path: "/broken", diffUrl: "https://x/loopover/shot?key=diff" })], }); expect(adv.findings).toEqual([]); }); @@ -411,7 +411,7 @@ describe("runVisualVisionForAdvisory", () => { const url = input.toString(); if (url === "https://api.anthropic.com/v1/messages") return anthropicOk(findingsResponse([])); if (url.includes("key=before")) return new Response("not found", { status: 404 }); - if (url.includes("/gittensory/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200 }); + if (url.includes("/loopover/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200 }); return new Response("not found", { status: 404 }); })); const adv = findingsHolder(); @@ -423,7 +423,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })], }); // The "after" image alone was enough to attempt the call; the model returned no findings either way. expect(adv.findings).toEqual([]); @@ -450,7 +450,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })], }); expect(providerCalls).toEqual([]); expect(adv.findings).toEqual([]); @@ -469,7 +469,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })], }); expect(adv.findings).toEqual([]); }); @@ -487,7 +487,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })], }); expect(adv.findings).toEqual([]); // A genuine provider failure is a distinct "error" status (not "ok") -- but it's still a real request @@ -518,7 +518,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })], }); expect(adv.findings).toEqual([]); }); @@ -539,7 +539,7 @@ describe("runVisualVisionForAdvisory", () => { confirmedContributor: true, settings: byokSettings(), advisory: adv, - routes: [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })], + routes: [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })], }), ).resolves.toBeUndefined(); expect(adv.findings).toEqual([]); @@ -552,13 +552,13 @@ describe("runVisualVisionForAdvisory", () => { function stubShots() { vi.stubGlobal("fetch", vi.fn(async (input: RequestInfo | URL) => { const url = input.toString(); - if (url.includes("/gittensory/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200, headers: { "content-type": "image/png" } }); + if (url.includes("/loopover/shot")) return new Response(new Uint8Array([1, 2, 3]), { status: 200, headers: { "content-type": "image/png" } }); return new Response("not found", { status: 404 }); })); } function selfHostVisionRoutes() { - return [route({ path: "/app", diffUrl: "https://x/gittensory/shot?key=diff", beforeUrl: "https://x/gittensory/shot?key=before", afterUrl: "https://x/gittensory/shot?key=after" })]; + return [route({ path: "/app", diffUrl: "https://x/loopover/shot?key=diff", beforeUrl: "https://x/loopover/shot?key=before", afterUrl: "https://x/loopover/shot?key=after" })]; } describe("runVisualVisionForAdvisory: self-host local vision provider (#4335)", () => { diff --git a/test/unit/visual-wire.test.ts b/test/unit/visual-wire.test.ts index 98cbdf7ee1..3b40a6f7f9 100644 --- a/test/unit/visual-wire.test.ts +++ b/test/unit/visual-wire.test.ts @@ -24,7 +24,7 @@ describe("isScreenshotsEnabled", () => { // `features.screenshots` may opt an allowlisted repo out, but it must not let an unallowlisted repo bypass the // operator-controlled LOOPOVER_REVIEW_REPOS rollout boundary. describe("screenshots converged-feature activation (env flag AND repo cutover allowlist, with manifest opt-out)", () => { - const repo = "JSONbored/gittensory"; + const repo = "JSONbored/loopover"; const noOverride: Pick = { features: { present: false, rag: null, reputation: null, safety: null, grounding: null, e2eTests: null, screenshots: null, improvementSignal: null, amsReputationBridge: null }, }; @@ -45,7 +45,7 @@ describe("screenshots converged-feature activation (env flag AND repo cutover al }); it("matches the repo case-insensitively within the allowlist", () => { - expect(resolveConvergedFeature({ LOOPOVER_REVIEW_SCREENSHOTS: "on", LOOPOVER_REVIEW_REPOS: "jsonbored/GITTENSORY" } as Env, noOverride, "screenshots", repo)).toBe(true); + expect(resolveConvergedFeature({ LOOPOVER_REVIEW_SCREENSHOTS: "on", LOOPOVER_REVIEW_REPOS: "jsonbored/LOOPOVER" } as Env, noOverride, "screenshots", repo)).toBe(true); }); it("does not let a `features.screenshots` override bypass the repo allowlist", () => { diff --git a/test/unit/weekly-value-report.test.ts b/test/unit/weekly-value-report.test.ts index 32c6c0166a..3bfc90405d 100644 --- a/test/unit/weekly-value-report.test.ts +++ b/test/unit/weekly-value-report.test.ts @@ -22,7 +22,7 @@ describe("weekly value reports", () => { generatedAt: "2026-06-01T12:00:00.000Z", variant: "public", days: 7, - repositories: [repo("JSONbored/gittensory", true, true), repo("entrius/allways-ui", true, false)], + repositories: [repo("JSONbored/loopover", true, true), repo("entrius/allways-ui", true, false)], installations: [installation(1)], health: [health(1, "healthy")], registry: registry(["/Users/operator/private-registry.json"]), @@ -35,7 +35,7 @@ describe("weekly value reports", () => { activeActors: 3, activeRepos: 2, repos: [ - { key: "JSONbored/gittensory", count: 6 }, + { key: "JSONbored/loopover", count: 6 }, { key: "entrius/allways-ui", count: 4 }, ], events: [ @@ -54,7 +54,7 @@ describe("weekly value reports", () => { totalEvents: 8, activeActors: 2, activeRepos: 1, - repos: [{ key: "JSONbored/gittensory", count: 8 }], + repos: [{ key: "JSONbored/loopover", count: 8 }], events: [ { eventName: "local_branch_analysis_completed", count: 2 }, { eventName: "agent_pr_packet_completed", count: 2 }, @@ -109,7 +109,7 @@ describe("weekly value reports", () => { generatedAt: "2026-06-01T12:00:00.000Z", variant: "operator", days: 7, - repositories: [repo("JSONbored/gittensory", true, true)], + repositories: [repo("JSONbored/loopover", true, true)], installations: [installation(1)], health: [health(1, "needs_attention")], registry: registry(["source mirror stale", "wallet hotkey reward-estimate trust-score public score prediction private scoreability farming"]), @@ -180,7 +180,7 @@ describe("weekly value reports", () => { generatedAt: "2026-06-01T12:00:00.000Z", variant: "operator", days: 7, - repositories: [repo("JSONbored/gittensory", true, true)], + repositories: [repo("JSONbored/loopover", true, true)], installations: [installation(1)], health: [health(1, "healthy")], registry: registry([]), @@ -217,7 +217,7 @@ describe("weekly value reports", () => { generatedAt: "2026-06-01T12:00:00.000Z", variant: "operator", days: 7, - repositories: [repo("JSONbored/gittensory", true, true)], + repositories: [repo("JSONbored/loopover", true, true)], installations: [installation(1)], health: [health(1, "healthy")], registry: registry([]), @@ -251,7 +251,7 @@ describe("weekly value reports", () => { generatedAt: "2026-06-01T12:00:00.000Z", variant: "operator", days: 7, - repositories: [repo("JSONbored/gittensory", true, true)], + repositories: [repo("JSONbored/loopover", true, true)], installations: [installation(1)], health: [health(1, "healthy")], registry: registry([]), @@ -281,14 +281,14 @@ describe("weekly value reports", () => { const report = buildWeeklyValueReport({ generatedAt: "2026-06-01T12:00:00.000Z", days: 1, - repositories: [repo("JSONbored/gittensory", true, true)], + repositories: [repo("JSONbored/loopover", true, true)], installations: [installation(1)], health: [health(1, "healthy")], registry: registry([]), scoring: scoring([]), upstreamDrift: upstream({ status: "current", openReportCount: 0 }), usageSummary: usageSummary({ totalEvents: 1, activeActors: 1 }), - usageRollups: [rollup("2026-05-31", { totalEvents: 1, activeActors: 1, activeRepos: 1, repos: [{ key: "JSONbored/gittensory", count: 1 }], events: [], surfaces: [], commands: [], tools: [] })], + usageRollups: [rollup("2026-05-31", { totalEvents: 1, activeActors: 1, activeRepos: 1, repos: [{ key: "JSONbored/loopover", count: 1 }], events: [], surfaces: [], commands: [], tools: [] })], usageRollupStatus: rollupStatus({ status: "ready" }), }); diff --git a/test/workers/worker-runtime.test.ts b/test/workers/worker-runtime.test.ts index b40dca1273..ef871843ae 100644 --- a/test/workers/worker-runtime.test.ts +++ b/test/workers/worker-runtime.test.ts @@ -6,16 +6,16 @@ import { isCloudflareWorkerRuntime } from "../../src/api/routes"; describe("worker runtime", () => { it("serves public metadata and keeps private routes locked in the Workers runtime", async () => { const ctx = createExecutionContext(); - const health = await worker.fetch(new Request("https://gittensory.test/health"), {} as Env, ctx); + const health = await worker.fetch(new Request("https://loopover.test/health"), {} as Env, ctx); await waitOnExecutionContext(ctx); expect(health.status).toBe(200); await expect(health.json()).resolves.toMatchObject({ status: "ok", service: "loopover-api" }); - const openApi = await worker.fetch(new Request("https://gittensory.test/openapi.json"), {} as Env, createExecutionContext()); + const openApi = await worker.fetch(new Request("https://loopover.test/openapi.json"), {} as Env, createExecutionContext()); expect(openApi.status).toBe(200); await expect(openApi.json()).resolves.toMatchObject({ info: { title: "LoopOver API" } }); - const mcp = await worker.fetch(new Request("https://gittensory.test/mcp", { method: "POST" }), {} as Env, createExecutionContext()); + const mcp = await worker.fetch(new Request("https://loopover.test/mcp", { method: "POST" }), {} as Env, createExecutionContext()); expect(mcp.status).toBe(401); }); @@ -25,7 +25,7 @@ describe("worker runtime", () => { }); it("still serves a normal response when WORKER_SENTRY_DSN is unset -- the Sentry middleware being registered must not itself break requests", async () => { - const res = await worker.fetch(new Request("https://gittensory.test/health"), { WORKER_SENTRY_DSN: undefined } as unknown as Env, createExecutionContext()); + const res = await worker.fetch(new Request("https://loopover.test/health"), { WORKER_SENTRY_DSN: undefined } as unknown as Env, createExecutionContext()); expect(res.status).toBe(200); }); });