From 3e3ced288d3be86eda9e7def47d0474b37e89343 Mon Sep 17 00:00:00 2001 From: JSONbored <49853598+JSONbored@users.noreply.github.com> Date: Tue, 14 Jul 2026 02:21:57 -0700 Subject: [PATCH 1/4] feat(docker)!: Phase 7 - full-cutover rename Docker/k8s/systemd manifests to loopover-* Phase 7 of the gittensory -> loopover rebrand (#5705): renames every Docker/k8s/systemd resource identifier and the operator-mounted gittensory-config/ directory convention, full cutover. - Root Dockerfile: comments, DATABASE_PATH default (gittensory.sqlite -> loopover.sqlite). - k8s/miner-deployment.yaml, k8s/miner-secret.example.yaml, k8s/README.md: StatefulSet/label/service/secret names, image tag, kubectl examples. - systemd/gittensory-miner.service.example -> loopover-miner.service.example, systemd/gittensory-miner-ui.service.example -> loopover-miner-ui.service.example (renamed to match the existing loopover-docker-prune.*.example convention): unit descriptions, User=, host paths, install steps. - docker-compose.yml + .gitignore + config/examples/: the operator-mounted ./gittensory-config -> ./loopover-config bind-mount convention, plus the stale ~/.config/gittensory-miner AMS-ledger-export doc-drift left behind by the config-directory rename in #5721. - scripts/gittensory-config-lint.ts -> scripts/loopover-config-lint.ts (git mv, its own error-message prefix, and every reference: package.json, docs, tests). - scripts/selfhost-update.sh, scripts/selfhost-post-update-check.sh: the same directory-convention comments. - 6 apps/gittensory-ui self-hosting docs pages (operations, quickstart, configuration, release-checklist, docs-audit, maintainer-self-hosting): every gittensory-config/ code example and prose reference. Explicitly NOT touched: .env.example's Sentry/OTEL/domain-example/hosted- collector-URL prose (Phase 8 scope, unrelated to Docker/k8s) and apps/gittensory-*/packages/gittensory-* directory names themselves (Phase 5). BREAKING CHANGE: the self-host operator-mounted config directory is now ./loopover-config (was ./gittensory-config); systemd unit filenames changed; k8s StatefulSet/Secret/label names changed. No dual-read/alias, per the epic's full-cutover mandate. Self-host operators must rename their existing ./gittensory-config directory (and any k8s/systemd units built from the old examples) to match. --- .env.example | 4 +-- .gitignore | 8 ++--- Dockerfile | 8 ++--- .../routes/docs.maintainer-self-hosting.tsx | 8 ++--- .../docs.self-hosting-configuration.tsx | 8 ++--- .../routes/docs.self-hosting-docs-audit.tsx | 2 +- .../routes/docs.self-hosting-operations.tsx | 10 +++--- .../routes/docs.self-hosting-quickstart.tsx | 8 ++--- .../docs.self-hosting-release-checklist.tsx | 6 ++-- config/examples/TEMPLATES.md | 16 +++++----- config/examples/global.loopover.yml | 2 +- docker-compose.yml | 10 +++--- k8s/README.md | 8 ++--- k8s/miner-deployment.yaml | 26 +++++++-------- k8s/miner-secret.example.yaml | 8 ++--- package.json | 2 +- ...config-lint.ts => loopover-config-lint.ts} | 2 +- scripts/selfhost-post-update-check.sh | 2 +- scripts/selfhost-update.sh | 2 +- ...mple => loopover-miner-ui.service.example} | 26 +++++++-------- ...example => loopover-miner.service.example} | 32 +++++++++---------- .../docs-selfhost-activation-paths.test.ts | 2 +- .../docs-selfhost-git-deploy-hygiene.test.ts | 2 +- .../docs-selfhost-update-rollback.test.ts | 2 +- ...ts => loopover-config-lint-script.test.ts} | 2 +- test/unit/mcp-cli-basics.test.ts | 6 ++-- 26 files changed, 106 insertions(+), 106 deletions(-) rename scripts/{gittensory-config-lint.ts => loopover-config-lint.ts} (97%) rename systemd/{gittensory-miner-ui.service.example => loopover-miner-ui.service.example} (71%) rename systemd/{gittensory-miner.service.example => loopover-miner.service.example} (59%) rename test/unit/{gittensory-config-lint-script.test.ts => loopover-config-lint-script.test.ts} (99%) diff --git a/.env.example b/.env.example index 9d780549cb..7b34a2ae76 100644 --- a/.env.example +++ b/.env.example @@ -509,12 +509,12 @@ REDIS_URL=redis://redis:6379 # REQUIRED for the self-host review # GRAFANA_REPORTING_EXPORT_INTERVAL_SECONDS=30 # refresh cadence for the redacted reporting SQLite export # LOOPOVER_REPORTING_SOURCE_DB=/appdb/loopover.sqlite # if DATABASE_PATH=/data/custom.sqlite, set /appdb/custom.sqlite # -# AMS (gittensory-miner) ledger dashboards — only useful when a miner ALSO runs on this same host (see +# 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 # 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. -# LOOPOVER_MINER_CONFIG_DIR=~/.config/gittensory-miner # host dir the exporter mounts read-only at /ams-ledgers +# LOOPOVER_MINER_CONFIG_DIR=~/.config/loopover-miner # host dir the exporter mounts read-only at /ams-ledgers # LOOPOVER_AMS_REPORTING_EXPORT_INTERVAL_SECONDS=30 # refresh cadence for the redacted AMS ledger exports # # Claude usage telemetry → OTEL collector → Prometheus → the Claude usage dashboard. OFF by default. diff --git a/.gitignore b/.gitignore index faf6ce49fa..6fd180e0f6 100644 --- a/.gitignore +++ b/.gitignore @@ -35,10 +35,10 @@ alertmanager/*_url alertmanager/*_url_file # Private self-host operator config. Root AGENTS.md/CLAUDE.md are public project docs; # repo-scoped review instructions live under this ignored mount. -gittensory-config/ -gittensory-config.backup-*/ +loopover-config/ +loopover-config.backup-*/ # Operator deploy-backup snapshots -- contains raw .env/.yml backups and config tarballs, same -# exposure class as gittensory-config/ above (secrets + private review rules), just under a +# exposure class as loopover-config/ above (secrets + private review rules), just under a # different directory name that the pattern above does not match. .deploy-backups/ # Codex/CLI auth state must only live in runtime volumes or operator home dirs. @@ -55,7 +55,7 @@ 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 -# checkout. Trailing on purpose: the narrower gittensory-config.backup-*/ and .deploy-backups/ +# checkout. Trailing on purpose: the narrower loopover-config.backup-*/ and .deploy-backups/ # rules above already cover their specific directories, and nothing tracked in the repo matches # either pattern (verified via `git ls-files | grep -E '\.bak-|\.backup-'`) (#1660). *.bak-* diff --git a/Dockerfile b/Dockerfile index cba48c683b..0dc7e341c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# Self-host image for gittensory-api (#980). Runs the SAME Worker handlers on Node via src/server.ts — +# Self-host image for loopover-api (#980). Runs the SAME Worker handlers on Node via src/server.ts — # the Cloudflare bindings become self-host adapters (D1 -> node:sqlite, Queue -> in-process). The hosted # Cloudflare Worker (wrangler) deploy is unaffected. SECRETS ARE NEVER BAKED: supply them at run time via # the .env file or mounted *_FILE secrets (see docker-compose.yml + .env.example). @@ -13,7 +13,7 @@ WORKDIR /app # (workspaces: apps/*, packages/*), and `npm ci` only symlinks node_modules/ to a workspace whose # directory already exists on disk. Copying just the root package*.json first (the usual dependency-layer # caching trick) left every workspace package.json missing at `npm ci` time, so npm silently skipped every -# internal symlink -- @loopover/engine (a workspace dependency of gittensory-miner's checked-in +# internal symlink -- @loopover/engine (a workspace dependency of loopover-miner's checked-in # lib/*.js artifacts, #2281) then couldn't be resolved by esbuild no matter how/when its own dist/ was built. COPY . . # --ignore-scripts: no native builds are needed (SQLite is the built-in node:sqlite; @hono/node-server is @@ -32,7 +32,7 @@ ARG LOOPOVER_VERSION= ENV NODE_ENV=production \ PLATFORM=self-hosted \ PORT=8787 \ - DATABASE_PATH=/data/gittensory.sqlite \ + DATABASE_PATH=/data/loopover.sqlite \ MIGRATIONS_DIR=/app/migrations \ NPM_CONFIG_PREFIX=/home/node/.npm-global \ LOOPOVER_VERSION=${LOOPOVER_VERSION} @@ -96,7 +96,7 @@ FROM runtime-base AS runtime-prebuilt COPY --chown=node:node dist/server.mjs ./dist/server.mjs COPY --chown=node:node migrations ./migrations # Generic, safe self-host private-config templates (config/examples/, #layered-private-config) — reference only. -# GITTENSORY_REPO_CONFIG_DIR still points at the operator-mounted /config, so shipping these activates nothing. +# LOOPOVER_REPO_CONFIG_DIR still points at the operator-mounted /config, so shipping these activates nothing. COPY --chown=node:node config/examples ./config/examples # Default local/operator builds still build the bundle inside Docker, but only the JS bundle reaches runtime. diff --git a/apps/gittensory-ui/src/routes/docs.maintainer-self-hosting.tsx b/apps/gittensory-ui/src/routes/docs.maintainer-self-hosting.tsx index 9d506bc9e5..059cc16999 100644 --- a/apps/gittensory-ui/src/routes/docs.maintainer-self-hosting.tsx +++ b/apps/gittensory-ui/src/routes/docs.maintainer-self-hosting.tsx @@ -223,9 +223,9 @@ function MaintainerSelfHosting() { Checks: write included — re-approve on existing Apps after permission bumps).
  • - Mount ./gittensory-config and copy{" "} + Mount ./loopover-config and copy{" "} config/examples/global.loopover.yml →{" "} - gittensory-config/.loopover.yml for a centralized private default (per-repo + loopover-config/.loopover.yml for a centralized private default (per-repo files deep-merge on top).
  • @@ -245,12 +245,12 @@ function MaintainerSelfHosting() { { title: "Single-command repo onboarding", description: - "Today: edit .env allowlist, copy YAML templates, sign into the panel, click activate. Proposed: one CLI/API command that adds owner/repo to LOOPOVER_REVIEW_REPOS, seeds gittensory-config/owner__repo/.loopover.yml from global.loopover.yml, and POSTs activation — idempotent, dry-run aware.", + "Today: edit .env allowlist, copy YAML templates, sign into the panel, click activate. Proposed: one CLI/API command that adds owner/repo to LOOPOVER_REVIEW_REPOS, seeds loopover-config/owner__repo/.loopover.yml from global.loopover.yml, and POSTs activation — idempotent, dry-run aware.", }, { title: "Centralized private default only", description: - "Most fleets need one gittensory-config/.loopover.yml with optional per-repo overrides — docs now treat that as the default story instead of implying every repo needs its own file.", + "Most fleets need one loopover-config/.loopover.yml with optional per-repo overrides — docs now treat that as the default story instead of implying every repo needs its own file.", }, { title: "Advisory-by-default on first install", diff --git a/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx b/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx index f3d747fb7c..afb2acab7b 100644 --- a/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx +++ b/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx @@ -135,8 +135,8 @@ function SelfHostingConfiguration() { cp config/examples/loopover.minimal.yml .loopover.yml # Self-host private mount (operator-only policy) -mkdir -p gittensory-config -cp config/examples/global.loopover.yml gittensory-config/.loopover.yml`} +mkdir -p loopover-config +cp config/examples/global.loopover.yml loopover-config/.loopover.yml`} /> Keep anti-abuse thresholds, maintainer allowlists, and autonomy dials in the{" "} @@ -144,7 +144,7 @@ cp config/examples/global.loopover.yml gittensory-config/.loopover.yml`} read. config/examples/TEMPLATES.md documents the public-vs-private split and how to apply the templates to gittensory, awesome-claude, and{" "} metagraphed without committing private policy. Lint before deploy:{" "} - npx tsx scripts/gittensory-config-lint.ts path/to/.loopover.yml. + npx tsx scripts/loopover-config-lint.ts path/to/.loopover.yml.

    Authoritative copies in git: