diff --git a/.claude/skills/contributing-to-gittensory/SKILL.md b/.claude/skills/contributing-to-gittensory/SKILL.md index d6415b1096..7db61c77a4 100644 --- a/.claude/skills/contributing-to-gittensory/SKILL.md +++ b/.claude/skills/contributing-to-gittensory/SKILL.md @@ -96,7 +96,7 @@ approved, then confirm it's green. **Install the gittensory MCP** — your pre-submit oracle that predicts the gate before you push: ```sh -npm install -g @jsonbored/gittensory-mcp@latest +npm install -g @jsonbored/loopover-mcp@latest gittensory-mcp login # GitHub device flow (for the auth'd preflight tools) gittensory-mcp init-client --print codex # prints TOML for ~/.codex/config.toml ([mcp_servers.gittensory]) gittensory-mcp init-client --print claude # or --print cursor — prints the correct config per tool @@ -204,7 +204,7 @@ Run the matching command(s) and **commit the regenerated file(s)** — CI fails | 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) | | CLI command surface | `npm run command-reference` | the generated command-reference doc | -| UI files (`apps/gittensory-ui/**`) | `npm --workspace @jsonbored/gittensory-ui run format` | formatted files | +| UI files (`apps/gittensory-ui/**`) | `npm --workspace @jsonbored/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. @@ -222,14 +222,14 @@ npm audit --audit-level=moderate # the dependency-review job's local eq `npm run test:ci` runs, and must pass, **all of**: `actionlint`, `db:migrations:check`, `db:schema-drift:check`, `selfhost:env-reference:check`, `selfhost:validate-observability`, `cf-typegen:check`, `typecheck`, `test:coverage`, `test:engine-parity`, `test:driver-parity`, the -`@jsonbored/gittensory-engine` workspace's own test run, `test:workers`, `build:mcp`, `test:mcp-pack`, +`@jsonbored/loopover-engine` workspace's own test run, `test:workers`, `build:mcp`, `test:mcp-pack`, `build:miner`, `test:miner-pack`, `rees:test`, `ui:openapi:check`, `ui:openapi:settings-parity`, `ui:version-audit`, `docs:drift-check`, `manifest:drift-check`, `engine-parity:drift-check`, `command-reference:check`, `ui:lint`, `ui:typecheck`, `ui:test`, `ui:build`. If any step fails, fix it and re-run — do not push a red tree. (Full per-check table in `reference.md`; check `package.json`'s own `test:ci` script if this list and that script ever disagree — the script is the source of truth.) -If `ui:lint` fails on formatting, run `npm --workspace @jsonbored/gittensory-ui run format`. If +If `ui:lint` fails on formatting, run `npm --workspace @jsonbored/loopover-ui run format`. If `ui:openapi:check` fails, you forgot Phase 4's `ui:openapi`. **Sync with `main` before you push if it moved** — a base conflict auto-closes a contributor PR: diff --git a/.claude/skills/contributing-to-gittensory/reference.md b/.claude/skills/contributing-to-gittensory/reference.md index 49a9325fc6..8e7909b140 100644 --- a/.claude/skills/contributing-to-gittensory/reference.md +++ b/.claude/skills/contributing-to-gittensory/reference.md @@ -59,12 +59,12 @@ these for a normal PR:** | Local command | Why it's not in the table above | |---|---| | `npm run test:engine-parity`, `npm run test:driver-parity` | Plain `test/contract/*.test.ts` files — no dedicated CI job, but they DO run in CI as part of whichever `test (1/2)` shard happens to contain them (sharded `vitest run`). | -| `npm run test --workspace @jsonbored/gittensory-engine` | The engine package's own `node --test` suite. **Not run by `ci.yml` on a PR at all** — only by `.github/workflows/publish-engine.yml` at release time. A regression here is invisible to Codecov and to every PR-gating CI check; `test:ci` locally is the only pre-merge signal. | +| `npm run test --workspace @jsonbored/loopover-engine` | The engine package's own `node --test` suite. **Not run by `ci.yml` on a PR at all** — only by `.github/workflows/publish-engine.yml` at release time. A regression here is invisible to Codecov and to every PR-gating CI check; `test:ci` locally is the only pre-merge signal. | | `npm run manifest:drift-check`, `npm run engine-parity:drift-check` | Appear in `test:ci` only — not in `ci.yml` under any job. | 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 -@jsonbored/gittensory-engine` isn't part of `ci.yml`. If your change touches +@jsonbored/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 checks go green) is the only way to know you didn't break it. @@ -138,12 +138,12 @@ PR-side signals that raise slop risk (band: clean 0 / low 1–24 / elevated 25 --- -## 5. MCP pre-submit tools (`@jsonbored/gittensory-mcp`) +## 5. MCP pre-submit tools (`@jsonbored/loopover-mcp`) Install + configure (let the CLI print the right config for your tool — **Codex is TOML, not JSON**): ```sh -npm install -g @jsonbored/gittensory-mcp@latest +npm install -g @jsonbored/loopover-mcp@latest gittensory-mcp login # GitHub device flow gittensory-mcp init-client --print codex # → ~/.codex/config.toml ([mcp_servers.gittensory]) gittensory-mcp init-client --print claude # or --print cursor (→ mcpServers JSON) @@ -240,7 +240,7 @@ absence of forbidden terms. ## 7. Style, lint, naming - **Prettier (UI):** printWidth 100, double quotes, semicolons, `trailingComma: all`. Fix: - `npm --workspace @jsonbored/gittensory-ui run format`. (`routeTree.gen.ts` and lockfiles are ignored.) + `npm --workspace @jsonbored/loopover-ui run format`. (`routeTree.gen.ts` and lockfiles are ignored.) - **ESLint (UI):** `react-hooks/recommended`; `react-refresh/only-export-components` (non-component exports must move to a `*-model.ts`); **design-token** `no-restricted-syntax` in `src/components/site/**` + `src/routes/**` (use `text-token-*`, `leading-token-*`, `rounded-token`, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa8f20fd07..4970ad07cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,7 +105,7 @@ jobs: # 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 - # dependency on @jsonbored/gittensory-engine (isTestFile/isCodeFile), which the bin subprocess and + # dependency on @jsonbored/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 # imports src/mcp/server.ts in-process, and server.ts alone directly imports ~40 other src/ modules @@ -274,7 +274,7 @@ jobs: 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 -- - # committed, pre-built JS -- which itself imports @jsonbored/gittensory-engine. That package's dist/ is + # committed, pre-built JS -- which itself imports @jsonbored/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- # narrow trigger). Originally ran after coverage (broke test:coverage on PRs that didn't touch the @@ -283,7 +283,7 @@ jobs: # of both. - name: Build engine package if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.engine == 'true' || needs.changes.outputs.ui == 'true' }} - run: npm run build --workspace @jsonbored/gittensory-engine + run: npm run build --workspace @jsonbored/loopover-engine # .tsbuildinfo mutates every run (tsc's own incremental state), unlike node_modules above which is # immutable per lockfile -- so this needs the run_id-suffixed-key + restore-keys-prefix pattern (always # creates a new cache entry to save into, restore falls back to the most recent matching prefix) rather @@ -310,7 +310,7 @@ 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 @jsonbored/gittensory-engine for real (isTestFile/isCodeFile), so a + # gittensory-mcp now depends on @jsonbored/loopover-engine for real (isTestFile/isCodeFile), so a # PR that only touches packages/gittensory-engine/** must also rebuild + pack-check the mcp package, # not just the mcp filter's own (deliberately narrower) path list. - name: Build MCP @@ -389,7 +389,7 @@ jobs: # steps directly instead of the aggregate script, skipping that redundant regen. - name: UI build if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' }} - run: npm run extension:build && npm --workspace @jsonbored/gittensory-ui run build + run: npm run extension:build && npm --workspace @jsonbored/loopover-ui run build # The full-suite coverage run, sharded (#ci-shard-coverage). This alone was ~9-10 of the ~11 minutes a # typical backend PR spent in validate-code, because vitest schedules whole test FILES atomically to @@ -463,7 +463,7 @@ jobs: # 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. - name: Build engine package - run: npm run build --workspace @jsonbored/gittensory-engine + run: npm run build --workspace @jsonbored/loopover-engine - name: Prepare test reports dir run: mkdir -p reports/junit - name: Test with coverage (shard ${{ matrix.shard }}/6) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 64e4e8f601..637a70bba9 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -78,12 +78,12 @@ jobs: 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 @jsonbored/gittensory-engine. - # That package's dist/ is gitignored (see ci.yml's own build --workspace @jsonbored/gittensory-engine + # (via packages/gittensory-miner/lib/opportunity-fanout.js), which imports @jsonbored/loopover-engine. + # That package's dist/ is gitignored (see ci.yml's own build --workspace @jsonbored/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 @jsonbored/gittensory-engine" on every run. + # fails with "Failed to resolve entry for package @jsonbored/loopover-engine" on every run. - name: Build gittensory-engine - run: npm run build --workspace @jsonbored/gittensory-engine + run: npm run build --workspace @jsonbored/loopover-engine - name: MCP release validation gate run: npm run test:release:mcp @@ -93,7 +93,7 @@ jobs: - name: Pack and smoke-test the tarball run: | set -euo pipefail - PACK_JSON="$(npm pack --workspace @jsonbored/gittensory-mcp --pack-destination "$RUNNER_TEMP" --json)" + PACK_JSON="$(npm pack --workspace @jsonbored/loopover-mcp --pack-destination "$RUNNER_TEMP" --json)" TARBALL="$(node -e 'const fs=require("fs"); const input=fs.readFileSync(0,"utf8"); process.stdout.write(JSON.parse(input)[0].filename)' <<< "$PACK_JSON")" TARBALL_PATH="$RUNNER_TEMP/$TARBALL" UNEXPECTED_FILES="$(tar -tzf "$TARBALL_PATH" | grep -Ev '^(package/(bin|lib|scripts)/.+|package/(package.json|README.md|CHANGELOG.md|LICENSE))$' || true)" @@ -158,7 +158,7 @@ jobs: echo "Creating tag $TAG at HEAD ($HEAD_SHA)." git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git tag -a "$TAG" -m "@jsonbored/gittensory-mcp v${VERSION}" + git tag -a "$TAG" -m "@jsonbored/loopover-mcp v${VERSION}" git remote set-url origin "https://github.com/${GITHUB_REPOSITORY}.git" gh auth setup-git git push origin "$TAG" @@ -204,16 +204,16 @@ jobs: set -euo pipefail NOTES_FILE="$(mktemp)" cat > "$NOTES_FILE" </dev/null 2>&1; then - gh release edit "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/gittensory-mcp v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" + gh release edit "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/loopover-mcp v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" else - gh release create "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/gittensory-mcp v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" --verify-tag + gh release create "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/loopover-mcp v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" --verify-tag fi diff --git a/.github/workflows/publish-engine.yml b/.github/workflows/publish-engine.yml index 06ac57660c..15eb4f73c4 100644 --- a/.github/workflows/publish-engine.yml +++ b/.github/workflows/publish-engine.yml @@ -6,7 +6,7 @@ name: Publish Engine Package # released_by_release_please left false) is the human override path and self-tags HEAD from # packages/gittensory-engine/package.json's version. # -# NOTE: this workflow cannot run successfully until @jsonbored/gittensory-engine has been bootstrap +# NOTE: this workflow cannot run successfully until @jsonbored/loopover-engine has 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 package -- the package must already exist before a # Trusted Publisher can be configured in npmjs.com's package settings). Until that one-time manual @@ -90,14 +90,14 @@ jobs: run: npm ci - name: Engine test suite - run: npm run test --workspace @jsonbored/gittensory-engine + run: npm run test --workspace @jsonbored/loopover-engine # Build + pack happen in THIS unprivileged job (no id-token). The privileged publish job below # never runs npm install/build, so a compromised build dependency can't reach the OIDC token. - name: Pack and smoke-test the tarball run: | set -euo pipefail - PACK_JSON="$(npm pack --workspace @jsonbored/gittensory-engine --pack-destination "$RUNNER_TEMP" --json)" + PACK_JSON="$(npm pack --workspace @jsonbored/loopover-engine --pack-destination "$RUNNER_TEMP" --json)" TARBALL="$(node -e 'const fs=require("fs"); const input=fs.readFileSync(0,"utf8"); process.stdout.write(JSON.parse(input)[0].filename)' <<< "$PACK_JSON")" TARBALL_PATH="$RUNNER_TEMP/$TARBALL" UNEXPECTED_FILES="$(tar -tzf "$TARBALL_PATH" | grep -Ev '^(package/dist/.+|package/(package.json|README.md|CHANGELOG.md|LICENSE))$' || true)" @@ -114,8 +114,8 @@ jobs: npm --prefix "$TMP" init -y >/dev/null npm --prefix "$TMP" install "$TARBALL_PATH" >/dev/null node --input-type=module -e " - import { ENGINE_VERSION } from '$TMP/node_modules/@jsonbored/gittensory-engine/dist/index.js'; - import { isTestPath, isCodeFile } from '$TMP/node_modules/@jsonbored/gittensory-engine/dist/signals/test-evidence.js'; + import { ENGINE_VERSION } from '$TMP/node_modules/@jsonbored/loopover-engine/dist/index.js'; + import { isTestPath, isCodeFile } from '$TMP/node_modules/@jsonbored/loopover-engine/dist/signals/test-evidence.js'; if (typeof ENGINE_VERSION !== 'string' || !ENGINE_VERSION) throw new Error('ENGINE_VERSION smoke test failed'); if (isTestPath('test/foo.test.ts') !== true) throw new Error('isTestPath smoke test failed'); if (isCodeFile('src/foo.ts') !== true) throw new Error('isCodeFile smoke test failed'); @@ -178,7 +178,7 @@ jobs: echo "Creating tag $TAG at HEAD ($HEAD_SHA)." git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git tag -a "$TAG" -m "@jsonbored/gittensory-engine v${VERSION}" + git tag -a "$TAG" -m "@jsonbored/loopover-engine v${VERSION}" git remote set-url origin "https://github.com/${GITHUB_REPOSITORY}.git" gh auth setup-git git push origin "$TAG" @@ -224,16 +224,16 @@ jobs: set -euo pipefail NOTES_FILE="$(mktemp)" cat > "$NOTES_FILE" </dev/null 2>&1; then - gh release edit "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/gittensory-engine v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" + gh release edit "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/loopover-engine v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" else - gh release create "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/gittensory-engine v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" --verify-tag + gh release create "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --title "@jsonbored/loopover-engine v${RELEASE_VERSION}" --notes-file "$NOTES_FILE" --verify-tag fi diff --git a/.github/workflows/release-selfhost.yml b/.github/workflows/release-selfhost.yml index e62f7b8a83..bbb10c2dcd 100644 --- a/.github/workflows/release-selfhost.yml +++ b/.github/workflows/release-selfhost.yml @@ -123,12 +123,12 @@ 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 @jsonbored/gittensory-engine. + # packages/gittensory-miner/lib/*.js (committed, pre-built) which imports @jsonbored/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). - name: Build engine package - run: npm run build --workspace @jsonbored/gittensory-engine + run: npm run build --workspace @jsonbored/loopover-engine - name: Build self-host bundle for release run: node scripts/build-selfhost.mjs --all diff --git a/.github/workflows/selfhost.yml b/.github/workflows/selfhost.yml index f8ff53ee7b..68ebc8c222 100644 --- a/.github/workflows/selfhost.yml +++ b/.github/workflows/selfhost.yml @@ -75,13 +75,13 @@ jobs: run: npm ci --ignore-scripts # Same #ci-engine-build-order fix as ci.yml (see its "Build engine package" step): the Postgres - # integration test's import graph now reaches @jsonbored/gittensory-engine transitively (#5117 moved + # integration test's import graph now reaches @jsonbored/loopover-engine transitively (#5117 moved # local-write action specs there; src/mcp/local-write-tools.ts re-exports them). That package's # dist/ is gitignored and only exists after this build step, so the test fails to resolve the # package's exports without it -- this workflow never needed the engine package built before, so it # never had this step; it does now. - name: Build engine package - run: npm run build --workspace @jsonbored/gittensory-engine + run: npm run build --workspace @jsonbored/loopover-engine - name: Postgres integration test (real PG) run: PG_TEST_URL=postgres://postgres:devpw@localhost:5432/gittensory npx vitest run test/integration/selfhost-pg.test.ts diff --git a/.github/workflows/ui-deploy.yml b/.github/workflows/ui-deploy.yml index d1785dec15..74be6ca36b 100644 --- a/.github/workflows/ui-deploy.yml +++ b/.github/workflows/ui-deploy.yml @@ -37,4 +37,4 @@ jobs: - name: Validate frontend env: VITE_GITTENSORY_API_ORIGIN: https://gittensory-api.aethereal.dev - run: npm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm run extension:build && npm --workspace @jsonbored/gittensory-ui run build + run: npm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm run extension:build && npm --workspace @jsonbored/loopover-ui run build diff --git a/AGENTS.md b/AGENTS.md index e91dd8e405..f066a98c6d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -35,4 +35,4 @@ process evolves — edits to those files improve both Claude Code and Codex. are also capped at **2 open PRs at a time** — close or wait for one to resolve before opening a third. The full procedure, the gate disposition matrix, test patterns, the MCP pre-submit predictors -(`@jsonbored/gittensory-mcp`), and the PR template are all in the skill files above — use them. +(`@jsonbored/loopover-mcp`), and the PR template are all in the skill files above — use them. diff --git a/Dockerfile b/Dockerfile index 45322820a0..9b4103afff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,13 +13,13 @@ 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 -- @jsonbored/gittensory-engine (a workspace dependency of gittensory-miner's checked-in +# internal symlink -- @jsonbored/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 # pure JS; esbuild ships its binary as an optional dependency, not a script). RUN npm ci --ignore-scripts -RUN npm --workspace @jsonbored/gittensory-engine run build +RUN npm --workspace @jsonbored/loopover-engine run build # --all: bundle every dependency into one self-contained dist/server.mjs, so the runtime image needs no # node_modules (≈10× smaller). The bundle has zero `cloudflare:*` imports (stubbed at build), so no loader. RUN node scripts/build-selfhost.mjs --all diff --git a/apps/gittensory-miner-ui/eslint.config.js b/apps/gittensory-miner-ui/eslint.config.js index 131f9e562a..4f1cc68880 100644 --- a/apps/gittensory-miner-ui/eslint.config.js +++ b/apps/gittensory-miner-ui/eslint.config.js @@ -34,7 +34,7 @@ export default tseslint.config( selector: "Literal[value=/(^|\\s)(text-(2xs|xs|sm|base|md|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)|text-\\[\\d|leading-(none|tight|snug|normal|relaxed|loose|3|4|5|6|7|8|9|10)|leading-\\[|rounded-(sm|md|lg|xl|2xl|3xl)|divide-y(\\s|$)|border-(t|b|l|r)(\\s|$))(\\s|$)/]", message: - "Use design tokens instead: text-token-*, leading-token-*, rounded-token, border-hairline / divide-hairline. See @jsonbored/gittensory-ui-kit/theme.css.", + "Use design tokens instead: text-token-*, leading-token-*, rounded-token, border-hairline / divide-hairline. See @jsonbored/loopover-ui-kit/theme.css.", }, { selector: diff --git a/apps/gittensory-miner-ui/package.json b/apps/gittensory-miner-ui/package.json index c13777a746..7c16998f97 100644 --- a/apps/gittensory-miner-ui/package.json +++ b/apps/gittensory-miner-ui/package.json @@ -1,8 +1,8 @@ { - "name": "@jsonbored/gittensory-miner-ui", + "name": "@jsonbored/loopover-miner-ui", "version": "0.0.0", "private": true, - "description": "Local read-only dashboard shell for the Gittensory miner.", + "description": "Local read-only dashboard shell for the LoopOver miner.", "packageManager": "npm@10.9.8", "type": "module", "scripts": { @@ -15,7 +15,7 @@ "format": "prettier --write ." }, "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@jsonbored/loopover-ui-kit": "^0.1.0", "@tailwindcss/vite": "^4.3.2", "@tanstack/react-router": "^1.170.17", "react": "^19.2.7", diff --git a/apps/gittensory-miner-ui/src/routes/index.tsx b/apps/gittensory-miner-ui/src/routes/index.tsx index 1d3aa017ca..55c0e5d2c2 100644 --- a/apps/gittensory-miner-ui/src/routes/index.tsx +++ b/apps/gittensory-miner-ui/src/routes/index.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from "@tanstack/react-router"; -import { Card, CardContent, CardHeader } from "@jsonbored/gittensory-ui-kit/components/card"; +import { Card, CardContent, CardHeader } from "@jsonbored/loopover-ui-kit/components/card"; export const Route = createFileRoute("/")({ component: IndexPage, diff --git a/apps/gittensory-miner-ui/src/routes/portfolio.tsx b/apps/gittensory-miner-ui/src/routes/portfolio.tsx index bda0aa7d5d..25884c5ee4 100644 --- a/apps/gittensory-miner-ui/src/routes/portfolio.tsx +++ b/apps/gittensory-miner-ui/src/routes/portfolio.tsx @@ -1,7 +1,7 @@ import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useState } from "react"; -import { Card, CardContent, CardHeader } from "@jsonbored/gittensory-ui-kit/components/card"; +import { Card, CardContent, CardHeader } from "@jsonbored/loopover-ui-kit/components/card"; import { fetchPortfolioQueue, type PortfolioQueueResult, type QueueStatus } from "../lib/portfolio-queue"; diff --git a/apps/gittensory-miner-ui/src/routes/run-history.tsx b/apps/gittensory-miner-ui/src/routes/run-history.tsx index 5c4276332f..85774a6363 100644 --- a/apps/gittensory-miner-ui/src/routes/run-history.tsx +++ b/apps/gittensory-miner-ui/src/routes/run-history.tsx @@ -1,8 +1,8 @@ import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useState } from "react"; -import { Badge } from "@jsonbored/gittensory-ui-kit/components/badge"; -import { Card, CardContent, CardHeader } from "@jsonbored/gittensory-ui-kit/components/card"; +import { Badge } from "@jsonbored/loopover-ui-kit/components/badge"; +import { Card, CardContent, CardHeader } from "@jsonbored/loopover-ui-kit/components/card"; import { Table, TableBody, @@ -10,7 +10,7 @@ import { TableHead, TableHeader, TableRow, -} from "@jsonbored/gittensory-ui-kit/components/table"; +} from "@jsonbored/loopover-ui-kit/components/table"; import { fetchRunStates, type RunHistoryResult, type RunStateRow } from "../lib/run-history"; diff --git a/apps/gittensory-miner-ui/src/styles.css b/apps/gittensory-miner-ui/src/styles.css index 249ad4bdf5..b6be55e1b6 100644 --- a/apps/gittensory-miner-ui/src/styles.css +++ b/apps/gittensory-miner-ui/src/styles.css @@ -2,13 +2,13 @@ @source "../src"; @source "../../../packages/gittensory-ui-kit/src"; @import "tw-animate-css"; -@import "@jsonbored/gittensory-ui-kit/theme.css"; +@import "@jsonbored/loopover-ui-kit/theme.css"; /* - * gittensory-miner-ui renders from the same shared design system as - * gittensory-ui (imported above from @jsonbored/gittensory-ui-kit) — no + * loopover-miner-ui renders from the same shared design system as + * loopover-ui (imported above from @jsonbored/loopover-ui-kit) — no * local tokens, colors, or fonts. Dark-only for now (the `.dark` class is - * hardcoded on in index.html), matching gittensory-ui's current + * hardcoded on in index.html), matching loopover-ui's current * dark-only deployment — the light tokens ship in the shared theme so a * toggle can be added later without touching this stylesheet. */ diff --git a/apps/gittensory-ui/package.json b/apps/gittensory-ui/package.json index 480be129ee..46681b5702 100644 --- a/apps/gittensory-ui/package.json +++ b/apps/gittensory-ui/package.json @@ -1,8 +1,8 @@ { - "name": "@jsonbored/gittensory-ui", + "name": "@jsonbored/loopover-ui", "version": "0.0.0", "private": true, - "description": "Gittensory's public website, docs, and dashboard (TanStack Start SPA/SSR app).", + "description": "LoopOver's public website, docs, and dashboard (TanStack Start SPA/SSR app).", "packageManager": "npm@10.9.8", "sideEffects": false, "type": "module", @@ -20,7 +20,7 @@ "format": "prettier --write ." }, "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@jsonbored/loopover-ui-kit": "^0.1.0", "@radix-ui/react-accordion": "^1.2.15", "@radix-ui/react-alert-dialog": "^1.1.18", "@radix-ui/react-aspect-ratio": "^1.1.11", diff --git a/apps/gittensory-ui/src/components/site/animated-terminal.tsx b/apps/gittensory-ui/src/components/site/animated-terminal.tsx index 88255be184..f66f937612 100644 --- a/apps/gittensory-ui/src/components/site/animated-terminal.tsx +++ b/apps/gittensory-ui/src/components/site/animated-terminal.tsx @@ -10,7 +10,7 @@ export interface TerminalScene { const DEFAULT_SCENES: TerminalScene[] = [ { - prompt: "npx -y @jsonbored/gittensory-mcp@latest login", + prompt: "npx -y @jsonbored/loopover-mcp@latest login", output: "→ GitHub Device Flow opened… authorized as octocat", }, { diff --git a/apps/gittensory-ui/src/components/ui/accordion.tsx b/apps/gittensory-ui/src/components/ui/accordion.tsx index a054f3b1d6..1528b3e74e 100644 --- a/apps/gittensory-ui/src/components/ui/accordion.tsx +++ b/apps/gittensory-ui/src/components/ui/accordion.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/accordion"; +export * from "@jsonbored/loopover-ui-kit/components/accordion"; diff --git a/apps/gittensory-ui/src/components/ui/alert-dialog.tsx b/apps/gittensory-ui/src/components/ui/alert-dialog.tsx index 7122b9d44d..fe0e85b385 100644 --- a/apps/gittensory-ui/src/components/ui/alert-dialog.tsx +++ b/apps/gittensory-ui/src/components/ui/alert-dialog.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/alert-dialog"; +export * from "@jsonbored/loopover-ui-kit/components/alert-dialog"; diff --git a/apps/gittensory-ui/src/components/ui/alert.tsx b/apps/gittensory-ui/src/components/ui/alert.tsx index 41365f78bf..644eda0388 100644 --- a/apps/gittensory-ui/src/components/ui/alert.tsx +++ b/apps/gittensory-ui/src/components/ui/alert.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/alert"; +export * from "@jsonbored/loopover-ui-kit/components/alert"; diff --git a/apps/gittensory-ui/src/components/ui/aspect-ratio.tsx b/apps/gittensory-ui/src/components/ui/aspect-ratio.tsx index 0be69c2af4..d0a1f1ffb4 100644 --- a/apps/gittensory-ui/src/components/ui/aspect-ratio.tsx +++ b/apps/gittensory-ui/src/components/ui/aspect-ratio.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/aspect-ratio"; +export * from "@jsonbored/loopover-ui-kit/components/aspect-ratio"; diff --git a/apps/gittensory-ui/src/components/ui/avatar.tsx b/apps/gittensory-ui/src/components/ui/avatar.tsx index c587c79431..bbcfa96bed 100644 --- a/apps/gittensory-ui/src/components/ui/avatar.tsx +++ b/apps/gittensory-ui/src/components/ui/avatar.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/avatar"; +export * from "@jsonbored/loopover-ui-kit/components/avatar"; diff --git a/apps/gittensory-ui/src/components/ui/badge.tsx b/apps/gittensory-ui/src/components/ui/badge.tsx index 5112009415..2da8887ccf 100644 --- a/apps/gittensory-ui/src/components/ui/badge.tsx +++ b/apps/gittensory-ui/src/components/ui/badge.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/badge"; +export * from "@jsonbored/loopover-ui-kit/components/badge"; diff --git a/apps/gittensory-ui/src/components/ui/breadcrumb.tsx b/apps/gittensory-ui/src/components/ui/breadcrumb.tsx index 47d551cb3e..bb4d6513bc 100644 --- a/apps/gittensory-ui/src/components/ui/breadcrumb.tsx +++ b/apps/gittensory-ui/src/components/ui/breadcrumb.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/breadcrumb"; +export * from "@jsonbored/loopover-ui-kit/components/breadcrumb"; diff --git a/apps/gittensory-ui/src/components/ui/button.tsx b/apps/gittensory-ui/src/components/ui/button.tsx index 850f14aa5c..e8217d4c9d 100644 --- a/apps/gittensory-ui/src/components/ui/button.tsx +++ b/apps/gittensory-ui/src/components/ui/button.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/button"; +export * from "@jsonbored/loopover-ui-kit/components/button"; diff --git a/apps/gittensory-ui/src/components/ui/calendar.tsx b/apps/gittensory-ui/src/components/ui/calendar.tsx index 6ee8c76987..474d1c52a1 100644 --- a/apps/gittensory-ui/src/components/ui/calendar.tsx +++ b/apps/gittensory-ui/src/components/ui/calendar.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/calendar"; +export * from "@jsonbored/loopover-ui-kit/components/calendar"; diff --git a/apps/gittensory-ui/src/components/ui/card.tsx b/apps/gittensory-ui/src/components/ui/card.tsx index bb613c5087..2f77422c73 100644 --- a/apps/gittensory-ui/src/components/ui/card.tsx +++ b/apps/gittensory-ui/src/components/ui/card.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/card"; +export * from "@jsonbored/loopover-ui-kit/components/card"; diff --git a/apps/gittensory-ui/src/components/ui/carousel.tsx b/apps/gittensory-ui/src/components/ui/carousel.tsx index 0ccdef62ee..be7039881e 100644 --- a/apps/gittensory-ui/src/components/ui/carousel.tsx +++ b/apps/gittensory-ui/src/components/ui/carousel.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/carousel"; +export * from "@jsonbored/loopover-ui-kit/components/carousel"; diff --git a/apps/gittensory-ui/src/components/ui/chart.tsx b/apps/gittensory-ui/src/components/ui/chart.tsx index b14dd95a0d..226a2ac0d4 100644 --- a/apps/gittensory-ui/src/components/ui/chart.tsx +++ b/apps/gittensory-ui/src/components/ui/chart.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/chart"; +export * from "@jsonbored/loopover-ui-kit/components/chart"; diff --git a/apps/gittensory-ui/src/components/ui/checkbox.tsx b/apps/gittensory-ui/src/components/ui/checkbox.tsx index 48182659b0..7c34911a7c 100644 --- a/apps/gittensory-ui/src/components/ui/checkbox.tsx +++ b/apps/gittensory-ui/src/components/ui/checkbox.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/checkbox"; +export * from "@jsonbored/loopover-ui-kit/components/checkbox"; diff --git a/apps/gittensory-ui/src/components/ui/collapsible.tsx b/apps/gittensory-ui/src/components/ui/collapsible.tsx index fc8e6e0d4d..b69d59acbd 100644 --- a/apps/gittensory-ui/src/components/ui/collapsible.tsx +++ b/apps/gittensory-ui/src/components/ui/collapsible.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/collapsible"; +export * from "@jsonbored/loopover-ui-kit/components/collapsible"; diff --git a/apps/gittensory-ui/src/components/ui/command.tsx b/apps/gittensory-ui/src/components/ui/command.tsx index 288d1fbf12..b27939f46e 100644 --- a/apps/gittensory-ui/src/components/ui/command.tsx +++ b/apps/gittensory-ui/src/components/ui/command.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/command"; +export * from "@jsonbored/loopover-ui-kit/components/command"; diff --git a/apps/gittensory-ui/src/components/ui/context-menu.tsx b/apps/gittensory-ui/src/components/ui/context-menu.tsx index bd9333427a..0507e4abd5 100644 --- a/apps/gittensory-ui/src/components/ui/context-menu.tsx +++ b/apps/gittensory-ui/src/components/ui/context-menu.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/context-menu"; +export * from "@jsonbored/loopover-ui-kit/components/context-menu"; diff --git a/apps/gittensory-ui/src/components/ui/dialog.tsx b/apps/gittensory-ui/src/components/ui/dialog.tsx index 20bbf14f98..abbf269b74 100644 --- a/apps/gittensory-ui/src/components/ui/dialog.tsx +++ b/apps/gittensory-ui/src/components/ui/dialog.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/dialog"; +export * from "@jsonbored/loopover-ui-kit/components/dialog"; diff --git a/apps/gittensory-ui/src/components/ui/drawer.tsx b/apps/gittensory-ui/src/components/ui/drawer.tsx index 62bf3398ba..7b4f4a340e 100644 --- a/apps/gittensory-ui/src/components/ui/drawer.tsx +++ b/apps/gittensory-ui/src/components/ui/drawer.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/drawer"; +export * from "@jsonbored/loopover-ui-kit/components/drawer"; diff --git a/apps/gittensory-ui/src/components/ui/dropdown-menu.tsx b/apps/gittensory-ui/src/components/ui/dropdown-menu.tsx index 35b5da3b1f..3c7df19ba2 100644 --- a/apps/gittensory-ui/src/components/ui/dropdown-menu.tsx +++ b/apps/gittensory-ui/src/components/ui/dropdown-menu.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/dropdown-menu"; +export * from "@jsonbored/loopover-ui-kit/components/dropdown-menu"; diff --git a/apps/gittensory-ui/src/components/ui/form.tsx b/apps/gittensory-ui/src/components/ui/form.tsx index 96a4e962b2..8502b68d94 100644 --- a/apps/gittensory-ui/src/components/ui/form.tsx +++ b/apps/gittensory-ui/src/components/ui/form.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/form"; +export * from "@jsonbored/loopover-ui-kit/components/form"; diff --git a/apps/gittensory-ui/src/components/ui/hover-card.tsx b/apps/gittensory-ui/src/components/ui/hover-card.tsx index d1af5db7b4..4ef1e99ea1 100644 --- a/apps/gittensory-ui/src/components/ui/hover-card.tsx +++ b/apps/gittensory-ui/src/components/ui/hover-card.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/hover-card"; +export * from "@jsonbored/loopover-ui-kit/components/hover-card"; diff --git a/apps/gittensory-ui/src/components/ui/input-otp.tsx b/apps/gittensory-ui/src/components/ui/input-otp.tsx index a7b2df2821..19df7ab81e 100644 --- a/apps/gittensory-ui/src/components/ui/input-otp.tsx +++ b/apps/gittensory-ui/src/components/ui/input-otp.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/input-otp"; +export * from "@jsonbored/loopover-ui-kit/components/input-otp"; diff --git a/apps/gittensory-ui/src/components/ui/input.tsx b/apps/gittensory-ui/src/components/ui/input.tsx index 48059009c1..c5db1c5d23 100644 --- a/apps/gittensory-ui/src/components/ui/input.tsx +++ b/apps/gittensory-ui/src/components/ui/input.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/input"; +export * from "@jsonbored/loopover-ui-kit/components/input"; diff --git a/apps/gittensory-ui/src/components/ui/label.tsx b/apps/gittensory-ui/src/components/ui/label.tsx index fe1cb23ffc..e21f4ca2c9 100644 --- a/apps/gittensory-ui/src/components/ui/label.tsx +++ b/apps/gittensory-ui/src/components/ui/label.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/label"; +export * from "@jsonbored/loopover-ui-kit/components/label"; diff --git a/apps/gittensory-ui/src/components/ui/menubar.tsx b/apps/gittensory-ui/src/components/ui/menubar.tsx index f7aea60653..49a1be6c09 100644 --- a/apps/gittensory-ui/src/components/ui/menubar.tsx +++ b/apps/gittensory-ui/src/components/ui/menubar.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/menubar"; +export * from "@jsonbored/loopover-ui-kit/components/menubar"; diff --git a/apps/gittensory-ui/src/components/ui/navigation-menu.tsx b/apps/gittensory-ui/src/components/ui/navigation-menu.tsx index 3e1987f5f7..af2e4f2c2f 100644 --- a/apps/gittensory-ui/src/components/ui/navigation-menu.tsx +++ b/apps/gittensory-ui/src/components/ui/navigation-menu.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/navigation-menu"; +export * from "@jsonbored/loopover-ui-kit/components/navigation-menu"; diff --git a/apps/gittensory-ui/src/components/ui/pagination.tsx b/apps/gittensory-ui/src/components/ui/pagination.tsx index 1a8a3542ff..fec960ddf8 100644 --- a/apps/gittensory-ui/src/components/ui/pagination.tsx +++ b/apps/gittensory-ui/src/components/ui/pagination.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/pagination"; +export * from "@jsonbored/loopover-ui-kit/components/pagination"; diff --git a/apps/gittensory-ui/src/components/ui/popover.tsx b/apps/gittensory-ui/src/components/ui/popover.tsx index 61c15a79e1..790024f93c 100644 --- a/apps/gittensory-ui/src/components/ui/popover.tsx +++ b/apps/gittensory-ui/src/components/ui/popover.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/popover"; +export * from "@jsonbored/loopover-ui-kit/components/popover"; diff --git a/apps/gittensory-ui/src/components/ui/progress.tsx b/apps/gittensory-ui/src/components/ui/progress.tsx index adf8ff259c..a47208d2eb 100644 --- a/apps/gittensory-ui/src/components/ui/progress.tsx +++ b/apps/gittensory-ui/src/components/ui/progress.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/progress"; +export * from "@jsonbored/loopover-ui-kit/components/progress"; diff --git a/apps/gittensory-ui/src/components/ui/radio-group.tsx b/apps/gittensory-ui/src/components/ui/radio-group.tsx index 84c8edd841..a0657e8968 100644 --- a/apps/gittensory-ui/src/components/ui/radio-group.tsx +++ b/apps/gittensory-ui/src/components/ui/radio-group.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/radio-group"; +export * from "@jsonbored/loopover-ui-kit/components/radio-group"; diff --git a/apps/gittensory-ui/src/components/ui/resizable.tsx b/apps/gittensory-ui/src/components/ui/resizable.tsx index de7337d439..bf9d3de264 100644 --- a/apps/gittensory-ui/src/components/ui/resizable.tsx +++ b/apps/gittensory-ui/src/components/ui/resizable.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/resizable"; +export * from "@jsonbored/loopover-ui-kit/components/resizable"; diff --git a/apps/gittensory-ui/src/components/ui/scroll-area.tsx b/apps/gittensory-ui/src/components/ui/scroll-area.tsx index 05b4d41e44..c43dbdf4aa 100644 --- a/apps/gittensory-ui/src/components/ui/scroll-area.tsx +++ b/apps/gittensory-ui/src/components/ui/scroll-area.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/scroll-area"; +export * from "@jsonbored/loopover-ui-kit/components/scroll-area"; diff --git a/apps/gittensory-ui/src/components/ui/select.tsx b/apps/gittensory-ui/src/components/ui/select.tsx index b4395f4f23..8a35284f21 100644 --- a/apps/gittensory-ui/src/components/ui/select.tsx +++ b/apps/gittensory-ui/src/components/ui/select.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/select"; +export * from "@jsonbored/loopover-ui-kit/components/select"; diff --git a/apps/gittensory-ui/src/components/ui/separator.tsx b/apps/gittensory-ui/src/components/ui/separator.tsx index 9752461de3..274d851209 100644 --- a/apps/gittensory-ui/src/components/ui/separator.tsx +++ b/apps/gittensory-ui/src/components/ui/separator.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/separator"; +export * from "@jsonbored/loopover-ui-kit/components/separator"; diff --git a/apps/gittensory-ui/src/components/ui/sheet.tsx b/apps/gittensory-ui/src/components/ui/sheet.tsx index d295388468..a938a5ea95 100644 --- a/apps/gittensory-ui/src/components/ui/sheet.tsx +++ b/apps/gittensory-ui/src/components/ui/sheet.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/sheet"; +export * from "@jsonbored/loopover-ui-kit/components/sheet"; diff --git a/apps/gittensory-ui/src/components/ui/sidebar.tsx b/apps/gittensory-ui/src/components/ui/sidebar.tsx index 054d0d4904..877108c178 100644 --- a/apps/gittensory-ui/src/components/ui/sidebar.tsx +++ b/apps/gittensory-ui/src/components/ui/sidebar.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/sidebar"; +export * from "@jsonbored/loopover-ui-kit/components/sidebar"; diff --git a/apps/gittensory-ui/src/components/ui/skeleton.tsx b/apps/gittensory-ui/src/components/ui/skeleton.tsx index 3c511ba922..0be8f50394 100644 --- a/apps/gittensory-ui/src/components/ui/skeleton.tsx +++ b/apps/gittensory-ui/src/components/ui/skeleton.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/skeleton"; +export * from "@jsonbored/loopover-ui-kit/components/skeleton"; diff --git a/apps/gittensory-ui/src/components/ui/slider.tsx b/apps/gittensory-ui/src/components/ui/slider.tsx index 2313a50cd0..8dec7d6a92 100644 --- a/apps/gittensory-ui/src/components/ui/slider.tsx +++ b/apps/gittensory-ui/src/components/ui/slider.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/slider"; +export * from "@jsonbored/loopover-ui-kit/components/slider"; diff --git a/apps/gittensory-ui/src/components/ui/sonner.tsx b/apps/gittensory-ui/src/components/ui/sonner.tsx index 8572382cbf..5281516106 100644 --- a/apps/gittensory-ui/src/components/ui/sonner.tsx +++ b/apps/gittensory-ui/src/components/ui/sonner.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/sonner"; +export * from "@jsonbored/loopover-ui-kit/components/sonner"; diff --git a/apps/gittensory-ui/src/components/ui/switch.tsx b/apps/gittensory-ui/src/components/ui/switch.tsx index 5636fd7cb2..7d458ce2b8 100644 --- a/apps/gittensory-ui/src/components/ui/switch.tsx +++ b/apps/gittensory-ui/src/components/ui/switch.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/switch"; +export * from "@jsonbored/loopover-ui-kit/components/switch"; diff --git a/apps/gittensory-ui/src/components/ui/table.tsx b/apps/gittensory-ui/src/components/ui/table.tsx index cf143b6808..f564b15cec 100644 --- a/apps/gittensory-ui/src/components/ui/table.tsx +++ b/apps/gittensory-ui/src/components/ui/table.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/table"; +export * from "@jsonbored/loopover-ui-kit/components/table"; diff --git a/apps/gittensory-ui/src/components/ui/tabs.tsx b/apps/gittensory-ui/src/components/ui/tabs.tsx index 4e5da3ac71..0ccfa9d2ba 100644 --- a/apps/gittensory-ui/src/components/ui/tabs.tsx +++ b/apps/gittensory-ui/src/components/ui/tabs.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/tabs"; +export * from "@jsonbored/loopover-ui-kit/components/tabs"; diff --git a/apps/gittensory-ui/src/components/ui/textarea.tsx b/apps/gittensory-ui/src/components/ui/textarea.tsx index 89c5224749..9fce65c547 100644 --- a/apps/gittensory-ui/src/components/ui/textarea.tsx +++ b/apps/gittensory-ui/src/components/ui/textarea.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/textarea"; +export * from "@jsonbored/loopover-ui-kit/components/textarea"; diff --git a/apps/gittensory-ui/src/components/ui/toggle-group.tsx b/apps/gittensory-ui/src/components/ui/toggle-group.tsx index fcc36dd158..71eee53c5e 100644 --- a/apps/gittensory-ui/src/components/ui/toggle-group.tsx +++ b/apps/gittensory-ui/src/components/ui/toggle-group.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/toggle-group"; +export * from "@jsonbored/loopover-ui-kit/components/toggle-group"; diff --git a/apps/gittensory-ui/src/components/ui/toggle.tsx b/apps/gittensory-ui/src/components/ui/toggle.tsx index 78bb42995d..faeaf74834 100644 --- a/apps/gittensory-ui/src/components/ui/toggle.tsx +++ b/apps/gittensory-ui/src/components/ui/toggle.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/toggle"; +export * from "@jsonbored/loopover-ui-kit/components/toggle"; diff --git a/apps/gittensory-ui/src/components/ui/tooltip.tsx b/apps/gittensory-ui/src/components/ui/tooltip.tsx index 5a5475223e..4f48d20895 100644 --- a/apps/gittensory-ui/src/components/ui/tooltip.tsx +++ b/apps/gittensory-ui/src/components/ui/tooltip.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/components/tooltip"; +export * from "@jsonbored/loopover-ui-kit/components/tooltip"; diff --git a/apps/gittensory-ui/src/hooks/use-mobile.tsx b/apps/gittensory-ui/src/hooks/use-mobile.tsx index d4834e5a04..eb30ed8877 100644 --- a/apps/gittensory-ui/src/hooks/use-mobile.tsx +++ b/apps/gittensory-ui/src/hooks/use-mobile.tsx @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/hooks/use-mobile"; +export * from "@jsonbored/loopover-ui-kit/hooks/use-mobile"; diff --git a/apps/gittensory-ui/src/lib/mcp-package.ts b/apps/gittensory-ui/src/lib/mcp-package.ts index 56e00cb69c..9978b871da 100644 --- a/apps/gittensory-ui/src/lib/mcp-package.ts +++ b/apps/gittensory-ui/src/lib/mcp-package.ts @@ -2,7 +2,7 @@ import { useQuery } from "@tanstack/react-query"; import { apiFetch } from "@/lib/api/request"; -export const MCP_PACKAGE_NAME = "@jsonbored/gittensory-mcp"; +export const MCP_PACKAGE_NAME = "@jsonbored/loopover-mcp"; export const MCP_PACKAGE_ENCODED_NAME = "@jsonbored%2fgittensory-mcp"; export const MCP_PACKAGE_REGISTRY_URL = `https://registry.npmjs.org/${MCP_PACKAGE_ENCODED_NAME}`; export const MCP_PACKAGE_NPM_URL = `https://www.npmjs.com/package/${MCP_PACKAGE_NAME}`; diff --git a/apps/gittensory-ui/src/lib/miner-commands.ts b/apps/gittensory-ui/src/lib/miner-commands.ts index d24de2dc85..5b97595636 100644 --- a/apps/gittensory-ui/src/lib/miner-commands.ts +++ b/apps/gittensory-ui/src/lib/miner-commands.ts @@ -9,7 +9,7 @@ export type MinerCommandAction = { boundary: "local-mcp"; }; -const MCP_PACKAGE = "@jsonbored/gittensory-mcp"; +const MCP_PACKAGE = "@jsonbored/loopover-mcp"; const FALLBACK_LOGIN = "your-login"; const FALLBACK_REPO = "owner/repo"; diff --git a/apps/gittensory-ui/src/lib/utils.ts b/apps/gittensory-ui/src/lib/utils.ts index fddf9cfee8..573d5c78c0 100644 --- a/apps/gittensory-ui/src/lib/utils.ts +++ b/apps/gittensory-ui/src/lib/utils.ts @@ -1 +1 @@ -export * from "@jsonbored/gittensory-ui-kit/utils"; +export * from "@jsonbored/loopover-ui-kit/utils"; diff --git a/apps/gittensory-ui/src/routes/agents.tsx b/apps/gittensory-ui/src/routes/agents.tsx index 69fa209bd6..a93c450e8e 100644 --- a/apps/gittensory-ui/src/routes/agents.tsx +++ b/apps/gittensory-ui/src/routes/agents.tsx @@ -69,7 +69,7 @@ function AgentsPage() {
- +
diff --git a/apps/gittensory-ui/src/routes/changelog.tsx b/apps/gittensory-ui/src/routes/changelog.tsx index 5d8cbefd93..84caf188ac 100644 --- a/apps/gittensory-ui/src/routes/changelog.tsx +++ b/apps/gittensory-ui/src/routes/changelog.tsx @@ -16,12 +16,12 @@ export const Route = createFileRoute("/changelog")({ { title: "Changelog — Gittensory" }, { name: "description", - content: "Release history for @jsonbored/gittensory-mcp pulled live from the npm registry.", + content: "Release history for @jsonbored/loopover-mcp pulled live from the npm registry.", }, { property: "og:title", content: "Changelog — Gittensory" }, { property: "og:description", - content: "Release history for @jsonbored/gittensory-mcp pulled live from the npm registry.", + content: "Release history for @jsonbored/loopover-mcp pulled live from the npm registry.", }, { property: "og:url", content: "/changelog" }, ], diff --git a/apps/gittensory-ui/src/routes/index.tsx b/apps/gittensory-ui/src/routes/index.tsx index 5f5f5c5e2b..acb92057b6 100644 --- a/apps/gittensory-ui/src/routes/index.tsx +++ b/apps/gittensory-ui/src/routes/index.tsx @@ -456,7 +456,7 @@ const CLIENT_TABS: Array<{ audience: "Miners", filename: "terminal", lang: "bash", - snippet: `npm i -g @jsonbored/gittensory-mcp@latest + snippet: `npm i -g @jsonbored/loopover-mcp@latest gittensory-mcp login gittensory-mcp analyze-branch --login your-login --json`, }, @@ -468,7 +468,7 @@ gittensory-mcp analyze-branch --login your-login --json`, lang: "toml", snippet: `[mcp_servers.gittensory] command = "npx" -args = ["-y", "@jsonbored/gittensory-mcp@latest", "--stdio"]`, +args = ["-y", "@jsonbored/loopover-mcp@latest", "--stdio"]`, }, { id: "claude", @@ -480,7 +480,7 @@ args = ["-y", "@jsonbored/gittensory-mcp@latest", "--stdio"]`, "mcpServers": { "gittensory": { "command": "npx", - "args": ["-y", "@jsonbored/gittensory-mcp@latest", "--stdio"] + "args": ["-y", "@jsonbored/loopover-mcp@latest", "--stdio"] } } }`, @@ -495,7 +495,7 @@ args = ["-y", "@jsonbored/gittensory-mcp@latest", "--stdio"]`, "mcpServers": { "gittensory": { "command": "npx", - "args": ["-y", "@jsonbored/gittensory-mcp@latest", "--stdio"] + "args": ["-y", "@jsonbored/loopover-mcp@latest", "--stdio"] } } }`, diff --git a/apps/gittensory-ui/src/styles.css b/apps/gittensory-ui/src/styles.css index 7c53d8b36a..04bfdc343d 100644 --- a/apps/gittensory-ui/src/styles.css +++ b/apps/gittensory-ui/src/styles.css @@ -2,13 +2,13 @@ @source "../src"; @source "../../../packages/gittensory-ui-kit/src"; @import "tw-animate-css"; -@import "@jsonbored/gittensory-ui-kit/theme.css"; +@import "@jsonbored/loopover-ui-kit/theme.css"; /* * Site-only additions on top of the shared design system (imported above - * from @jsonbored/gittensory-ui-kit/theme.css — tokens, base layer, and the + * from @jsonbored/loopover-ui-kit/theme.css — tokens, base layer, and the * border-hairline family the shared components depend on now live there). - * Everything below is specific to gittensory-ui's own marketing/docs pages + * Everything below is specific to loopover-ui's own marketing/docs pages * and dashboard chrome — hero flourishes, gradients, nav accents — not * needed by a shared component, so it stays local. */ @@ -93,7 +93,7 @@ } /* Animated gradient border utility (focus-ring now lives in the shared - theme — see @jsonbored/gittensory-ui-kit/theme.css). */ + theme — see @jsonbored/loopover-ui-kit/theme.css). */ @layer utilities { .gradient-border { position: relative; diff --git a/package-lock.json b/package-lock.json index 8a0df1122f..e1a944078a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "gittensory", + "name": "loopover", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "gittensory", + "name": "loopover", "version": "0.1.0", "license": "AGPL-3.0-only", "workspaces": [ @@ -16,7 +16,7 @@ "@asteasolutions/zod-to-openapi": "^8.5.0", "@cloudflare/puppeteer": "^1.1.0", "@hono/node-server": "^2.0.8", - "@jsonbored/gittensory-engine": "*", + "@jsonbored/loopover-engine": "*", "@modelcontextprotocol/sdk": "1.29.0", "@octokit/core": "^7.0.6", "@opentelemetry/api": "^1.9.1", @@ -62,10 +62,10 @@ } }, "apps/gittensory-miner-ui": { - "name": "@jsonbored/gittensory-miner-ui", + "name": "@jsonbored/loopover-miner-ui", "version": "0.0.0", "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@jsonbored/loopover-ui-kit": "^0.1.0", "@tailwindcss/vite": "^4.3.2", "@tanstack/react-router": "^1.170.17", "react": "^19.2.7", @@ -472,10 +472,10 @@ } }, "apps/gittensory-ui": { - "name": "@jsonbored/gittensory-ui", + "name": "@jsonbored/loopover-ui", "version": "0.0.0", "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@jsonbored/loopover-ui-kit": "^0.1.0", "@radix-ui/react-accordion": "^1.2.15", "@radix-ui/react-alert-dialog": "^1.1.18", "@radix-ui/react-aspect-ratio": "^1.1.11", @@ -3094,27 +3094,27 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@jsonbored/gittensory-engine": { + "node_modules/@jsonbored/loopover-engine": { "resolved": "packages/gittensory-engine", "link": true }, - "node_modules/@jsonbored/gittensory-mcp": { + "node_modules/@jsonbored/loopover-mcp": { "resolved": "packages/gittensory-mcp", "link": true }, - "node_modules/@jsonbored/gittensory-miner": { + "node_modules/@jsonbored/loopover-miner": { "resolved": "packages/gittensory-miner", "link": true }, - "node_modules/@jsonbored/gittensory-miner-ui": { + "node_modules/@jsonbored/loopover-miner-ui": { "resolved": "apps/gittensory-miner-ui", "link": true }, - "node_modules/@jsonbored/gittensory-ui": { + "node_modules/@jsonbored/loopover-ui": { "resolved": "apps/gittensory-ui", "link": true }, - "node_modules/@jsonbored/gittensory-ui-kit": { + "node_modules/@jsonbored/loopover-ui-kit": { "resolved": "packages/gittensory-ui-kit", "link": true }, @@ -15619,7 +15619,7 @@ } }, "packages/gittensory-engine": { - "name": "@jsonbored/gittensory-engine", + "name": "@jsonbored/loopover-engine", "version": "1.0.0", "license": "AGPL-3.0-only", "dependencies": { @@ -15654,11 +15654,11 @@ "license": "MIT" }, "packages/gittensory-mcp": { - "name": "@jsonbored/gittensory-mcp", + "name": "@jsonbored/loopover-mcp", "version": "0.7.1", "license": "AGPL-3.0-only", "dependencies": { - "@jsonbored/gittensory-engine": "^1.0.0", + "@jsonbored/loopover-engine": "^1.0.0", "@modelcontextprotocol/sdk": "1.29.0", "zod": "^4.4.3" }, @@ -15670,11 +15670,11 @@ } }, "packages/gittensory-miner": { - "name": "@jsonbored/gittensory-miner", + "name": "@jsonbored/loopover-miner", "version": "0.1.0", "license": "AGPL-3.0-only", "dependencies": { - "@jsonbored/gittensory-engine": "*", + "@jsonbored/loopover-engine": "*", "@modelcontextprotocol/sdk": "1.29.0", "zod": "^4.4.3" }, @@ -15687,7 +15687,7 @@ } }, "packages/gittensory-ui-kit": { - "name": "@jsonbored/gittensory-ui-kit", + "name": "@jsonbored/loopover-ui-kit", "version": "0.1.0", "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 7858f174ed..f78301aa1c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "gittensory", + "name": "loopover", "version": "0.1.0", "private": true, "packageManager": "npm@10.9.8", @@ -13,7 +13,7 @@ "scripts": { "dev": "wrangler dev", "deploy": "wrangler deploy", - "deploy:api": "npm --workspace @jsonbored/gittensory-engine run build && wrangler d1 migrations apply gittensory --remote && wrangler deploy", + "deploy:api": "npm --workspace @jsonbored/loopover-engine run build && wrangler d1 migrations apply gittensory --remote && wrangler deploy", "selfhost:postgres:migrate": "tsx scripts/migrate-selfhost-sqlite-to-postgres.ts", "selfhost:env-reference": "node scripts/gen-selfhost-env-reference.mjs", "selfhost:env-reference:check": "node scripts/gen-selfhost-env-reference.mjs --check", @@ -28,8 +28,8 @@ "db:migrate:local": "wrangler d1 migrations apply gittensory --local", "db:migrate:remote": "wrangler d1 migrations apply gittensory --remote", "drizzle:generate": "drizzle-kit generate", - "build:mcp": "npm --workspace @jsonbored/gittensory-mcp run build", - "build:miner": "npm --workspace @jsonbored/gittensory-engine run build && npm --workspace @jsonbored/gittensory-miner run build", + "build:mcp": "npm --workspace @jsonbored/loopover-mcp run build", + "build:miner": "npm --workspace @jsonbored/loopover-engine run build && npm --workspace @jsonbored/loopover-miner run build", "test:mcp-pack": "node scripts/check-mcp-package.mjs", "test:miner-pack": "node scripts/check-miner-package.mjs", "rees:install": "npm ci --prefix review-enrichment --prefer-offline --no-audit --no-fund", @@ -42,12 +42,12 @@ "actionlint": "node scripts/actionlint.mjs", "ui:dev": "npm run ui:preview", "extension:build": "node scripts/build-extension.mjs", - "ui:kit:build": "npm run build --workspace @jsonbored/gittensory-ui-kit", - "ui:build": "npm run ui:kit:build && npm run ui:openapi && npm run extension:build && npm --workspace @jsonbored/gittensory-ui run build && npm --workspace @jsonbored/gittensory-miner-ui run build", + "ui:kit:build": "npm run build --workspace @jsonbored/loopover-ui-kit", + "ui:build": "npm run ui:kit:build && npm run ui:openapi && npm run extension:build && npm --workspace @jsonbored/loopover-ui run build && npm --workspace @jsonbored/loopover-miner-ui run build", "ui:preview": "npm run ui:build && wrangler dev --config apps/gittensory-ui/dist/server/wrangler.json --ip 127.0.0.1 --port 4173 --local", - "ui:lint": "npm run ui:kit:build && npm --workspace @jsonbored/gittensory-ui run lint && npm --workspace @jsonbored/gittensory-miner-ui run lint", - "ui:typecheck": "npm run ui:kit:build && npm --workspace @jsonbored/gittensory-ui run typecheck && npm --workspace @jsonbored/gittensory-miner-ui run typecheck", - "ui:test": "npm run ui:kit:build && npm --workspace @jsonbored/gittensory-ui run test && npm --workspace @jsonbored/gittensory-miner-ui run test", + "ui:lint": "npm run ui:kit:build && npm --workspace @jsonbored/loopover-ui run lint && npm --workspace @jsonbored/loopover-miner-ui run lint", + "ui:typecheck": "npm run ui:kit:build && npm --workspace @jsonbored/loopover-ui run typecheck && npm --workspace @jsonbored/loopover-miner-ui run typecheck", + "ui:test": "npm run ui:kit:build && npm --workspace @jsonbored/loopover-ui run test && npm --workspace @jsonbored/loopover-miner-ui run test", "ui:openapi": "tsx scripts/write-ui-openapi.ts", "ui:openapi:check": "tsx scripts/write-ui-openapi.ts --check", "ui:openapi:settings-parity": "tsx scripts/check-openapi-settings-parity.mjs", @@ -81,7 +81,7 @@ "test:smoke:observability:metrics": "node scripts/smoke-observability-metrics.mjs", "test:smoke:browser:install": "playwright install chromium", "test:smoke:browser": "node scripts/smoke-ui-browser.mjs", - "test:ci": "git diff --check && npm run actionlint && npm run db:migrations:check && npm run db:schema-drift:check && npm run selfhost:env-reference:check && npm run miner:env-reference:check && npm run selfhost:validate-observability && npm run cf-typegen:check && npm run typecheck && npm run test:coverage && npm run test:engine-parity && npm run test:driver-parity && npm run test --workspace @jsonbored/gittensory-engine && npm run test:workers && npm run build:mcp && npm run test:mcp-pack && npm run build:miner && npm run test:miner-pack && npm run rees:test && npm run ui:openapi:check && npm run ui:openapi:settings-parity && npm run ui:version-audit && npm run docs:drift-check && npm run manifest:drift-check && npm run engine-parity:drift-check && npm run command-reference:check && npm run ui:lint && npm run ui:typecheck && npm run ui:test && npm run ui:build", + "test:ci": "git diff --check && npm run actionlint && npm run db:migrations:check && npm run db:schema-drift:check && npm run selfhost:env-reference:check && npm run miner:env-reference:check && npm run selfhost:validate-observability && npm run cf-typegen:check && npm run typecheck && npm run test:coverage && npm run test:engine-parity && npm run test:driver-parity && npm run test --workspace @jsonbored/loopover-engine && npm run test:workers && npm run build:mcp && npm run test:mcp-pack && npm run build:miner && npm run test:miner-pack && npm run rees:test && npm run ui:openapi:check && npm run ui:openapi:settings-parity && npm run ui:version-audit && npm run docs:drift-check && npm run manifest:drift-check && npm run engine-parity:drift-check && npm run command-reference:check && npm run ui:lint && npm run ui:typecheck && npm run ui:test && npm run ui:build", "test:release": "npm run test:ci && npm run changelog:check", "test:release:mcp": "npm run test:ci", "test:watch": "vitest", @@ -91,7 +91,7 @@ "@asteasolutions/zod-to-openapi": "^8.5.0", "@cloudflare/puppeteer": "^1.1.0", "@hono/node-server": "^2.0.8", - "@jsonbored/gittensory-engine": "*", + "@jsonbored/loopover-engine": "*", "@modelcontextprotocol/sdk": "1.29.0", "@octokit/core": "^7.0.6", "@opentelemetry/api": "^1.9.1", diff --git a/packages/gittensory-engine/README.md b/packages/gittensory-engine/README.md index a3ce36726c..8450a7ba0b 100644 --- a/packages/gittensory-engine/README.md +++ b/packages/gittensory-engine/README.md @@ -1,11 +1,11 @@ -# @jsonbored/gittensory-engine +# @jsonbored/loopover-engine -Shared, deterministic engine logic for the Gittensory review stack and the `gittensory-miner`. +Shared, deterministic engine logic for the LoopOver review stack and the `loopover-miner`. This package houses pure, side-effect-free logic (scoring preview/model, predicted-gate types, reward-risk, slop signals, focus-manifest parse/compile core, duplicate-winner adjudication, and their engine-parity fixtures) so the exact same code runs identically in the hosted review backend and in a local miner. It is -versioned independently of the app and published to npm as `@jsonbored/gittensory-engine`. +versioned independently of the app and published to npm as `@jsonbored/loopover-engine`. The logic is extracted from the app's `src/` in follow-up issues; this skeleton keeps the package buildable in the meantime. The root `package.json` already globs `packages/*` in its `workspaces` field, so `npm ci` @@ -19,7 +19,7 @@ log or assert which engine build produced a deterministic result. ## Build ``` -npm run build --workspace @jsonbored/gittensory-engine +npm run build --workspace @jsonbored/loopover-engine ``` This runs `tsc -p tsconfig.json`, emitting `dist/` (the only published output alongside `CHANGELOG.md`). @@ -27,7 +27,7 @@ This runs `tsc -p tsconfig.json`, emitting `dist/` (the only published output al ## Test ``` -npm test --workspace @jsonbored/gittensory-engine +npm test --workspace @jsonbored/loopover-engine ``` Compiles the package and the `test/` suite (`node:test`) to plain JS and runs it — no experimental runtime @@ -53,7 +53,7 @@ than inverting or overflowing it — but the two directions are handled asymmetr Any single factor at `0` (or a `dupRisk` of `1`) collapses the whole score to `0`. ```ts -import { rankOpportunities, rankOpportunityScore } from "@jsonbored/gittensory-engine"; +import { rankOpportunities, rankOpportunityScore } from "@jsonbored/loopover-engine"; rankOpportunityScore({ potential: 0.9, feasibility: 0.8, laneFit: 1, freshness: 0.7, dupRisk: 0.1 }); // → 0.4536 @@ -73,7 +73,7 @@ The score is intended for replay harnesses that need an auditable floor before a the replayed plan or PR target data and the revealed history target data: ```ts -import { scoreObjectiveAnchor } from "@jsonbored/gittensory-engine"; +import { scoreObjectiveAnchor } from "@jsonbored/loopover-engine"; const result = scoreObjectiveAnchor({ replayed: { @@ -125,7 +125,7 @@ Replay harnesses that already represent the two sides as arrays of plans, PRs, o helpers instead: ```ts -import { scoreObjectiveAnchorHistory } from "@jsonbored/gittensory-engine"; +import { scoreObjectiveAnchorHistory } from "@jsonbored/loopover-engine"; const result = scoreObjectiveAnchorHistory({ replayed: [ @@ -170,7 +170,7 @@ runtime owns the model calls; the engine package owns the stable post-processing - combine the surviving pairwise average with the objective-anchor score. ```ts -import { computePairwiseCalibrationScore } from "@jsonbored/gittensory-engine"; +import { computePairwiseCalibrationScore } from "@jsonbored/loopover-engine"; const result = computePairwiseCalibrationScore({ objectiveAnchor: 0.55, @@ -217,7 +217,7 @@ secrets, trust scores, reward values, private rankings, or maintainer evidence. import { computeGateVerdictCompositeCalibrationScore, ingestGateVerdictCalibrationSignals, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; const gateVerdicts = ingestGateVerdictCalibrationSignals([ { @@ -276,7 +276,7 @@ to pr_outcome-only gating. import { computePhase7CalibrationLoop, shouldScheduleHistoricalReplayRun, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; const prOutcome = { mergeConfirmed: 74, @@ -352,7 +352,7 @@ import { computeTrackRecordSummary, renderTrackRecordSummaryMarkdown, resolveTrackRecordSummaryConfig, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; const config = resolveTrackRecordSummaryConfig({ miner: { trackRecordSummary: { enabled: true } }, @@ -410,7 +410,7 @@ for raw review text, secrets, trust scores, reward values, private rankings, or import { computeFindingSeverityCompositeCalibrationScore, ingestFindingSeverityCalibrationSignals, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; const findingSeverity = ingestFindingSeverityCalibrationSignals([ { @@ -478,7 +478,7 @@ It has no fields for raw review text, secrets, trust scores, reward values, priv import { computeReviewerConsensusCompositeCalibrationScore, ingestReviewerConsensusCalibrationSignals, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; const reviewerConsensus = ingestReviewerConsensusCalibrationSignals([ { @@ -573,7 +573,7 @@ fatigue before a formal ban lands. It keeps the hard-ban verdict authoritative a object instead of changing `allowed`: ```ts -import { resolveAiPolicyFatigueVerdict } from "@jsonbored/gittensory-engine"; +import { resolveAiPolicyFatigueVerdict } from "@jsonbored/loopover-engine"; const verdict = resolveAiPolicyFatigueVerdict({ now: "2026-07-05T00:00:00Z", diff --git a/packages/gittensory-engine/package.json b/packages/gittensory-engine/package.json index 774b1a533b..024c583e04 100644 --- a/packages/gittensory-engine/package.json +++ b/packages/gittensory-engine/package.json @@ -1,9 +1,9 @@ { - "name": "@jsonbored/gittensory-engine", + "name": "@jsonbored/loopover-engine", "version": "1.0.0", "license": "AGPL-3.0-only", "type": "module", - "description": "Shared deterministic engine logic for the Gittensory review stack and gittensory-miner.", + "description": "Shared deterministic engine logic for the LoopOver review stack and loopover-miner.", "repository": { "type": "git", "url": "git+https://github.com/JSONbored/gittensory.git", @@ -15,7 +15,7 @@ }, "keywords": [ "gittensor", - "gittensory", + "loopover", "engine", "deterministic", "scoring", diff --git a/packages/gittensory-engine/src/focus-manifest.ts b/packages/gittensory-engine/src/focus-manifest.ts index 2d7254a677..3a37e5e4a0 100644 --- a/packages/gittensory-engine/src/focus-manifest.ts +++ b/packages/gittensory-engine/src/focus-manifest.ts @@ -1,5 +1,5 @@ /** - * Focus-manifest parse/compile core (#2280). Extracted to `@jsonbored/gittensory-engine` so the maintainer + * Focus-manifest parse/compile core (#2280). Extracted to `@jsonbored/loopover-engine` so the maintainer * review stack and the miner's goal-spec parser share identical, versioned manifest logic instead of drifting * apart. This is the MINER-side parse-pattern template for {@link MinerGoalSpec} (`.gittensory-miner.yml`) — * same tolerant-parser shape: typed config + safe defaults + warnings, never throws. diff --git a/packages/gittensory-engine/src/index.ts b/packages/gittensory-engine/src/index.ts index 2b722f2947..e74c90dd65 100644 --- a/packages/gittensory-engine/src/index.ts +++ b/packages/gittensory-engine/src/index.ts @@ -1,4 +1,4 @@ -// Barrel export for @jsonbored/gittensory-engine. +// Barrel export for @jsonbored/loopover-engine. // // This package houses the deterministic, side-effect-free logic shared by the Gittensory review-stack // backend and the gittensory-miner (scoring preview/model, predicted-gate types, reward-risk, slop signals, diff --git a/packages/gittensory-engine/src/miner/lint-guard.ts b/packages/gittensory-engine/src/miner/lint-guard.ts index 5e4c660d48..e394554a31 100644 --- a/packages/gittensory-engine/src/miner/lint-guard.ts +++ b/packages/gittensory-engine/src/miner/lint-guard.ts @@ -62,7 +62,7 @@ export type LintGuardOptions = { const PACKAGE_COMMAND: Readonly, readonly string[]>> = Object.freeze({ root: Object.freeze(["npm", "run", "typecheck"]), - engine: Object.freeze(["npm", "run", "build", "--workspace", "@jsonbored/gittensory-engine"]), + engine: Object.freeze(["npm", "run", "build", "--workspace", "@jsonbored/loopover-engine"]), ui: Object.freeze(["npm", "run", "ui:typecheck"]), }); diff --git a/packages/gittensory-engine/src/miner/repo-map.ts b/packages/gittensory-engine/src/miner/repo-map.ts index 31f23fc338..1c751f9c84 100644 --- a/packages/gittensory-engine/src/miner/repo-map.ts +++ b/packages/gittensory-engine/src/miner/repo-map.ts @@ -22,7 +22,7 @@ import { createRequire } from "node:module"; import Parser from "web-tree-sitter"; // Lazy, not module-scope: this file is reachable from the Cloudflare Workers bundle (barrel-exported via -// `@jsonbored/gittensory-engine`) even though nothing there ever calls `buildRepoMap`. `import.meta.url` is +// `@jsonbored/loopover-engine`) even though nothing there ever calls `buildRepoMap`. `import.meta.url` is // undefined in that bundle's startup-validation context, so an eager `createRequire(import.meta.url)` at // module scope would crash the Worker's deploy before any request is served. Deferring construction to // first real use keeps this module import-safe everywhere while still working for its actual CLI callers. diff --git a/packages/gittensory-engine/src/opportunity-metadata.ts b/packages/gittensory-engine/src/opportunity-metadata.ts index 8155a4bc06..13eb5f02f8 100644 --- a/packages/gittensory-engine/src/opportunity-metadata.ts +++ b/packages/gittensory-engine/src/opportunity-metadata.ts @@ -7,7 +7,7 @@ import { type OpportunityRankInput, } from "./opportunity-ranker.js"; -/** Metadata-only candidate issue shape produced by `@jsonbored/gittensory-miner` fan-out helpers. */ +/** Metadata-only candidate issue shape produced by `@jsonbored/loopover-miner` fan-out helpers. */ export type MetadataCandidateIssue = { repoFullName: string; issueNumber: number; diff --git a/packages/gittensory-engine/src/reward-risk.ts b/packages/gittensory-engine/src/reward-risk.ts index 464c30f155..5074982b35 100644 --- a/packages/gittensory-engine/src/reward-risk.ts +++ b/packages/gittensory-engine/src/reward-risk.ts @@ -1,4 +1,4 @@ -// Deterministic reward/risk reasoning signals, extracted to `@jsonbored/gittensory-engine` (#2281) so the +// Deterministic reward/risk reasoning signals, extracted to `@jsonbored/loopover-engine` (#2281) so the // gittensory-miner can rank candidate work locally with the same logic the maintainer-side gate computes. // // Unlike the earlier self-contained extractions, reward-risk sits on top of the maintainer signal stack in diff --git a/packages/gittensory-engine/src/signals/path-matchers.ts b/packages/gittensory-engine/src/signals/path-matchers.ts index 143e8cdb9f..776d3cf49e 100644 --- a/packages/gittensory-engine/src/signals/path-matchers.ts +++ b/packages/gittensory-engine/src/signals/path-matchers.ts @@ -1,7 +1,7 @@ import { isCodeFile, isTestPath } from "./test-evidence.js"; // Pure, deterministic path matchers for slop classification (#561), extracted to -// `@jsonbored/gittensory-engine` (#4252) so the published gittensory-mcp/gittensory-miner CLIs can depend on +// `@jsonbored/loopover-engine` (#4252) so the published gittensory-mcp/gittensory-miner CLIs can depend on // the same source instead of hand-porting it. Siblings to `isTestFile` / `isTestPath`: they identify changed // files that are NOT genuine hand-authored effort — machine-generated output, vendored/imported third-party // code, minified bundles, dependency lockfiles, and docs — so slop signals can tell a padded diff from real diff --git a/packages/gittensory-engine/src/signals/test-evidence.ts b/packages/gittensory-engine/src/signals/test-evidence.ts index 1e504f6f71..7a3b139855 100644 --- a/packages/gittensory-engine/src/signals/test-evidence.ts +++ b/packages/gittensory-engine/src/signals/test-evidence.ts @@ -36,7 +36,7 @@ const EXTENDED_SOURCE_EXTENSION = /\.(php|cpp|cc|c|h|hpp|m|vue|svelte|astro|dart /** cs/swift/groovy/kts plus php, C/C++/Objective-C, vue/svelte/astro, and dart — see isSourcePath for the * canonical JVM/.NET/Swift/Groovy/Kotlin-script matcher kept symmetric with isTestPath. Generated Dart part * files (.g.dart/.freezed.dart/.gr.dart) stay non-code (#3724). The single source of truth both the Worker - * (src/signals/path-matchers.ts) and the published @jsonbored/gittensory-mcp/gittensory-miner CLIs delegate + * (src/signals/path-matchers.ts) and the published @jsonbored/loopover-mcp/gittensory-miner CLIs delegate * to, so the three previously-independent hand-ports can't silently drift from each other again. */ export function isCodeFile(file: string): boolean { if (isSourcePath(file)) return true; diff --git a/packages/gittensory-engine/src/version.ts b/packages/gittensory-engine/src/version.ts index 2a4c8fbbab..e87066d328 100644 --- a/packages/gittensory-engine/src/version.ts +++ b/packages/gittensory-engine/src/version.ts @@ -1,4 +1,4 @@ import ownPackageJson from "../package.json" with { type: "json" }; -/** Published semver of `@jsonbored/gittensory-engine`, derived from this package's own package.json. */ +/** Published semver of `@jsonbored/loopover-engine`, derived from this package's own package.json. */ export const ENGINE_VERSION: string = ownPackageJson.version; diff --git a/packages/gittensory-mcp/CHANGELOG.md b/packages/gittensory-mcp/CHANGELOG.md index 7b017acffd..f81dc15bcd 100644 --- a/packages/gittensory-mcp/CHANGELOG.md +++ b/packages/gittensory-mcp/CHANGELOG.md @@ -295,7 +295,7 @@ - Gittensory_lint_pr_text commit/PR-body rubric linter (#634) - Per-repo time-decay hyperparameters + go live (#703) (#733) - Active issue-watch monitor — gittensory_watch_issues (#699 path B) (#735) -- Slop self-check tools + release @jsonbored/gittensory-mcp v0.6.0 (#745) +- Slop self-check tools + release @jsonbored/loopover-mcp v0.6.0 (#745) ### Fixes - Bound local branch scenario inputs (#614) diff --git a/packages/gittensory-mcp/README.md b/packages/gittensory-mcp/README.md index faf3fffe01..df706b22b3 100644 --- a/packages/gittensory-mcp/README.md +++ b/packages/gittensory-mcp/README.md @@ -1,19 +1,19 @@ -# @jsonbored/gittensory-mcp +# @jsonbored/loopover-mcp -Local stdio MCP wrapper for the Gittensory base-agent layer. +Local stdio MCP wrapper for the LoopOver base-agent layer. -It inspects local git metadata and calls the Gittensory API for branch preflight, score blockers, reward/risk reasoning, contributor decision packs, deterministic next-action planning, and public-safe PR packets. It does not upload source contents in v1. +It inspects local git metadata and calls the LoopOver API for branch preflight, score blockers, reward/risk reasoning, contributor decision packs, deterministic next-action planning, and public-safe PR packets. It does not upload source contents in v1. ## Status -The package is public. Gittensory keeps sensitive score, trust, wallet, and maintainer context out of public PR comments. +The package is public. LoopOver keeps sensitive score, trust, wallet, and maintainer context out of public PR comments. ## Install Public npm: ```sh -npm install -g @jsonbored/gittensory-mcp@latest +npm install -g @jsonbored/loopover-mcp@latest gittensory-mcp login ``` @@ -21,7 +21,7 @@ From a local checkout: ```sh npm install -npm link --workspace @jsonbored/gittensory-mcp +npm link --workspace @jsonbored/loopover-mcp ``` ## Commands @@ -74,14 +74,14 @@ gittensory-mcp --stdio `gittensory-mcp version` (aliases `--version` and `-v`) prints the installed package version, the targeted API version, and the Node.js runtime version: ```text -@jsonbored/gittensory-mcp/0.5.0 (api 0.1.0, node v22.12.0) +@jsonbored/loopover-mcp/0.5.0 (api 0.1.0, node v22.12.0) ``` Add `--json` for machine-readable output: ```json { - "name": "@jsonbored/gittensory-mcp", + "name": "@jsonbored/loopover-mcp", "version": "0.5.0", "apiVersion": "0.1.0", "node": "v22.12.0" @@ -124,7 +124,7 @@ gittensory-mcp analyze-branch --login jsonbored \ ## Review your PR locally before you push `gittensory-mcp review-pr` composes the existing preflight, slop-risk, and PR-text-lint checks into -ONE report, so your own local agent (Claude Code, Codex, etc.) can see everything the gittensory gate +ONE report, so your own local agent (Claude Code, Codex, etc.) can see everything the LoopOver gate would flag before you ever open a PR. It is a thin composition layer — it calls the same checks `preflight`, `slop-risk`, and `lint-pr-text` already run and merges their output; it does not reimplement any of them. @@ -152,7 +152,7 @@ The same composed check is exposed to MCP clients as `gittensory_review_pr_befor gittensory-mcp login --github-token "$(gh auth token)" ``` -The wrapper stores a Gittensory session token, not a GitHub token. +The wrapper stores a LoopOver session token, not a GitHub token. The default profile keeps normal single-account usage simple. For multiple identities, use named profiles: @@ -208,7 +208,7 @@ Profiles are prompt instructions for the coding-agent environment, not autonomou - `maintainer-triage` uses queue triage, review prep, and public-guidance prompts for maintainer review preparation. - `repo-owner-intake` uses intake-readiness, focus-manifest, and onboarding-pack prompts for repository owner setup planning. -Use them when an agent should plan, explain, draft, or prepare packets from Gittensory MCP outputs. Do not use them to open PRs, post comments, label, close, merge, publish public GitHub output, ask for wallets/hotkeys/coldkeys/private keys/tokens, or upload local source contents. Public snippets must stay separated from authenticated private context. +Use them when an agent should plan, explain, draft, or prepare packets from LoopOver MCP outputs. Do not use them to open PRs, post comments, label, close, merge, publish public GitHub output, ask for wallets/hotkeys/coldkeys/private keys/tokens, or upload local source contents. Public snippets must stay separated from authenticated private context. ## Environment @@ -227,21 +227,21 @@ Use them when an agent should plan, explain, draft, or prepare packets from Gitt ### Local score preview adapter -Branch analysis can call a local scorer command that reads branch metadata JSON from stdin and prints one JSON object to stdout. Gittensory never uploads source contents; the scorer runs on your machine. +Branch analysis can call a local scorer command that reads branch metadata JSON from stdin and prints one JSON object to stdout. LoopOver never uploads source contents; the scorer runs on your machine. Metadata-only fallback is used when the command is missing or fails. Run `gittensory-mcp doctor` for setup diagnostics. Reference wrappers ship with the package: ```sh -export GITTENSOR_SCORE_PREVIEW_CMD="node $(npm root -g)/@jsonbored/gittensory-mcp/scripts/gittensor-score-preview.mjs" +export GITTENSOR_SCORE_PREVIEW_CMD="node $(npm root -g)/@jsonbored/loopover-mcp/scripts/gittensor-score-preview.mjs" ``` For tree-sitter scoring with a local [entrius/gittensor](https://github.com/entrius/gittensor) checkout: ```sh export GITTENSOR_ROOT=/path/to/gittensor -export GITTENSOR_SCORE_PREVIEW_CMD="python3 $(npm root -g)/@jsonbored/gittensory-mcp/scripts/gittensor-score-preview.py" +export GITTENSOR_SCORE_PREVIEW_CMD="python3 $(npm root -g)/@jsonbored/loopover-mcp/scripts/gittensor-score-preview.py" ``` Expected stdout shape: diff --git a/packages/gittensory-mcp/bin/gittensory-mcp.js b/packages/gittensory-mcp/bin/gittensory-mcp.js index b98ebe8408..b3fd10db44 100755 --- a/packages/gittensory-mcp/bin/gittensory-mcp.js +++ b/packages/gittensory-mcp/bin/gittensory-mcp.js @@ -5,7 +5,7 @@ import { homedir } from "node:os"; import { delimiter, dirname, join } from "node:path"; import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { buildFeasibilityVerdict } from "@jsonbored/gittensory-engine"; +import { buildFeasibilityVerdict } from "@jsonbored/loopover-engine"; import { z } from "zod"; import { buildBranchAnalysisPayload, collectLocalDiff, collectLocalBranchMetadata, probeLocalScorer, referenceScorePreviewExample, resolveScorePreviewCommand, resolveWorkspaceCwd, sanitizeLocalScorerStatus, setupGuidanceForLocalScorer, isTestFile } from "../lib/local-branch.js"; import { formatTable } from "../lib/format-table.js"; diff --git a/packages/gittensory-mcp/lib/local-branch.js b/packages/gittensory-mcp/lib/local-branch.js index edf3a91225..e4b885c1fb 100644 --- a/packages/gittensory-mcp/lib/local-branch.js +++ b/packages/gittensory-mcp/lib/local-branch.js @@ -2,7 +2,7 @@ import { execFileSync } from "node:child_process"; import { realpathSync } from "node:fs"; import { dirname, isAbsolute, join, relative, resolve } from "node:path"; import { fileURLToPath } from "node:url"; -import { isCodeFile, isTestPath as isTestFile } from "@jsonbored/gittensory-engine/signals/test-evidence"; +import { isCodeFile, isTestPath as isTestFile } from "@jsonbored/loopover-engine/signals/test-evidence"; export { isCodeFile, isTestFile }; @@ -208,7 +208,7 @@ export function referenceScorePreviewCommand(kind = "metadata") { export function referenceScorePreviewExample(kind = "metadata") { const script = kind === "gittensor" ? "gittensor-score-preview.py" : "gittensor-score-preview.mjs"; const interpreter = kind === "gittensor" ? "python3" : "node"; - return `${interpreter} ./node_modules/@jsonbored/gittensory-mcp/scripts/${script}`; + return `${interpreter} ./node_modules/@jsonbored/loopover-mcp/scripts/${script}`; } export function redactLocalPath(value) { diff --git a/packages/gittensory-mcp/package.json b/packages/gittensory-mcp/package.json index 56ff9ac2ab..a256212635 100644 --- a/packages/gittensory-mcp/package.json +++ b/packages/gittensory-mcp/package.json @@ -1,9 +1,9 @@ { - "name": "@jsonbored/gittensory-mcp", + "name": "@jsonbored/loopover-mcp", "version": "0.7.1", "license": "AGPL-3.0-only", "type": "module", - "description": "Local stdio MCP wrapper for the Gittensory Gittensor base-agent.", + "description": "Local stdio MCP wrapper for the LoopOver Gittensor base-agent.", "repository": { "type": "git", "url": "git+https://github.com/JSONbored/gittensory.git", @@ -38,7 +38,7 @@ "build": "node --check bin/gittensory-mcp.js && node --check lib/local-branch.js && node --check lib/format-table.js && node --check scripts/gittensor-score-preview.mjs" }, "dependencies": { - "@jsonbored/gittensory-engine": "^1.0.0", + "@jsonbored/loopover-engine": "^1.0.0", "@modelcontextprotocol/sdk": "1.29.0", "zod": "^4.4.3" }, diff --git a/packages/gittensory-mcp/scripts/gittensor-score-preview.mjs b/packages/gittensory-mcp/scripts/gittensor-score-preview.mjs index 7e936b51a6..c745ec3462 100644 --- a/packages/gittensory-mcp/scripts/gittensor-score-preview.mjs +++ b/packages/gittensory-mcp/scripts/gittensor-score-preview.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env node import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { isCodeFile, isTestPath as isTestFile } from "@jsonbored/gittensory-engine/signals/test-evidence"; +import { isCodeFile, isTestPath as isTestFile } from "@jsonbored/loopover-engine/signals/test-evidence"; function lineCount(file) { const additions = Number(file.additions ?? 0); diff --git a/packages/gittensory-miner/DEPLOYMENT.md b/packages/gittensory-miner/DEPLOYMENT.md index 6fba10145e..dd298a0e6f 100644 --- a/packages/gittensory-miner/DEPLOYMENT.md +++ b/packages/gittensory-miner/DEPLOYMENT.md @@ -1,13 +1,13 @@ # Gittensory miner deployment -Two form factors for running `@jsonbored/gittensory-miner`: **laptop mode** (single machine, zero Docker) and **fleet mode** (containerized workers with a shared data volume). Both are 100% client-side for core operation — the miner never uploads source and never requires a hosted Gittensory callback to boot. Credentials (GitHub tokens, etc.) stay on the operator's machine or in their own secret store; nothing is baked into images. +Two form factors for running `@jsonbored/loopover-miner`: **laptop mode** (single machine, zero Docker) and **fleet mode** (containerized workers with a shared data volume). Both are 100% client-side for core operation — the miner never uploads source and never requires a hosted Gittensory callback to boot. Credentials (GitHub tokens, etc.) stay on the operator's machine or in their own secret store; nothing is baked into images. | | Laptop mode | Fleet mode | | ---------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | | **Best for** | One contributor machine, local experimentation | Many parallel miner attempts on a host or small cluster | | **Dependencies** | Node.js `>=22.13.0` only | Docker (or compatible runtime) + Node image or custom image | | **State** | SQLite files under `~/.config/gittensory-miner/` (override with `GITTENSORY_MINER_CONFIG_DIR`) | Same SQLite layout on a mounted `/data` (or `GITTENSORY_MINER_CONFIG_DIR`) volume | -| **Setup** | `npm install -g @jsonbored/gittensory-miner` or workspace build | `docker build` + `docker run` with env + volume (see below) | +| **Setup** | `npm install -g @jsonbored/loopover-miner` or workspace build | `docker build` + `docker run` with env + volume (see below) | | **Footprint** | One Node process, local disk for ledgers/queues | One container per worker; scale horizontally by adding containers | ## Laptop mode walkthrough @@ -15,9 +15,9 @@ Two form factors for running `@jsonbored/gittensory-miner`: **laptop mode** (sin 1. Install Node.js 22.13+ and the package: ```sh - npm install -g @jsonbored/gittensory-miner@latest + npm install -g @jsonbored/loopover-miner@latest # or from a checkout: - npm install && npm --workspace @jsonbored/gittensory-miner run build + npm install && npm --workspace @jsonbored/loopover-miner run build ``` 2. Inspect what is installed and where local state will live (no network calls): @@ -38,7 +38,7 @@ Two form factors for running `@jsonbored/gittensory-miner`: **laptop mode** (sin governor-ledger.sqlite3 # governor decisions ``` - Override the directory with `GITTENSORY_MINER_CONFIG_DIR` or `XDG_CONFIG_HOME` (same resolution chain as `@jsonbored/gittensory-mcp`). + Override the directory with `GITTENSORY_MINER_CONFIG_DIR` or `XDG_CONFIG_HOME` (same resolution chain as `@jsonbored/loopover-mcp`). 4. Optional per-repo miner goals: copy [`.gittensory-miner.yml.example`](../../.gittensory-miner.yml.example) to a target repo as `.gittensory-miner.yml`. See [`docs/miner-goal-spec.md`](docs/miner-goal-spec.md). @@ -85,7 +85,7 @@ docker compose -f docker-compose.miner.yml up -d --build To run the miner continuously on a plain Linux host without Docker, supervise `gittensory-miner loop` — the autonomous discover → attempt → manage daemon (#5135) — with systemd. [`systemd/gittensory-miner.service.example`](../../systemd/gittensory-miner.service.example) is a ready-to-adapt persistent unit; its header carries the full install steps: ```sh -npm install -g @jsonbored/gittensory-miner +npm install -g @jsonbored/loopover-miner gittensory-miner init sudo cp systemd/gittensory-miner.service.example /etc/systemd/system/gittensory-miner.service sudo $EDITOR /etc/systemd/system/gittensory-miner.service # set User / WorkingDirectory / ExecStart / secrets diff --git a/packages/gittensory-miner/Dockerfile b/packages/gittensory-miner/Dockerfile index d377b6f21d..9b123eb503 100644 --- a/packages/gittensory-miner/Dockerfile +++ b/packages/gittensory-miner/Dockerfile @@ -1,4 +1,4 @@ -# Fleet-mode image for @jsonbored/gittensory-miner (#4295). Build context = monorepo root: +# Fleet-mode image for @jsonbored/loopover-miner (#4295). Build context = monorepo root: # docker build -f packages/gittensory-miner/Dockerfile -t gittensory-miner:latest . # SECRETS ARE NEVER BAKED: supply operator credentials at `docker run` time only. # Persistent SQLite ledgers live on a mounted volume (default GITTENSORY_MINER_CONFIG_DIR=/data/miner). @@ -9,12 +9,12 @@ ARG GITTENSORY_VERSION= FROM public.ecr.aws/docker/library/node:24-slim AS build WORKDIR /app # Full source BEFORE `npm ci`: npm workspaces only symlinks packages that already exist on disk. -# Same ordering fix as the root gittensory-api Dockerfile — @jsonbored/gittensory-engine must be -# present when `npm ci` runs or gittensory-miner's workspace dependency cannot resolve. +# Same ordering fix as the root gittensory-api Dockerfile — @jsonbored/loopover-engine must be +# present when `npm ci` runs or loopover-miner's workspace dependency cannot resolve. COPY . . RUN npm ci --ignore-scripts -RUN npm --workspace @jsonbored/gittensory-engine run build -RUN npm --workspace @jsonbored/gittensory-miner run build +RUN npm --workspace @jsonbored/loopover-engine run build +RUN npm --workspace @jsonbored/loopover-miner run build RUN npm prune --omit=dev --ignore-scripts # --- runtime: non-root CLI image with a mounted config volume ----------------------------------- diff --git a/packages/gittensory-miner/README.md b/packages/gittensory-miner/README.md index 6fd9e747fd..36b0ce4178 100644 --- a/packages/gittensory-miner/README.md +++ b/packages/gittensory-miner/README.md @@ -1,6 +1,6 @@ -# @jsonbored/gittensory-miner +# @jsonbored/loopover-miner -Foundation CLI for the local Gittensory miner runtime. +Foundation CLI for the local LoopOver miner runtime. This package is the future home of the autonomous discover → analyze → plan → prepare → create → manage miner workflow. In this foundation phase it provides the package scaffold, a minimal CLI surface for `--help` and `--version`, and a non-blocking npm registry version nudge on startup. @@ -33,7 +33,7 @@ no enforcement wiring yet. (#2328) The package also includes a local soft-claim ledger: `openClaimLedger` / `claimIssue` / `releaseClaim` / `listActiveClaims` persist which issues this miner instance has claimed on this machine. The table is local -bookkeeping only — duplicate winners are adjudicated elsewhere via `@jsonbored/gittensory-engine`. (#2291) +bookkeeping only — duplicate winners are adjudicated elsewhere via `@jsonbored/loopover-engine`. (#2291) The package also includes an append-only event ledger: `initEventLedger` / `appendEvent` / `readEvents` persist immutable miner-loop events in local SQLite for contributor audit. Insert-only — rows are never updated or @@ -41,7 +41,7 @@ deleted. (#2322) The package also records local PR outcomes: `recordPrOutcomeSnapshot` / `readPrOutcomes` write and reduce the miner's OWN record of the outcomes of its OWN PRs (merged / closed, with an optional rejection-reason bucket) over -the append-only event ledger above. This is DISTINCT from the gittensory server's `recordPrOutcome` +the append-only event ledger above. This is DISTINCT from the LoopOver server's `recordPrOutcome` (`src/review/outcomes-wire.ts`), which writes hosted-backend audit rows from the GitHub App's webhook stream — same concept name, different codebase layer, no shared code (a laptop-mode miner may have no webhook relay at all). (#4274) @@ -96,7 +96,7 @@ See [`DEPLOYMENT.md`](DEPLOYMENT.md) for laptop vs fleet deployment. Zero-infra local install — no Docker, Redis, or Postgres required: ```sh -npm install -g @jsonbored/gittensory-miner +npm install -g @jsonbored/loopover-miner gittensory-miner init gittensory-miner doctor gittensory-miner status @@ -108,8 +108,8 @@ From a local checkout: ```sh npm install -npm --workspace @jsonbored/gittensory-miner run build -npm link --workspace @jsonbored/gittensory-miner +npm --workspace @jsonbored/loopover-miner run build +npm link --workspace @jsonbored/loopover-miner ``` ## Commands @@ -149,4 +149,4 @@ Further AMS-state-reading tools (status/doctor diagnostics, governor ledger) lan ## Version check -On every invocation the CLI starts an async npm registry lookup (5s timeout). When the installed package is behind `@jsonbored/gittensory-miner@latest`, it prints a one-line upgrade command to stderr without blocking or failing the requested command. Set `GITTENSORY_NPM_REGISTRY_URL` to point at a mirror, same as `@jsonbored/gittensory-mcp`. +On every invocation the CLI starts an async npm registry lookup (5s timeout). When the installed package is behind `@jsonbored/loopover-miner@latest`, it prints a one-line upgrade command to stderr without blocking or failing the requested command. Set `GITTENSORY_NPM_REGISTRY_URL` to point at a mirror, same as `@jsonbored/loopover-mcp`. diff --git a/packages/gittensory-miner/bin/gittensory-miner-mcp.js b/packages/gittensory-miner/bin/gittensory-miner-mcp.js index 7c9312fd8a..7ca82887b0 100755 --- a/packages/gittensory-miner/bin/gittensory-miner-mcp.js +++ b/packages/gittensory-miner/bin/gittensory-miner-mcp.js @@ -15,7 +15,7 @@ import { initPortfolioQueueStore } from "../lib/portfolio-queue.js"; import { initRunStateStore } from "../lib/run-state.js"; import { PLAN_STATUSES, openPlanStore } from "../lib/plan-store.js"; -// MCP stdio server for @jsonbored/gittensory-miner (scaffold #5153). Mirrors the packages/gittensory-mcp +// MCP stdio server for @jsonbored/loopover-miner (scaffold #5153). Mirrors the packages/gittensory-mcp // harness (MCP SDK server + stdio transport). Tools: // - gittensory_miner_ping (#5153): trivial static health check, reads no AMS state. // - gittensory_miner_get_portfolio_dashboard (#5155): read-only per-repo backlog dashboard, wrapping the diff --git a/packages/gittensory-miner/bin/gittensory-miner.js b/packages/gittensory-miner/bin/gittensory-miner.js index 04789f0a87..fe7d2e42cd 100755 --- a/packages/gittensory-miner/bin/gittensory-miner.js +++ b/packages/gittensory-miner/bin/gittensory-miner.js @@ -72,7 +72,7 @@ if (cliArgs[0] === "feasibility") { process.exit(runFeasibilityCli(cliArgs.slice(1))); } -const packageName = "@jsonbored/gittensory-miner"; +const packageName = "@jsonbored/loopover-miner"; const packageVersion = resolveMinerVersion(process.env); const upgradeCommand = resolveUpgradeCommand(packageName); diff --git a/packages/gittensory-miner/docs/coding-agent-driver.md b/packages/gittensory-miner/docs/coding-agent-driver.md index 89cb3b9aae..ad8c3df32f 100644 --- a/packages/gittensory-miner/docs/coding-agent-driver.md +++ b/packages/gittensory-miner/docs/coding-agent-driver.md @@ -5,7 +5,7 @@ provider-agnostic contract, so the rest of the miner — planning, attempt logging, metering, gate polling — never has to know which backend actually did the work. -The interface itself lives in `@jsonbored/gittensory-engine` +The interface itself lives in `@jsonbored/loopover-engine` ([`packages/gittensory-engine/src/miner/coding-agent-driver.ts`](../../gittensory-engine/src/miner/coding-agent-driver.ts)); the orchestration around it (mode gating, invocation, the factory) lives in the sibling modules described below. diff --git a/packages/gittensory-miner/docs/cross-repo-discovery-phase1.md b/packages/gittensory-miner/docs/cross-repo-discovery-phase1.md index f93d91a6f4..9ccfc0412b 100644 --- a/packages/gittensory-miner/docs/cross-repo-discovery-phase1.md +++ b/packages/gittensory-miner/docs/cross-repo-discovery-phase1.md @@ -39,7 +39,7 @@ Hosted and stdio MCP surfaces expose the composed shortlist via `gittensory_find | [#2306](https://github.com/JSONbored/gittensory/issues/2306) | AI-policy fixture corpus + integration test | | [#2307](https://github.com/JSONbored/gittensory/issues/2307) | Cross-repo GitHub search/listing fan-out (metadata-only) | | [#2308](https://github.com/JSONbored/gittensory/issues/2308) | Hosted `gittensory_find_opportunities` MCP tool | -| [#2309](https://github.com/JSONbored/gittensory/issues/2309) | Stdio `gittensory_find_opportunities` in `@jsonbored/gittensory-mcp` | +| [#2309](https://github.com/JSONbored/gittensory/issues/2309) | Stdio `gittensory_find_opportunities` in `@jsonbored/loopover-mcp` | | [#2310](https://github.com/JSONbored/gittensory/issues/2310) | Miner package `test:miner-pack` / `build:miner` parity checks | | [#2311](https://github.com/JSONbored/gittensory/issues/2311) | End-to-end Phase 1 discovery pipeline fixture test | diff --git a/packages/gittensory-miner/docs/discovery-index-contract.md b/packages/gittensory-miner/docs/discovery-index-contract.md index 41be376a6f..aa6fb659c8 100644 --- a/packages/gittensory-miner/docs/discovery-index-contract.md +++ b/packages/gittensory-miner/docs/discovery-index-contract.md @@ -1,7 +1,7 @@ # Discovery-index API contract The **discovery-index contract** is the typed request/response shape a miner uses to query the *optional* hosted -discovery-index service. It is defined in `@jsonbored/gittensory-engine` +discovery-index service. It is defined in `@jsonbored/loopover-engine` (`packages/gittensory-engine/src/discovery-index-contract.ts`) so both sides — this repo's future server implementation ([#4250](https://github.com/JSONbored/gittensory/issues/4250), maintainer-only, explicitly blocked on this contract) and any client — build against one shape. diff --git a/packages/gittensory-miner/docs/discovery-plane-operator-guide.md b/packages/gittensory-miner/docs/discovery-plane-operator-guide.md index f06552100e..43cbb5a100 100644 --- a/packages/gittensory-miner/docs/discovery-plane-operator-guide.md +++ b/packages/gittensory-miner/docs/discovery-plane-operator-guide.md @@ -61,7 +61,7 @@ With opt-in off (default), behavior is byte-identical to today: local SQLite led `packages/gittensory-miner/lib/claim-ledger.js` records soft claims **locally only** ("never uploads, syncs, or phones home"). Fleet-wide coordination before work starts is what [#4302](https://github.com/JSONbored/gittensory/issues/4302) + the hosted index ([#4250](https://github.com/JSONbored/gittensory/issues/4250)) add **on top of** that ledger — only after explicit opt-in. -After-the-fact duplicate adjudication (`isDuplicateClusterWinnerByClaim` in `@jsonbored/gittensory-engine`) remains separate; it resolves collisions by observing what publicly landed first, not by preventing overlap up front. +After-the-fact duplicate adjudication (`isDuplicateClusterWinnerByClaim` in `@jsonbored/loopover-engine`) remains separate; it resolves collisions by observing what publicly landed first, not by preventing overlap up front. ## Invariants diff --git a/packages/gittensory-miner/docs/fleet-run-manifest.md b/packages/gittensory-miner/docs/fleet-run-manifest.md index cf2b371a1a..d67377faf6 100644 --- a/packages/gittensory-miner/docs/fleet-run-manifest.md +++ b/packages/gittensory-miner/docs/fleet-run-manifest.md @@ -3,7 +3,7 @@ The **fleet run-manifest** is the top-level config a *fleet operator* authors to run the miner across many repos at once: it declares which repos are in scope for a fleet run and how a finite worktree/concurrency budget is split between them. It is parsed by `parseFleetRunManifestContent` / `parseFleetRunManifest` in -`@jsonbored/gittensory-engine` (`packages/gittensory-engine/src/fleet-run-manifest.ts`). +`@jsonbored/loopover-engine` (`packages/gittensory-engine/src/fleet-run-manifest.ts`). It is **not** the same file as `.gittensory-miner.yml` (see [`miner-goal-spec.md`](./miner-goal-spec.md)) — the naming is easy to conflate. Same tolerant-parser convention (every field optional, unknown keys ignored, a diff --git a/packages/gittensory-miner/docs/miner-goal-spec.md b/packages/gittensory-miner/docs/miner-goal-spec.md index 8fae73888d..82e3587149 100644 --- a/packages/gittensory-miner/docs/miner-goal-spec.md +++ b/packages/gittensory-miner/docs/miner-goal-spec.md @@ -1,6 +1,6 @@ # MinerGoalSpec (`.gittensory-miner.yml`) -Per-repo configuration telling an autonomous Gittensory miner what to look for and how to behave when targeting a repo. Parsed by `@jsonbored/gittensory-engine` (`parseMinerGoalSpec` / `parseMinerGoalSpecContent`); this document is the field reference. Machine-readable shape: [`../schema/miner-goal-spec.schema.json`](../schema/miner-goal-spec.schema.json). Copy [`.gittensory-miner.yml.example`](../../../.gittensory-miner.yml.example) to `.gittensory-miner.yml` and edit. +Per-repo configuration telling an autonomous Gittensory miner what to look for and how to behave when targeting a repo. Parsed by `@jsonbored/loopover-engine` (`parseMinerGoalSpec` / `parseMinerGoalSpecContent`); this document is the field reference. Machine-readable shape: [`../schema/miner-goal-spec.schema.json`](../schema/miner-goal-spec.schema.json). Copy [`.gittensory-miner.yml.example`](../../../.gittensory-miner.yml.example) to `.gittensory-miner.yml` and edit. Discovery order (first match wins): diff --git a/packages/gittensory-miner/docs/repo-agnostic-capability-audit.md b/packages/gittensory-miner/docs/repo-agnostic-capability-audit.md index 489b472f54..db3993a77a 100644 --- a/packages/gittensory-miner/docs/repo-agnostic-capability-audit.md +++ b/packages/gittensory-miner/docs/repo-agnostic-capability-audit.md @@ -11,7 +11,7 @@ surviving only as the default). Audit-and-document only — no code changes here The miner's discovery/claim/scoring code is **already largely repo-agnostic**. Discovery queries are caller-supplied, label preferences are generic per-tenant config (`.gittensory-miner.yml` uses plain `bug`/`enhancement`, not `gittensor:*`), ranking/feasibility are delegated to -`@jsonbored/gittensory-engine` with config-overridable inputs, and runtime knobs live in +`@jsonbored/loopover-engine` with config-overridable inputs, and runtime knobs live in `.gittensory-ams.yml`. The remaining assumptions fall into three buckets: 1. **GitHub as the only forge** — the fan-out hardcodes GitHub's REST paths, headers, API version, and @@ -19,7 +19,7 @@ caller-supplied, label preferences are generic per-tenant config (`.gittensory-m 2. **An existing forge-host override that isn't reachable from the CLI** — `opportunity-fanout` already accepts `apiBaseUrl` (GitHub Enterprise), but `discover-cli` never parses or threads it. 3. **Engine-delegated gittensory *defaults*** — label taxonomy and the miner goal spec default to - gittensory's conventions in `@jsonbored/gittensory-engine`; they are overridable, but the miner uses + gittensory's conventions in `@jsonbored/loopover-engine`; they are overridable, but the miner uses the gittensory defaults out of the box unless a per-tenant config is supplied. Everything else audited is already parameterized (see the last section) and needs no #4784 work. @@ -52,7 +52,7 @@ whatever label strings the forge returns, with no `gittensor:*` filter. No chang | Line | Assumption | Category | Should become | | --- | --- | --- | --- | -| 1–5 | imports `DEFAULT_MINER_GOAL_SPEC`, `parseMinerGoalSpecContent`, `rankMetadataOpportunities` from `@jsonbored/gittensory-engine` | (3) scoring rubric | Ranking is engine-delegated and config-driven via `parseMinerGoalSpecContent`, but falls back to `DEFAULT_MINER_GOAL_SPEC` (gittensory's rubric) when no per-tenant goal spec is provided. #4784 should ensure a tenant goal spec is surfaced/required rather than silently defaulting. | +| 1–5 | imports `DEFAULT_MINER_GOAL_SPEC`, `parseMinerGoalSpecContent`, `rankMetadataOpportunities` from `@jsonbored/loopover-engine` | (3) scoring rubric | Ranking is engine-delegated and config-driven via `parseMinerGoalSpecContent`, but falls back to `DEFAULT_MINER_GOAL_SPEC` (gittensory's rubric) when no per-tenant goal spec is provided. #4784 should ensure a tenant goal spec is surfaced/required rather than silently defaulting. | ### `lib/feasibility-cli.js` — feasibility verdict (delegated) @@ -60,7 +60,7 @@ whatever label strings the forge returns, with no `gittensor:*` filter. No chang | --- | --- | --- | --- | | 4 | delegates to engine `buildFeasibilityVerdict` | (3) scoring rubric | The status vocabularies (`CLAIM_STATUSES`, `DUPLICATE_CLUSTER_RISKS`, `ISSUE_STATUSES`) are generic; the *verdict logic* lives in the engine. No miner-side hardcode, but the engine rubric is a shared dependency to confirm is tenant-neutral. | -### `@jsonbored/gittensory-engine` (shared dependency the miner scores through) +### `@jsonbored/loopover-engine` (shared dependency the miner scores through) | Location | Assumption | Category | Should become | | --- | --- | --- | --- | diff --git a/packages/gittensory-miner/lib/ams-policy.d.ts b/packages/gittensory-miner/lib/ams-policy.d.ts index 3be9c27d47..af2db87b65 100644 --- a/packages/gittensory-miner/lib/ams-policy.d.ts +++ b/packages/gittensory-miner/lib/ams-policy.d.ts @@ -1,4 +1,4 @@ -import type { AmsPolicySpec } from "@jsonbored/gittensory-engine"; +import type { AmsPolicySpec } from "@jsonbored/loopover-engine"; import type { SelfReviewContextFetch } from "./self-review-context.js"; export function resolveAmsPolicyConfigPath(env?: Record): string; diff --git a/packages/gittensory-miner/lib/ams-policy.js b/packages/gittensory-miner/lib/ams-policy.js index 0340651849..d8e1fe128c 100644 --- a/packages/gittensory-miner/lib/ams-policy.js +++ b/packages/gittensory-miner/lib/ams-policy.js @@ -1,5 +1,5 @@ import { existsSync, readFileSync } from "node:fs"; -import { AMS_POLICY_SPEC_FILENAMES, DEFAULT_AMS_POLICY_SPEC, parseAmsPolicySpecContent } from "@jsonbored/gittensory-engine"; +import { AMS_POLICY_SPEC_FILENAMES, DEFAULT_AMS_POLICY_SPEC, parseAmsPolicySpecContent } from "@jsonbored/loopover-engine"; import { resolveLocalStoreDbPath } from "./local-store.js"; // Real two-scope resolver for `.gittensory-ams.yml` (#5132, Wave 3.5 follow-up). AmsPolicySpec @@ -83,7 +83,7 @@ async function fetchRepoAmsPolicyContent(target, resolved) { * readFileSync?: (path: string, encoding: "utf8") => string, existsSync?: (path: string) => boolean, * env?: Record, * }} [options] - * @returns {Promise<{ spec: import("@jsonbored/gittensory-engine").AmsPolicySpec, source: "local"|"repo"|"default", warnings: string[] }>} + * @returns {Promise<{ spec: import("@jsonbored/loopover-engine").AmsPolicySpec, source: "local"|"repo"|"default", warnings: string[] }>} */ export async function resolveAmsPolicy(repoFullName, options = {}) { const resolved = normalizeOptions(options); diff --git a/packages/gittensory-miner/lib/attempt-cli.d.ts b/packages/gittensory-miner/lib/attempt-cli.d.ts index 5e0002aa5f..a624554235 100644 --- a/packages/gittensory-miner/lib/attempt-cli.d.ts +++ b/packages/gittensory-miner/lib/attempt-cli.d.ts @@ -1,4 +1,4 @@ -import type { CodingAgentExecutionMode, FeasibilityVerdict, LocalWriteActionSpec } from "@jsonbored/gittensory-engine"; +import type { CodingAgentExecutionMode, FeasibilityVerdict, LocalWriteActionSpec } from "@jsonbored/loopover-engine"; import type { AttemptDeps, AttemptResult as RunMinerAttemptResult, runMinerAttempt } from "./attempt-runner.js"; import type { ClaimLedger } from "./claim-ledger.js"; import type { EventLedger } from "./event-ledger.js"; diff --git a/packages/gittensory-miner/lib/attempt-cli.js b/packages/gittensory-miner/lib/attempt-cli.js index 2dfabd76cf..50b70346b4 100644 --- a/packages/gittensory-miner/lib/attempt-cli.js +++ b/packages/gittensory-miner/lib/attempt-cli.js @@ -12,7 +12,7 @@ // governor.convergenceInput is an honest first-attempt-shaped literal, not a real per-issue attempt-history // query (attempt-log.js's schema has no repo+issue index, and reenqueue counts aren't tracked anywhere yet). -import { resolveCodingAgentModeFromConfig } from "@jsonbored/gittensory-engine"; +import { resolveCodingAgentModeFromConfig } from "@jsonbored/loopover-engine"; import { constructProductionCodingAgentDriver } from "./coding-agent-construction.js"; import { runSlopAssessment } from "./slop-assessment.js"; import { fetchLiveIssueSnapshot } from "./live-issue-snapshot.js"; diff --git a/packages/gittensory-miner/lib/attempt-input-builder.d.ts b/packages/gittensory-miner/lib/attempt-input-builder.d.ts index 2c0d5b1d74..af0dc905ac 100644 --- a/packages/gittensory-miner/lib/attempt-input-builder.d.ts +++ b/packages/gittensory-miner/lib/attempt-input-builder.d.ts @@ -1,4 +1,4 @@ -import type { AmsPolicySpec, CodingAgentExecutionMode, IterateLoopInput, SelfReviewContext } from "@jsonbored/gittensory-engine"; +import type { AmsPolicySpec, CodingAgentExecutionMode, IterateLoopInput, SelfReviewContext } from "@jsonbored/loopover-engine"; import type { AttemptGovernorContext } from "./attempt-runner.js"; import type { CodingTaskSpecResult } from "./coding-task-spec.js"; diff --git a/packages/gittensory-miner/lib/attempt-input-builder.js b/packages/gittensory-miner/lib/attempt-input-builder.js index f6d6edaa3d..334049ba70 100644 --- a/packages/gittensory-miner/lib/attempt-input-builder.js +++ b/packages/gittensory-miner/lib/attempt-input-builder.js @@ -1,4 +1,4 @@ -import { isGlobalMinerKillSwitch, isGlobalMinerLiveModeOptIn } from "@jsonbored/gittensory-engine"; +import { isGlobalMinerKillSwitch, isGlobalMinerLiveModeOptIn } from "@jsonbored/loopover-engine"; // Pure composers for runMinerAttempt's real input (#5132, Wave 3.5 -- the final assembly). Everything here is // a plain in/out transform over already-fetched/already-computed real data (coding-task-spec, #5239; @@ -28,7 +28,7 @@ import { isGlobalMinerKillSwitch, isGlobalMinerLiveModeOptIn } from "@jsonbored/ * the persisted governor-state store when absent. * * @param {Record} env - * @param {import("@jsonbored/gittensory-engine").AmsPolicySpec} amsPolicySpec + * @param {import("@jsonbored/loopover-engine").AmsPolicySpec} amsPolicySpec * @returns {import("./attempt-runner.js").AttemptGovernorContext} */ export function buildAttemptGovernorContext(env, amsPolicySpec) { @@ -47,17 +47,17 @@ export function buildAttemptGovernorContext(env, amsPolicySpec) { * * @param {{ * codingTaskSpec: Extract, - * reviewContext: import("@jsonbored/gittensory-engine").SelfReviewContext, + * reviewContext: import("@jsonbored/loopover-engine").SelfReviewContext, * worktreePath: string, * attemptId: string, - * mode: import("@jsonbored/gittensory-engine").CodingAgentExecutionMode, + * mode: import("@jsonbored/loopover-engine").CodingAgentExecutionMode, * repoFullName: string, * minerLogin: string, * rejectionSignaled: boolean, - * amsPolicySpec: import("@jsonbored/gittensory-engine").AmsPolicySpec, + * amsPolicySpec: import("@jsonbored/loopover-engine").AmsPolicySpec, * branchRef?: string, * }} input - * @returns {import("@jsonbored/gittensory-engine").IterateLoopInput} + * @returns {import("@jsonbored/loopover-engine").IterateLoopInput} */ export function buildAttemptLoopInput(input) { return { diff --git a/packages/gittensory-miner/lib/attempt-log.d.ts b/packages/gittensory-miner/lib/attempt-log.d.ts index 6bc3a36898..9d810fbe8e 100644 --- a/packages/gittensory-miner/lib/attempt-log.d.ts +++ b/packages/gittensory-miner/lib/attempt-log.d.ts @@ -1,4 +1,4 @@ -import type { AttemptLogEvent } from "@jsonbored/gittensory-engine"; +import type { AttemptLogEvent } from "@jsonbored/loopover-engine"; export type AttemptLogEntry = { id: number; diff --git a/packages/gittensory-miner/lib/attempt-log.js b/packages/gittensory-miner/lib/attempt-log.js index e54b062307..876bcec882 100644 --- a/packages/gittensory-miner/lib/attempt-log.js +++ b/packages/gittensory-miner/lib/attempt-log.js @@ -1,4 +1,4 @@ -import { formatAttemptLogJsonl, normalizeAttemptLogEvent } from "@jsonbored/gittensory-engine"; +import { formatAttemptLogJsonl, normalizeAttemptLogEvent } from "@jsonbored/loopover-engine"; import { normalizeLocalStoreDbPath, openLocalStoreDb, resolveLocalStoreDbPath } from "./local-store.js"; // Append-only driver attempt log (#4294): a structured, attempt-scoped event trace for every CodingAgentDriver run diff --git a/packages/gittensory-miner/lib/attempt-runner.d.ts b/packages/gittensory-miner/lib/attempt-runner.d.ts index 82e5071b2c..32bd90eeb6 100644 --- a/packages/gittensory-miner/lib/attempt-runner.d.ts +++ b/packages/gittensory-miner/lib/attempt-runner.d.ts @@ -4,7 +4,7 @@ import type { IterateLoopInput, IterateLoopResult, LocalWriteActionSpec, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import type { HarnessSubmissionDecision, HarnessSubmissionEventLedger } from "./harness-submission-trigger.js"; import type { SubmissionFreshnessClaimLedger, LiveIssueSnapshot, FreshnessAbortReason } from "./submission-freshness-check.js"; import type { GovernorChokepointInputPersisted } from "./governor-chokepoint-persisted.js"; diff --git a/packages/gittensory-miner/lib/attempt-runner.js b/packages/gittensory-miner/lib/attempt-runner.js index d87ee5045d..45b62724c1 100644 --- a/packages/gittensory-miner/lib/attempt-runner.js +++ b/packages/gittensory-miner/lib/attempt-runner.js @@ -1,5 +1,5 @@ -import { buildOpenPrSpec } from "@jsonbored/gittensory-engine"; -import { runIterateLoop } from "@jsonbored/gittensory-engine"; +import { buildOpenPrSpec } from "@jsonbored/loopover-engine"; +import { runIterateLoop } from "@jsonbored/loopover-engine"; import { checkSubmissionFreshness } from "./submission-freshness-check.js"; import { evaluateGovernorChokepointGatePersisted } from "./governor-chokepoint-persisted.js"; import { prepareOpenPrSubmission } from "./harness-submission-trigger.js"; @@ -10,7 +10,7 @@ import { prepareOpenPrSubmission } from "./harness-submission-trigger.js"; // Governor chokepoint (#2340, which itself composes kill-switch, dry-run, rate-limit, budget caps, non- // convergence, self-reputation-throttle, and self-plagiarism -- see chokepoint.ts's own module doc comment for // the exact precedence ladder) -> on allowed:true, builds the REAL open_pr command via the now-shared -// buildOpenPrSpec (@jsonbored/gittensory-engine, moved from root src/mcp/local-write-tools.ts) and executes it. +// buildOpenPrSpec (@jsonbored/loopover-engine, moved from root src/mcp/local-write-tools.ts) and executes it. // // WORKTREE LIFECYCLE IS NOT THIS MODULE'S JOB: runIterateLoop already takes a plain `workingDirectory` string // (packages/gittensory-engine/src/miner/iterate-loop.ts's own IterateLoopInput), deliberately agnostic about @@ -73,7 +73,7 @@ function assertInput(input) { * input/deps, mirroring every sibling module in this pipeline. * * @param {{ - * loopInput: import("@jsonbored/gittensory-engine").IterateLoopInput, + * loopInput: import("@jsonbored/loopover-engine").IterateLoopInput, * issueNumber: number, * minerLogin: string, * base: string, @@ -82,10 +82,10 @@ function assertInput(input) { * submissionMode: "observe"|"enforce", * maxConsecutiveGateBlocks?: number, * draft?: boolean, - * governor: Omit, + * governor: Omit, * }} input * @param {{ - * driver: import("@jsonbored/gittensory-engine").CodingAgentDriver, + * driver: import("@jsonbored/loopover-engine").CodingAgentDriver, * runSlopAssessment: Function, * appendAttemptLogEvent: Function, * claimLedger: object, @@ -95,7 +95,7 @@ function assertInput(input) { * governorState?: import("./governor-state.js").GovernorState, * sessionStartMs?: number, * nowMs: number, - * executeLocalWrite: (spec: import("@jsonbored/gittensory-engine").LocalWriteActionSpec) => Promise, + * executeLocalWrite: (spec: import("@jsonbored/loopover-engine").LocalWriteActionSpec) => Promise, * }} deps */ export async function runMinerAttempt(input, deps) { diff --git a/packages/gittensory-miner/lib/attempt-worktree.d.ts b/packages/gittensory-miner/lib/attempt-worktree.d.ts index b60d181602..57447c27c6 100644 --- a/packages/gittensory-miner/lib/attempt-worktree.d.ts +++ b/packages/gittensory-miner/lib/attempt-worktree.d.ts @@ -1,4 +1,4 @@ -import type { WorktreeExecFn } from "@jsonbored/gittensory-engine"; +import type { WorktreeExecFn } from "@jsonbored/loopover-engine"; import type { RunGitFn } from "./repo-clone.js"; export function createRealWorktreeExec(timeoutMs?: number): WorktreeExecFn; diff --git a/packages/gittensory-miner/lib/attempt-worktree.js b/packages/gittensory-miner/lib/attempt-worktree.js index a0c136ccce..60921e1b6b 100644 --- a/packages/gittensory-miner/lib/attempt-worktree.js +++ b/packages/gittensory-miner/lib/attempt-worktree.js @@ -1,9 +1,9 @@ import { spawn } from "node:child_process"; -import { addWorktree, removeWorktree, shouldRetainWorktree } from "@jsonbored/gittensory-engine"; +import { addWorktree, removeWorktree, shouldRetainWorktree } from "@jsonbored/loopover-engine"; import { ensureRepoCloned } from "./repo-clone.js"; // Real attempt-worktree preparation (#5132, Wave 3.5 follow-up). Composes ensureRepoCloned (repo-clone.js, -// the missing base-clone-management step) with @jsonbored/gittensory-engine's already-built, already-tested +// the missing base-clone-management step) with @jsonbored/loopover-engine's already-built, already-tested // addWorktree/removeWorktree primitives -- which existed but were never called from this package, so // `workingDirectory` handed to runIterateLoop was always just an empty directory with no real git repo in // it. This is the caller that finally exercises them for real. @@ -16,7 +16,7 @@ const DEFAULT_TIMEOUT_MS = 120_000; * failed `git worktree add`'s stderr is the diagnosable signal, not something to lose to an unhandled * rejection. * - * @returns {import("@jsonbored/gittensory-engine").WorktreeExecFn} + * @returns {import("@jsonbored/loopover-engine").WorktreeExecFn} */ export function createRealWorktreeExec(timeoutMs = DEFAULT_TIMEOUT_MS) { return (cmd, args, opts) => @@ -54,7 +54,7 @@ export function createRealWorktreeExec(timeoutMs = DEFAULT_TIMEOUT_MS) { * @param {string} attemptId * @param {{ * baseBranch?: string, cloneBaseDir?: string, env?: Record, - * exec?: import("@jsonbored/gittensory-engine").WorktreeExecFn, timeoutMs?: number, + * exec?: import("@jsonbored/loopover-engine").WorktreeExecFn, timeoutMs?: number, * remoteUrl?: string, runGit?: import("./repo-clone.js").RunGitFn, * }} [options] * @returns {Promise<{ ok: boolean, worktreePath?: string, branchName?: string, repoPath?: string, error?: string }>} @@ -85,7 +85,7 @@ export async function prepareAttemptWorktree(repoFullName, attemptId, options = * @param {string} repoPath * @param {string} worktreePath * @param {boolean} attemptOk - * @param {{ exec?: import("@jsonbored/gittensory-engine").WorktreeExecFn, timeoutMs?: number }} [options] + * @param {{ exec?: import("@jsonbored/loopover-engine").WorktreeExecFn, timeoutMs?: number }} [options] * @returns {Promise<{ ok: boolean, removed: boolean, error?: string }>} */ export async function cleanupAttemptWorktree(repoPath, worktreePath, attemptOk, options = {}) { diff --git a/packages/gittensory-miner/lib/claim-adjudication.js b/packages/gittensory-miner/lib/claim-adjudication.js index fe99581bd8..4df34e5d29 100644 --- a/packages/gittensory-miner/lib/claim-adjudication.js +++ b/packages/gittensory-miner/lib/claim-adjudication.js @@ -1,12 +1,12 @@ // Soft-claim adjudication (#4291). Decides which of several miners claiming the same issue proceeds, by REUSING the -// maintainer-side duplicate-cluster election (`isDuplicateClusterWinnerByClaim` from @jsonbored/gittensory-engine) +// maintainer-side duplicate-cluster election (`isDuplicateClusterWinnerByClaim` from @jsonbored/loopover-engine) // rather than reimplementing it — so the miner and the maintainer gate agree on exactly one winner by construction. // // The local claim ledger is 100% client-side and cannot see other miners' claims, so the competing-claim signal // must come from something publicly observable: the OPEN PRs that link the same issue (an issue with several open // PRs linking it IS the public signal of a contested claim). The caller assembles that set — exactly like the // maintainer-side callers in src/ do — and passes it here. -import { isDuplicateClusterWinnerByClaim, resolveDuplicateClusterWinnerNumber } from "@jsonbored/gittensory-engine"; +import { isDuplicateClusterWinnerByClaim, resolveDuplicateClusterWinnerNumber } from "@jsonbored/loopover-engine"; /** * Map an observed claim record to the engine's `DuplicateClaimMember`. The field names deliberately DIFFER — the diff --git a/packages/gittensory-miner/lib/claim-ledger.js b/packages/gittensory-miner/lib/claim-ledger.js index 5cfc96fcb4..ed44d6d5d1 100644 --- a/packages/gittensory-miner/lib/claim-ledger.js +++ b/packages/gittensory-miner/lib/claim-ledger.js @@ -60,7 +60,7 @@ export function openClaimLedger(dbPath = resolveClaimLedgerDbPath()) { const db = openLocalStoreDb(resolvedPath); // LOCAL bookkeeping only: this table records which issues this miner instance has soft-claimed on this // machine. It does NOT adjudicate contested duplicates — sibling miners claiming the same issue are - // resolved elsewhere via `isDuplicateClusterWinnerByClaim` from `@jsonbored/gittensory-engine` (#3355). + // resolved elsewhere via `isDuplicateClusterWinnerByClaim` from `@jsonbored/loopover-engine` (#3355). db.exec(` CREATE TABLE IF NOT EXISTS miner_claims ( id INTEGER PRIMARY KEY AUTOINCREMENT, diff --git a/packages/gittensory-miner/lib/coding-agent-construction.d.ts b/packages/gittensory-miner/lib/coding-agent-construction.d.ts index eefafe589a..42b4efcb35 100644 --- a/packages/gittensory-miner/lib/coding-agent-construction.d.ts +++ b/packages/gittensory-miner/lib/coding-agent-construction.d.ts @@ -1,4 +1,4 @@ -import type { AgentSdkHooks, AgentSdkQueryFn, CliSubprocessSpawnFn, CodingAgentDriver } from "@jsonbored/gittensory-engine"; +import type { AgentSdkHooks, AgentSdkQueryFn, CliSubprocessSpawnFn, CodingAgentDriver } from "@jsonbored/loopover-engine"; export function createRealCliSubprocessSpawn(): CliSubprocessSpawnFn; diff --git a/packages/gittensory-miner/lib/coding-agent-construction.js b/packages/gittensory-miner/lib/coding-agent-construction.js index d463649b10..7962c212eb 100644 --- a/packages/gittensory-miner/lib/coding-agent-construction.js +++ b/packages/gittensory-miner/lib/coding-agent-construction.js @@ -8,7 +8,7 @@ // default via `buildHouseRulesAgentSdkHooks` -- a caller never has to remember to attach it by hand. import { spawn as nodeSpawn } from "node:child_process"; -import { createCodingAgentDriver, resolveFirstConfiguredCodingAgentDriverName } from "@jsonbored/gittensory-engine"; +import { createCodingAgentDriver, resolveFirstConfiguredCodingAgentDriverName } from "@jsonbored/loopover-engine"; import { buildHouseRulesAgentSdkHooks } from "./coding-agent-house-rules.js"; /** @@ -18,7 +18,7 @@ import { buildHouseRulesAgentSdkHooks } from "./coding-agent-house-rules.js"; * resolve-not-reject rationale (a killed/errored subprocess's partial output may hold the real diagnosable * error, e.g. an auth failure line on stderr). * - * @returns {import("@jsonbored/gittensory-engine").CliSubprocessSpawnFn} + * @returns {import("@jsonbored/loopover-engine").CliSubprocessSpawnFn} */ export function createRealCliSubprocessSpawn() { return (cmd, args, opts) => @@ -73,13 +73,13 @@ export function createRealCliSubprocessSpawn() { * * @param {Record} env * @param {{ - * spawn?: import("@jsonbored/gittensory-engine").CliSubprocessSpawnFn, - * query?: import("@jsonbored/gittensory-engine").AgentSdkQueryFn, - * hooks?: import("@jsonbored/gittensory-engine").AgentSdkHooks, + * spawn?: import("@jsonbored/loopover-engine").CliSubprocessSpawnFn, + * query?: import("@jsonbored/loopover-engine").AgentSdkQueryFn, + * hooks?: import("@jsonbored/loopover-engine").AgentSdkHooks, * houseRulesConfig?: unknown, * houseRulesOptions?: unknown, * }} [options] - * @returns {import("@jsonbored/gittensory-engine").CodingAgentDriver} + * @returns {import("@jsonbored/loopover-engine").CodingAgentDriver} */ export function constructProductionCodingAgentDriver(env, options = {}) { const providerName = resolveFirstConfiguredCodingAgentDriverName(env); diff --git a/packages/gittensory-miner/lib/coding-agent-house-rules.d.ts b/packages/gittensory-miner/lib/coding-agent-house-rules.d.ts index b118776091..dc78e0d39b 100644 --- a/packages/gittensory-miner/lib/coding-agent-house-rules.d.ts +++ b/packages/gittensory-miner/lib/coding-agent-house-rules.d.ts @@ -1,4 +1,4 @@ -import type { AgentSdkHooks, CodingAgentDriverResult, CodingAgentExecutionMode, LintGuardResult, RunCodingAgentAttemptOptions } from "@jsonbored/gittensory-engine"; +import type { AgentSdkHooks, CodingAgentDriverResult, CodingAgentExecutionMode, LintGuardResult, RunCodingAgentAttemptOptions } from "@jsonbored/loopover-engine"; import type { DenyRule } from "./deny-hooks.js"; import type { appendGovernorEvent } from "./governor-ledger.js"; diff --git a/packages/gittensory-miner/lib/coding-agent-house-rules.js b/packages/gittensory-miner/lib/coding-agent-house-rules.js index abfc3379b5..505b797714 100644 --- a/packages/gittensory-miner/lib/coding-agent-house-rules.js +++ b/packages/gittensory-miner/lib/coding-agent-house-rules.js @@ -1,7 +1,7 @@ // House-rules-enforced coding-agent construction (#2343 follow-up). buildHouseRulesPreToolUseHook // (pretooluse-hook.js) is the LIVE PreToolUse interception point, but the engine package's // createCodingAgentDriver / runCodingAgentAttempt (driver-factory.ts) cannot import it directly -- the -// dependency only ever flows gittensory-miner -> @jsonbored/gittensory-engine, never the reverse (the engine +// dependency only ever flows gittensory-miner -> @jsonbored/loopover-engine, never the reverse (the engine // package is portable and cannot depend on the miner CLI package). This module is the missing miner-side // glue: it wraps runCodingAgentAttempt so the `agent-sdk` provider gets house-rule enforcement by DEFAULT -- // a future real call site does not need to remember to attach it itself, closing the exact gap @@ -14,7 +14,7 @@ // replacement for the engine's own `runCodingAgentAttempt`) to get real, unbypassable house-rule enforcement // automatically, rather than depending on that future author to remember to wire hooks by hand. -import { runCodingAgentAttempt } from "@jsonbored/gittensory-engine"; +import { runCodingAgentAttempt } from "@jsonbored/loopover-engine"; import { buildHouseRulesPreToolUseHook } from "./pretooluse-hook.js"; /** diff --git a/packages/gittensory-miner/lib/coding-task-spec.d.ts b/packages/gittensory-miner/lib/coding-task-spec.d.ts index 13a5bed0bc..fda3ee6190 100644 --- a/packages/gittensory-miner/lib/coding-task-spec.d.ts +++ b/packages/gittensory-miner/lib/coding-task-spec.d.ts @@ -1,4 +1,4 @@ -import type { AcceptanceCriteria, FeasibilityGateResult, FeasibilityVerdict, IssueRecord, PullRequestRecord } from "@jsonbored/gittensory-engine"; +import type { AcceptanceCriteria, FeasibilityGateResult, FeasibilityVerdict, IssueRecord, PullRequestRecord } from "@jsonbored/loopover-engine"; export type CodingTaskIssue = { number: number; title: string; body?: string | null | undefined; labels?: string[] | undefined }; diff --git a/packages/gittensory-miner/lib/coding-task-spec.js b/packages/gittensory-miner/lib/coding-task-spec.js index ea77ee5bbb..f6940650d8 100644 --- a/packages/gittensory-miner/lib/coding-task-spec.js +++ b/packages/gittensory-miner/lib/coding-task-spec.js @@ -9,7 +9,7 @@ import { feasibilityInputFromPreStartCheck, serializeAcceptanceCriteria, shouldWriteAcceptanceCriteria, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; // Coding-task-spec builder (#5132, Wave 3.5 follow-up). The second gap discovered alongside #5132's CLI // wiring: `IterateLoopInput.title`/`instructions`/`acceptanceCriteriaPath` had no builder anywhere in this @@ -21,7 +21,7 @@ import { // // issueStatus is intentionally left undefined when computing feasibility: buildIssueQualityReport (the only // thing that could supply it) lives only in root src/signals/engine.ts and has never been extracted into -// @jsonbored/gittensory-engine (same gap #5145's own header documents for `issueQuality`). This is not a +// @jsonbored/loopover-engine (same gap #5145's own header documents for `issueQuality`). This is not a // fabrication -- feasibilityInputFromPreStartCheck's OWN documented default for a missing // issueQualityStatus/lifecycle is "ready", the same honest-default precedent already established. @@ -49,7 +49,7 @@ function resolveClaimStatus(claimLedger, repoFullName, issueNumber) { } // The target issue's own raw cluster risk from buildCollisionReport (newly exported from -// @jsonbored/gittensory-engine's public barrel) -- "none" when the issue isn't part of any cluster at all. +// @jsonbored/loopover-engine's public barrel) -- "none" when the issue isn't part of any cluster at all. // DELIBERATELY does NOT apply #5145's ">= 2 pull_request items" threshold: that gate exists specifically to // stop inDuplicateCluster (self-review, "does MY OWN just-created submission look redundant") from firing on // the ordinary case of one existing PR already legitimately closing the issue. Feasibility asks a different @@ -72,7 +72,7 @@ function resolveDuplicateClusterRisk(repoFullName, issues, pullRequests, issueNu * @param {{ number: number }} issue * @param {{ issues: Array<{ number: number }>, pullRequests: unknown[] }} context * @param {{ listClaims: (filter: { repoFullName: string, status: string }) => Array<{ issueNumber: number }> }} claimLedger - * @returns {import("@jsonbored/gittensory-engine").FeasibilityGateResult} + * @returns {import("@jsonbored/loopover-engine").FeasibilityGateResult} */ export function buildCodingTaskFeasibility(repoFullName, issue, context, claimLedger) { const found = context.issues.some((candidate) => candidate.number === issue.number); @@ -86,8 +86,8 @@ export function buildCodingTaskFeasibility(repoFullName, issue, context, claimLe * Compose the immutable AcceptanceCriteria document for one target issue + its feasibility verdict. * * @param {{ title: string, body?: string | null, labels?: string[] }} issue - * @param {import("@jsonbored/gittensory-engine").FeasibilityGateResult} feasibility - * @returns {import("@jsonbored/gittensory-engine").AcceptanceCriteria} + * @param {import("@jsonbored/loopover-engine").FeasibilityGateResult} feasibility + * @returns {import("@jsonbored/loopover-engine").AcceptanceCriteria} */ export function buildCodingTaskAcceptanceCriteria(issue, feasibility) { const promptPacket = buildPromptPacket({ @@ -105,7 +105,7 @@ export function buildCodingTaskAcceptanceCriteria(issue, feasibility) { * expected to abandon the attempt rather than start it, per acceptance-criteria.ts's own documented design. * * @param {string} workingDirectory - * @param {import("@jsonbored/gittensory-engine").AcceptanceCriteria} acceptanceCriteria + * @param {import("@jsonbored/loopover-engine").AcceptanceCriteria} acceptanceCriteria * @returns {{ written: boolean, path: string | null }} */ export function writeAcceptanceCriteriaFile(workingDirectory, acceptanceCriteria) { diff --git a/packages/gittensory-miner/lib/execute-local-write.d.ts b/packages/gittensory-miner/lib/execute-local-write.d.ts index e5a108b051..c6d89e803d 100644 --- a/packages/gittensory-miner/lib/execute-local-write.d.ts +++ b/packages/gittensory-miner/lib/execute-local-write.d.ts @@ -1,4 +1,4 @@ -import type { LocalWriteActionSpec } from "@jsonbored/gittensory-engine"; +import type { LocalWriteActionSpec } from "@jsonbored/loopover-engine"; export type ExecuteLocalWriteResult = { action: string; diff --git a/packages/gittensory-miner/lib/execute-local-write.js b/packages/gittensory-miner/lib/execute-local-write.js index 13d6cc3cfc..690c8f5b45 100644 --- a/packages/gittensory-miner/lib/execute-local-write.js +++ b/packages/gittensory-miner/lib/execute-local-write.js @@ -13,7 +13,7 @@ import { spawn } from "node:child_process"; const DEFAULT_TIMEOUT_MS = 120_000; /** - * @param {import("@jsonbored/gittensory-engine").LocalWriteActionSpec} spec + * @param {import("@jsonbored/loopover-engine").LocalWriteActionSpec} spec * @param {{ cwd?: string, env?: NodeJS.ProcessEnv, timeoutMs?: number }} [options] * @returns {Promise<{ action: string, stdout: string, stderr: string, code: number | null, timedOut: boolean }>} */ diff --git a/packages/gittensory-miner/lib/feasibility-cli.d.ts b/packages/gittensory-miner/lib/feasibility-cli.d.ts index 4cf46b633e..69b9724885 100644 --- a/packages/gittensory-miner/lib/feasibility-cli.d.ts +++ b/packages/gittensory-miner/lib/feasibility-cli.d.ts @@ -4,7 +4,7 @@ import type { FeasibilityGateInput, FeasibilityGateResult, FeasibilityIssueStatus, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; export type ParsedFeasibilityArgs = | { diff --git a/packages/gittensory-miner/lib/feasibility-cli.js b/packages/gittensory-miner/lib/feasibility-cli.js index da17d32c9f..5ec0b8fe65 100644 --- a/packages/gittensory-miner/lib/feasibility-cli.js +++ b/packages/gittensory-miner/lib/feasibility-cli.js @@ -1,7 +1,7 @@ /** `feasibility` CLI command (#4270): a thin parse -> execute -> render wrapper around the engine's pure * `buildFeasibilityVerdict` composer. Purely local — no network, no filesystem — so it never needs the * npm-registry update check other subcommands opt into. */ -import { buildFeasibilityVerdict } from "@jsonbored/gittensory-engine"; +import { buildFeasibilityVerdict } from "@jsonbored/loopover-engine"; const CLAIM_STATUSES = ["unclaimed", "claimed", "solved", "unknown"]; const DUPLICATE_CLUSTER_RISKS = ["none", "low", "medium", "high"]; diff --git a/packages/gittensory-miner/lib/governor-action-mode.d.ts b/packages/gittensory-miner/lib/governor-action-mode.d.ts index 90ee4db0a4..72d6d9825f 100644 --- a/packages/gittensory-miner/lib/governor-action-mode.d.ts +++ b/packages/gittensory-miner/lib/governor-action-mode.d.ts @@ -1,4 +1,4 @@ -import type { MinerActionMode, MinerKillSwitchScope } from "@jsonbored/gittensory-engine"; +import type { MinerActionMode, MinerKillSwitchScope } from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; export type ResolveMinerActionModeGateInput = { diff --git a/packages/gittensory-miner/lib/governor-action-mode.js b/packages/gittensory-miner/lib/governor-action-mode.js index 91bf31b30f..7e8be1a008 100644 --- a/packages/gittensory-miner/lib/governor-action-mode.js +++ b/packages/gittensory-miner/lib/governor-action-mode.js @@ -7,7 +7,7 @@ import { isGlobalMinerLiveModeOptIn, minerActionModeExecutes, resolveMinerActionMode, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import { appendGovernorEvent } from "./governor-ledger.js"; /** @@ -16,10 +16,10 @@ import { appendGovernorEvent } from "./governor-ledger.js"; * opt-in. Both sides must opt in before real writes execute; repo config alone only preserves dry-run. * * @param {object} input - * @param {import("@jsonbored/gittensory-engine").MinerKillSwitchScope} input.killSwitchScope + * @param {import("@jsonbored/loopover-engine").MinerKillSwitchScope} input.killSwitchScope * @param {unknown} [input.repoLiveModeOptIn] `MinerGoalSpec.execution.liveModeOptIn` from the target repo * @param {Record} [input.env] - * @returns {{ mode: import("@jsonbored/gittensory-engine").MinerActionMode, executes: boolean }} + * @returns {{ mode: import("@jsonbored/loopover-engine").MinerActionMode, executes: boolean }} */ export function resolveMinerActionModeGate(input) { const env = input.env ?? process.env; diff --git a/packages/gittensory-miner/lib/governor-chokepoint-persisted.d.ts b/packages/gittensory-miner/lib/governor-chokepoint-persisted.d.ts index 08b8125294..bd54694b75 100644 --- a/packages/gittensory-miner/lib/governor-chokepoint-persisted.d.ts +++ b/packages/gittensory-miner/lib/governor-chokepoint-persisted.d.ts @@ -1,4 +1,4 @@ -import type { GovernorChokepointInput } from "@jsonbored/gittensory-engine"; +import type { GovernorChokepointInput } from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; import type { EvaluateGovernorChokepointGateResult } from "./governor-chokepoint.js"; import type { GovernorState } from "./governor-state.js"; diff --git a/packages/gittensory-miner/lib/governor-chokepoint.d.ts b/packages/gittensory-miner/lib/governor-chokepoint.d.ts index 60bee9a8eb..8fd36b77da 100644 --- a/packages/gittensory-miner/lib/governor-chokepoint.d.ts +++ b/packages/gittensory-miner/lib/governor-chokepoint.d.ts @@ -1,4 +1,4 @@ -import type { GovernorChokepointInput, GovernorDecision, WriteRateLimitBackoffStore, WriteRateLimitBucketStore } from "@jsonbored/gittensory-engine"; +import type { GovernorChokepointInput, GovernorDecision, WriteRateLimitBackoffStore, WriteRateLimitBucketStore } from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; export type EvaluateGovernorChokepointGateResult = { diff --git a/packages/gittensory-miner/lib/governor-chokepoint.js b/packages/gittensory-miner/lib/governor-chokepoint.js index bfc53eb3b8..10fc2b80bd 100644 --- a/packages/gittensory-miner/lib/governor-chokepoint.js +++ b/packages/gittensory-miner/lib/governor-chokepoint.js @@ -9,7 +9,7 @@ import { evaluateGovernorChokepoint, recordWriteRateLimitAllowed, recordWriteRateLimitDenied, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import { appendGovernorEvent } from "./governor-ledger.js"; /** @@ -17,13 +17,13 @@ import { appendGovernorEvent } from "./governor-ledger.js"; * advance rate-limit bucket/backoff state when the rate-limit stage actually ran (kill-switch and dry-run * short-circuit before rate-limit is evaluated, so bucket state is untouched in those cases). * - * @param {import("@jsonbored/gittensory-engine").GovernorChokepointInput} input + * @param {import("@jsonbored/loopover-engine").GovernorChokepointInput} input * @param {{ append?: typeof appendGovernorEvent }} [options] * @returns {{ - * decision: import("@jsonbored/gittensory-engine").GovernorDecision, + * decision: import("@jsonbored/loopover-engine").GovernorDecision, * recorded: import("./governor-ledger.js").GovernorLedgerEntry, - * rateLimitBuckets: import("@jsonbored/gittensory-engine").WriteRateLimitBucketStore, - * rateLimitBackoffAttempts: import("@jsonbored/gittensory-engine").WriteRateLimitBackoffStore, + * rateLimitBuckets: import("@jsonbored/loopover-engine").WriteRateLimitBucketStore, + * rateLimitBackoffAttempts: import("@jsonbored/loopover-engine").WriteRateLimitBackoffStore, * }} */ export function evaluateGovernorChokepointGate(input, options = {}) { diff --git a/packages/gittensory-miner/lib/governor-kill-switch.d.ts b/packages/gittensory-miner/lib/governor-kill-switch.d.ts index c5d60d6259..6a797be76e 100644 --- a/packages/gittensory-miner/lib/governor-kill-switch.d.ts +++ b/packages/gittensory-miner/lib/governor-kill-switch.d.ts @@ -1,4 +1,4 @@ -import type { MinerKillSwitchScope } from "@jsonbored/gittensory-engine"; +import type { MinerKillSwitchScope } from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; export type CheckMinerKillSwitchInput = { diff --git a/packages/gittensory-miner/lib/governor-kill-switch.js b/packages/gittensory-miner/lib/governor-kill-switch.js index 57a733915f..d171744374 100644 --- a/packages/gittensory-miner/lib/governor-kill-switch.js +++ b/packages/gittensory-miner/lib/governor-kill-switch.js @@ -8,7 +8,7 @@ import { isGlobalMinerKillSwitch, isMinerKillSwitchActive, resolveMinerKillSwitch, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import { appendGovernorEvent } from "./governor-ledger.js"; /** @@ -18,7 +18,7 @@ import { appendGovernorEvent } from "./governor-ledger.js"; * @param {object} [input] * @param {boolean} [input.repoPaused] * @param {Record} [input.env] - * @returns {{ scope: import("@jsonbored/gittensory-engine").MinerKillSwitchScope, active: boolean }} + * @returns {{ scope: import("@jsonbored/loopover-engine").MinerKillSwitchScope, active: boolean }} */ export function checkMinerKillSwitch(input = {}) { const env = input.env ?? process.env; @@ -35,8 +35,8 @@ export function checkMinerKillSwitch(input = {}) { * @param {object} input * @param {string} [input.repoFullName] * @param {string} input.actionClass - * @param {import("@jsonbored/gittensory-engine").MinerKillSwitchScope} input.previousScope - * @param {import("@jsonbored/gittensory-engine").MinerKillSwitchScope} input.scope + * @param {import("@jsonbored/loopover-engine").MinerKillSwitchScope} input.previousScope + * @param {import("@jsonbored/loopover-engine").MinerKillSwitchScope} input.scope * @param {{ append?: typeof appendGovernorEvent }} [options] */ export function recordMinerKillSwitchTransition(input, options = {}) { diff --git a/packages/gittensory-miner/lib/governor-ledger-cli.js b/packages/gittensory-miner/lib/governor-ledger-cli.js index 0365c9445e..5568ccff5e 100644 --- a/packages/gittensory-miner/lib/governor-ledger-cli.js +++ b/packages/gittensory-miner/lib/governor-ledger-cli.js @@ -1,4 +1,4 @@ -/** Must match `GOVERNOR_LEDGER_EVENT_TYPES` in `@jsonbored/gittensory-engine`. */ +/** Must match `GOVERNOR_LEDGER_EVENT_TYPES` in `@jsonbored/loopover-engine`. */ const GOVERNOR_LEDGER_EVENT_TYPES = Object.freeze([ "allowed", "denied", diff --git a/packages/gittensory-miner/lib/governor-ledger.js b/packages/gittensory-miner/lib/governor-ledger.js index 0c39c47080..7ffc11879c 100644 --- a/packages/gittensory-miner/lib/governor-ledger.js +++ b/packages/gittensory-miner/lib/governor-ledger.js @@ -2,7 +2,7 @@ import { chmodSync, mkdirSync } from "node:fs"; import { homedir } from "node:os"; import { dirname, join } from "node:path"; import { DatabaseSync } from "node:sqlite"; -import { normalizeGovernorLedgerEvent } from "@jsonbored/gittensory-engine"; +import { normalizeGovernorLedgerEvent } from "@jsonbored/loopover-engine"; import { applySchemaMigrations } from "./schema-version.js"; // Append-only governor decision ledger (#2328): every allowed/denied/throttled/kill-switch outcome lands in a diff --git a/packages/gittensory-miner/lib/governor-open-pr.d.ts b/packages/gittensory-miner/lib/governor-open-pr.d.ts index 5e0dd95270..4dd5d165dc 100644 --- a/packages/gittensory-miner/lib/governor-open-pr.d.ts +++ b/packages/gittensory-miner/lib/governor-open-pr.d.ts @@ -2,7 +2,7 @@ import type { OwnSubmissionRecord, SelfPlagiarismCandidate, SelfPlagiarismVerdict, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; export type EvaluateOpenPrSelfPlagiarismInput = { diff --git a/packages/gittensory-miner/lib/governor-open-pr.js b/packages/gittensory-miner/lib/governor-open-pr.js index 15a20cb0aa..9b4c2c9d03 100644 --- a/packages/gittensory-miner/lib/governor-open-pr.js +++ b/packages/gittensory-miner/lib/governor-open-pr.js @@ -5,15 +5,15 @@ import { buildSelfPlagiarismGovernorLedgerEvent, resolveSelfPlagiarismConfig, selfPlagiarismCheck, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import { appendGovernorEvent } from "./governor-ledger.js"; /** * Run the self-plagiarism throttle for a prospective open_pr and persist the governor decision. * * @param {object} input - * @param {import("@jsonbored/gittensory-engine").SelfPlagiarismCandidate} input.candidate - * @param {readonly import("@jsonbored/gittensory-engine").OwnSubmissionRecord[]} input.recentOwnSubmissions + * @param {import("@jsonbored/loopover-engine").SelfPlagiarismCandidate} input.candidate + * @param {readonly import("@jsonbored/loopover-engine").OwnSubmissionRecord[]} input.recentOwnSubmissions * @param {unknown} [input.selfPlagiarismConfig] parsed `.gittensory-miner.yml` selfPlagiarism block * @param {{ append?: typeof appendGovernorEvent }} [options] */ diff --git a/packages/gittensory-miner/lib/governor-run-halt.d.ts b/packages/gittensory-miner/lib/governor-run-halt.d.ts index 6cbb9dacd7..ccfe254dd0 100644 --- a/packages/gittensory-miner/lib/governor-run-halt.d.ts +++ b/packages/gittensory-miner/lib/governor-run-halt.d.ts @@ -4,7 +4,7 @@ import type { PortfolioConvergenceInput, PortfolioConvergenceThresholds, RunLoopHaltVerdict, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; import type { QueueEntry } from "./portfolio-queue.js"; diff --git a/packages/gittensory-miner/lib/governor-run-halt.js b/packages/gittensory-miner/lib/governor-run-halt.js index 8c510ccb16..63b4d3446b 100644 --- a/packages/gittensory-miner/lib/governor-run-halt.js +++ b/packages/gittensory-miner/lib/governor-run-halt.js @@ -4,7 +4,7 @@ import { buildRunLoopHaltGovernorLedgerEvent, evaluateRunLoopHalt, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import { appendGovernorEvent } from "./governor-ledger.js"; /** @@ -12,10 +12,10 @@ import { appendGovernorEvent } from "./governor-ledger.js"; * * @param {object} input * @param {boolean} [input.runHalted] whether the run is already halted - * @param {import("@jsonbored/gittensory-engine").GovernorCapUsage} input.usage cumulative run usage - * @param {import("@jsonbored/gittensory-engine").GovernorCapLimits} input.limits run ceilings - * @param {import("@jsonbored/gittensory-engine").PortfolioConvergenceInput} input.convergence in-flight item history - * @param {import("@jsonbored/gittensory-engine").PortfolioConvergenceThresholds} [input.convergenceThresholds] + * @param {import("@jsonbored/loopover-engine").GovernorCapUsage} input.usage cumulative run usage + * @param {import("@jsonbored/loopover-engine").GovernorCapLimits} input.limits run ceilings + * @param {import("@jsonbored/loopover-engine").PortfolioConvergenceInput} input.convergence in-flight item history + * @param {import("@jsonbored/loopover-engine").PortfolioConvergenceThresholds} [input.convergenceThresholds] * @param {{ repoFullName: string, identifier: string } | null | undefined} [input.inFlightItem] * @param {(repoFullName: string, identifier: string) => import("./portfolio-queue.js").QueueEntry | null} [input.markFailed] * @param {{ append?: typeof appendGovernorEvent }} [options] diff --git a/packages/gittensory-miner/lib/governor-state.d.ts b/packages/gittensory-miner/lib/governor-state.d.ts index 25dcbc8011..951cb12e41 100644 --- a/packages/gittensory-miner/lib/governor-state.d.ts +++ b/packages/gittensory-miner/lib/governor-state.d.ts @@ -1,4 +1,4 @@ -import type { GovernorCapUsage, OwnSubmissionRecord, RepoOutcomeHistory, WriteRateLimitBackoffStore, WriteRateLimitBucketStore } from "@jsonbored/gittensory-engine"; +import type { GovernorCapUsage, OwnSubmissionRecord, RepoOutcomeHistory, WriteRateLimitBackoffStore, WriteRateLimitBucketStore } from "@jsonbored/loopover-engine"; export type GovernorRateLimitState = { buckets: WriteRateLimitBucketStore; diff --git a/packages/gittensory-miner/lib/governor-write-rate-limit.d.ts b/packages/gittensory-miner/lib/governor-write-rate-limit.d.ts index b4b683acbc..a951faaac1 100644 --- a/packages/gittensory-miner/lib/governor-write-rate-limit.d.ts +++ b/packages/gittensory-miner/lib/governor-write-rate-limit.d.ts @@ -3,7 +3,7 @@ import type { WriteRateLimitBucketStore, WriteRateLimitPolicies, WriteRateLimitVerdict, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import type { AppendGovernorEventInput, GovernorLedgerEntry } from "./governor-ledger.js"; export type EvaluateWriteRateLimitGateInput = { diff --git a/packages/gittensory-miner/lib/governor-write-rate-limit.js b/packages/gittensory-miner/lib/governor-write-rate-limit.js index 8e70f78dd0..73d23b1d8d 100644 --- a/packages/gittensory-miner/lib/governor-write-rate-limit.js +++ b/packages/gittensory-miner/lib/governor-write-rate-limit.js @@ -7,7 +7,7 @@ import { evaluateWriteRateLimit, recordWriteRateLimitAllowed, recordWriteRateLimitDenied, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; import { appendGovernorEvent } from "./governor-ledger.js"; /** @@ -16,10 +16,10 @@ import { appendGovernorEvent } from "./governor-ledger.js"; * @param {object} input * @param {string} input.actionClass governor write class (e.g. open_pr, comment) * @param {string} input.repoFullName target repo - * @param {import("@jsonbored/gittensory-engine").WriteRateLimitBucketStore} input.buckets - * @param {import("@jsonbored/gittensory-engine").WriteRateLimitBackoffStore} input.backoffAttempts + * @param {import("@jsonbored/loopover-engine").WriteRateLimitBucketStore} input.buckets + * @param {import("@jsonbored/loopover-engine").WriteRateLimitBackoffStore} input.backoffAttempts * @param {number} input.nowMs clock reading in epoch ms - * @param {import("@jsonbored/gittensory-engine").WriteRateLimitPolicies} [input.policies] + * @param {import("@jsonbored/loopover-engine").WriteRateLimitPolicies} [input.policies] * @param {() => number} [input.randomFn] injected jitter source (defaults to mid-band draw) * @param {{ append?: typeof appendGovernorEvent }} [options] */ diff --git a/packages/gittensory-miner/lib/harness-submission-trigger.js b/packages/gittensory-miner/lib/harness-submission-trigger.js index c6039052a9..74a48f2dd3 100644 --- a/packages/gittensory-miner/lib/harness-submission-trigger.js +++ b/packages/gittensory-miner/lib/harness-submission-trigger.js @@ -1,7 +1,7 @@ -import { evaluateHarnessSubmissionTrigger } from "@jsonbored/gittensory-engine"; +import { evaluateHarnessSubmissionTrigger } from "@jsonbored/loopover-engine"; // Harness submission-gate wiring orchestrator (#2337): the real-IO half of connecting the gated-submission -// decision (`shouldSubmit`, wrapped by `evaluateHarnessSubmissionTrigger`, @jsonbored/gittensory-engine) to a +// decision (`shouldSubmit`, wrapped by `evaluateHarnessSubmissionTrigger`, @jsonbored/loopover-engine) to a // real driving loop's own handoff signal. Reads the session's recent decision history to compute the // consecutive-block circuit-breaker tally, consults the pure decision, and always records exactly one audit // event -- regardless of outcome, so a paused-pending-human-review session leaves a full trail of why. diff --git a/packages/gittensory-miner/lib/loop-cli.js b/packages/gittensory-miner/lib/loop-cli.js index 80b258c57b..51ae11b680 100644 --- a/packages/gittensory-miner/lib/loop-cli.js +++ b/packages/gittensory-miner/lib/loop-cli.js @@ -38,7 +38,7 @@ import { pollPrDisposition, classifyPrDisposition } from "./pr-disposition-polle import { recordPrOutcomeSnapshot } from "./pr-outcome.js"; import { buildLoopClosureSummary } from "./loop-closure.js"; import { attemptLoopReentry } from "./loop-reentry.js"; -import { DEFAULT_AMS_POLICY_SPEC } from "@jsonbored/gittensory-engine"; +import { DEFAULT_AMS_POLICY_SPEC } from "@jsonbored/loopover-engine"; const LOOP_USAGE = "Usage: gittensory-miner loop [...] | --search --miner-login [--base ] [--live] [--max-cycles ] [--cycle-delay-ms ] [--json]"; diff --git a/packages/gittensory-miner/lib/loop-reentry.js b/packages/gittensory-miner/lib/loop-reentry.js index c89821fffd..2cc3977516 100644 --- a/packages/gittensory-miner/lib/loop-reentry.js +++ b/packages/gittensory-miner/lib/loop-reentry.js @@ -1,10 +1,10 @@ -import { shouldReenter } from "@jsonbored/gittensory-engine"; +import { shouldReenter } from "@jsonbored/loopover-engine"; import { readPrOutcomes } from "./pr-outcome.js"; // Closed-loop discovery re-entry orchestrator (#2338): the real-IO half of "on a resolved outcome (merged, or // rejected-and-disengaged), automatically re-invoke discovery to select the next candidate." The DECISION -// itself (shouldReenter, @jsonbored/gittensory-engine) is pure; this module owns everything that decision +// itself (shouldReenter, @jsonbored/loopover-engine) is pure; this module owns everything that decision // needs real state for -- reading the repo's own pr_outcome history to compute the per-repo consecutive- // disengagement tally, reading recent re-entry events for the hourly/session rate cap, and (only when allowed) // actually dequeuing the next candidate and transitioning run-state. diff --git a/packages/gittensory-miner/lib/miner-goal-spec.d.ts b/packages/gittensory-miner/lib/miner-goal-spec.d.ts index bf385824f0..a92ceedb12 100644 --- a/packages/gittensory-miner/lib/miner-goal-spec.d.ts +++ b/packages/gittensory-miner/lib/miner-goal-spec.d.ts @@ -1,4 +1,4 @@ -import type { ParsedMinerGoalSpec } from "@jsonbored/gittensory-engine"; +import type { ParsedMinerGoalSpec } from "@jsonbored/loopover-engine"; export function resolveMinerGoalSpec( repoPath: string, diff --git a/packages/gittensory-miner/lib/miner-goal-spec.js b/packages/gittensory-miner/lib/miner-goal-spec.js index 4118095249..eb1e3de01a 100644 --- a/packages/gittensory-miner/lib/miner-goal-spec.js +++ b/packages/gittensory-miner/lib/miner-goal-spec.js @@ -1,6 +1,6 @@ import { existsSync, readFileSync } from "node:fs"; import { join } from "node:path"; -import { discoverMinerGoalSpecPath, parseMinerGoalSpecContent } from "@jsonbored/gittensory-engine"; +import { discoverMinerGoalSpecPath, parseMinerGoalSpecContent } from "@jsonbored/loopover-engine"; // Real local .gittensory-miner.yml resolver (#5132, Wave 3.5 follow-up). MinerGoalSpec's own discovery // helper (discoverMinerGoalSpecPath, packages/gittensory-engine) is deliberately IO-free -- the caller @@ -20,7 +20,7 @@ import { discoverMinerGoalSpecPath, parseMinerGoalSpecContent } from "@jsonbored * * @param {string} repoPath * @param {{ existsSync?: (path: string) => boolean, readFileSync?: (path: string, encoding: "utf8") => string }} [options] - * @returns {import("@jsonbored/gittensory-engine").ParsedMinerGoalSpec} + * @returns {import("@jsonbored/loopover-engine").ParsedMinerGoalSpec} */ export function resolveMinerGoalSpec(repoPath, options = {}) { const existsImpl = options.existsSync ?? existsSync; diff --git a/packages/gittensory-miner/lib/opportunity-fanout.js b/packages/gittensory-miner/lib/opportunity-fanout.js index a8e56c7ca5..8294deb942 100644 --- a/packages/gittensory-miner/lib/opportunity-fanout.js +++ b/packages/gittensory-miner/lib/opportunity-fanout.js @@ -1,5 +1,5 @@ import { Buffer } from "node:buffer"; -import { resolveAiPolicyVerdict } from "@jsonbored/gittensory-engine"; +import { resolveAiPolicyVerdict } from "@jsonbored/loopover-engine"; const defaultApiBaseUrl = "https://api.github.com"; const defaultConcurrency = 5; diff --git a/packages/gittensory-miner/lib/opportunity-ranker.d.ts b/packages/gittensory-miner/lib/opportunity-ranker.d.ts index efc76dee3a..4628d5e56e 100644 --- a/packages/gittensory-miner/lib/opportunity-ranker.d.ts +++ b/packages/gittensory-miner/lib/opportunity-ranker.d.ts @@ -1,4 +1,4 @@ -import type { MinerGoalSpec } from "@jsonbored/gittensory-engine"; +import type { MinerGoalSpec } from "@jsonbored/loopover-engine"; import type { RawCandidateIssue } from "./opportunity-fanout.js"; export type RankedCandidateIssue = RawCandidateIssue & { diff --git a/packages/gittensory-miner/lib/opportunity-ranker.js b/packages/gittensory-miner/lib/opportunity-ranker.js index 71f7f1c56b..3ee180ef3a 100644 --- a/packages/gittensory-miner/lib/opportunity-ranker.js +++ b/packages/gittensory-miner/lib/opportunity-ranker.js @@ -2,7 +2,7 @@ import { DEFAULT_MINER_GOAL_SPEC, parseMinerGoalSpecContent, rankMetadataOpportunities, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; function finiteEpochMs(value) { return Number.isFinite(value) ? value : Date.now(); diff --git a/packages/gittensory-miner/lib/portfolio-queue-manager.d.ts b/packages/gittensory-miner/lib/portfolio-queue-manager.d.ts index 49ce435943..7f31b373c7 100644 --- a/packages/gittensory-miner/lib/portfolio-queue-manager.d.ts +++ b/packages/gittensory-miner/lib/portfolio-queue-manager.d.ts @@ -1,4 +1,4 @@ -import type { PortfolioCaps } from "@jsonbored/gittensory-engine"; +import type { PortfolioCaps } from "@jsonbored/loopover-engine"; import type { EnqueueItem, PortfolioQueueStore, QueueEntry } from "./portfolio-queue.js"; export type PortfolioQueueClaimTarget = { diff --git a/packages/gittensory-miner/lib/portfolio-queue-manager.js b/packages/gittensory-miner/lib/portfolio-queue-manager.js index 06cd2fdec9..b1390e35c4 100644 --- a/packages/gittensory-miner/lib/portfolio-queue-manager.js +++ b/packages/gittensory-miner/lib/portfolio-queue-manager.js @@ -2,7 +2,7 @@ // (portfolio-queue.js, #2292) with the pure engine selector (nextEligibleItems, queue.ts, #2326) so batch // claiming respects global/per-repo WIP caps and cross-repo diversification instead of a naive priority-only // single-row dequeue. Caps are plain constructor arguments — not wired to .gittensory-miner.yml here. -import { nextEligibleItems } from "@jsonbored/gittensory-engine"; +import { nextEligibleItems } from "@jsonbored/loopover-engine"; import { initPortfolioQueueStore } from "./portfolio-queue.js"; import { DEFAULT_MAX_LEASE_MS, sweepStuckItems } from "./portfolio-queue-expiry.js"; diff --git a/packages/gittensory-miner/lib/rejection-signal.js b/packages/gittensory-miner/lib/rejection-signal.js index 2dfa4a24bb..b40e53a399 100644 --- a/packages/gittensory-miner/lib/rejection-signal.js +++ b/packages/gittensory-miner/lib/rejection-signal.js @@ -1,4 +1,4 @@ -import { resolveAiPolicyVerdict } from "@jsonbored/gittensory-engine"; +import { resolveAiPolicyVerdict } from "@jsonbored/loopover-engine"; // Real rejectionSignaled resolver (#5132, Wave 3.5 follow-up). iterate-policy.ts's own doc comment: "True // when the target repo (or this contributor's history with it) has signaled it does not want automated/ diff --git a/packages/gittensory-miner/lib/replay-snapshot.d.ts b/packages/gittensory-miner/lib/replay-snapshot.d.ts index d7ee921bc4..a0eb80ef94 100644 --- a/packages/gittensory-miner/lib/replay-snapshot.d.ts +++ b/packages/gittensory-miner/lib/replay-snapshot.d.ts @@ -1,4 +1,4 @@ -import type { WorktreeExecFn, WorktreeRemoveResult } from "@jsonbored/gittensory-engine"; +import type { WorktreeExecFn, WorktreeRemoveResult } from "@jsonbored/loopover-engine"; export const REPLAY_SNAPSHOT_SUBDIR: ".gittensory-replay-snapshots"; diff --git a/packages/gittensory-miner/lib/replay-snapshot.js b/packages/gittensory-miner/lib/replay-snapshot.js index b589ddc98b..31e53dadd5 100644 --- a/packages/gittensory-miner/lib/replay-snapshot.js +++ b/packages/gittensory-miner/lib/replay-snapshot.js @@ -1,5 +1,5 @@ import { join } from "node:path"; -import { removeWorktree } from "@jsonbored/gittensory-engine"; +import { removeWorktree } from "@jsonbored/loopover-engine"; import { openLocalStoreDb, resolveLocalStoreDbPath, normalizeLocalStoreDbPath } from "./local-store.js"; // Freeze/snapshot mechanism for historical replay targets (#3010). Given a repo and a commit SHA T, exports: @@ -17,7 +17,7 @@ import { openLocalStoreDb, resolveLocalStoreDbPath, normalizeLocalStoreDbPath } // and found no such utility anywhere -- opportunity-fanout.js reads GitHub API issue `updated_at`, not git // commit/tag history at all. The one genuinely reusable piece is worktree-allocator.ts's injected-exec // convention (WorktreeExecFn) and its removeWorktree -- both reused directly below (import from -// @jsonbored/gittensory-engine), rather than inventing a THIRD "inject the git subprocess" abstraction +// @jsonbored/loopover-engine), rather than inventing a THIRD "inject the git subprocess" abstraction // alongside cli-subprocess-driver.ts's and worktree-allocator.ts's own. // // FAIL-FAST VALIDATION: ancestry-walking (git log T) already excludes anything NOT reachable from T by diff --git a/packages/gittensory-miner/lib/self-review-context.d.ts b/packages/gittensory-miner/lib/self-review-context.d.ts index a1c261913e..1e02ca6922 100644 --- a/packages/gittensory-miner/lib/self-review-context.d.ts +++ b/packages/gittensory-miner/lib/self-review-context.d.ts @@ -1,4 +1,4 @@ -import type { SelfReviewContext } from "@jsonbored/gittensory-engine"; +import type { SelfReviewContext } from "@jsonbored/loopover-engine"; // bounties/issueQuality are always omitted (see this file's own header comment for why), so the result is // SelfReviewContext minus those two optional fields rather than the full type. diff --git a/packages/gittensory-miner/lib/self-review-context.js b/packages/gittensory-miner/lib/self-review-context.js index fbab889e3f..3d10312ba2 100644 --- a/packages/gittensory-miner/lib/self-review-context.js +++ b/packages/gittensory-miner/lib/self-review-context.js @@ -1,4 +1,4 @@ -import { buildCollisionReport, parseFocusManifestContent } from "@jsonbored/gittensory-engine"; +import { buildCollisionReport, parseFocusManifestContent } from "@jsonbored/loopover-engine"; // Real SelfReviewContext fetcher (#5145, Wave 3.5). Builds the context object the miner's self-review pass // (packages/gittensory-engine/src/miner/self-review-adapter.ts) needs, at the SAME fidelity the live gate's @@ -10,7 +10,7 @@ import { buildCollisionReport, parseFocusManifestContent } from "@jsonbored/gitt // system that PUSHES data into the live gate's own internal ingest route (src/api/routes.ts). There is // no public endpoint the miner could legitimately pull from instead. // - `issueQuality`: built by buildIssueQualityReport, which lives only in root src/signals/engine.ts and -// has never been extracted into @jsonbored/gittensory-engine (the same "not yet extracted" situation +// has never been extracted into @jsonbored/loopover-engine (the same "not yet extracted" situation // src/signals/slop.ts documented before #5133 extracted slop scoring specifically). // // Both are already optional on SelfReviewContext, and buildPredictedGateVerdict already degrades gracefully diff --git a/packages/gittensory-miner/lib/slop-assessment.d.ts b/packages/gittensory-miner/lib/slop-assessment.d.ts index ec7bbebdc0..6572a499bd 100644 --- a/packages/gittensory-miner/lib/slop-assessment.d.ts +++ b/packages/gittensory-miner/lib/slop-assessment.d.ts @@ -1,3 +1,3 @@ -import type { SlopAssessment, SlopAssessmentInput } from "@jsonbored/gittensory-engine"; +import type { SlopAssessment, SlopAssessmentInput } from "@jsonbored/loopover-engine"; export function runSlopAssessment(input: SlopAssessmentInput): SlopAssessment; diff --git a/packages/gittensory-miner/lib/slop-assessment.js b/packages/gittensory-miner/lib/slop-assessment.js index 17d3341bf7..ee4c1cca26 100644 --- a/packages/gittensory-miner/lib/slop-assessment.js +++ b/packages/gittensory-miner/lib/slop-assessment.js @@ -1,4 +1,4 @@ -import { buildSlopAssessment } from "@jsonbored/gittensory-engine"; +import { buildSlopAssessment } from "@jsonbored/loopover-engine"; // Production runSlopAssessment binding (#5133, Wave 3.5 follow-up to #2334). `attempt-runner.js`'s // `deps.runSlopAssessment` (via #2333's iterate-loop -> self-review-adapter's `SelfReviewAdapterDeps`) had @@ -12,8 +12,8 @@ import { buildSlopAssessment } from "@jsonbored/gittensory-engine"; // `packages/gittensory-engine/src/signals/slop.ts`, byte-parity-verified against the live gate's own copy). /** - * @param {import("@jsonbored/gittensory-engine").SlopAssessmentInput} input - * @returns {import("@jsonbored/gittensory-engine").SlopAssessment} + * @param {import("@jsonbored/loopover-engine").SlopAssessmentInput} input + * @returns {import("@jsonbored/loopover-engine").SlopAssessment} */ export function runSlopAssessment(input) { return buildSlopAssessment(input); diff --git a/packages/gittensory-miner/lib/status.js b/packages/gittensory-miner/lib/status.js index 7d50754b4a..fbce8e998c 100644 --- a/packages/gittensory-miner/lib/status.js +++ b/packages/gittensory-miner/lib/status.js @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node import { createRequire } from "node:module"; import { homedir } from "node:os"; import { join } from "node:path"; -import { CODING_AGENT_DRIVER_CONFIG_ENV, resolveFirstConfiguredCodingAgentDriverName } from "@jsonbored/gittensory-engine"; +import { CODING_AGENT_DRIVER_CONFIG_ENV, resolveFirstConfiguredCodingAgentDriverName } from "@jsonbored/loopover-engine"; import { checkClaudeCliPresent, checkCodexCliPresent, @@ -29,8 +29,8 @@ function moduleDir() { return (cachedModuleDir ??= import.meta.dirname); } -const PACKAGE_NAME = "@jsonbored/gittensory-miner"; -const ENGINE_PACKAGE = "@jsonbored/gittensory-engine"; +const PACKAGE_NAME = "@jsonbored/loopover-miner"; +const ENGINE_PACKAGE = "@jsonbored/loopover-engine"; // Config-file discovery order (mirrors the `.gittensory-miner.yml` precedence the goal-spec parser documents). const CONFIG_FILE_CANDIDATES = Object.freeze([ ".gittensory-miner.yml", @@ -52,7 +52,7 @@ export function resolveMinerStateDir(env = process.env) { return join(configHome, "gittensory-miner"); } -// The pinned @jsonbored/gittensory-engine version this miner is built against, read from the miner's own declared +// The pinned @jsonbored/loopover-engine version this miner is built against, read from the miner's own declared // dependency. (The engine package's `exports` map blocks `require("/package.json")`, and its built `dist` may // be absent depending on build order, so the declared-dependency version is the reliable, always-available source.) function readEngineVersion() { @@ -88,7 +88,7 @@ export function readInstalledEnginePackageVersionFromPaths( return null; } -/** Installed @jsonbored/gittensory-engine semver from node_modules (not the declared dependency range). */ +/** Installed @jsonbored/loopover-engine semver from node_modules (not the declared dependency range). */ export function readInstalledEnginePackageVersion() { try { return readInstalledEnginePackageVersionFromPaths( diff --git a/packages/gittensory-miner/lib/update-check.js b/packages/gittensory-miner/lib/update-check.js index a4a772501d..6e0a8b7252 100644 --- a/packages/gittensory-miner/lib/update-check.js +++ b/packages/gittensory-miner/lib/update-check.js @@ -1,4 +1,4 @@ -const defaultPackageName = "@jsonbored/gittensory-miner"; +const defaultPackageName = "@jsonbored/loopover-miner"; const defaultNpmRegistryUrl = "https://registry.npmjs.org"; function isLocalRegistryHost(hostname) { diff --git a/packages/gittensory-miner/package.json b/packages/gittensory-miner/package.json index 9c2f30b32e..6f00986d30 100644 --- a/packages/gittensory-miner/package.json +++ b/packages/gittensory-miner/package.json @@ -1,9 +1,9 @@ { - "name": "@jsonbored/gittensory-miner", + "name": "@jsonbored/loopover-miner", "version": "0.1.0", "license": "AGPL-3.0-only", "type": "module", - "description": "Foundation CLI for the local Gittensory miner runtime.", + "description": "Foundation CLI for the local LoopOver miner runtime.", "repository": { "type": "git", "url": "git+https://github.com/JSONbored/gittensory.git", @@ -15,7 +15,7 @@ }, "keywords": [ "gittensor", - "gittensory", + "loopover", "miner", "cli", "agent" @@ -36,7 +36,7 @@ "build": "node --check bin/gittensory-miner.js && node --check bin/gittensory-miner-mcp.js && node --check lib/ams-policy.js && node --check lib/attempt-cli.js && node --check lib/attempt-input-builder.js && node --check lib/attempt-log.js && node --check lib/attempt-runner.js && node --check lib/attempt-worktree.js && node --check lib/calibration-types.js && node --check lib/calibration.js && node --check lib/ci-poller.js && node --check lib/claim-adjudication.js && node --check lib/claim-ledger-cli.js && node --check lib/claim-ledger-expiry.js && node --check lib/claim-ledger.js && node --check lib/cli.js && node --check lib/coding-agent-construction.js && node --check lib/coding-agent-house-rules.js && node --check lib/coding-task-spec.js && node --check lib/deny-check.js && node --check lib/deny-hook-synthesis.js && node --check lib/deny-hooks.js && node --check lib/discover-cli.js && node --check lib/event-ledger-cli.js && node --check lib/event-ledger.js && node --check lib/execute-local-write.js && node --check lib/feasibility-cli.js && node --check lib/gate-verdict-poller.js && node --check lib/governor-action-mode.js && node --check lib/governor-chokepoint-persisted.js && node --check lib/governor-chokepoint.js && node --check lib/governor-kill-switch.js && node --check lib/governor-ledger-cli.js && node --check lib/governor-ledger.js && node --check lib/governor-open-pr.js && node --check lib/governor-run-halt.js && node --check lib/governor-state.js && node --check lib/governor-write-rate-limit.js && node --check lib/harness-submission-trigger.js && node --check lib/laptop-init.js && node --check lib/live-issue-snapshot.js && node --check lib/local-store.js && node --check lib/loop-cli.js && node --check lib/loop-closure.js && node --check lib/loop-reentry.js && node --check lib/manage-poll.js && node --check lib/manage-status.js && node --check lib/miner-goal-spec.js && node --check lib/opportunity-fanout.js && node --check lib/opportunity-ranker.js && node --check lib/orb-export.js && node --check lib/plan-store-cli.js && node --check lib/plan-store.js && node --check lib/portfolio-dashboard.js && node --check lib/portfolio-discovery.js && node --check lib/portfolio-queue-cli.js && node --check lib/portfolio-queue-manager.js && node --check lib/portfolio-queue.js && node --check lib/portfolio-queue-expiry.js && node --check lib/pr-disposition-poller.js && node --check lib/pr-outcome.js && node --check lib/prediction-ledger.js && node --check lib/pretooluse-hook.js && node --check lib/rejection-signal.js && node --check lib/rejection-state-machine.js && node --check lib/rejection-templates.js && node --check lib/replay-objective-anchor.js && node --check lib/replay-snapshot.js && node --check lib/replay-task-generation.js && node --check lib/repo-clone.js && node --check lib/run-state-cli.js && node --check lib/run-state.js && node --check lib/self-review-context.js && node --check lib/slop-assessment.js && node --check lib/status.js && node --check lib/submission-freshness-check.js && node --check lib/update-check.js && node --check lib/version.js && node --check lib/worktree-allocator.js" }, "dependencies": { - "@jsonbored/gittensory-engine": "*", + "@jsonbored/loopover-engine": "*", "@modelcontextprotocol/sdk": "1.29.0", "zod": "^4.4.3" }, diff --git a/packages/gittensory-ui-kit/package.json b/packages/gittensory-ui-kit/package.json index 7d5ad4e1a3..bd0b6eafb8 100644 --- a/packages/gittensory-ui-kit/package.json +++ b/packages/gittensory-ui-kit/package.json @@ -1,9 +1,9 @@ { - "name": "@jsonbored/gittensory-ui-kit", + "name": "@jsonbored/loopover-ui-kit", "version": "0.1.0", "license": "AGPL-3.0-only", "type": "module", - "description": "Shared design-system tokens and component primitives for gittensory-ui and gittensory-miner-ui.", + "description": "Shared design-system tokens and component primitives for loopover-ui and loopover-miner-ui.", "repository": { "type": "git", "url": "git+https://github.com/JSONbored/gittensory.git", @@ -14,7 +14,7 @@ "url": "https://github.com/JSONbored/gittensory/issues" }, "keywords": [ - "gittensory", + "loopover", "design-system", "ui" ], diff --git a/release-please-config.json b/release-please-config.json index 48a78a1f36..21b794e26f 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -4,12 +4,12 @@ "packages/gittensory-mcp": { "release-type": "node", "component": "mcp", - "package-name": "@jsonbored/gittensory-mcp" + "package-name": "@jsonbored/loopover-mcp" }, "packages/gittensory-engine": { "release-type": "node", "component": "engine", - "package-name": "@jsonbored/gittensory-engine" + "package-name": "@jsonbored/loopover-engine" } }, "include-component-in-tag": true, diff --git a/review-enrichment/package.json b/review-enrichment/package.json index 029d8cce7f..1e01e8e6f1 100644 --- a/review-enrichment/package.json +++ b/review-enrichment/package.json @@ -1,9 +1,9 @@ { - "name": "gittensory-review-enrichment", + "name": "loopover-review-enrichment", "version": "0.1.0", "private": true, "type": "module", - "description": "Gittensory review-enrichment service (REES) — heavy/external/historical PR analysis returned as a structured brief the review engine splices into the prompt. Deploys standalone on Railway; see #1473.", + "description": "LoopOver review-enrichment service (REES) — heavy/external/historical PR analysis returned as a structured brief the review engine splices into the prompt. Deploys standalone on Railway; see #1473.", "engines": { "node": ">=20" }, diff --git a/review-enrichment/src/github-headers.ts b/review-enrichment/src/github-headers.ts index f47e7029d2..bec4b4d69f 100644 --- a/review-enrichment/src/github-headers.ts +++ b/review-enrichment/src/github-headers.ts @@ -3,7 +3,7 @@ // a GITHUB_API_VERSION constant, 1 hardcoded Accept to raw-only (unable to ever request JSON), and 2 reinvented a // raw-toggle param a 4th way. One export, one shape, used by every analyzer that talks to the GitHub API. const GITHUB_API_VERSION = "2022-11-28"; -const USER_AGENT = "gittensory-review-enrichment"; +const USER_AGENT = "loopover-review-enrichment"; /** Standard headers for an authenticated GitHub REST API request: `Authorization`, `X-GitHub-Api-Version`, and * `User-Agent` are always present. `Accept` defaults to the structured-JSON media type; pass `{ raw: true }` diff --git a/review-enrichment/test/github-headers.test.ts b/review-enrichment/test/github-headers.test.ts index 30d9e29766..94b14335f8 100644 --- a/review-enrichment/test/github-headers.test.ts +++ b/review-enrichment/test/github-headers.test.ts @@ -9,7 +9,7 @@ test("githubHeaders defaults to the structured-JSON Accept media type", () => { Authorization: "Bearer tok_abc123", Accept: "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28", - "User-Agent": "gittensory-review-enrichment", + "User-Agent": "loopover-review-enrichment", }); }); @@ -23,7 +23,7 @@ test("githubHeaders switches Accept to the raw media type when opts.raw is true" Authorization: "Bearer tok_abc123", Accept: "application/vnd.github.raw", "X-GitHub-Api-Version": "2022-11-28", - "User-Agent": "gittensory-review-enrichment", + "User-Agent": "loopover-review-enrichment", }); }); diff --git a/scripts/check-engine-parity.ts b/scripts/check-engine-parity.ts index 7c6cb53692..adf3e82606 100644 --- a/scripts/check-engine-parity.ts +++ b/scripts/check-engine-parity.ts @@ -2,7 +2,7 @@ // Mechanical drift tripwire for hand-duplicated src/ <-> gittensory-engine file pairs (#4260). Most src/{review, // settings,signals} modules are thin re-export shims over the engine, but ~15 twin files are still maintained in // parallel — this script discovers those pairs, normalizes known-harmless import-path aliases, and fails CI when -// the normalized bodies diverge. Also compares the workspace-installed @jsonbored/gittensory-engine semver against +// the normalized bodies diverge. Also compares the workspace-installed @jsonbored/loopover-engine semver against // the monorepo engine package's declared version (version-skew tripwire; no live-gate round-trip). import { existsSync, readdirSync, readFileSync } from "node:fs"; import { execFileSync } from "node:child_process"; @@ -150,7 +150,7 @@ const ENGINE_SRC_ROOT = "packages/gittensory-engine/src"; const HOST_SRC_ROOT = "src"; const ENGINE_PACKAGE_JSON = "packages/gittensory-engine/package.json"; const MINER_ENGINE_PIN_FILE = "packages/gittensory-miner/expected-engine.version"; -const ENGINE_PACKAGE_NAME = "@jsonbored/gittensory-engine"; +const ENGINE_PACKAGE_NAME = "@jsonbored/loopover-engine"; export type EngineParityPair = { area: string; @@ -546,7 +546,7 @@ export type EngineVersionSkewResult = { }; /** - * Version-skew tripwire: installed @jsonbored/gittensory-engine must be >= the monorepo engine package version. + * Version-skew tripwire: installed @jsonbored/loopover-engine must be >= the monorepo engine package version. * Returns `{ failures, installed, expected, skew }`. */ export function checkEngineVersionSkew({ diff --git a/scripts/check-mcp-package.mjs b/scripts/check-mcp-package.mjs index 55e1eef325..e2a7366ea5 100644 --- a/scripts/check-mcp-package.mjs +++ b/scripts/check-mcp-package.mjs @@ -3,7 +3,7 @@ import { readFileSync } from "node:fs"; import { join } from "node:path"; import { spawnSync } from "node:child_process"; -const result = spawnSync("npm", ["pack", "--workspace", "@jsonbored/gittensory-mcp", "--dry-run", "--json"], { +const result = spawnSync("npm", ["pack", "--workspace", "@jsonbored/loopover-mcp", "--dry-run", "--json"], { encoding: "utf8", }); diff --git a/scripts/check-mcp-release-candidate.mjs b/scripts/check-mcp-release-candidate.mjs index e71ec46040..f1cd62af6b 100644 --- a/scripts/check-mcp-release-candidate.mjs +++ b/scripts/check-mcp-release-candidate.mjs @@ -13,7 +13,7 @@ import { } from "./mcp-release-candidate-core.mjs"; const PACKAGE_DIR = "packages/gittensory-mcp"; -const WORKSPACE = "@jsonbored/gittensory-mcp"; +const WORKSPACE = "@jsonbored/loopover-mcp"; const PUBLISH_WORKFLOW = ".github/workflows/npm-publish.yml"; const onWindows = process.platform === "win32"; diff --git a/scripts/check-mcp-release-due.mjs b/scripts/check-mcp-release-due.mjs index 11eb369177..a63dd2f5be 100644 --- a/scripts/check-mcp-release-due.mjs +++ b/scripts/check-mcp-release-due.mjs @@ -40,7 +40,7 @@ function parseArgs(argv) { } function readPublishedPackageVersion() { - const result = spawnSync("npm", ["view", "@jsonbored/gittensory-mcp", "version", "--json"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }); + const result = spawnSync("npm", ["view", "@jsonbored/loopover-mcp", "version", "--json"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }); if (result.status !== 0) return null; try { const parsed = JSON.parse(result.stdout); diff --git a/scripts/check-miner-package.mjs b/scripts/check-miner-package.mjs index f2e93b3310..99eb8331d7 100644 --- a/scripts/check-miner-package.mjs +++ b/scripts/check-miner-package.mjs @@ -51,7 +51,7 @@ function loadMinerPackFromNpm() { const paths = JSON.parse(process.env.CHECK_MINER_PACK_TEST_FILES); return { files: paths.map((path) => ({ path })) }; } - const result = spawnSync("npm", ["pack", "--workspace", "@jsonbored/gittensory-miner", "--dry-run", "--json"], { + const result = spawnSync("npm", ["pack", "--workspace", "@jsonbored/loopover-miner", "--dry-run", "--json"], { encoding: "utf8", }); if (result.status !== 0) { diff --git a/scripts/check-openapi-settings-parity.mjs b/scripts/check-openapi-settings-parity.mjs index 9e4d1d189a..75081b8d85 100644 --- a/scripts/check-openapi-settings-parity.mjs +++ b/scripts/check-openapi-settings-parity.mjs @@ -3,7 +3,7 @@ // schemas -- ui:openapi:check only verifies the generated openapi.json matches THEM, never that they match // the actual RepositorySettings TS type the API handler serializes. A field added to the TS type (and // actually returned by GET /v1/repos/:owner/:repo/settings) can silently miss the Zod schema forever, with -// no CI signal -- breaking generated API clients (including @jsonbored/gittensory-mcp) that have no way to +// no CI signal -- breaking generated API clients (including @jsonbored/loopover-mcp) that have no way to // know about a field the spec doesn't mention. This is a structural key-set diff, not a value/type check. import { readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; diff --git a/scripts/check-ui-mcp-version-copy.mjs b/scripts/check-ui-mcp-version-copy.mjs index 7d4c74e29e..4bb8c6496d 100644 --- a/scripts/check-ui-mcp-version-copy.mjs +++ b/scripts/check-ui-mcp-version-copy.mjs @@ -4,7 +4,7 @@ import { join, relative } from "node:path"; import { get } from "node:https"; const root = process.cwd(); -const packageName = "@jsonbored/gittensory-mcp"; +const packageName = "@jsonbored/loopover-mcp"; const registryUrl = "https://registry.npmjs.org/@jsonbored%2fgittensory-mcp"; const sourceLatestPath = join(root, "apps/gittensory-ui/src/lib/mcp-package.ts"); const targets = [ diff --git a/scripts/deploy-selfhost-prebuilt.sh b/scripts/deploy-selfhost-prebuilt.sh index 33e3a2c28c..e5919ea9bc 100755 --- a/scripts/deploy-selfhost-prebuilt.sh +++ b/scripts/deploy-selfhost-prebuilt.sh @@ -35,7 +35,7 @@ run_node_build() { -v "$PWD:/work" \ -w /work \ "$NODE_IMAGE" \ - sh -lc 'npm ci --ignore-scripts && npm --workspace @jsonbored/gittensory-engine run build && node scripts/build-selfhost.mjs --all && node scripts/validate-selfhost-sourcemap.mjs' + sh -lc 'npm ci --ignore-scripts && npm --workspace @jsonbored/loopover-engine run build && node scripts/build-selfhost.mjs --all && node scripts/validate-selfhost-sourcemap.mjs' } run_sentry_upload() { diff --git a/scripts/sync-release-lockfile-versions.mjs b/scripts/sync-release-lockfile-versions.mjs index cb7c0712c0..97ed7d797a 100644 --- a/scripts/sync-release-lockfile-versions.mjs +++ b/scripts/sync-release-lockfile-versions.mjs @@ -3,7 +3,7 @@ // per-workspace version fields, whose keys contain slashes (e.g. "packages/gittensory-engine") // nested under a manifest-mode component's own release-please-config.json block -- confirmed // empirically (mcp-v0.7.0/engine-v0.2.0 dry runs both left package-lock.json un-synced, breaking -// `npm ci` with "Missing: @jsonbored/gittensory-engine@0.1.0 from lock file"). This does the same +// `npm ci` with "Missing: @jsonbored/loopover-engine@0.1.0 from lock file"). This does the same // single-line replacement a human would make by hand: find the workspace's own manifest-mirror // entry, replace just its "version" value. No JSON.parse/stringify round-trip on the whole // multi-thousand-line lockfile, which would risk reordering/reformatting far beyond the one line diff --git a/src/mcp/find-opportunities.ts b/src/mcp/find-opportunities.ts index 8f5a68e58a..db9e6a30f7 100644 --- a/src/mcp/find-opportunities.ts +++ b/src/mcp/find-opportunities.ts @@ -1,6 +1,6 @@ // Hosted `gittensory_find_opportunities` (#2308): metadata-only cross-repo discovery that composes the // opportunity fan-out (#2307), deterministic ranker (#2302), and goal-model signals from -// `@jsonbored/gittensory-engine` — never clones source, never uploads metadata, never writes to GitHub. +// `@jsonbored/loopover-engine` — never clones source, never uploads metadata, never writes to GitHub. // Banned repos are hard-skipped upstream in fan-out AI-policy resolution; only `aiPolicyAllowed: true` // rows are ever returned. diff --git a/src/mcp/local-write-tools.ts b/src/mcp/local-write-tools.ts index e1c77dda01..3f41fcb81e 100644 --- a/src/mcp/local-write-tools.ts +++ b/src/mcp/local-write-tools.ts @@ -17,4 +17,4 @@ export { buildTestGenSpec, type LocalWriteActionSpec, type LocalWriteJsonValue, -} from "@jsonbored/gittensory-engine"; +} from "@jsonbored/loopover-engine"; diff --git a/src/review/issue-rag-wire.ts b/src/review/issue-rag-wire.ts index 9ca4e0a695..5c39a3b0b8 100644 --- a/src/review/issue-rag-wire.ts +++ b/src/review/issue-rag-wire.ts @@ -1,5 +1,5 @@ /** - * Issue-centric RAG query composition (#2320), extracted to `@jsonbored/gittensory-engine` (#4254) so the + * Issue-centric RAG query composition (#2320), extracted to `@jsonbored/loopover-engine` (#4254) so the * miner analyze phase can compose the identical retrieval query from an issue's title/body/labels without * importing the review stack. Retrieval wiring for the miner MCP tool lives in `./issue-rag-retrieval.ts` * and `src/mcp/issue-rag.ts` (#4293); the Vectorize/D1 backend itself stays in `./rag`. diff --git a/src/scoring/model.ts b/src/scoring/model.ts index 64903dfe63..05fd852538 100644 --- a/src/scoring/model.ts +++ b/src/scoring/model.ts @@ -9,7 +9,7 @@ import { syncUnmodeledScoringConstantDrift } from "../upstream/unmodeled-scoring import type { JsonValue, ScoringModelSnapshotRecord } from "../types"; import { errorMessage, nowIso } from "../utils/json"; -// Deterministic constants/classifiers, extracted to `@jsonbored/gittensory-engine` (#2282) so the miner can +// Deterministic constants/classifiers, extracted to `@jsonbored/loopover-engine` (#2282) so the miner can // run the same scoring-constant logic locally. Re-exported here (via relative source path — see // src/scoring/preview.ts's shim comment for why) so every existing import of this module keeps working // unchanged. The upstream-fetching, D1-persisting logic below is Cloudflare/D1-bound and cannot move into diff --git a/src/scoring/pending-pr-scenarios.ts b/src/scoring/pending-pr-scenarios.ts index c0909519a5..f962a41f65 100644 --- a/src/scoring/pending-pr-scenarios.ts +++ b/src/scoring/pending-pr-scenarios.ts @@ -1,7 +1,7 @@ import { listCheckSummaries, listPullRequestReviews } from "../db/repositories"; import type { CheckSummaryRecord, PullRequestRecord, PullRequestReviewRecord } from "../types"; -// Deterministic open-PR classification/detection, extracted to `@jsonbored/gittensory-engine` (#2282) so +// Deterministic open-PR classification/detection, extracted to `@jsonbored/loopover-engine` (#2282) so // the miner can run the same pending-PR-scenario logic locally. Re-exported here (via relative source path // — see src/scoring/preview.ts's shim comment for why) so every existing import of this module keeps // working unchanged. The two D1-fetching loaders below cannot move into the engine package, so they stay diff --git a/src/scoring/preview.ts b/src/scoring/preview.ts index 2d5efd05d3..a765004122 100644 --- a/src/scoring/preview.ts +++ b/src/scoring/preview.ts @@ -1,4 +1,4 @@ -// Deterministic score-preview builder, extracted to `@jsonbored/gittensory-engine` (#2282) so the miner can +// Deterministic score-preview builder, extracted to `@jsonbored/loopover-engine` (#2282) so the miner can // run the same preview locally. This file is a thin re-export shim; the implementation lives at // packages/gittensory-engine/src/scoring/preview.ts (imported via relative source path, not the published // package, to match this repo's existing engine-consumption convention — see e.g. diff --git a/src/selfhost/ai.ts b/src/selfhost/ai.ts index 8aa076351b..ea3731a387 100644 --- a/src/selfhost/ai.ts +++ b/src/selfhost/ai.ts @@ -409,7 +409,7 @@ export function createAnthropicAi(opts: { apiKey: string; model?: string | undef // runs read-only / no extra tools, and non-zero exit / empty output / error-envelope THROWS so the caller degrades. // // NOTE (#4284): the reusable half of this pattern — a parameterized allowlist builder + secret redaction — now also -// lives in `@jsonbored/gittensory-engine` (`SUBPROCESS_CLI_ENV_ALLOWLIST`, `buildAllowlistedEnv`, `SECRET_PATTERNS`, +// lives in `@jsonbored/loopover-engine` (`SUBPROCESS_CLI_ENV_ALLOWLIST`, `buildAllowlistedEnv`, `SECRET_PATTERNS`, // `redactSecrets`) so the coming gittensory-miner coding-agent drivers can depend on one source of truth. This copy // is deliberately kept parallel for now (the review path's `subscriptionCliEnv` also folds in CLI-specific PATH // resolution); keep the two in sync, or shim this onto the engine copy (like `src/rules/predicted-gate.ts` does) in diff --git a/src/services/mcp-compatibility.ts b/src/services/mcp-compatibility.ts index 79bd857067..c8d348fda3 100644 --- a/src/services/mcp-compatibility.ts +++ b/src/services/mcp-compatibility.ts @@ -6,7 +6,7 @@ import gittensoryMcpPackageJson from "../../packages/gittensory-mcp/package.json"; export const GITTENSORY_API_VERSION = "0.1.0"; -export const GITTENSORY_MCP_PACKAGE_NAME = "@jsonbored/gittensory-mcp"; +export const GITTENSORY_MCP_PACKAGE_NAME = "@jsonbored/loopover-mcp"; export const MINIMUM_SUPPORTED_MCP_VERSION = "0.5.0"; export const LATEST_RECOMMENDED_MCP_VERSION: string = gittensoryMcpPackageJson.version; diff --git a/src/signals/check-summary.ts b/src/signals/check-summary.ts index 6db8e0246b..fb62928862 100644 --- a/src/signals/check-summary.ts +++ b/src/signals/check-summary.ts @@ -1,4 +1,4 @@ -// Check-summary classifiers, extracted to `@jsonbored/gittensory-engine` (#4256) so reward-risk and the +// Check-summary classifiers, extracted to `@jsonbored/loopover-engine` (#4256) so reward-risk and the // published gittensory-mcp/gittensory-miner CLIs can depend on the same source instead of reaching into // `local-branch.ts` (which pulls in the whole review-scoring/Gittensor-API subsystem). This file is a thin // re-export shim; the implementation lives at packages/gittensory-engine/src/signals/check-summary.ts diff --git a/src/signals/duplicate-winner.ts b/src/signals/duplicate-winner.ts index 65b8aa7676..6736b03f83 100644 --- a/src/signals/duplicate-winner.ts +++ b/src/signals/duplicate-winner.ts @@ -1,5 +1,5 @@ /** - * Duplicate-winner adjudication (#dup-winner), extracted to `@jsonbored/gittensory-engine` (#2278) so the + * Duplicate-winner adjudication (#dup-winner), extracted to `@jsonbored/loopover-engine` (#2278) so the * maintainer gate and the miner's own soft-claim adjudication (a later Phase-0 issue) import the identical, * versioned election logic instead of drifting apart. See the engine module's doc comment for the full * election-order rationale (claim-time election, anti-backdating semantics). diff --git a/src/signals/local-scorer.ts b/src/signals/local-scorer.ts index 9cbe70bf29..3cf5b53f82 100644 --- a/src/signals/local-scorer.ts +++ b/src/signals/local-scorer.ts @@ -1,4 +1,4 @@ -// #782 deterministic local scorer — extracted to `@jsonbored/gittensory-engine` (#4253) so the published +// #782 deterministic local scorer — extracted to `@jsonbored/loopover-engine` (#4253) so the published // gittensory-mcp / gittensory-miner CLIs and the hosted Worker import the identical, versioned scoring logic // instead of drifting. The Vectorize/Node-coupled local-branch.ts is intentionally NOT moved; this shim only // re-exports the pure scorer. packages/gittensory-engine/src/local-scorer.ts (imported via relative source diff --git a/src/signals/path-matchers.ts b/src/signals/path-matchers.ts index ae242f691a..75e18a5b8c 100644 --- a/src/signals/path-matchers.ts +++ b/src/signals/path-matchers.ts @@ -1,5 +1,5 @@ // Pure, deterministic path matchers for slop classification (#561), extracted to -// `@jsonbored/gittensory-engine` (#4252) so the published gittensory-mcp/gittensory-miner CLIs can depend on +// `@jsonbored/loopover-engine` (#4252) so the published gittensory-mcp/gittensory-miner CLIs can depend on // the same source instead of hand-porting it. This file is a thin re-export shim; the implementation lives at // packages/gittensory-engine/src/signals/path-matchers.ts (imported via relative source path, not the // published package, to match this repo's existing engine-consumption convention — see e.g. diff --git a/src/signals/reward-risk.ts b/src/signals/reward-risk.ts index f9eac74b80..83084bc471 100644 --- a/src/signals/reward-risk.ts +++ b/src/signals/reward-risk.ts @@ -1,14 +1,14 @@ -// Reward/risk reasoning signals, extracted to `@jsonbored/gittensory-engine` (#2281) so the gittensory-miner +// Reward/risk reasoning signals, extracted to `@jsonbored/loopover-engine` (#2281) so the gittensory-miner // can rank candidate work locally with the same logic the maintainer-side gate computes. The implementation // lives at `packages/gittensory-engine/src/reward-risk.ts`, imported via its RELATIVE SOURCE PATH (matching -// the merged #2276/#2278/#2282 shims) — not the published `@jsonbored/gittensory-engine` specifier, so no +// the merged #2276/#2278/#2282 shims) — not the published `@jsonbored/loopover-engine` specifier, so no // tsconfig path / vitest alias / root dependency is introduced. // // This is a WRAPPING shim rather than the usual pure `export *` re-export. reward-risk depends on the // maintainer signal stack in `src/signals/engine.ts` (`buildRoleContext`, `buildLaneAdvice`, // `buildCollisionReport`, `buildQueueHealth`, `buildRepoFitRecommendation`, `buildContributorIntakeHealth`, // `buildPullRequestReviewIntelligence`) — none of which are extracted yet (and are far too large to port -// under the size cap). `isFailingCheckSummary` now lives in `@jsonbored/gittensory-engine` (#4256). The +// under the size cap). `isFailingCheckSummary` now lives in `@jsonbored/loopover-engine` (#4256). The // engine module takes the remaining builders as an // injected `RewardRiskEngineDeps`; this shim binds the real `src` builders and threads them in, so every // existing importer keeps calling the four builders with their original signatures. Once those builders gain diff --git a/src/signals/test-evidence.ts b/src/signals/test-evidence.ts index 8df158e566..601d0fda3d 100644 --- a/src/signals/test-evidence.ts +++ b/src/signals/test-evidence.ts @@ -1,4 +1,4 @@ -// Test/code-path classifiers, extracted to `@jsonbored/gittensory-engine` so the published +// Test/code-path classifiers, extracted to `@jsonbored/loopover-engine` so the published // gittensory-mcp/gittensory-miner CLIs can depend on the same source instead of hand-porting it // (previously drifted three times independently — see commit history titled "re-sync isTestFile // with the server"). This file is a thin re-export shim; the implementation lives at diff --git a/test/integration/api.test.ts b/test/integration/api.test.ts index 4cdd344442..0d68e29910 100644 --- a/test/integration/api.test.ts +++ b/test/integration/api.test.ts @@ -120,7 +120,7 @@ describe("api routes", () => { service: "gittensory-api", apiVersion: "0.1.0", mcp: { - packageName: "@jsonbored/gittensory-mcp", + packageName: "@jsonbored/loopover-mcp", minimumSupportedVersion: "0.5.0", latestRecommendedVersion: mcpPackageJson.version, latestPackageVersion: mcpPackageJson.version, @@ -3593,7 +3593,7 @@ describe("api routes", () => { method: "POST", headers: { ...apiHeaders(env), - "x-gittensory-mcp-package": "@jsonbored/gittensory-mcp", + "x-gittensory-mcp-package": "@jsonbored/loopover-mcp", "x-gittensory-mcp-version": "0.4.0", "x-gittensory-mcp-client": "gittensory-mcp-cli", }, @@ -6672,7 +6672,7 @@ function mcpHeaders(env: Env, sessionId?: string): Record { accept: "application/json, text/event-stream", "content-type": "application/json", "mcp-protocol-version": "2025-03-26", - "x-gittensory-mcp-package": "@jsonbored/gittensory-mcp", + "x-gittensory-mcp-package": "@jsonbored/loopover-mcp", "x-gittensory-mcp-version": "0.4.0", "x-gittensory-mcp-client": "gittensory-mcp-cli", ...(sessionId ? { "mcp-session-id": sessionId } : {}), diff --git a/test/integration/miner-discovery-pipeline.test.ts b/test/integration/miner-discovery-pipeline.test.ts index 546ad4c55b..2901d80b1d 100644 --- a/test/integration/miner-discovery-pipeline.test.ts +++ b/test/integration/miner-discovery-pipeline.test.ts @@ -9,7 +9,7 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/ci-engine-miner-filters.test.ts b/test/unit/ci-engine-miner-filters.test.ts index 6881baf109..6a03abc1d9 100644 --- a/test/unit/ci-engine-miner-filters.test.ts +++ b/test/unit/ci-engine-miner-filters.test.ts @@ -15,7 +15,7 @@ describe("CI engine/miner path filters", () => { expect(ci).toContain("name: Build engine package"); expect(ci).toContain("name: Build miner CLI"); expect(ci).toContain("name: Miner package check"); - expect(ci).toContain("npm run build --workspace @jsonbored/gittensory-engine"); + expect(ci).toContain("npm run build --workspace @jsonbored/loopover-engine"); expect(ci).toContain("npm run build:miner"); expect(ci).toContain("npm run test:miner-pack"); }); diff --git a/test/unit/ci-ui-build-openapi.test.ts b/test/unit/ci-ui-build-openapi.test.ts index cc99a06796..edc9c2d881 100644 --- a/test/unit/ci-ui-build-openapi.test.ts +++ b/test/unit/ci-ui-build-openapi.test.ts @@ -15,7 +15,7 @@ describe("UI build steps skip the redundant OpenAPI regen", () => { const stepEnd = workflow.indexOf("\n\n", stepStart); const step = workflow.slice(stepStart, stepEnd === -1 ? undefined : stepEnd); - expect(step).toContain("run: npm run extension:build && npm --workspace @jsonbored/gittensory-ui run build"); + expect(step).toContain("run: npm run extension:build && npm --workspace @jsonbored/loopover-ui run build"); expect(step).not.toContain("npm run ui:build"); }); @@ -23,7 +23,7 @@ describe("UI build steps skip the redundant OpenAPI regen", () => { const workflow = read(".github/workflows/ui-deploy.yml"); expect(workflow).toContain( - "run: npm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm run extension:build && npm --workspace @jsonbored/gittensory-ui run build", + "run: npm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm run extension:build && npm --workspace @jsonbored/loopover-ui run build", ); expect(workflow).not.toContain("&& npm run ui:build"); }); diff --git a/test/unit/coding-agent-miner.test.ts b/test/unit/coding-agent-miner.test.ts index fa99f11bd8..66cccef188 100644 --- a/test/unit/coding-agent-miner.test.ts +++ b/test/unit/coding-agent-miner.test.ts @@ -646,7 +646,7 @@ describe("lint-guarded edit wrapper (#4276)", () => { it("guardChangedFiles checks a changeset spanning multiple packages against each file's OWN rule, once per package", async () => { const { spawn, calls } = recordingSpawn({ "npm run typecheck": { code: 0, output: "" }, - "npm run build --workspace @jsonbored/gittensory-engine": { code: 1, output: "engine build failed" }, + "npm run build --workspace @jsonbored/loopover-engine": { code: 1, output: "engine build failed" }, "node --check packages/gittensory-miner/lib/cli.js": { code: 0, output: "" }, "npm run ui:typecheck": { code: 0, output: "" }, }); diff --git a/test/unit/docs-selfhost-update-rollback.test.ts b/test/unit/docs-selfhost-update-rollback.test.ts index b3fc8b155d..64415185ca 100644 --- a/test/unit/docs-selfhost-update-rollback.test.ts +++ b/test/unit/docs-selfhost-update-rollback.test.ts @@ -36,7 +36,7 @@ describe("self-host update + rollback docs (#1823)", () => { // packages/gittensory-engine/dist/ is gitignored and built via `tsc`; `npm ci --ignore-scripts` // never triggers that build on its own, so anything that imports the engine (e.g. // packages/gittensory-miner) fails to resolve during the --all bundle unless this runs first. - const engineBuildIndex = prebuiltScript.indexOf("@jsonbored/gittensory-engine run build"); + const engineBuildIndex = prebuiltScript.indexOf("@jsonbored/loopover-engine run build"); const bundleIndex = prebuiltScript.indexOf("build-selfhost.mjs --all"); expect(engineBuildIndex).toBeGreaterThan(-1); expect(bundleIndex).toBeGreaterThan(-1); diff --git a/test/unit/find-opportunities.test.ts b/test/unit/find-opportunities.test.ts index 0a98654216..e9c35c07fd 100644 --- a/test/unit/find-opportunities.test.ts +++ b/test/unit/find-opportunities.test.ts @@ -16,7 +16,7 @@ import { import { upsertRepositoryFromGitHub } from "../../src/db/repositories"; import { createTestEnv } from "../helpers/d1"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/gittensory-engine-scaffold.test.ts b/test/unit/gittensory-engine-scaffold.test.ts index b7da0b3fbb..39e46f528a 100644 --- a/test/unit/gittensory-engine-scaffold.test.ts +++ b/test/unit/gittensory-engine-scaffold.test.ts @@ -6,7 +6,7 @@ import enginePkg from "../../packages/gittensory-engine/package.json"; // package contract so the skeleton stays correct and installable as extraction lands. describe("gittensory-engine package scaffold", () => { it("declares the published package identity", () => { - expect(enginePkg.name).toBe("@jsonbored/gittensory-engine"); + expect(enginePkg.name).toBe("@jsonbored/loopover-engine"); expect(enginePkg.version).toMatch(/^\d+\.\d+\.\d+$/); expect(enginePkg.type).toBe("module"); expect(enginePkg.license).toBe("AGPL-3.0-only"); diff --git a/test/unit/local-scorer-adapter.test.ts b/test/unit/local-scorer-adapter.test.ts index 43ba29ae95..a66a05f5da 100644 --- a/test/unit/local-scorer-adapter.test.ts +++ b/test/unit/local-scorer-adapter.test.ts @@ -128,7 +128,7 @@ describe("local scorer adapter", () => { const guidance = setupGuidanceForLocalScorer({ ok: false, code: "missing_scorer_command" }).join("\n"); expect(guidance).not.toMatch(/\/secret\/home\/user/); - expect(guidance).toMatch(/node_modules\/@jsonbored\/gittensory-mcp\/scripts\//); + expect(guidance).toMatch(/node_modules\/@jsonbored\/loopover-mcp\/scripts\//); const probe = probeLocalScorer(process.env.GITTENSOR_SCORE_PREVIEW_CMD); expect(JSON.stringify(probe)).not.toMatch(/\/secret\/home\/user/); diff --git a/test/unit/local-write-tools.test.ts b/test/unit/local-write-tools.test.ts index 5f4677b747..7a0d2998a6 100644 --- a/test/unit/local-write-tools.test.ts +++ b/test/unit/local-write-tools.test.ts @@ -5,7 +5,7 @@ import { describe, expect, it, vi } from "vitest"; // no network round-trip). Without this redirect, the package-specifier re-export resolves through the engine's // published dist/ output, not its .ts source, so v8 coverage cannot attribute hits back to the source file -- // same fix as miner-coding-agent-house-rules.test.ts / miner-harness-submission-trigger.test.ts already apply. -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/mcp-cli-basics.test.ts b/test/unit/mcp-cli-basics.test.ts index bfa4709323..da41d16f89 100644 --- a/test/unit/mcp-cli-basics.test.ts +++ b/test/unit/mcp-cli-basics.test.ts @@ -119,7 +119,7 @@ describe("gittensory-mcp CLI — basics", () => { }); it("reports the package version via version, --version, and -v", () => { - const expected = `@jsonbored/gittensory-mcp/${mcpPackageJson.version}`; + const expected = `@jsonbored/loopover-mcp/${mcpPackageJson.version}`; for (const flag of ["version", "--version", "-v"]) { const plain = run([flag]).trim(); expect(plain).toContain(expected); @@ -131,7 +131,7 @@ describe("gittensory-mcp CLI — basics", () => { it("emits machine-readable version output with --json", () => { const payload = JSON.parse(run(["version", "--json"])) as { name: string; version: string; apiVersion: string; node: string }; - expect(payload.name).toBe("@jsonbored/gittensory-mcp"); + expect(payload.name).toBe("@jsonbored/loopover-mcp"); expect(payload.version).toBe(mcpPackageJson.version); expect(payload.apiVersion).toBe("0.1.0"); expect(payload.node).toBe(process.version); diff --git a/test/unit/mcp-cli-doctor.test.ts b/test/unit/mcp-cli-doctor.test.ts index 01048d72aa..38e37e302e 100644 --- a/test/unit/mcp-cli-doctor.test.ts +++ b/test/unit/mcp-cli-doctor.test.ts @@ -148,9 +148,9 @@ describe("gittensory-mcp CLI — doctor", () => { state: "stale", latestVersion: "9.9.9", updateAvailable: true, - upgradeCommand: "npm install -g @jsonbored/gittensory-mcp@latest", + upgradeCommand: "npm install -g @jsonbored/loopover-mcp@latest", }); - expect(payload.package.npxFallback).toContain("npx @jsonbored/gittensory-mcp@latest"); + expect(payload.package.npxFallback).toContain("npx @jsonbored/loopover-mcp@latest"); }); it("reports a current install without upgrade guidance", async () => { @@ -247,8 +247,8 @@ describe("gittensory-mcp CLI — doctor", () => { ) as { checks: Array<{ name: string; status: string; remediation?: string }> }; const version = payload.checks.find((check) => check.name === "version"); expect(version).toMatchObject({ status: "warn" }); - expect(version?.remediation).toContain("npm install -g @jsonbored/gittensory-mcp@latest"); - expect(version?.remediation).toContain("npx @jsonbored/gittensory-mcp@latest"); + expect(version?.remediation).toContain("npm install -g @jsonbored/loopover-mcp@latest"); + expect(version?.remediation).toContain("npx @jsonbored/loopover-mcp@latest"); }); it("reports API compatibility as unavailable when the API does not advertise a minimum version", async () => { @@ -304,7 +304,7 @@ describe("gittensory-mcp CLI — doctor", () => { state: "stale", latestStatus: "api", latestVersion: oneMinorAboveLocal, - upgradeCommand: "npm install -g @jsonbored/gittensory-mcp@latest", + upgradeCommand: "npm install -g @jsonbored/loopover-mcp@latest", }); }); @@ -321,7 +321,7 @@ describe("gittensory-mcp CLI — doctor", () => { expect(status.apiCompatibility).toMatchObject({ status: "incompatible", minVersion: "9.0.0", - upgradeCommand: "npm install -g @jsonbored/gittensory-mcp@latest", + upgradeCommand: "npm install -g @jsonbored/loopover-mcp@latest", }); const doctor = JSON.parse(await runAsync(["doctor", "--cwd", tempDir, "--repo", "JSONbored/gittensory", "--json"], env)) as { @@ -334,13 +334,13 @@ describe("gittensory-mcp CLI — doctor", () => { expect.objectContaining({ name: "api_compatibility", status: "fail", - remediation: "npm install -g @jsonbored/gittensory-mcp@latest", + remediation: "npm install -g @jsonbored/loopover-mcp@latest", }), ]), ); expect(doctor.checklist).toEqual(expect.arrayContaining([expect.objectContaining({ id: "api_compatibility", status: "fail" })])); expect(doctor.nextCommand).toMatchObject({ - command: "npm install -g @jsonbored/gittensory-mcp@latest", + command: "npm install -g @jsonbored/loopover-mcp@latest", reason: expect.stringContaining("Upgrade"), }); }); @@ -417,7 +417,7 @@ describe("gittensory-mcp CLI — doctor", () => { } expect(statusOutput).not.toContain("session-token"); // Sanity: upgrade guidance still surfaces in human-readable output. - expect(statusOutput).toContain("npm install -g @jsonbored/gittensory-mcp@latest"); + expect(statusOutput).toContain("npm install -g @jsonbored/loopover-mcp@latest"); }); it("keeps doctor exit code 0 by default even when a check fails", async () => { diff --git a/test/unit/mcp-cli-profiles.test.ts b/test/unit/mcp-cli-profiles.test.ts index a633c43479..fc032925ab 100644 --- a/test/unit/mcp-cli-profiles.test.ts +++ b/test/unit/mcp-cli-profiles.test.ts @@ -194,7 +194,7 @@ describe("gittensory-mcp CLI — profiles", () => { }), ) as { package: { name: string; version: string; latestStatus: string }; api: { status: string }; auth: { login: string } }; - expect(status.package).toMatchObject({ name: "@jsonbored/gittensory-mcp", version: mcpPackageJson.version, latestStatus: "skipped" }); + expect(status.package).toMatchObject({ name: "@jsonbored/loopover-mcp", version: mcpPackageJson.version, latestStatus: "skipped" }); expect(status.api.status).toBe("ok"); expect(status.auth.login).toBe("JSONbored"); @@ -216,7 +216,7 @@ describe("gittensory-mcp CLI — profiles", () => { }); const sessionRequest = requests.find((request) => request.url === "/v1/auth/session"); - expect(sessionRequest?.headers["x-gittensory-mcp-package"]).toBe("@jsonbored/gittensory-mcp"); + expect(sessionRequest?.headers["x-gittensory-mcp-package"]).toBe("@jsonbored/loopover-mcp"); expect(sessionRequest?.headers["x-gittensory-mcp-version"]).toBe(mcpPackageJson.version); expect(sessionRequest?.headers["x-gittensory-mcp-client"]).toBe("gittensory-mcp-cli"); const telemetryHeaders = JSON.stringify({ diff --git a/test/unit/mcp-compatibility.test.ts b/test/unit/mcp-compatibility.test.ts index 515db58ee0..419056d990 100644 --- a/test/unit/mcp-compatibility.test.ts +++ b/test/unit/mcp-compatibility.test.ts @@ -48,7 +48,7 @@ describe("MCP compatibility telemetry", () => { it("builds bounded telemetry from allowlisted MCP headers", () => { const telemetry = buildMcpClientTelemetry( new Headers({ - "x-gittensory-mcp-package": "@jsonbored/gittensory-mcp", + "x-gittensory-mcp-package": "@jsonbored/loopover-mcp", "x-gittensory-mcp-version": "0.2.1", "x-gittensory-mcp-client": "gittensory-mcp-cli", "mcp-protocol-version": "2025-03-26", @@ -60,7 +60,7 @@ describe("MCP compatibility telemetry", () => { clientName: "gittensory-mcp-cli", clientVersion: "0.2.1", metadata: { - packageName: "@jsonbored/gittensory-mcp", + packageName: "@jsonbored/loopover-mcp", packageVersion: "0.2.1", protocolVersion: "2025-03-26", compatibilityStatus: "incompatible", @@ -90,7 +90,7 @@ describe("MCP compatibility telemetry", () => { it("uses the canonical package and default MCP client fallbacks without storing unsafe header data", () => { const canonical = buildMcpClientTelemetry( new Headers({ - "x-gittensory-mcp-package": "@jsonbored/gittensory-mcp", + "x-gittensory-mcp-package": "@jsonbored/loopover-mcp", "x-gittensory-mcp-version": "0.4.0", }), { requireGittensoryHeader: true }, diff --git a/test/unit/mcp-find-opportunities.test.ts b/test/unit/mcp-find-opportunities.test.ts index c7b8b17f62..2eca2c3971 100644 --- a/test/unit/mcp-find-opportunities.test.ts +++ b/test/unit/mcp-find-opportunities.test.ts @@ -9,7 +9,7 @@ import { upsertRepositoryFromGitHub } from "../../src/db/repositories"; import { GittensoryMcp } from "../../src/mcp/server"; import { createTestEnv } from "../helpers/d1"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/mcp-release-candidate.test.ts b/test/unit/mcp-release-candidate.test.ts index d476e9b4be..68368ad01f 100644 --- a/test/unit/mcp-release-candidate.test.ts +++ b/test/unit/mcp-release-candidate.test.ts @@ -30,7 +30,7 @@ const TOKENLESS_WORKFLOW = [ " id-token: write", " steps:", " - name: Publish with npm trusted publishing", - " run: npx -y npm@11.15.0 publish --workspace @jsonbored/gittensory-mcp --access public --provenance", + " run: npx -y npm@11.15.0 publish --workspace @jsonbored/loopover-mcp --access public --provenance", ].join("\n"); describe("parseReleaseTag / checkTag", () => { diff --git a/test/unit/mcp-server-telemetry.test.ts b/test/unit/mcp-server-telemetry.test.ts index be49e01d74..2564813d05 100644 --- a/test/unit/mcp-server-telemetry.test.ts +++ b/test/unit/mcp-server-telemetry.test.ts @@ -23,7 +23,7 @@ describe("MCP server telemetry", () => { headers: { authorization: `Bearer ${env.GITTENSORY_MCP_TOKEN}`, "content-type": "application/json", - "x-gittensory-mcp-package": "@jsonbored/gittensory-mcp", + "x-gittensory-mcp-package": "@jsonbored/loopover-mcp", "x-gittensory-mcp-version": "0.5.0", "x-gittensory-mcp-client": "gittensory-mcp-cli", }, diff --git a/test/unit/miner-ams-policy.test.ts b/test/unit/miner-ams-policy.test.ts index db7b71a8dc..13971e639d 100644 --- a/test/unit/miner-ams-policy.test.ts +++ b/test/unit/miner-ams-policy.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-attempt-cli.test.ts b/test/unit/miner-attempt-cli.test.ts index 0df8a00dda..143bceace0 100644 --- a/test/unit/miner-attempt-cli.test.ts +++ b/test/unit/miner-attempt-cli.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-attempt-input-builder.test.ts b/test/unit/miner-attempt-input-builder.test.ts index 87c8b638d0..e89677c365 100644 --- a/test/unit/miner-attempt-input-builder.test.ts +++ b/test/unit/miner-attempt-input-builder.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-attempt-log.test.ts b/test/unit/miner-attempt-log.test.ts index c5f9402120..b230d57081 100644 --- a/test/unit/miner-attempt-log.test.ts +++ b/test/unit/miner-attempt-log.test.ts @@ -4,7 +4,7 @@ import { join } from "node:path"; import { DatabaseSync } from "node:sqlite"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/miner/attempt-log.js"); }); diff --git a/test/unit/miner-attempt-runner.test.ts b/test/unit/miner-attempt-runner.test.ts index 141d75d2af..941d109f24 100644 --- a/test/unit/miner-attempt-runner.test.ts +++ b/test/unit/miner-attempt-runner.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-attempt-worktree.test.ts b/test/unit/miner-attempt-worktree.test.ts index 253b1a6684..16e1d0aa02 100644 --- a/test/unit/miner-attempt-worktree.test.ts +++ b/test/unit/miner-attempt-worktree.test.ts @@ -4,7 +4,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-claim-ledger-readme.test.ts b/test/unit/miner-claim-ledger-readme.test.ts index c58b547b22..c1594be2c3 100644 --- a/test/unit/miner-claim-ledger-readme.test.ts +++ b/test/unit/miner-claim-ledger-readme.test.ts @@ -12,6 +12,6 @@ describe("gittensory-miner claim ledger README (#2291)", () => { expect(readme).toContain("releaseClaim"); expect(readme).toContain("listActiveClaims"); expect(readme).toContain("bookkeeping only"); - expect(readme).toContain("@jsonbored/gittensory-engine"); + expect(readme).toContain("@jsonbored/loopover-engine"); }); }); diff --git a/test/unit/miner-cli.test.ts b/test/unit/miner-cli.test.ts index 59b08107ff..d64b82d5df 100644 --- a/test/unit/miner-cli.test.ts +++ b/test/unit/miner-cli.test.ts @@ -49,18 +49,18 @@ describe("gittensory-miner CLI helpers", () => { it("prints the package version with the node runtime", () => { const log = vi.spyOn(console, "log").mockImplementation(() => undefined); printVersion({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", }); expect(log).toHaveBeenCalledWith( - expect.stringContaining("@jsonbored/gittensory-miner/0.1.0"), + expect.stringContaining("@jsonbored/loopover-miner/0.1.0"), ); expect(log).toHaveBeenCalledWith(expect.stringContaining(process.version)); }); it("prints help text with the supported commands", () => { const log = vi.spyOn(console, "log").mockImplementation(() => undefined); - printHelp({ packageName: "@jsonbored/gittensory-miner" }); + printHelp({ packageName: "@jsonbored/loopover-miner" }); const text = log.mock.calls[0]?.[0]; expect(text).toContain("gittensory-miner --help"); expect(text).toContain("gittensory-miner version"); @@ -72,10 +72,10 @@ describe("gittensory-miner CLI helpers", () => { .spyOn(console, "error") .mockImplementation(() => undefined); expect( - runCli(["mystery"], { packageName: "@jsonbored/gittensory-miner" }), + runCli(["mystery"], { packageName: "@jsonbored/loopover-miner" }), ).toBe(1); expect(error).toHaveBeenCalledWith( - "Unknown command: mystery. Run @jsonbored/gittensory-miner --help.", + "Unknown command: mystery. Run @jsonbored/loopover-miner --help.", ); }); @@ -96,8 +96,8 @@ describe("gittensory-miner startup update check (#2331)", () => { GITTENSORY_NPM_REGISTRY_URL: "https://registry.example.com/", }), ).toBe("https://registry.example.com"); - expect(resolveUpgradeCommand("@jsonbored/gittensory-miner")).toBe( - "npm install -g @jsonbored/gittensory-miner@latest", + expect(resolveUpgradeCommand("@jsonbored/loopover-miner")).toBe( + "npm install -g @jsonbored/loopover-miner@latest", ); }); @@ -178,13 +178,13 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await maybePrintUpdateNudge({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", npmRegistryUrl: registryUrl, - upgradeCommand: "npm install -g @jsonbored/gittensory-miner@latest", + upgradeCommand: "npm install -g @jsonbored/loopover-miner@latest", }); expect(stderr).toHaveBeenCalledWith( - "npm install -g @jsonbored/gittensory-miner@latest\n", + "npm install -g @jsonbored/loopover-miner@latest\n", ); }); @@ -194,10 +194,10 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await maybePrintUpdateNudge({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", npmRegistryUrl: registryUrl, - upgradeCommand: "npm install -g @jsonbored/gittensory-miner@latest", + upgradeCommand: "npm install -g @jsonbored/loopover-miner@latest", }); expect(stderr).not.toHaveBeenCalled(); }); @@ -206,10 +206,10 @@ describe("gittensory-miner startup update check (#2331)", () => { const registryUrl = await startRegistryFixture({ npmStatus: 500 }); await expect( maybePrintUpdateNudge({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", npmRegistryUrl: registryUrl, - upgradeCommand: "npm install -g @jsonbored/gittensory-miner@latest", + upgradeCommand: "npm install -g @jsonbored/loopover-miner@latest", }), ).resolves.toBeUndefined(); }); @@ -218,7 +218,7 @@ describe("gittensory-miner startup update check (#2331)", () => { const registryUrl = await startRegistryFixture({ npmStatus: 503 }); await expect( fetchLatestPackageVersion({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", npmRegistryUrl: registryUrl, }), ).rejects.toThrow("npm_latest_version_unavailable"); @@ -227,7 +227,7 @@ describe("gittensory-miner startup update check (#2331)", () => { it("startUpdateCheck resolves immediately when opted out", async () => { const fetchSpy = vi.spyOn(globalThis, "fetch"); await startUpdateCheck(["--no-update-check"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", }); expect(fetchSpy).not.toHaveBeenCalled(); @@ -239,12 +239,12 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await startUpdateCheck(["--version"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", env: { GITTENSORY_NPM_REGISTRY_URL: registryUrl }, }); expect(stderr).toHaveBeenCalledWith( - "npm install -g @jsonbored/gittensory-miner@latest\n", + "npm install -g @jsonbored/loopover-miner@latest\n", ); }); @@ -254,7 +254,7 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await startUpdateCheck(["--version"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", env: { GITTENSORY_NPM_REGISTRY_URL: registryUrl }, }); @@ -265,7 +265,7 @@ describe("gittensory-miner startup update check (#2331)", () => { const registryUrl = await startRegistryFixture({ npmStatus: 500 }); await expect( startUpdateCheck(["--version"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", env: { GITTENSORY_NPM_REGISTRY_URL: registryUrl }, }), @@ -291,19 +291,19 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); const updateCheck = startUpdateCheck(["mystery"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@jsonbored/loopover-miner", packageVersion: "0.1.0", env: { GITTENSORY_NPM_REGISTRY_URL: registryUrl }, }); await awaitOpportunisticUpdateCheck(updateCheck); expect(stderr).toHaveBeenCalledWith( - "npm install -g @jsonbored/gittensory-miner@latest\n", + "npm install -g @jsonbored/loopover-miner@latest\n", ); }); it("serves --version without blocking when update checks are disabled", () => { const output = runCapture(["--version", "--no-update-check"]); - expect(output).toContain("@jsonbored/gittensory-miner/0.1.0"); + expect(output).toContain("@jsonbored/loopover-miner/0.1.0"); }); it("serves --help immediately without waiting for a slow registry check", async () => { @@ -318,7 +318,7 @@ describe("gittensory-miner startup update check (#2331)", () => { expect(Date.now() - startedAt).toBeLessThan(2000); expect(output).toContain("gittensory-miner --help"); expect(output).not.toContain( - "npm install -g @jsonbored/gittensory-miner@latest", + "npm install -g @jsonbored/loopover-miner@latest", ); }); diff --git a/test/unit/miner-coding-agent-construction.test.ts b/test/unit/miner-coding-agent-construction.test.ts index c001818f42..9f835482ba 100644 --- a/test/unit/miner-coding-agent-construction.test.ts +++ b/test/unit/miner-coding-agent-construction.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-coding-agent-house-rules.test.ts b/test/unit/miner-coding-agent-house-rules.test.ts index a92f2499d1..ea7c2d36a6 100644 --- a/test/unit/miner-coding-agent-house-rules.test.ts +++ b/test/unit/miner-coding-agent-house-rules.test.ts @@ -1,11 +1,11 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); import { buildHouseRulesAgentSdkHooks, runHouseRulesEnforcedCodingAgentAttempt } from "../../packages/gittensory-miner/lib/coding-agent-house-rules.js"; -// Typed from source, not the "@jsonbored/gittensory-engine" package specifier: that resolves via the +// Typed from source, not the "@jsonbored/loopover-engine" package specifier: that resolves via the // workspace package's dist/ (git-ignored, only built by CI's later "Build engine package" step -- #ci-engine- // build-order), which runs AFTER Typecheck, so a real (non-vi.mock) `import type` from the package specifier // fails TS2307 in CI even though it resolves fine locally with a stale/leftover dist/ already on disk. The diff --git a/test/unit/miner-coding-task-spec.test.ts b/test/unit/miner-coding-task-spec.test.ts index d587f4aca1..828fa02562 100644 --- a/test/unit/miner-coding-task-spec.test.ts +++ b/test/unit/miner-coding-task-spec.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-deployment-doc.test.ts b/test/unit/miner-deployment-doc.test.ts index 28edc950f2..cda2550d88 100644 --- a/test/unit/miner-deployment-doc.test.ts +++ b/test/unit/miner-deployment-doc.test.ts @@ -27,7 +27,7 @@ describe("miner deployment guide (#2330)", () => { const dockerignore = readFileSync(join(process.cwd(), ".dockerignore"), "utf8"); expect(dockerfile).toContain("COPY . ."); expect(dockerfile).toContain("npm prune --omit=dev --ignore-scripts"); - expect(dockerfile).toContain("@jsonbored/gittensory-engine"); + expect(dockerfile).toContain("@jsonbored/loopover-engine"); expect(dockerfile).toContain("USER node"); expect(dockerfile).toContain("GITTENSORY_MINER_CONFIG_DIR=/data/miner"); expect(dockerfile).toContain("VOLUME"); diff --git a/test/unit/miner-feasibility-cli.test.ts b/test/unit/miner-feasibility-cli.test.ts index cfc78373ba..6e82b6bd80 100644 --- a/test/unit/miner-feasibility-cli.test.ts +++ b/test/unit/miner-feasibility-cli.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-goal-spec-resolver.test.ts b/test/unit/miner-goal-spec-resolver.test.ts index d000596584..79a009bd90 100644 --- a/test/unit/miner-goal-spec-resolver.test.ts +++ b/test/unit/miner-goal-spec-resolver.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-action-mode.test.ts b/test/unit/miner-governor-action-mode.test.ts index 30982366d8..664811e1b1 100644 --- a/test/unit/miner-governor-action-mode.test.ts +++ b/test/unit/miner-governor-action-mode.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-chokepoint-persisted.test.ts b/test/unit/miner-governor-chokepoint-persisted.test.ts index 0b48e234ef..ff7123fc35 100644 --- a/test/unit/miner-governor-chokepoint-persisted.test.ts +++ b/test/unit/miner-governor-chokepoint-persisted.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-chokepoint.test.ts b/test/unit/miner-governor-chokepoint.test.ts index d24070cea6..f3de611814 100644 --- a/test/unit/miner-governor-chokepoint.test.ts +++ b/test/unit/miner-governor-chokepoint.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-kill-switch.test.ts b/test/unit/miner-governor-kill-switch.test.ts index fed52a50eb..6c98adab51 100644 --- a/test/unit/miner-governor-kill-switch.test.ts +++ b/test/unit/miner-governor-kill-switch.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-ledger-cli.test.ts b/test/unit/miner-governor-ledger-cli.test.ts index 2a8d9fad90..5a04c062d9 100644 --- a/test/unit/miner-governor-ledger-cli.test.ts +++ b/test/unit/miner-governor-ledger-cli.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-ledger.test.ts b/test/unit/miner-governor-ledger.test.ts index b9f8c7c7f8..567a9aef5d 100644 --- a/test/unit/miner-governor-ledger.test.ts +++ b/test/unit/miner-governor-ledger.test.ts @@ -4,7 +4,7 @@ import { join } from "node:path"; import { DatabaseSync } from "node:sqlite"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-open-pr.test.ts b/test/unit/miner-governor-open-pr.test.ts index bc5dac4efd..2f91452ccf 100644 --- a/test/unit/miner-governor-open-pr.test.ts +++ b/test/unit/miner-governor-open-pr.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-run-halt.test.ts b/test/unit/miner-governor-run-halt.test.ts index 7cce96f389..b20c2d7fe7 100644 --- a/test/unit/miner-governor-run-halt.test.ts +++ b/test/unit/miner-governor-run-halt.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-governor-write-rate-limit.test.ts b/test/unit/miner-governor-write-rate-limit.test.ts index 7fec5854b2..8ddea16823 100644 --- a/test/unit/miner-governor-write-rate-limit.test.ts +++ b/test/unit/miner-governor-write-rate-limit.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-harness-submission-trigger.test.ts b/test/unit/miner-harness-submission-trigger.test.ts index 78adabc3a5..85da2bef23 100644 --- a/test/unit/miner-harness-submission-trigger.test.ts +++ b/test/unit/miner-harness-submission-trigger.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-loop-cli.test.ts b/test/unit/miner-loop-cli.test.ts index 29ce61a511..b07488f671 100644 --- a/test/unit/miner-loop-cli.test.ts +++ b/test/unit/miner-loop-cli.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-loop-reentry.test.ts b/test/unit/miner-loop-reentry.test.ts index 23888effd1..22aa7cdb2f 100644 --- a/test/unit/miner-loop-reentry.test.ts +++ b/test/unit/miner-loop-reentry.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-opportunity-fanout.test.ts b/test/unit/miner-opportunity-fanout.test.ts index 2cb7fb4c3f..27201d6672 100644 --- a/test/unit/miner-opportunity-fanout.test.ts +++ b/test/unit/miner-opportunity-fanout.test.ts @@ -1,7 +1,7 @@ import { Buffer } from "node:buffer"; import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-opportunity-ranker.test.ts b/test/unit/miner-opportunity-ranker.test.ts index a24e03cc31..89898ae248 100644 --- a/test/unit/miner-opportunity-ranker.test.ts +++ b/test/unit/miner-opportunity-ranker.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-package-skeleton.test.ts b/test/unit/miner-package-skeleton.test.ts index 43973fa7fa..1b225e876e 100644 --- a/test/unit/miner-package-skeleton.test.ts +++ b/test/unit/miner-package-skeleton.test.ts @@ -30,7 +30,7 @@ describe("gittensory-miner package skeleton (#2287)", () => { const miner = readPackageJson(minerRoot); const mcp = readPackageJson(mcpRoot); - expect(miner.name).toBe("@jsonbored/gittensory-miner"); + expect(miner.name).toBe("@jsonbored/loopover-miner"); expect(miner.license).toBe("AGPL-3.0-only"); expect(miner.type).toBe("module"); expect(miner.bin).toEqual({ @@ -38,7 +38,7 @@ describe("gittensory-miner package skeleton (#2287)", () => { "gittensory-miner-mcp": "bin/gittensory-miner-mcp.js", }); expect(miner.publishConfig).toEqual(mcp.publishConfig); - expect(miner.dependencies["@jsonbored/gittensory-engine"]).toBeDefined(); + expect(miner.dependencies["@jsonbored/loopover-engine"]).toBeDefined(); expect(miner.engines.node).toMatch(/^>=22(?:\.\d+){0,2}$/); expect(miner.files).toEqual(expect.arrayContaining(["bin", "lib"])); expect(miner.scripts.build.startsWith("node --check bin/gittensory-miner.js")).toBe(true); @@ -56,15 +56,15 @@ describe("gittensory-miner package skeleton (#2287)", () => { // behavior. spawnSync never throws; assert on stdout content directly, decoupled from the exit code. const result = spawnSync( "npm", - ["ls", "--workspace", "@jsonbored/gittensory-miner", "--depth=0"], + ["ls", "--workspace", "@jsonbored/loopover-miner", "--depth=0"], { cwd: process.cwd(), encoding: "utf8" }, ); - expect(result.stdout).toContain("@jsonbored/gittensory-miner@"); + expect(result.stdout).toContain("@jsonbored/loopover-miner@"); }); it("serves --help and --version from the bin entry", () => { expect(runCapture(["--help", "--no-update-check"])).toContain("gittensory-miner --help"); - expect(runCapture(["--version", "--no-update-check"])).toContain("@jsonbored/gittensory-miner/"); + expect(runCapture(["--version", "--no-update-check"])).toContain("@jsonbored/loopover-miner/"); expect( runCapture(["--version", "--no-update-check"], { GITTENSORY_MINER_VERSION: "gittensory-miner-fleet@abc1234", @@ -75,7 +75,7 @@ describe("gittensory-miner package skeleton (#2287)", () => { it("documents foundation scope and local checkout install paths in the README", () => { const readme = readFileSync(readmePath, "utf8"); expect(readme).toContain("foundation phase"); - expect(readme).toContain("npm link --workspace @jsonbored/gittensory-miner"); + expect(readme).toContain("npm link --workspace @jsonbored/loopover-miner"); expect(readme).toContain("gittensory-miner --help"); expect(readme).toContain("gittensory-miner --version"); }); diff --git a/test/unit/miner-rejection-signal.test.ts b/test/unit/miner-rejection-signal.test.ts index f604a5b525..b293376c58 100644 --- a/test/unit/miner-rejection-signal.test.ts +++ b/test/unit/miner-rejection-signal.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-self-review-context.test.ts b/test/unit/miner-self-review-context.test.ts index 15a88b59bc..72ab52bbfe 100644 --- a/test/unit/miner-self-review-context.test.ts +++ b/test/unit/miner-self-review-context.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-slop-assessment.test.ts b/test/unit/miner-slop-assessment.test.ts index 34b4d06201..8eebb13275 100644 --- a/test/unit/miner-slop-assessment.test.ts +++ b/test/unit/miner-slop-assessment.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-status.test.ts b/test/unit/miner-status.test.ts index 1c562fd3d3..2b3e6b2fce 100644 --- a/test/unit/miner-status.test.ts +++ b/test/unit/miner-status.test.ts @@ -50,9 +50,9 @@ describe("gittensory-miner status/doctor (#2288)", () => { const root = tempRoot(); writeFileSync(join(root, ".gittensory-miner.yml"), "minerEnabled: true\n"); const status = collectStatus({ GITTENSORY_MINER_CONFIG_DIR: join(root, "state") }, root); - expect(status.package.name).toBe("@jsonbored/gittensory-miner"); + expect(status.package.name).toBe("@jsonbored/loopover-miner"); expect(typeof status.package.version).toBe("string"); - expect(status.engine.name).toBe("@jsonbored/gittensory-engine"); + expect(status.engine.name).toBe("@jsonbored/loopover-engine"); expect(status.stateDir).toBe(join(root, "state")); expect(status.configFile).toBe(join(root, ".gittensory-miner.yml")); // discovered }); @@ -71,7 +71,7 @@ describe("gittensory-miner status/doctor (#2288)", () => { it("runStatus prints human-readable text (0) and machine JSON with --json", () => { const log = vi.spyOn(console, "log").mockImplementation(() => {}); expect(runStatus([], { GITTENSORY_MINER_CONFIG_DIR: "/s" }, tempRoot())).toBe(0); - expect(String(log.mock.calls[0]?.[0])).toContain("@jsonbored/gittensory-miner"); + expect(String(log.mock.calls[0]?.[0])).toContain("@jsonbored/loopover-miner"); log.mockClear(); expect(runStatus(["--json"], { GITTENSORY_MINER_CONFIG_DIR: "/s" }, tempRoot())).toBe(0); expect(JSON.parse(String(log.mock.calls[0]?.[0])).stateDir).toBe("/s"); diff --git a/test/unit/opportunity-fanout-ai-policy.test.ts b/test/unit/opportunity-fanout-ai-policy.test.ts index 0684b7bf4a..a169d8ac6b 100644 --- a/test/unit/opportunity-fanout-ai-policy.test.ts +++ b/test/unit/opportunity-fanout-ai-policy.test.ts @@ -3,9 +3,9 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { afterEach, describe, expect, it, vi } from "vitest"; -// Route the miner's bare "@jsonbored/gittensory-engine" import at the engine source (mirrors +// Route the miner's bare "@jsonbored/loopover-engine" import at the engine source (mirrors // miner-opportunity-fanout.test.ts) so the fan-out uses the real resolveAiPolicyVerdict. -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@jsonbored/loopover-engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/support/mcp-cli-harness.ts b/test/unit/support/mcp-cli-harness.ts index 2e2a3b5573..17295704e1 100644 --- a/test/unit/support/mcp-cli-harness.ts +++ b/test/unit/support/mcp-cli-harness.ts @@ -120,7 +120,7 @@ export async function startFixtureServer( server = createServer(async (request, response) => { options.onApiRequest?.(request); response.setHeader("content-type", "application/json"); - if (request.url && request.url.includes("gittensory-mcp/latest")) { + if (request.url && request.url.includes("loopover-mcp/latest")) { if (options.npmStatus && options.npmStatus >= 400) { response.statusCode = options.npmStatus; response.end(JSON.stringify({ error: "registry_error" })); @@ -143,13 +143,13 @@ export async function startFixtureServer( service: "gittensory-api", apiVersion: "0.1.0", mcp: { - packageName: "@jsonbored/gittensory-mcp", + packageName: "@jsonbored/loopover-mcp", minimumSupportedVersion, latestRecommendedVersion, latestPackageVersion: latestRecommendedVersion, supportedVersionRange: `>=${minimumSupportedVersion}`, - upgradeCommand: "npm install -g @jsonbored/gittensory-mcp@latest", - npxFallbackCommand: "npx @jsonbored/gittensory-mcp@latest ", + upgradeCommand: "npm install -g @jsonbored/loopover-mcp@latest", + npxFallbackCommand: "npx @jsonbored/loopover-mcp@latest ", }, compatibilityWarnings: [], breakingChanges: [], diff --git a/test/unit/support/miner-cli-harness.ts b/test/unit/support/miner-cli-harness.ts index 82584791f4..c350e8575d 100644 --- a/test/unit/support/miner-cli-harness.ts +++ b/test/unit/support/miner-cli-harness.ts @@ -71,7 +71,7 @@ export async function startRegistryFixture( server = createServer((request, response) => { const respond = () => { response.setHeader("content-type", "application/json"); - if (request.url && request.url.includes("gittensory-miner/latest")) { + if (request.url && request.url.includes("loopover-miner/latest")) { if (options.npmStatus && options.npmStatus >= 400) { response.statusCode = options.npmStatus; response.end(JSON.stringify({ error: "registry_error" }));