From 2b48186bccf02658c91ea476cdce6c5c49f9c79e Mon Sep 17 00:00:00 2001 From: JSONbored <49853598+JSONbored@users.noreply.github.com> Date: Tue, 14 Jul 2026 05:39:06 -0700 Subject: [PATCH] fix(rebrand): full-cutover rename remaining internal gittensory runtime identifiers Phase 8a of the rebrand epic (#5705): renames functional runtime identifiers that survived Phases 1-7 because they weren't caught by prior sed/perl sweeps (bare positional-argument actor strings, object keys, Sentry context/fingerprint names, OTel span attributes, HKDF/hash namespace strings, extension message-passing protocol strings and CSS class names, and the miner's worktree branch prefix/subdir). Also fixes two regressions/drift discovered along the way: - apps/loopover-extension/content.js's data-attribute duplicate-mount guard was querying the old gittensory-prefixed attribute name after Phase 6 renamed the setter, silently disabling the guard. - packages/loopover-miner/docs/env-reference.md's checked-in title was stale against its Phase-5-fixed generator. - apps/loopover-ui's docs.gittensory-commands.tsx route file (and its footer/nav links) were never renamed even though the @loopover mention-command docs it covers already were (Phase 2), leaving a stale /docs/gittensory-commands URL in every bot comment footer. Deliberately NOT touched: the real (unrenamed) JSONbored/gittensory GitHub/Sentry-project references, GITTENSORY_LEGACY_* check-run constants, the already-decided gittensory-selfhost container-image legacy alias, the PUBLIC_SITE_ORIGIN_ALIASES domain alias, and the .gittensory-miner.yml per-repo config filename (separate, large, deferred to its own follow-up). --- apps/loopover-extension/background.js | 4 +- apps/loopover-extension/content.js | 44 ++++++------ apps/loopover-extension/styles.css | 72 +++++++++---------- apps/loopover-miner-extension/background.js | 10 +-- apps/loopover-miner-extension/content.js | 8 +-- .../opportunity-badge.js | 12 ++-- apps/loopover-miner-extension/options.js | 2 +- apps/loopover-miner-extension/styles.css | 20 +++--- .../test/background.test.ts | 4 +- apps/loopover-ui/public/openapi.json | 2 +- apps/loopover-ui/src/lib/analytics-window.ts | 2 +- apps/loopover-ui/src/lib/api/session.ts | 2 +- apps/loopover-ui/src/routeTree.gen.ts | 42 +++++------ apps/loopover-ui/src/routes/docs.index.tsx | 2 +- ...ommands.tsx => docs.loopover-commands.tsx} | 6 +- .../src/routes/docs.maintainer-workflow.tsx | 2 +- .../src/miner/worktree-plan.ts | 4 +- scripts/check-docs-drift.mjs | 2 +- scripts/mcp-release-core.mjs | 2 +- src/db/repositories.ts | 8 +-- src/github/client.ts | 2 +- src/github/e2e-test-commit.ts | 2 +- src/github/footer.ts | 4 +- src/github/repo-doc-pr.ts | 2 +- src/openapi/spec.ts | 2 +- src/queue/dlq.ts | 2 +- src/queue/processors.ts | 52 +++++++------- src/queue/review-evasion.ts | 32 ++++----- src/review/fix-handoff-render.ts | 2 +- src/review/maintainer-recap-wire.ts | 2 +- src/review/parity.ts | 2 +- src/review/stats.ts | 2 +- src/review/unified-comment-bridge.ts | 2 +- src/selfhost/otel.ts | 4 +- src/selfhost/qdrant-vectorize.ts | 2 +- src/selfhost/review-tracing.ts | 6 +- src/selfhost/sentry.ts | 18 ++--- src/services/agent-action-executor.ts | 4 +- src/services/operator-dashboard.ts | 2 +- src/signals/engine.ts | 2 +- src/upstream/unmodeled-scoring-drift.ts | 2 +- src/utils/crypto.ts | 2 +- test/unit/agent-execution.test.ts | 4 +- test/unit/check-docs-drift-script.test.ts | 2 +- test/unit/db-parsers.test.ts | 24 +++---- test/unit/e2e-test-commit.test.ts | 2 +- test/unit/fix-handoff-collapsible.test.ts | 2 +- test/unit/fix-handoff-render.test.ts | 2 +- test/unit/gate-outcome-audit-rollups.test.ts | 8 +-- test/unit/github-commands.test.ts | 6 +- test/unit/local-write-tools.test.ts | 2 +- test/unit/mcp-automation-state.test.ts | 8 +-- test/unit/mcp-release.test.ts | 6 +- test/unit/miner-attempt-cli.test.ts | 8 +-- test/unit/miner-attempt-input-builder.test.ts | 12 ++-- test/unit/miner-attempt-worktree.test.ts | 4 +- test/unit/miner-extension-live-fetch.test.ts | 4 +- test/unit/miner-worktree-pool.test.ts | 4 +- test/unit/notify-pagerduty.test.ts | 2 +- test/unit/operator-dashboard.test.ts | 4 +- test/unit/parity.test.ts | 26 +++---- test/unit/queue-2.test.ts | 4 +- test/unit/repo-doc-pr.test.ts | 10 +-- test/unit/routes-agent-approval.test.ts | 18 ++--- .../routes-gate-outcome-breakdown.test.ts | 16 ++--- test/unit/selfhost-otel.test.ts | 12 ++-- test/unit/selfhost-qdrant-vectorize.test.ts | 6 +- test/unit/selfhost-sentry.test.ts | 58 +++++++-------- test/unit/unified-comment-parity.test.ts | 2 +- 69 files changed, 328 insertions(+), 328 deletions(-) rename apps/loopover-ui/src/routes/{docs.gittensory-commands.tsx => docs.loopover-commands.tsx} (96%) diff --git a/apps/loopover-extension/background.js b/apps/loopover-extension/background.js index 6266b1077f..070a794256 100644 --- a/apps/loopover-extension/background.js +++ b/apps/loopover-extension/background.js @@ -1,8 +1,8 @@ import { logoutExtensionSession, requestPullContext } from "./auth.js"; chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => { - if (!message || !["gittensory:pull-context", "gittensory:logout"].includes(message.type)) return false; - const task = message.type === "gittensory:logout" ? logoutExtensionSession() : requestPullContext(message); + if (!message || !["loopover:pull-context", "loopover:logout"].includes(message.type)) return false; + const task = message.type === "loopover:logout" ? logoutExtensionSession() : requestPullContext(message); void task.then((payload) => sendResponse({ ok: true, payload })).catch((error) => sendResponse({ ok: false, error: error instanceof Error ? error.message : String(error) })); return true; }); diff --git a/apps/loopover-extension/content.js b/apps/loopover-extension/content.js index 001418500f..5cef4120a7 100644 --- a/apps/loopover-extension/content.js +++ b/apps/loopover-extension/content.js @@ -19,26 +19,26 @@ function matchPullRequestTarget(pathname) { } function mountOverlay(target) { - if (document.querySelector("[data-gittensory-pr-context]")) return; + if (document.querySelector("[data-loopover-pr-context]")) return; const container = document.createElement("aside"); const host = findPullRequestSidebar(); - container.className = `gittensory-overlay ${host ? "gittensory-overlay--sidebar" : "gittensory-overlay--floating"}`; + container.className = `loopover-overlay ${host ? "loopover-overlay--sidebar" : "loopover-overlay--floating"}`; container.dataset.loopoverPrContext = "true"; container.innerHTML = ` -
${escapeOpportunityHtml(badge.why)}
+${escapeOpportunityHtml(badge.why)}
${ lastSyncedLabel - ? `${escapeOpportunityHtml(lastSyncedLabel)}
` + ? `${escapeOpportunityHtml(lastSyncedLabel)}
` : "" } `; diff --git a/apps/loopover-miner-extension/options.js b/apps/loopover-miner-extension/options.js index 8051fb37c5..b674b36169 100644 --- a/apps/loopover-miner-extension/options.js +++ b/apps/loopover-miner-extension/options.js @@ -43,7 +43,7 @@ async function removeLegacyDiscoveryIndexUrl() { // Mirrors background.js's own literal (#4859) -- these classic (non-ESM-importing) extension scripts share a // message-type "protocol" via matching string literals, the same convention content.js already uses for // ISSUE_CONTEXT_MESSAGE, not a cross-file import. -const SYNC_RANKED_CANDIDATES_MESSAGE = "gittensory-miner:sync-ranked-candidates"; +const SYNC_RANKED_CANDIDATES_MESSAGE = "loopover-miner:sync-ranked-candidates"; const DEFAULT_MINER_UI_URL = "http://localhost:5174"; function normalizeMinerUiUrl(text) { diff --git a/apps/loopover-miner-extension/styles.css b/apps/loopover-miner-extension/styles.css index d5e30515f4..5d34ec6baa 100644 --- a/apps/loopover-miner-extension/styles.css +++ b/apps/loopover-miner-extension/styles.css @@ -1,4 +1,4 @@ -.gittensory-miner-opportunity-badge { +.loopover-miner-opportunity-badge { border: 1px solid rgba(126, 231, 188, 0.35); border-radius: 8px; background: rgba(15, 17, 23, 0.96); @@ -8,7 +8,7 @@ padding: 12px; } -.gittensory-miner-opportunity-badge--floating { +.loopover-miner-opportunity-badge--floating { position: fixed; right: 16px; bottom: 16px; @@ -17,14 +17,14 @@ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35); } -.gittensory-miner-opportunity-badge__header { +.loopover-miner-opportunity-badge__header { align-items: center; display: flex; gap: 8px; margin-bottom: 8px; } -.gittensory-miner-opportunity-badge__mark { +.loopover-miner-opportunity-badge__mark { align-items: center; background: #7ee7bc; border-radius: 999px; @@ -37,33 +37,33 @@ width: 20px; } -.gittensory-miner-opportunity-badge__read-only { +.loopover-miner-opportunity-badge__read-only { color: rgba(244, 247, 245, 0.55); font-size: 11px; margin-left: auto; } -.gittensory-miner-opportunity-badge__score { +.loopover-miner-opportunity-badge__score { align-items: baseline; display: flex; gap: 8px; margin-bottom: 6px; } -.gittensory-miner-opportunity-badge__score strong { +.loopover-miner-opportunity-badge__score strong { font-size: 15px; } -.gittensory-miner-opportunity-badge__score span { +.loopover-miner-opportunity-badge__score span { color: rgba(244, 247, 245, 0.72); } -.gittensory-miner-opportunity-badge__why { +.loopover-miner-opportunity-badge__why { color: rgba(244, 247, 245, 0.78); margin: 0; } -.gittensory-miner-opportunity-badge__synced { +.loopover-miner-opportunity-badge__synced { color: rgba(244, 247, 245, 0.55); font-size: 11px; margin: 6px 0 0; diff --git a/apps/loopover-miner-extension/test/background.test.ts b/apps/loopover-miner-extension/test/background.test.ts index 1c9d8b00af..c39ba309d6 100644 --- a/apps/loopover-miner-extension/test/background.test.ts +++ b/apps/loopover-miner-extension/test/background.test.ts @@ -253,10 +253,10 @@ describe("background service worker", () => { fetchImpl: jsonFetch(200, { candidates: [] }), }); - expect(mod.alarmCreateCalls[0]?.[0]).toBe("gittensory-miner:sync-ranked-candidates"); + expect(mod.alarmCreateCalls[0]?.[0]).toBe("loopover-miner:sync-ranked-candidates"); mod.dispatchStartup(); mod.dispatchInstalled(); - mod.dispatchAlarm("gittensory-miner:sync-ranked-candidates"); + mod.dispatchAlarm("loopover-miner:sync-ranked-candidates"); mod.dispatchAlarm("other-alarm"); await flush(); expect(mod.localSetCalls.length).toBeGreaterThan(0); diff --git a/apps/loopover-ui/public/openapi.json b/apps/loopover-ui/public/openapi.json index 8d1ffc2e0a..293bb3a837 100644 --- a/apps/loopover-ui/public/openapi.json +++ b/apps/loopover-ui/public/openapi.json @@ -17161,7 +17161,7 @@ "schema": { "type": "string", "minLength": 1, - "example": "gittensory" + "example": "loopover" }, "required": true, "description": "Repository name", diff --git a/apps/loopover-ui/src/lib/analytics-window.ts b/apps/loopover-ui/src/lib/analytics-window.ts index 9b4a275fd4..41176da577 100644 --- a/apps/loopover-ui/src/lib/analytics-window.ts +++ b/apps/loopover-ui/src/lib/analytics-window.ts @@ -1,7 +1,7 @@ export const ANALYTICS_WINDOW_OPTIONS = [7, 30, 90] as const; export type AnalyticsWindowDays = (typeof ANALYTICS_WINDOW_OPTIONS)[number]; export const DEFAULT_ANALYTICS_WINDOW_DAYS: AnalyticsWindowDays = 7; -export const ANALYTICS_WINDOW_STORAGE_KEY = "gittensory.analytics.windowDays"; +export const ANALYTICS_WINDOW_STORAGE_KEY = "loopover.analytics.windowDays"; export function parseAnalyticsWindowDays(value: unknown): AnalyticsWindowDays { const numeric = Number(value); diff --git a/apps/loopover-ui/src/lib/api/session.ts b/apps/loopover-ui/src/lib/api/session.ts index 85452a0fca..9704ec3c16 100644 --- a/apps/loopover-ui/src/lib/api/session.ts +++ b/apps/loopover-ui/src/lib/api/session.ts @@ -45,7 +45,7 @@ type AuthState = type SessionResponse = (AppSession & { status: "authenticated" }) | { status: "signed_out" }; -const SESSION_CHANGED_EVENT = "gittensory.session.changed"; +const SESSION_CHANGED_EVENT = "loopover.session.changed"; async function fetchBrowserSession(): PromiseFor syntax, default roles, PR action verbs, and the gate vs auto-review boundary, see the{" "} - @loopover command reference. + @loopover command reference.