diff --git a/.claude/skills/contributing-to-loopover/SKILL.md b/.claude/skills/contributing-to-loopover/SKILL.md index 2f01c72f1c..304bbf17f2 100644 --- a/.claude/skills/contributing-to-loopover/SKILL.md +++ b/.claude/skills/contributing-to-loopover/SKILL.md @@ -84,7 +84,7 @@ opening a **fresh** PR. This is the entire reason to get it right before you pus git clone https://github.com//gittensory && cd gittensory git remote add upstream https://github.com/JSONbored/gittensory # to sync main later nvm use # Node 22 (.nvmrc) -npm ci # installs the whole workspace, incl. apps/gittensory-ui — required before any check +npm ci # installs the whole workspace, incl. apps/loopover-ui — required before any check ``` All `npm run …` commands run from the **repo root**. As an external contributor you **push to your @@ -125,7 +125,7 @@ pasted JSON block will not work in Codex). You'll use these tools in Phases 1 an - **Run the pre-start checks** via MCP: `loopover_check_before_start` (is it claimed / a duplicate cluster / already solved?) and, if linking an issue, `loopover_validate_linked_issue`. - **Stay in scope.** The gate's `wantedPaths` are `src/`, `packages/`, `test/`, `migrations/`, - `scripts/`, `review-enrichment/`, `.github/workflows/`, `wrangler.jsonc`, `apps/gittensory-ui/`. Avoid `blockedPaths` + `scripts/`, `review-enrichment/`, `.github/workflows/`, `wrangler.jsonc`, `apps/loopover-ui/`. Avoid `blockedPaths` (`site/`, `CNAME`, `**/lovable/**`). Keep the PR narrow — one coherent change. --- @@ -198,13 +198,13 @@ Run the matching command(s) and **commit the regenerated file(s)** — CI fails | You changed… | Run | Commit | |---|---|---| -| API routes or OpenAPI schemas (`src/`) | `npm run ui:openapi` | `apps/gittensory-ui/public/openapi.json` | +| API routes or OpenAPI schemas (`src/`) | `npm run ui:openapi` | `apps/loopover-ui/public/openapi.json` | | A Cloudflare binding/var in `wrangler.jsonc` | `npm run cf-typegen` | `worker-configuration.d.ts` | | Drizzle schema (`src/db/schema.ts`) | `npm run drizzle:generate` | the new `migrations/NNNN_*.sql` | | Added a raw-SQL migration | (none — just author it) | next **contiguous** `migrations/NNNN_snake.sql` | -| `src/selfhost/**` (or a few other scanned files — see `scripts/gen-selfhost-env-reference.mjs`'s `DEFAULT_SOURCE_ROOTS`) adding/removing an `env.SOMETHING` read | `npm run selfhost:env-reference` | `apps/gittensory-ui/src/lib/selfhost-env-reference.ts` — the doc cites the file only (not `file:line`, deliberately, so an unrelated line shift elsewhere in the file never makes this go stale) | +| `src/selfhost/**` (or a few other scanned files — see `scripts/gen-selfhost-env-reference.mjs`'s `DEFAULT_SOURCE_ROOTS`) adding/removing an `env.SOMETHING` read | `npm run selfhost:env-reference` | `apps/loopover-ui/src/lib/selfhost-env-reference.ts` — the doc cites the file only (not `file:line`, deliberately, so an unrelated line shift elsewhere in the file never makes this go stale) | | CLI command surface | `npm run command-reference` | the generated command-reference doc | -| UI files (`apps/gittensory-ui/**`) | `npm --workspace @loopover/ui run format` | formatted files | +| UI files (`apps/loopover-ui/**`) | `npm --workspace @loopover/ui run format` | formatted files | Migrations must use the **next free number** (contiguous, no gaps, no reuse) and match `NNNN_snake_case.sql`; `db:migrations:check` enforces it. @@ -264,17 +264,17 @@ merge instead of a one-shot close. below needs real, clickable thumbnail URLs — here's how to get them when you can't drag-and-drop into GitHub's web editor (which needs a human browser session an AI coding tool can't drive end-to-end): -1. **Local dev server:** `npm --prefix apps/gittensory-ui run dev` (Vite forces port **8080** regardless +1. **Local dev server:** `npm --prefix apps/loopover-ui run dev` (Vite forces port **8080** regardless of what you request — use that port in any launch config, or `preview_screenshot`-style tooling just hangs waiting for the server). For an auth-gated page, use the sanctioned local-preview escape hatch - instead of real GitHub OAuth: `useSession().signInPreview()` (`apps/gittensory-ui/src/lib/api/session.ts`), + instead of real GitHub OAuth: `useSession().signInPreview()` (`apps/loopover-ui/src/lib/api/session.ts`), gated on `import.meta.env.DEV` — it sets a synthetic session client-side with no network write. Click the "Continue with local preview" button in the sign-in wall rather than calling the hook indirectly (the real `fetchBrowserSession()` call can race in afterward and silently overwrite it back to `null`); overriding `window.fetch` for `/v1/auth/session` to return the same authenticated shape closes that race either way. 2. **Fixed viewport, never a full-page/`fullPage: true` capture.** gittensory-ui is a **dark-mode-only - build** (`apps/gittensory-ui/src/components/site/theme-toggle.tsx` — the toggle was removed; there is + build** (`apps/loopover-ui/src/components/site/theme-toggle.tsx` — the toggle was removed; there is no light theme left to force), so there's no theme dimension to multiply out. Capture at whichever viewport(s) your change actually affects — mobile (375×812) and desktop (1280×800) cover most cases; add a caption per state either way (`"Loaded state"`, `"Mobile layout"`, etc., matching the existing diff --git a/.claude/skills/contributing-to-loopover/reference.md b/.claude/skills/contributing-to-loopover/reference.md index 5bb13ebf66..5a23dda2cf 100644 --- a/.claude/skills/contributing-to-loopover/reference.md +++ b/.claude/skills/contributing-to-loopover/reference.md @@ -28,7 +28,7 @@ path filter matched; on push to `main`, everything runs. | lint → migrations | migration guard | `npm run db:migrations:check` | duplicate/gap/misnamed migration number | | lint → cf-typegen | worker types drift | `npm run cf-typegen:check` | committed `worker-configuration.d.ts` is stale (run `npm run cf-typegen`) | | lint → schema-drift | `src/db/schema.ts` vs `migrations/` | `npm run db:schema-drift:check` | a Drizzle table's schema doesn't match the migration history | -| lint → selfhost-env-reference | self-host env-var doc drift | `npm run selfhost:env-reference:check` | committed `apps/gittensory-ui/src/lib/selfhost-env-reference.ts` is stale (run `npm run selfhost:env-reference`) — triggers when `src/selfhost/**` (+ a few other scanned files) adds/removes an env var read; a pure line shift of an existing read does NOT trigger it, since the doc cites the file only, not `file:line` (#env-reference-churn) | +| lint → selfhost-env-reference | self-host env-var doc drift | `npm run selfhost:env-reference:check` | committed `apps/loopover-ui/src/lib/selfhost-env-reference.ts` is stale (run `npm run selfhost:env-reference`) — triggers when `src/selfhost/**` (+ a few other scanned files) adds/removes an env var read; a pure line shift of an existing read does NOT trigger it, since the doc cites the file only, not `file:line` (#env-reference-churn) | | lint → observability | Grafana/Prometheus/alert config validation | `npm run selfhost:validate-observability` | a self-host observability config (dashboard/rule/datasource) is malformed | | lint → typecheck | `tsc --noEmit` | `npm run typecheck` | any backend type error | | test (1/2) | sharded vitest + coverage | `npm run test:coverage` (unsharded) | any failing `test/**/*.test.ts` (excl. `test/workers/**`) | @@ -51,7 +51,7 @@ path filter matched; on push to `main`, everything runs. **One command for everything except `security`:** `npm run test:ci`. There is **no** CodeQL/Analyze workflow in this repo. There is **no** root-level Prettier gate — Prettier is enforced only inside -`ui:lint` (so it only bites `apps/gittensory-ui/**`). +`ui:lint` (so it only bites `apps/loopover-ui/**`). **Local-only checks with no separate named CI status — `npm run test:ci` is the only thing that catches these for a normal PR:** @@ -65,7 +65,7 @@ these for a normal PR:** This is a real, previously-hit gap, not a hypothetical: a past PR shipped a genuine, undetected `codecov/patch`-adjacent regression in the engine package specifically because `test --workspace @loopover/engine` isn't part of `ci.yml`. If your change touches -`packages/gittensory-engine/**`, running `npm run test:ci` locally (not just watching the PR's CI +`packages/loopover-engine/**`, running `npm run test:ci` locally (not just watching the PR's CI checks go green) is the only way to know you didn't break it. --- @@ -117,7 +117,7 @@ Implications for you: `.loopover.yml` (the public config you can predict against) sets the gate *modes* (`linkedIssue: advisory`, `duplicates: block`, `readiness: advisory/60`, AI review off) and the focus manifest (`wantedPaths`: `src/ packages/ test/ migrations/ scripts/ review-enrichment/ .github/workflows/ -wrangler.jsonc apps/gittensory-ui/`; `blockedPaths`: `site/ CNAME **/lovable/**`; `linkedIssuePolicy: preferred`; +wrangler.jsonc apps/loopover-ui/`; `blockedPaths`: `site/ CNAME **/lovable/**`; `linkedIssuePolicy: preferred`; `testExpectations: npm run test:ci`). But the **modes are inputs to the disposition above** — the engine still auto-merges the clean case and auto-closes the adverse case. The MCP `predict_gate` uses the public config + safe defaults; a clean prediction is necessary but not sufficient (it can't see diff --git a/.claude/skills/contributor-pipeline-gardening/reference.md b/.claude/skills/contributor-pipeline-gardening/reference.md index 3bb0307c65..eb2cabb924 100644 --- a/.claude/skills/contributor-pipeline-gardening/reference.md +++ b/.claude/skills/contributor-pipeline-gardening/reference.md @@ -4,9 +4,9 @@ Two products, self-host-first: -- **AMS (Autonomous Miner System)** — `packages/gittensory-miner` (npm: `@loopover/miner`) + - `packages/gittensory-engine` (npm: `@loopover/engine`, shared core also used by ORB) + - `apps/gittensory-miner-ui` + `apps/gittensory-miner-extension`. The contributor/miner side: finds +- **AMS (Autonomous Miner System)** — `packages/loopover-miner` (npm: `@loopover/miner`) + + `packages/loopover-engine` (npm: `@loopover/engine`, shared core also used by ORB) + + `apps/loopover-miner-ui` + `apps/loopover-miner-extension`. The contributor/miner side: finds issues, plans, writes code, opens PRs, autonomously. Self-host (a local Miner Node) is the only shipped deployment target; hosted AMS is a later phase (see "AMS/ORB Cloud Readiness" below). - **ORB (Owner/One-shot Review Brain)** — `src/**` (the Worker app: `src/review`, `src/queue`, @@ -21,7 +21,7 @@ Two products, self-host-first: **Standing priorities named by the maintainer (2026-07-14), not yet issue-backed:** - **AMS selfhost hardening, round 2.** Miner Wave 4 ("AMS Hardening & Packaging") fully closed (151/151) on 2026-07-14 — that backlog is empty, not hiding more maintainer-only work. Getting more - requires a fresh gap-audit (read the current `packages/gittensory-miner`/`-engine` code against what + requires a fresh gap-audit (read the current `packages/loopover-miner`/`-engine` code against what Wave 4 already covered — coverage gate, ledger races, MCP scaffolding — and find what's still genuinely thin), not relabeling existing issues. - **Unified AMS+ORB self-host harness** — letting one operator install/run both products together in diff --git a/.env.example b/.env.example index 7b34a2ae76..2ddf48f055 100644 --- a/.env.example +++ b/.env.example @@ -510,7 +510,7 @@ REDIS_URL=redis://redis:6379 # REQUIRED for the self-host review # LOOPOVER_REPORTING_SOURCE_DB=/appdb/loopover.sqlite # if DATABASE_PATH=/data/custom.sqlite, set /appdb/custom.sqlite # # AMS (loopover-miner) ledger dashboards — only useful when a miner ALSO runs on this same host (see -# packages/gittensory-miner/docs/observability.md). Requires --profile ams-observability, separate from the +# packages/loopover-miner/docs/observability.md). Requires --profile ams-observability, separate from the # general observability profile above: an engine-only deployment has nothing for this exporter to read. # Grafana never mounts the live ledgers directly — this exporter reads them read-only and writes a redacted # snapshot (free-form attempt_log_events.reason/.payload_json dropped) into the same reporting volume. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7cb106e2e5..a881e4e6cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,11 +69,11 @@ jobs: # A dependency bump (package.json/package-lock.json) stays here too since it can break the UI # build or types in ways only that full toolchain would catch. ui: - - 'apps/gittensory-ui/**' - - 'apps/gittensory-miner-ui/**' - - 'apps/gittensory-extension/**' - - 'apps/gittensory-miner-extension/**' - - 'packages/gittensory-ui-kit/**' + - 'apps/loopover-ui/**' + - 'apps/loopover-miner-ui/**' + - 'apps/loopover-extension/**' + - 'apps/loopover-miner-extension/**' + - 'packages/loopover-ui-kit/**' - 'scripts/build-extension.mjs' - 'scripts/build-miner-extension.mjs' - 'package.json' @@ -81,7 +81,7 @@ jobs: # Backend changes that can drift the OpenAPI contract the UI type-checks against, but say # nothing about the UI app's OWN code -- only the lightweight drift check needs to run, not # ui:lint/typecheck/test/build (#ci-scope). If a backend PR's change IS UI-relevant, regenerating - # `apps/gittensory-ui/public/openapi.json` per CONTRIBUTING.md lands a change under `ui` above, + # `apps/loopover-ui/public/openapi.json` per CONTRIBUTING.md lands a change under `ui` above, # which correctly re-triggers the full toolchain. uiContract: - 'src/**' @@ -90,23 +90,23 @@ jobs: # Self-contained package: build is `node --check` on its own files # and the pack check only inspects the tarball. Root src/ cannot # affect it, so it is intentionally NOT a trigger here. - - 'packages/gittensory-mcp/**' + - 'packages/loopover-mcp/**' - 'scripts/check-mcp-package.mjs' - 'package-lock.json' engine: - - 'packages/gittensory-engine/**' + - 'packages/loopover-engine/**' - 'package-lock.json' miner: - - 'packages/gittensory-miner/**' + - 'packages/loopover-miner/**' - 'scripts/check-miner-package.mjs' - 'package-lock.json' # 6 of the 7 MCP CLI-cluster test files, and ONLY these 6, are truly self-contained w.r.t. root # src/**: verified by direct-import inspection that test/unit/mcp-cli-*.test.ts (5 files) and # their shared test/unit/support/mcp-cli-harness.ts import nothing but node:* builtins + vitest, - # and mcp-discovery.test.ts spawns packages/gittensory-mcp/bin/loopover-mcp.js as a real + # and mcp-discovery.test.ts spawns packages/loopover-mcp/bin/loopover-mcp.js as a real # subprocess via StdioClientTransport -- none of the 6 ever load root src/ in-process. This mirrors # the `mcp` filter's own established trust boundary above (a self-contained package build). They are - # NOT self-contained w.r.t. packages/gittensory-engine/**, though: gittensory-mcp now has a real + # NOT self-contained w.r.t. packages/loopover-engine/**, though: loopover-mcp now has a real # dependency on @loopover/engine (isTestFile/isCodeFile), which the bin subprocess and # local-branch.js load at runtime -- hence that path below, alongside the mcp package's own. # test/unit/mcp-output-schemas.test.ts is DELIBERATELY NOT in this filter: unlike the other 6, it @@ -127,8 +127,8 @@ jobs: - 'scripts/**' - 'migrations/**' - '.github/workflows/**' - - 'packages/gittensory-mcp/**' - - 'packages/gittensory-engine/**' + - 'packages/loopover-mcp/**' + - 'packages/loopover-engine/**' - 'test/helpers/**' - 'test/unit/mcp-cli-*.test.ts' - 'test/unit/mcp-discovery.test.ts' @@ -139,7 +139,7 @@ jobs: # Both miner-package test files are self-contained w.r.t. root src/**, the same trust boundary as # mcpCliHarness above: check-miner-package.test.ts only spawns scripts/check-miner-package.mjs as a # real subprocess (node:child_process + vitest, nothing else), and miner-calibration-types.test.ts - # only imports the scaffolded packages/gittensory-miner/lib/calibration.js -- neither ever loads + # only imports the scaffolded packages/loopover-miner/lib/calibration.js -- neither ever loads # root src/ in-process. Mirrors mcpCliHarness's filter shape for the same reason (tooling/config # changes that could plausibly affect how these tests run, plus the miner package + the test files # themselves), swapping in the miner-specific package and test files. @@ -151,7 +151,7 @@ jobs: - 'scripts/**' - 'migrations/**' - '.github/workflows/**' - - 'packages/gittensory-miner/**' + - 'packages/loopover-miner/**' - 'test/unit/check-miner-package.test.ts' - 'test/unit/miner-calibration-types.test.ts' @@ -197,7 +197,7 @@ jobs: with: path: | node_modules - apps/gittensory-ui/node_modules + apps/loopover-ui/node_modules # hashFiles('.nvmrc') matters as much as the package manifests and lockfile: a Node bump # with no lockfile change would otherwise still hit and silently reuse node_modules whose # native addons (sharp, workerd, fsevents) were compiled against the OLD Node's ABI. The @@ -225,7 +225,7 @@ jobs: with: path: | node_modules - apps/gittensory-ui/node_modules + apps/loopover-ui/node_modules key: ${{ steps.node-modules-cache.outputs.cache-primary-key }} - name: Lint workflows if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' }} @@ -250,7 +250,7 @@ jobs: # lines (not just one that adds/removes an env var) can make it stale. Was previously enforced ONLY by # the local `npm run test:ci` aggregate script, never by this workflow -- went stale twice in one day # (2026-07-04) with zero CI signal until someone happened to run the full local script. Gated on `ui` - # too, not just `backend`: the generated file itself lives under apps/gittensory-ui/**, so a PR that + # too, not just `backend`: the generated file itself lives under apps/loopover-ui/**, so a PR that # hand-edits it (or a docs page docs:drift-check below cross-checks) without touching backend source # would otherwise never re-run this check. - name: Selfhost env-reference drift check @@ -275,10 +275,10 @@ jobs: NODE_OPTIONS: "" run: node scripts/validate-observability-configs.mjs # Runs ahead of Typecheck AND "Test with coverage" (#ci-engine-build-order): src/mcp/find-opportunities.ts - # (root backend, since #2281/#3985) imports packages/gittensory-miner/lib/opportunity-fanout.js -- + # (root backend, since #2281/#3985) imports packages/loopover-miner/lib/opportunity-fanout.js -- # committed, pre-built JS -- which itself imports @loopover/engine. That package's dist/ is # gitignored and only exists after this build step, so ANY backend typecheck or test run needs it built - # first, not just a PR that touches packages/gittensory-engine/** directly (this step's original, too- + # first, not just a PR that touches packages/loopover-engine/** directly (this step's original, too- # narrow trigger). Originally ran after coverage (broke test:coverage on PRs that didn't touch the # engine) and after Typecheck (broke a real, non-vi.mock `import type` from the package specifier with # TS2307 in CI while passing locally against a stale leftover dist/ -- first hit by PR #5082). Now ahead @@ -312,8 +312,8 @@ jobs: - name: Worker runtime tests if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' }} run: npm run test:workers - # gittensory-mcp now depends on @loopover/engine for real (isTestFile/isCodeFile), so a - # PR that only touches packages/gittensory-engine/** must also rebuild + pack-check the mcp package, + # loopover-mcp now depends on @loopover/engine for real (isTestFile/isCodeFile), so a + # PR that only touches packages/loopover-engine/** must also rebuild + pack-check the mcp package, # not just the mcp filter's own (deliberately narrower) path list. - name: Build MCP if: ${{ github.event_name == 'push' || needs.changes.outputs.mcp == 'true' || needs.changes.outputs.engine == 'true' }} @@ -360,14 +360,14 @@ jobs: - name: OpenAPI settings-parity check if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' || needs.changes.outputs.uiContract == 'true' }} run: npm run ui:openapi:settings-parity - # Checks apps/gittensory-ui/src' known-latest MCP version string against the published package, so + # Checks apps/loopover-ui/src' known-latest MCP version string against the published package, so # its dependency is `ui` (the file it scans) + `mcp` (the package it checks against) -- NOT the # OpenAPI contract, which this script never reads. - name: UI/MCP version audit if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' || needs.changes.outputs.mcp == 'true' }} run: npm run ui:version-audit - # gittensory-ui and gittensory-miner-ui both import compiled output from this shared package - # (packages/gittensory-ui-kit/dist), which is gitignored like every other workspace package's + # loopover-ui and loopover-miner-ui both import compiled output from this shared package + # (packages/loopover-ui-kit/dist), which is gitignored like every other workspace package's # dist -- so it does not exist on a fresh checkout until something builds it. Same class of gap # as "Build engine package" above; runs before UI lint/typecheck/tests/build all in this same # job, so building it here once covers all four. @@ -389,7 +389,7 @@ jobs: - name: Extension typecheck if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' }} run: npm run extension:typecheck && npm run miner-extension:typecheck - # `npm run ui:build` also regenerates apps/gittensory-ui/public/openapi.json (needed for a + # `npm run ui:build` also regenerates apps/loopover-ui/public/openapi.json (needed for a # standalone build), but this step's trigger condition is a strict subset of "OpenAPI drift # check" above (push || ui==true, vs. push || ui==true || uiContract==true), so whenever this # step runs, that check already ran and passed in this same job -- the committed spec is @@ -446,7 +446,7 @@ jobs: with: path: | node_modules - apps/gittensory-ui/node_modules + apps/loopover-ui/node_modules key: npm-${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true) && 'fork' || 'trusted' }}-${{ hashFiles('.nvmrc') }}-${{ hashFiles('package.json', 'apps/*/package.json', 'packages/*/package.json', 'package-lock.json') }} - name: Install dependencies (retry on transient failures) if: ${{ steps.node-modules-cache.outputs.cache-hit != 'true' }} @@ -466,7 +466,7 @@ jobs: with: path: | node_modules - apps/gittensory-ui/node_modules + apps/loopover-ui/node_modules key: ${{ steps.node-modules-cache.outputs.cache-primary-key }} # Any backend test run needs the engine package's dist/ built first -- see the identical step's # comment in validate-code (#ci-engine-build-order) for why. @@ -490,14 +490,14 @@ jobs: run: | EXCLUDE_ARGS=() if [ "$SKIP_MCP_CLI_HARNESS" = "true" ]; then - echo "Skipping the self-contained MCP CLI-harness tests (no packages/gittensory-mcp-relevant paths changed)." + echo "Skipping the self-contained MCP CLI-harness tests (no packages/loopover-mcp-relevant paths changed)." EXCLUDE_ARGS+=( --exclude "test/unit/mcp-cli-*.test.ts" --exclude "test/unit/mcp-discovery.test.ts" ) fi if [ "$SKIP_MINER_TEST_HARNESS" = "true" ]; then - echo "Skipping the self-contained miner-package tests (no packages/gittensory-miner-relevant paths changed)." + echo "Skipping the self-contained miner-package tests (no packages/loopover-miner-relevant paths changed)." EXCLUDE_ARGS+=( --exclude "test/unit/check-miner-package.test.ts" --exclude "test/unit/miner-calibration-types.test.ts" @@ -618,7 +618,7 @@ jobs: with: path: | node_modules - apps/gittensory-ui/node_modules + apps/loopover-ui/node_modules key: npm-${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true) && 'fork' || 'trusted' }}-${{ hashFiles('.nvmrc') }}-${{ hashFiles('package.json', 'apps/*/package.json', 'packages/*/package.json', 'package-lock.json') }} - name: Install dependencies (retry on transient failures) if: ${{ steps.node-modules-cache.outputs.cache-hit != 'true' }} diff --git a/.github/workflows/gittensor-impact.yml b/.github/workflows/gittensor-impact.yml index 53580f49af..3bee340e4b 100644 --- a/.github/workflows/gittensor-impact.yml +++ b/.github/workflows/gittensor-impact.yml @@ -1,7 +1,7 @@ name: Gittensor Impact # Renders the README contributor-impact card with scripts/gittensor-impact-card.mjs -# (our own script, styled to this repo's brand — see apps/gittensory-ui/src/styles.css) +# (our own script, styled to this repo's brand — see apps/loopover-ui/src/styles.css) # and publishes it to the gittensor-impact-assets branch, which the README embeds # directly. No third-party action: this replaced matthewevans/gittensor-impact-action # once its generic template no longer matched the site's design. diff --git a/.github/workflows/mcp-release-please.yml b/.github/workflows/mcp-release-please.yml index 3d962faa0f..13844c4606 100644 --- a/.github/workflows/mcp-release-please.yml +++ b/.github/workflows/mcp-release-please.yml @@ -1,8 +1,8 @@ name: Package Release Please # Conventional-commit-driven release automation for the four published npm packages in this monorepo -# (packages/gittensory-mcp, packages/gittensory-engine, packages/gittensory-miner, -# packages/gittensory-ui-kit). release-please maintains a Release PR per component that bumps its +# (packages/loopover-mcp, packages/loopover-engine, packages/loopover-miner, +# packages/loopover-ui-kit). release-please maintains a Release PR per component that bumps its # SemVer + regenerates its CHANGELOG.md from conventional commits touching that package's own # subtree. Merging a Release PR tags the component (mcp-v / engine-v / # miner-v / ui-kit-v, matching this repo's existing mcp-v* tag convention) and @@ -83,7 +83,7 @@ jobs: fi git fetch origin "$branch" git checkout -B "sync-check-${component}" "origin/$branch" - node "$trusted_sync_script" packages/gittensory-mcp packages/gittensory-engine packages/gittensory-miner packages/gittensory-ui-kit + node "$trusted_sync_script" packages/loopover-mcp packages/loopover-engine packages/loopover-miner packages/loopover-ui-kit if git diff --quiet package-lock.json; then echo "package-lock.json already in sync on $branch." else @@ -107,25 +107,25 @@ jobs: # exactly this race when an unrelated PR merged seconds apart). A tag doesn't move, so # dispatching against it makes the publish deterministic regardless of main's activity. - name: Dispatch MCP publish - if: ${{ steps.release.outputs['packages/gittensory-mcp--release_created'] == 'true' }} + if: ${{ steps.release.outputs['packages/loopover-mcp--release_created'] == 'true' }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run publish-mcp.yml --ref "${{ steps.release.outputs['packages/gittensory-mcp--tag_name'] }}" -f released_by_release_please=true + run: gh workflow run publish-mcp.yml --ref "${{ steps.release.outputs['packages/loopover-mcp--tag_name'] }}" -f released_by_release_please=true - name: Dispatch Engine publish - if: ${{ steps.release.outputs['packages/gittensory-engine--release_created'] == 'true' }} + if: ${{ steps.release.outputs['packages/loopover-engine--release_created'] == 'true' }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run publish-engine.yml --ref "${{ steps.release.outputs['packages/gittensory-engine--tag_name'] }}" -f released_by_release_please=true + run: gh workflow run publish-engine.yml --ref "${{ steps.release.outputs['packages/loopover-engine--tag_name'] }}" -f released_by_release_please=true - name: Dispatch Miner publish - if: ${{ steps.release.outputs['packages/gittensory-miner--release_created'] == 'true' }} + if: ${{ steps.release.outputs['packages/loopover-miner--release_created'] == 'true' }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run publish-miner.yml --ref "${{ steps.release.outputs['packages/gittensory-miner--tag_name'] }}" -f released_by_release_please=true + run: gh workflow run publish-miner.yml --ref "${{ steps.release.outputs['packages/loopover-miner--tag_name'] }}" -f released_by_release_please=true - name: Dispatch UI Kit publish - if: ${{ steps.release.outputs['packages/gittensory-ui-kit--release_created'] == 'true' }} + if: ${{ steps.release.outputs['packages/loopover-ui-kit--release_created'] == 'true' }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run publish-ui-kit.yml --ref "${{ steps.release.outputs['packages/gittensory-ui-kit--tag_name'] }}" -f released_by_release_please=true + run: gh workflow run publish-ui-kit.yml --ref "${{ steps.release.outputs['packages/loopover-ui-kit--tag_name'] }}" -f released_by_release_please=true diff --git a/.github/workflows/orb-stable-release-pr.yml b/.github/workflows/orb-stable-release-pr.yml index ab90a4301e..05788fd72c 100644 --- a/.github/workflows/orb-stable-release-pr.yml +++ b/.github/workflows/orb-stable-release-pr.yml @@ -1,8 +1,8 @@ # Automated ORB (self-host container image, ghcr.io/jsonbored/loopover-selfhost) STABLE-channel Release PR -- # the release-please-equivalent for ORB, whose cross-cutting image-relevant scoping (src/** shared with # UI/MCP-only subtrees it must exclude -- see orb-release-core.mjs's IMAGE_RELEVANT_PREFIXES/EXCLUDED_PREFIXES) -# doesn't fit release-please's directory-component model the way packages/gittensory-mcp and -# packages/gittensory-engine do (see mcp-release-please.yml). Same UX contract as those, hand-rolled: on the +# doesn't fit release-please's directory-component model the way packages/loopover-mcp and +# packages/loopover-engine do (see mcp-release-please.yml). Same UX contract as those, hand-rolled: on the # same schedule (or on demand), (re)compute the next stable version from conventional commits since the last # STABLE orb-v tag (scripts/check-orb-stable-release-due.mjs / orb-release-core.mjs's buildOrbStableReleaseReport) # and keep a standing `release-orb-stable` branch + PR in sync with that proposal. Nothing ships until a diff --git a/.github/workflows/publish-engine.yml b/.github/workflows/publish-engine.yml index 8b8d6d9598..519ff922b6 100644 --- a/.github/workflows/publish-engine.yml +++ b/.github/workflows/publish-engine.yml @@ -4,7 +4,7 @@ name: Publish Engine Package # rationale): a GITHUB_TOKEN-created tag doesn't fire push-triggered workflows, so the release # automation must explicitly dispatch this after tagging. A bare manual dispatch ( # released_by_release_please left false) is the human override path and self-tags HEAD from -# packages/gittensory-engine/package.json's version. +# packages/loopover-engine/package.json's version. # # @loopover/engine has already been bootstrap-published to npm once (from a maintainer's own # authenticated `npm login` session -- npm's trusted publishing/OIDC cannot create a brand-new @@ -65,7 +65,7 @@ jobs: id: version run: | set -euo pipefail - VERSION="$(node -p "require('./packages/gittensory-engine/package.json').version")" + VERSION="$(node -p "require('./packages/loopover-engine/package.json').version")" if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "::error::Invalid package version: $VERSION" exit 1 @@ -123,7 +123,7 @@ jobs: - name: Upload package tarball uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: gittensory-engine-tarball + name: loopover-engine-tarball path: ${{ runner.temp }}/*.tgz if-no-files-found: error retention-days: 7 @@ -186,21 +186,21 @@ jobs: - name: Download package tarball uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: gittensory-engine-tarball - path: ${{ runner.temp }}/gittensory-engine-package + name: loopover-engine-tarball + path: ${{ runner.temp }}/loopover-engine-package - name: Publish to npm (OIDC trusted publishing) env: NPM_CONFIG_PROVENANCE: "true" run: | set -euo pipefail - count=$(find "$RUNNER_TEMP/gittensory-engine-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') + count=$(find "$RUNNER_TEMP/loopover-engine-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') if [ "$count" != "1" ]; then echo "Expected exactly one tarball, found $count" >&2 - find "$RUNNER_TEMP/gittensory-engine-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 + find "$RUNNER_TEMP/loopover-engine-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 exit 1 fi - tarball=$(find "$RUNNER_TEMP/gittensory-engine-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) + tarball=$(find "$RUNNER_TEMP/loopover-engine-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) npx -y npm@11.15.0 publish "$tarball" --access public --provenance github-release: diff --git a/.github/workflows/publish-mcp.yml b/.github/workflows/publish-mcp.yml index fff1db78eb..023d40dd9b 100644 --- a/.github/workflows/publish-mcp.yml +++ b/.github/workflows/publish-mcp.yml @@ -3,7 +3,7 @@ name: Publish MCP Package # workflow_dispatch-only (no push:tags: trigger): a GITHUB_TOKEN-created tag (e.g. from the release # automation) does not fire push-triggered workflows, so the release automation must explicitly # dispatch this workflow after it tags a release. A bare manual dispatch (released_by_release_please -# left false) is the human override path and self-tags HEAD from packages/gittensory-mcp/package.json's +# left false) is the human override path and self-tags HEAD from packages/loopover-mcp/package.json's # version, matching the old "push a tag to publish" flow just invoked differently. on: workflow_dispatch: @@ -54,7 +54,7 @@ jobs: id: version run: | set -euo pipefail - VERSION="$(node -p "require('./packages/gittensory-mcp/package.json').version")" + VERSION="$(node -p "require('./packages/loopover-mcp/package.json').version")" if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "::error::Invalid package version: $VERSION" exit 1 @@ -77,12 +77,12 @@ jobs: - name: Install dependencies run: npm ci - # packages/gittensory-mcp's own test suite pulls in src/mcp/find-opportunities.ts transitively - # (via packages/gittensory-miner/lib/opportunity-fanout.js), which imports @loopover/engine. + # packages/loopover-mcp's own test suite pulls in src/mcp/find-opportunities.ts transitively + # (via packages/loopover-miner/lib/opportunity-fanout.js), which imports @loopover/engine. # That package's dist/ is gitignored (see ci.yml's own build --workspace @loopover/engine # step for the same reason) -- without building it first, the MCP release validation gate below # fails with "Failed to resolve entry for package @loopover/engine" on every run. - - name: Build gittensory-engine + - name: Build loopover-engine run: npm run build --workspace @loopover/engine - name: MCP release validation gate @@ -114,7 +114,7 @@ jobs: - name: Upload package tarball uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: gittensory-mcp-tarball + name: loopover-mcp-tarball path: ${{ runner.temp }}/*.tgz if-no-files-found: error retention-days: 7 @@ -167,21 +167,21 @@ jobs: - name: Download package tarball uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: gittensory-mcp-tarball - path: ${{ runner.temp }}/gittensory-mcp-package + name: loopover-mcp-tarball + path: ${{ runner.temp }}/loopover-mcp-package - name: Publish to npm (OIDC trusted publishing) env: NPM_CONFIG_PROVENANCE: "true" run: | set -euo pipefail - count=$(find "$RUNNER_TEMP/gittensory-mcp-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') + count=$(find "$RUNNER_TEMP/loopover-mcp-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') if [ "$count" != "1" ]; then echo "Expected exactly one tarball, found $count" >&2 - find "$RUNNER_TEMP/gittensory-mcp-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 + find "$RUNNER_TEMP/loopover-mcp-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 exit 1 fi - tarball=$(find "$RUNNER_TEMP/gittensory-mcp-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) + tarball=$(find "$RUNNER_TEMP/loopover-mcp-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) npx -y npm@11.15.0 publish "$tarball" --access public --provenance github-release: diff --git a/.github/workflows/publish-miner.yml b/.github/workflows/publish-miner.yml index 15fcca679a..551bd4ddaf 100644 --- a/.github/workflows/publish-miner.yml +++ b/.github/workflows/publish-miner.yml @@ -4,7 +4,7 @@ name: Publish Miner Package # files for the fuller rationale): a GITHUB_TOKEN-created tag doesn't fire push-triggered workflows, # so the release automation must explicitly dispatch this after tagging. A bare manual dispatch ( # released_by_release_please left false) is the human override path and self-tags HEAD from -# packages/gittensory-miner/package.json's version. +# packages/loopover-miner/package.json's version. # # @loopover/miner has already been bootstrap-published to npm once (from a maintainer's own # authenticated `npm login` session -- npm's trusted publishing/OIDC cannot create a brand-new @@ -66,7 +66,7 @@ jobs: id: version run: | set -euo pipefail - VERSION="$(node -p "require('./packages/gittensory-miner/package.json').version")" + VERSION="$(node -p "require('./packages/loopover-miner/package.json').version")" if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "::error::Invalid package version: $VERSION" exit 1 @@ -121,7 +121,7 @@ jobs: - name: Upload package tarball uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: gittensory-miner-tarball + name: loopover-miner-tarball path: ${{ runner.temp }}/*.tgz if-no-files-found: error retention-days: 7 @@ -184,21 +184,21 @@ jobs: - name: Download package tarball uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: gittensory-miner-tarball - path: ${{ runner.temp }}/gittensory-miner-package + name: loopover-miner-tarball + path: ${{ runner.temp }}/loopover-miner-package - name: Publish to npm (OIDC trusted publishing) env: NPM_CONFIG_PROVENANCE: "true" run: | set -euo pipefail - count=$(find "$RUNNER_TEMP/gittensory-miner-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') + count=$(find "$RUNNER_TEMP/loopover-miner-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') if [ "$count" != "1" ]; then echo "Expected exactly one tarball, found $count" >&2 - find "$RUNNER_TEMP/gittensory-miner-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 + find "$RUNNER_TEMP/loopover-miner-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 exit 1 fi - tarball=$(find "$RUNNER_TEMP/gittensory-miner-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) + tarball=$(find "$RUNNER_TEMP/loopover-miner-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) npx -y npm@11.15.0 publish "$tarball" --access public --provenance github-release: diff --git a/.github/workflows/publish-ui-kit.yml b/.github/workflows/publish-ui-kit.yml index aeb47828b5..bffe6936bd 100644 --- a/.github/workflows/publish-ui-kit.yml +++ b/.github/workflows/publish-ui-kit.yml @@ -4,7 +4,7 @@ name: Publish UI Kit Package # files for the fuller rationale): a GITHUB_TOKEN-created tag doesn't fire push-triggered workflows, # so the release automation must explicitly dispatch this after tagging. A bare manual dispatch ( # released_by_release_please left false) is the human override path and self-tags HEAD from -# packages/gittensory-ui-kit/package.json's version. +# packages/loopover-ui-kit/package.json's version. # # @loopover/ui-kit has already been bootstrap-published to npm once (from a maintainer's own # authenticated `npm login` session -- npm's trusted publishing/OIDC cannot create a brand-new @@ -65,7 +65,7 @@ jobs: id: version run: | set -euo pipefail - VERSION="$(node -p "require('./packages/gittensory-ui-kit/package.json').version")" + VERSION="$(node -p "require('./packages/loopover-ui-kit/package.json').version")" if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "::error::Invalid package version: $VERSION" exit 1 @@ -122,7 +122,7 @@ jobs: - name: Upload package tarball uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: gittensory-ui-kit-tarball + name: loopover-ui-kit-tarball path: ${{ runner.temp }}/*.tgz if-no-files-found: error retention-days: 7 @@ -185,21 +185,21 @@ jobs: - name: Download package tarball uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: gittensory-ui-kit-tarball - path: ${{ runner.temp }}/gittensory-ui-kit-package + name: loopover-ui-kit-tarball + path: ${{ runner.temp }}/loopover-ui-kit-package - name: Publish to npm (OIDC trusted publishing) env: NPM_CONFIG_PROVENANCE: "true" run: | set -euo pipefail - count=$(find "$RUNNER_TEMP/gittensory-ui-kit-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') + count=$(find "$RUNNER_TEMP/loopover-ui-kit-package" -maxdepth 1 -type f -name "*.tgz" | wc -l | tr -d ' ') if [ "$count" != "1" ]; then echo "Expected exactly one tarball, found $count" >&2 - find "$RUNNER_TEMP/gittensory-ui-kit-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 + find "$RUNNER_TEMP/loopover-ui-kit-package" -maxdepth 1 -type f -name "*.tgz" -print >&2 exit 1 fi - tarball=$(find "$RUNNER_TEMP/gittensory-ui-kit-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) + tarball=$(find "$RUNNER_TEMP/loopover-ui-kit-package" -maxdepth 1 -type f -name "*.tgz" -print -quit) npx -y npm@11.15.0 publish "$tarball" --access public --provenance github-release: diff --git a/.github/workflows/release-selfhost.yml b/.github/workflows/release-selfhost.yml index b0aebc8b43..c719f70d76 100644 --- a/.github/workflows/release-selfhost.yml +++ b/.github/workflows/release-selfhost.yml @@ -127,7 +127,7 @@ jobs: run: npm ci --ignore-scripts # #ci-engine-build-order (release pipeline): --all bundles EVERYTHING self-contained, including - # packages/gittensory-miner/lib/*.js (committed, pre-built) which imports @loopover/engine. + # packages/loopover-miner/lib/*.js (committed, pre-built) which imports @loopover/engine. # That package's dist/ is gitignored and only exists after this build step -- the regular CI smoke # test's narrower (non --all) build never hits this import chain, so it never caught the gap that # ci.yml's own validate-code job hit for ordinary backend PRs (fixed there separately). diff --git a/.github/workflows/ui-deploy.yml b/.github/workflows/ui-deploy.yml index a8c29871bb..4f8727fa95 100644 --- a/.github/workflows/ui-deploy.yml +++ b/.github/workflows/ui-deploy.yml @@ -30,7 +30,7 @@ jobs: - name: Install dependencies run: npm ci - # `npm run ui:build` also regenerates apps/gittensory-ui/public/openapi.json, but `ui:openapi:check` + # `npm run ui:build` also regenerates apps/loopover-ui/public/openapi.json, but `ui:openapi:check` # just verified the committed spec is already byte-identical to what regenerating it would produce # -- run ui:build's other two steps directly instead of the aggregate script, skipping that redundant # regen (mirrors the same fix in .github/workflows/ci.yml's "UI build" step). diff --git a/.github/workflows/ui-preview.yml b/.github/workflows/ui-preview.yml index f132bd51ce..e989a876dc 100644 --- a/.github/workflows/ui-preview.yml +++ b/.github/workflows/ui-preview.yml @@ -14,7 +14,7 @@ on: pull_request: types: [opened, synchronize, reopened] paths: - - "apps/gittensory-ui/**" + - "apps/loopover-ui/**" - "packages/**" permissions: @@ -61,6 +61,6 @@ jobs: uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: ui-preview-dist - path: apps/gittensory-ui/dist + path: apps/loopover-ui/dist if-no-files-found: error retention-days: 1 diff --git a/.github/workflows/ui-sentry-release.yml b/.github/workflows/ui-sentry-release.yml index 2e3b2a94f7..367c2a0d9f 100644 --- a/.github/workflows/ui-sentry-release.yml +++ b/.github/workflows/ui-sentry-release.yml @@ -1,11 +1,11 @@ -# Browser Sentry source-map upload for the operator UI (#1737). apps/gittensory-ui's PRODUCTION build/deploy +# Browser Sentry source-map upload for the operator UI (#1737). apps/loopover-ui's PRODUCTION build/deploy # is NOT driven by GitHub Actions -- Cloudflare's own Workers Build git integration owns that (see -# apps/gittensory-ui/vite.config.ts's header comment). That regular build never enables source maps (vite.config.ts's +# apps/loopover-ui/vite.config.ts's header comment). That regular build never enables source maps (vite.config.ts's # SENTRY_BUILD_SOURCEMAPS gate), so `dist/client` never ships a `.map` file publicly. # # This workflow does its own INDEPENDENT build with source maps enabled, purely to upload them to Sentry as a # release artifact -- it never deploys anything. Because Cloudflare Workers Build is external to this repo, the -# operator must set the SAME VITE_SENTRY_RELEASE value (gittensory-ui@, matching this workflow's own +# operator must set the SAME VITE_SENTRY_RELEASE value (loopover-ui@, matching this workflow's own # `release` output) in their Cloudflare deploy's build environment variables for a given commit, or Sentry # events won't symbolicate against these maps -- see the "Enabling browser Sentry" self-host doc. name: ui-sentry-release @@ -14,7 +14,7 @@ on: push: branches: [main] paths: - - "apps/gittensory-ui/**" + - "apps/loopover-ui/**" - "src/signals/redaction.ts" - ".github/workflows/ui-sentry-release.yml" workflow_dispatch: @@ -58,10 +58,10 @@ jobs: - name: Resolve release id id: version - run: echo "release=gittensory-ui@${GITHUB_SHA::12}" >> "$GITHUB_OUTPUT" + run: echo "release=loopover-ui@${GITHUB_SHA::12}" >> "$GITHUB_OUTPUT" - name: Build UI with source maps - working-directory: apps/gittensory-ui + working-directory: apps/loopover-ui env: SENTRY_BUILD_SOURCEMAPS: "1" VITE_SENTRY_RELEASE: ${{ steps.version.outputs.release }} @@ -87,7 +87,7 @@ jobs: - name: Upload Sentry source maps if: steps.sentry.outputs.enabled == 'true' - working-directory: apps/gittensory-ui + working-directory: apps/loopover-ui env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ vars.SENTRY_ORG || 'jsonbored' }} diff --git a/.github/workflows/visual-capture-fallback.yml b/.github/workflows/visual-capture-fallback.yml index 50f54b1b9f..1385027aad 100644 --- a/.github/workflows/visual-capture-fallback.yml +++ b/.github/workflows/visual-capture-fallback.yml @@ -28,7 +28,7 @@ name: LoopOver Visual Capture Fallback # delivers a `workflow_run` webhook; gittensory's backend then lists + downloads that run's artifact using its # OWN, already-trusted GitHub App installation token -- never a token that passed through this job. # -# Setup (self-hosted repos only -- NOT needed for gittensory-ui / metagraphed, which already have their own +# Setup (self-hosted repos only -- NOT needed for loopover-ui / metagraphed, which already have their own # preview-deploy pipeline): copy this file, unmodified, into the target repo's `.github/workflows/` at this # EXACT path and name (`visual-capture-fallback.yml` / "LoopOver Visual Capture Fallback") -- gittensory's # dispatch call and workflow_run listener both key off this fixed name. Then set `review.visual.actions_fallback: diff --git a/.gitignore b/.gitignore index 6fd180e0f6..5576955107 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,7 @@ coverage/ *.tsbuildinfo site/.vitepress/cache/ !migrations/*.sql -apps/gittensory-ui/public/downloads/loopover-extension.zip +apps/loopover-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/.gittensory-miner.env.example b/.gittensory-miner.env.example index 94edc641f3..249fa26466 100644 --- a/.gittensory-miner.env.example +++ b/.gittensory-miner.env.example @@ -1,13 +1,13 @@ # gittensory-miner — starter env file # # Copy this to `.gittensory-miner.env` (gitignored), fill in GITHUB_TOKEN, then either `source` it or -# point docker-compose / systemd at it — see packages/gittensory-miner/DEPLOYMENT.md: +# point docker-compose / systemd at it — see packages/loopover-miner/DEPLOYMENT.md: # # cp .gittensory-miner.env.example .gittensory-miner.env # # Every value below is a SAMPLE placeholder — never commit real secrets. For the generated, # always-current table of every miner env var and its default, see -# packages/gittensory-miner/docs/env-reference.md (regenerate with `npm run miner:env-reference`). +# packages/loopover-miner/docs/env-reference.md (regenerate with `npm run miner:env-reference`). # ============================================================================= # 1. Required @@ -17,7 +17,7 @@ GITHUB_TOKEN=ghp_your_token_here # Docker Swarm/Kubernetes secret-mount alternative: set GITHUB_TOKEN_FILE to a mounted file path instead # of a plaintext value above (keeps the token out of `docker inspect`); an explicit GITHUB_TOKEN always -# wins if both are set. See packages/gittensory-miner/DEPLOYMENT.md's "Secret-file alternative" section. +# wins if both are set. See packages/loopover-miner/DEPLOYMENT.md's "Secret-file alternative" section. # GITHUB_TOKEN_FILE=/run/secrets/github_token # ============================================================================= diff --git a/.loopover.yml b/.loopover.yml index 218dba3a53..cde6d61911 100644 --- a/.loopover.yml +++ b/.loopover.yml @@ -12,7 +12,7 @@ wantedPaths: - review-enrichment/ - .github/workflows/ - wrangler.jsonc - - apps/gittensory-ui/ + - apps/loopover-ui/ preferredLabels: - bug diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 01004dd521..acd6f345a9 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,6 +1,6 @@ { - "packages/gittensory-mcp": "1.0.0", - "packages/gittensory-engine": "2.0.0", - "packages/gittensory-miner": "2.0.0", - "packages/gittensory-ui-kit": "0.2.0" + "packages/loopover-mcp": "1.0.0", + "packages/loopover-engine": "2.0.0", + "packages/loopover-miner": "2.0.0", + "packages/loopover-ui-kit": "0.2.0" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0604a159fb..01034b3989 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -73,7 +73,7 @@ Focused contributions are welcome in these areas: - GitHub App webhook, check-run, command, sanitized comment, and installation-health behavior. - Registry, bounty, issue, PR, label, queue, collision, and GitHub backfill ingestion. - Deterministic signal builders for contributors, maintainers, repository owners, and operators. -- The Lovable/TanStack Start frontend under `apps/gittensory-ui`, as long as it preserves the +- The Lovable/TanStack Start frontend under `apps/loopover-ui`, as long as it preserves the current product structure and stays wired to live API data or honest empty/error states. - Cloudflare Worker, D1, Queue, scheduled job, deploy, and production smoke reliability. - MCP server/client behavior, CLI ergonomics, compatibility metadata, and npm package hygiene. @@ -224,7 +224,7 @@ Backend/API: Frontend: -- The production frontend is the TanStack Start app in `apps/gittensory-ui`. +- The production frontend is the TanStack Start app in `apps/loopover-ui`. - Use the existing design system and route structure unless a maintainer explicitly approves a larger redesign. - Signed-in app state comes from `GET /v1/auth/session`; do not restore app login through @@ -261,7 +261,7 @@ Cloudflare/deploy: include: `src/**`, `wrangler.jsonc`, `migrations/**`, `package.json`, `package-lock.json`, `tsconfig*.json`, `drizzle.config.ts`; exclude: `apps/**`, `docs/**`, `**/*.md`. - `gittensory-ui` build command: `npm run build:cloudflare`. Scope its watch-paths to - `apps/gittensory-ui/**` (note: the UI build runs `ui:openapi` off the API contract, so rebuild the + `apps/loopover-ui/**` (note: the UI build runs `ui:openapi` off the API contract, so rebuild the UI after API OpenAPI changes). - Do not re-add GitHub Pages or static-site deployment workflows. diff --git a/README.md b/README.md index 08b5ef909f..044a68072f 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ See [Tuning your reviews](https://gittensory.aethereal.dev/docs/tuning) for the | Website | [gittensory.aethereal.dev](https://gittensory.aethereal.dev/) | | Docs | [gittensory.aethereal.dev/docs](https://gittensory.aethereal.dev/docs) | | MCP package | [@loopover/mcp](https://www.npmjs.com/package/@loopover/mcp) | -| Engine package | [`@loopover/engine`](packages/gittensory-engine/README.md) — shared deterministic logic for the review stack and miner | -| Miner package | [`@loopover/miner`](packages/gittensory-miner/README.md) — local foundation CLI for the autonomous miner runtime | +| Engine package | [`@loopover/engine`](packages/loopover-engine/README.md) — shared deterministic logic for the review stack and miner | +| Miner package | [`@loopover/miner`](packages/loopover-miner/README.md) — local foundation CLI for the autonomous miner runtime | | API | [API browser](https://gittensory.aethereal.dev/api) and [OpenAPI JSON](https://gittensory-api.aethereal.dev/openapi.json) | | GitHub App | [Setup docs](https://gittensory.aethereal.dev/docs/github-app) — self-hosting is the only currently available path | | Browser extension | [Extension page](https://gittensory.aethereal.dev/extension) | diff --git a/alertmanager/alertmanager.yml b/alertmanager/alertmanager.yml index d07748a6f8..4c1f29256f 100644 --- a/alertmanager/alertmanager.yml +++ b/alertmanager/alertmanager.yml @@ -9,7 +9,7 @@ # # THIS IS A REQUIRED STEP for any deployment you expect to run unattended, not an # optional one — see https://gittensory.aethereal.dev/docs/self-hosting-operations -# (apps/gittensory-ui/src/routes/docs.self-hosting-operations.tsx), "Alerting — required +# (apps/loopover-ui/src/routes/docs.self-hosting-operations.tsx), "Alerting — required # for a 24/7 deployment" section, for the fastest verified path (a Discord webhook via # webhook_url_file, uncomment the block below) and for the Grafana "Alerts" row you can # check manually until you do. Until a real receiver is wired up, every rule in diff --git a/apps/gittensory-extension/.gitignore b/apps/loopover-extension/.gitignore similarity index 100% rename from apps/gittensory-extension/.gitignore rename to apps/loopover-extension/.gitignore diff --git a/apps/gittensory-extension/auth.js b/apps/loopover-extension/auth.js similarity index 100% rename from apps/gittensory-extension/auth.js rename to apps/loopover-extension/auth.js diff --git a/apps/gittensory-extension/background.js b/apps/loopover-extension/background.js similarity index 100% rename from apps/gittensory-extension/background.js rename to apps/loopover-extension/background.js diff --git a/apps/gittensory-extension/content.js b/apps/loopover-extension/content.js similarity index 100% rename from apps/gittensory-extension/content.js rename to apps/loopover-extension/content.js diff --git a/apps/gittensory-extension/manifest.json b/apps/loopover-extension/manifest.json similarity index 100% rename from apps/gittensory-extension/manifest.json rename to apps/loopover-extension/manifest.json diff --git a/apps/gittensory-extension/options.html b/apps/loopover-extension/options.html similarity index 100% rename from apps/gittensory-extension/options.html rename to apps/loopover-extension/options.html diff --git a/apps/gittensory-extension/options.js b/apps/loopover-extension/options.js similarity index 100% rename from apps/gittensory-extension/options.js rename to apps/loopover-extension/options.js diff --git a/apps/gittensory-extension/package.json b/apps/loopover-extension/package.json similarity index 89% rename from apps/gittensory-extension/package.json rename to apps/loopover-extension/package.json index 5c42258106..dc29d3d2f2 100644 --- a/apps/gittensory-extension/package.json +++ b/apps/loopover-extension/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-extension", + "name": "@loopover/extension", "version": "0.1.0", "private": true, "description": "Maintainer-facing browser extension overlay for GitHub pull requests and issues.", diff --git a/apps/gittensory-extension/styles.css b/apps/loopover-extension/styles.css similarity index 100% rename from apps/gittensory-extension/styles.css rename to apps/loopover-extension/styles.css diff --git a/apps/gittensory-miner-extension/.gitignore b/apps/loopover-miner-extension/.gitignore similarity index 100% rename from apps/gittensory-miner-extension/.gitignore rename to apps/loopover-miner-extension/.gitignore diff --git a/apps/gittensory-miner-extension/README.md b/apps/loopover-miner-extension/README.md similarity index 92% rename from apps/gittensory-miner-extension/README.md rename to apps/loopover-miner-extension/README.md index a66773f195..98abf533b4 100644 --- a/apps/gittensory-miner-extension/README.md +++ b/apps/loopover-miner-extension/README.md @@ -1,7 +1,7 @@ # LoopOver Miner Extension Contributor-facing browser extension for GitHub **issue** pages. It is intentionally separate from -[`apps/gittensory-extension/`](../gittensory-extension/) (the **Maintainer Overlay**), which injects private PR/issue +[`apps/loopover-extension/`](../gittensory-extension/) (the **Maintainer Overlay**), which injects private PR/issue context for maintainers. ## What it does @@ -11,7 +11,7 @@ context for maintainers. - Read-only opportunity badge (score/tier + short why) for watched repositories - Options page for watched repos and a local ranked-candidate cache -The badge surfaces the same ranked signal as `packages/gittensory-miner/lib/opportunity-ranker.js` by reading +The badge surfaces the same ranked signal as `packages/loopover-miner/lib/opportunity-ranker.js` by reading pre-ranked candidates from browser local storage. It never writes to GitHub and omits itself when no ranked signal is available for the current issue. diff --git a/apps/gittensory-miner-extension/background.js b/apps/loopover-miner-extension/background.js similarity index 98% rename from apps/gittensory-miner-extension/background.js rename to apps/loopover-miner-extension/background.js index aa7d030e37..11a4fb010c 100644 --- a/apps/gittensory-miner-extension/background.js +++ b/apps/loopover-miner-extension/background.js @@ -95,8 +95,8 @@ async function loadMinerUiUrl() { } /** Live-fetch replacement for the manual copy/paste workflow (#4859): pulls the miner's last discover run's - * ranked candidates from the local miner-ui's read-only /api/ranked-candidates endpoint (packages/gittensory- - * miner/lib/ranked-candidates.js via apps/gittensory-miner-ui/vite-ranked-candidates-api.ts) and writes them + * ranked candidates from the local miner-ui's read-only /api/ranked-candidates endpoint (packages/loopover- + * miner/lib/ranked-candidates.js via apps/loopover-miner-ui/vite-ranked-candidates-api.ts) and writes them * into the SAME chrome.storage.local keys the manual-paste flow (options.js) already writes * (rankedCandidates/rankedCandidatesSavedAt) -- so content.js/opportunity-badge.js/toolbar-badge.js need zero * changes; they already read from that one shared source regardless of which flow populated it. diff --git a/apps/gittensory-miner-extension/content.js b/apps/loopover-miner-extension/content.js similarity index 100% rename from apps/gittensory-miner-extension/content.js rename to apps/loopover-miner-extension/content.js diff --git a/apps/gittensory-miner-extension/icons/icon-128.png b/apps/loopover-miner-extension/icons/icon-128.png similarity index 100% rename from apps/gittensory-miner-extension/icons/icon-128.png rename to apps/loopover-miner-extension/icons/icon-128.png diff --git a/apps/gittensory-miner-extension/icons/icon-16.png b/apps/loopover-miner-extension/icons/icon-16.png similarity index 100% rename from apps/gittensory-miner-extension/icons/icon-16.png rename to apps/loopover-miner-extension/icons/icon-16.png diff --git a/apps/gittensory-miner-extension/icons/icon-32.png b/apps/loopover-miner-extension/icons/icon-32.png similarity index 100% rename from apps/gittensory-miner-extension/icons/icon-32.png rename to apps/loopover-miner-extension/icons/icon-32.png diff --git a/apps/gittensory-miner-extension/icons/icon-48.png b/apps/loopover-miner-extension/icons/icon-48.png similarity index 100% rename from apps/gittensory-miner-extension/icons/icon-48.png rename to apps/loopover-miner-extension/icons/icon-48.png diff --git a/apps/gittensory-miner-extension/manifest.json b/apps/loopover-miner-extension/manifest.json similarity index 100% rename from apps/gittensory-miner-extension/manifest.json rename to apps/loopover-miner-extension/manifest.json diff --git a/apps/gittensory-miner-extension/opportunity-badge.js b/apps/loopover-miner-extension/opportunity-badge.js similarity index 97% rename from apps/gittensory-miner-extension/opportunity-badge.js rename to apps/loopover-miner-extension/opportunity-badge.js index dc3b46fa29..5fca4fa616 100644 --- a/apps/gittensory-miner-extension/opportunity-badge.js +++ b/apps/loopover-miner-extension/opportunity-badge.js @@ -46,7 +46,7 @@ function formatOpportunityBadge(entry) { } // Mirrors ORB's shared RefreshMeta component's relative-time thresholds/format -// (packages/gittensory-ui-kit/src/utils.ts's relativeTimeFromNow: just now / Xm ago / Xh ago / Xd ago), +// (packages/loopover-ui-kit/src/utils.ts's relativeTimeFromNow: just now / Xm ago / Xh ago / Xd ago), // reimplemented here because this content script ships unbundled and cannot import that package (#5192). function formatLastSyncedLabel(savedAt, nowMs) { if (typeof savedAt !== "number" || !Number.isFinite(savedAt)) return null; diff --git a/apps/gittensory-miner-extension/options.html b/apps/loopover-miner-extension/options.html similarity index 98% rename from apps/gittensory-miner-extension/options.html rename to apps/loopover-miner-extension/options.html index e5816f93b2..abbeaa2dbe 100644 --- a/apps/gittensory-miner-extension/options.html +++ b/apps/loopover-miner-extension/options.html @@ -57,7 +57,7 @@

LoopOver miner extension

Configure which repositories this contributor-facing extension should watch on GitHub issue pages. This is a - separate product surface from the maintainer overlay at apps/gittensory-extension/. + separate product surface from the maintainer overlay at apps/loopover-extension/.