From 47097392b2e2b57031c4ea04e473a3245c27e75a Mon Sep 17 00:00:00 2001 From: JSONbored <49853598+JSONbored@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:45:14 -0700 Subject: [PATCH 1/2] refactor(extension): rename browser extension manifests and API origin to loopover MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renames both apps/gittensory-extension and apps/gittensory-miner-extension manifests' name/description/action.default_title, the maintainer overlay's default API origin (now the live api.loopover.ai custom-domain route on the same Worker), the built extension zip's filename/path, and the download link on the site's /extension page. Updates the .gitignore entry, the production smoke-test target, and a stale CI-comment reference in lockstep so nothing disagrees with the renamed artifact. Deliberately unchanged: directory names (apps/gittensory-extension/, apps/gittensory-miner-extension/ — npm-package-adjacent, deferred), the gts_ token wire-format prefix and GITTENSORY_SESSION_PATTERN identifier, the real jsonbored/gittensory GitHub repo-slug demo string, and the site's own domain/API-origin env vars (a separate, not-yet-cut-over concern). Closes #5329. --- .github/workflows/ui-preview-deploy.yml | 2 +- .gitignore | 2 +- apps/gittensory-extension/auth.js | 10 +++++----- apps/gittensory-extension/manifest.json | 8 ++++---- apps/gittensory-miner-extension/manifest.json | 4 ++-- apps/gittensory-ui/src/routes/extension.tsx | 16 ++++++++-------- scripts/build-extension.mjs | 2 +- scripts/smoke-production.mjs | 2 +- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ui-preview-deploy.yml b/.github/workflows/ui-preview-deploy.yml index 8984938422..c590d5cac2 100644 --- a/.github/workflows/ui-preview-deploy.yml +++ b/.github/workflows/ui-preview-deploy.yml @@ -100,7 +100,7 @@ jobs: test -d client || { echo "::error::artifact missing client/ assets dir"; exit 1; } # 3) Allowlist file extensions — fail on anything that isn't a normal web/build output (blocks # smuggled scripts/binaries). A few extensionless CF asset files are explicitly permitted. - # `zip` covers the served downloads (e.g. /downloads/gittensory-extension.zip) — a passive + # `zip` covers the served downloads (e.g. /downloads/loopover-extension.zip) — a passive # static asset wrangler only uploads (never executes), so allowing it doesn't run fork code. unexpected="$(find . -regextype posix-extended -type f \ -not -iregex '.*\.(mjs|js|cjs|map|json|css|html?|txt|svg|png|jpe?g|gif|webp|avif|ico|bmp|woff2?|ttf|otf|eot|wasm|xml|webmanifest|md|csv|zip|wgsl|glb|gltf)$' \ diff --git a/.gitignore b/.gitignore index e10fde5435..faf6ce49fa 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,7 @@ coverage/ *.tsbuildinfo site/.vitepress/cache/ !migrations/*.sql -apps/gittensory-ui/public/downloads/gittensory-extension.zip +apps/gittensory-ui/public/downloads/loopover-extension.zip .worker-configuration.gen-check.d.ts # Ad-hoc operator backup files (e.g. `cp file.yml file.yml.bak-notes-20260707`) -- general # catch-alls so a stray manual snapshot never dirties `git status` on a Git-backed self-host diff --git a/apps/gittensory-extension/auth.js b/apps/gittensory-extension/auth.js index bc5d7b8294..b4913736ac 100644 --- a/apps/gittensory-extension/auth.js +++ b/apps/gittensory-extension/auth.js @@ -1,6 +1,6 @@ -export const DEFAULT_API_ORIGIN = "https://gittensory-api.aethereal.dev"; -export const EXTENSION_SESSION_REQUIRED_MESSAGE = "Set an extension session token in Gittensory extension options."; -export const EXTENSION_SESSION_EXPIRED_MESSAGE = "Extension session expired or revoked. Create a fresh extension token in Gittensory."; +export const DEFAULT_API_ORIGIN = "https://api.loopover.ai"; +export const EXTENSION_SESSION_REQUIRED_MESSAGE = "Set an extension session token in LoopOver extension options."; +export const EXTENSION_SESSION_EXPIRED_MESSAGE = "Extension session expired or revoked. Create a fresh extension token in LoopOver."; export const STORAGE_KEYS = { apiOrigin: "apiOrigin", @@ -50,10 +50,10 @@ export function validateExtensionSessionToken(value) { const token = String(value ?? "").trim(); if (!token) throw new Error(EXTENSION_SESSION_REQUIRED_MESSAGE); if (looksLikeGitHubPersonalAccessToken(token)) { - throw new Error("GitHub personal access tokens are not accepted. Create a Gittensory extension token instead."); + throw new Error("GitHub personal access tokens are not accepted. Create a LoopOver extension token instead."); } if (!GITTENSORY_SESSION_PATTERN.test(token)) { - throw new Error("Extension tokens must be Gittensory session tokens that start with gts_."); + throw new Error("Extension tokens must be LoopOver session tokens that start with gts_."); } return token; } diff --git a/apps/gittensory-extension/manifest.json b/apps/gittensory-extension/manifest.json index bcd429f9af..55671b2e48 100644 --- a/apps/gittensory-extension/manifest.json +++ b/apps/gittensory-extension/manifest.json @@ -1,10 +1,10 @@ { "manifest_version": 3, - "name": "Gittensory Maintainer Overlay", - "description": "Private Gittensory pull request context on GitHub.", + "name": "LoopOver Maintainer Overlay", + "description": "Private LoopOver pull request context on GitHub.", "version": "0.1.0", "permissions": ["storage"], - "host_permissions": ["https://github.com/*", "https://gittensory-api.aethereal.dev/*"], + "host_permissions": ["https://github.com/*", "https://api.loopover.ai/*"], "background": { "service_worker": "background.js", "type": "module" @@ -19,6 +19,6 @@ ], "options_page": "options.html", "action": { - "default_title": "Gittensory" + "default_title": "LoopOver" } } diff --git a/apps/gittensory-miner-extension/manifest.json b/apps/gittensory-miner-extension/manifest.json index 5dca73f687..2e3be765f1 100644 --- a/apps/gittensory-miner-extension/manifest.json +++ b/apps/gittensory-miner-extension/manifest.json @@ -1,6 +1,6 @@ { "manifest_version": 3, - "name": "Gittensory Miner Opportunity", + "name": "LoopOver Miner Opportunity", "description": "Contributor-facing GitHub issue opportunity signals from a locally configured miner plane.", "version": "0.1.0", "permissions": ["storage"], @@ -19,6 +19,6 @@ ], "options_page": "options.html", "action": { - "default_title": "Gittensory Miner" + "default_title": "LoopOver Miner" } } diff --git a/apps/gittensory-ui/src/routes/extension.tsx b/apps/gittensory-ui/src/routes/extension.tsx index 4e489c0f6d..75f26507a2 100644 --- a/apps/gittensory-ui/src/routes/extension.tsx +++ b/apps/gittensory-ui/src/routes/extension.tsx @@ -14,13 +14,13 @@ import { cn } from "@/lib/utils"; export const Route = createFileRoute("/extension")({ head: () => ({ meta: [ - { title: "Browser extension — Gittensory" }, + { title: "Browser extension — LoopOver" }, { name: "description", content: "Private maintainer overlays on github.com. Never shown to PR authors or the public — reviewability context where you already work.", }, - { property: "og:title", content: "Gittensory · maintainer browser extension" }, + { property: "og:title", content: "LoopOver · maintainer browser extension" }, { property: "og:description", content: @@ -44,13 +44,13 @@ function ExtensionPage() { Maintainer overlays on the GitHub you already use.

- The Gittensory browser extension surfaces miner context, scoreability projections, and + The LoopOver browser extension surfaces miner context, scoreability projections, and reviewability hints on PR pages — visible only to the maintainer running it. Nothing is injected into the page or shown to the PR author.

@@ -104,9 +104,9 @@ function ExtensionPage() {
Privacy posture. The extension does not read the PR diff, post comments, - or open issues. It calls the same private Gittensory API endpoints you already use, then + or open issues. It calls the same private LoopOver API endpoints you already use, then renders the response in your local DOM. Its permission boundary is storage, GitHub PR - pages, and the configured Gittensory API origin. Extension tokens are scoped to pull + pages, and the configured LoopOver API origin. Extension tokens are scoped to pull context, stored in browser local storage rather than sync storage, and cleared on logout, expiry, or revoked-session responses. GitHub personal access tokens are rejected. @@ -230,7 +230,7 @@ function OverlayDemo() {
- {/* gittensory overlay panel */} + {/* loopover overlay panel */} G - gittensory overlay + loopover overlay you only diff --git a/scripts/build-extension.mjs b/scripts/build-extension.mjs index c84a5c47be..a6ae4ca125 100644 --- a/scripts/build-extension.mjs +++ b/scripts/build-extension.mjs @@ -5,7 +5,7 @@ import { fileURLToPath } from "node:url"; const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const source = resolve(root, "apps/gittensory-extension"); const outDir = resolve(root, "apps/gittensory-extension/dist/package"); -const zipPath = resolve(root, "apps/gittensory-ui/public/downloads/gittensory-extension.zip"); +const zipPath = resolve(root, "apps/gittensory-ui/public/downloads/loopover-extension.zip"); const crcTable = Array.from({ length: 256 }, (_, index) => { let value = index; for (let bit = 0; bit < 8; bit += 1) { diff --git a/scripts/smoke-production.mjs b/scripts/smoke-production.mjs index 3487d805a0..0d4a11bd0d 100644 --- a/scripts/smoke-production.mjs +++ b/scripts/smoke-production.mjs @@ -26,7 +26,7 @@ async function main() { const checks = []; for (const route of siteRoutes) checks.push(checkStatus(`${siteOrigin}${route}`, 200, `UI ${route}`)); checks.push(checkStatus(`${siteOrigin}/openapi.json`, 200, "UI OpenAPI artifact", { contentType: /application\/json/i })); - checks.push(checkStatus(`${siteOrigin}/downloads/gittensory-extension.zip`, 200, "extension zip", { contentType: /application\/zip/i })); + checks.push(checkStatus(`${siteOrigin}/downloads/loopover-extension.zip`, 200, "extension zip", { contentType: /application\/zip/i })); checks.push(checkText(`${siteOrigin}/robots.txt`, "Sitemap: https://gittensory.aethereal.dev/sitemap.xml", "robots sitemap directive")); checks.push(checkStatus(`${siteOrigin}/sitemap.xml`, 200, "sitemap", { contentType: /application\/xml/i })); checks.push(checkStatus(`${siteOrigin}/CNAME`, 404, "retired GitHub Pages CNAME")); From 61170664731efdbad98cac41a437f9013c44ac24 Mon Sep 17 00:00:00 2001 From: JSONbored <49853598+JSONbored@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:46:49 -0700 Subject: [PATCH 2/2] docs(miner): regenerate env-reference for GITTENSORY_MINER_KILL_SWITCH --- packages/gittensory-miner/docs/env-reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/gittensory-miner/docs/env-reference.md b/packages/gittensory-miner/docs/env-reference.md index e5e9d47277..f34d768564 100644 --- a/packages/gittensory-miner/docs/env-reference.md +++ b/packages/gittensory-miner/docs/env-reference.md @@ -12,6 +12,7 @@ Generated by `npm run miner:env-reference`. Do not edit manually. | `GITTENSORY_MINER_EVENT_LEDGER_DB` | `lib/event-ledger.js` | (none) | | `GITTENSORY_MINER_GOVERNOR_LEDGER_DB` | `lib/governor-ledger.js` | `""` | | `GITTENSORY_MINER_GOVERNOR_STATE_DB` | `lib/governor-state.js` | (none) | +| `GITTENSORY_MINER_KILL_SWITCH` | `lib/config-precedence.js` | `""` | | `GITTENSORY_MINER_NO_UPDATE_CHECK` | `lib/update-check.js` | `""` | | `GITTENSORY_MINER_ORB_EXPORT_DB` | `lib/orb-export.js` | `""` | | `GITTENSORY_MINER_PLAN_STORE_DB` | `lib/plan-store.js` | `""` |