diff --git a/.claude/skills/contributing-to-loopover/SKILL.md b/.claude/skills/contributing-to-loopover/SKILL.md index 077a674353..ed40691627 100644 --- a/.claude/skills/contributing-to-loopover/SKILL.md +++ b/.claude/skills/contributing-to-loopover/SKILL.md @@ -96,7 +96,7 @@ approved, then confirm it's green. **Install the loopover MCP** — your pre-submit oracle that predicts the gate before you push: ```sh -npm install -g @jsonbored/gittensory-mcp@latest +npm install -g @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 @@ -206,7 +206,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 @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. @@ -224,14 +224,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:live-gate-parity`, `test:driver-parity`, the -`@jsonbored/gittensory-engine` workspace's own test run, `test:workers`, `build:mcp`, `test:mcp-pack`, +`@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 @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-loopover/reference.md b/.claude/skills/contributing-to-loopover/reference.md index 878e4ec4bc..f8114ccf8e 100644 --- a/.claude/skills/contributing-to-loopover/reference.md +++ b/.claude/skills/contributing-to-loopover/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:live-gate-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 @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 +@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 (`@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 @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) @@ -243,7 +243,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 @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 86fc7d6722..81653e456d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,7 +107,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 @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 @@ -276,7 +276,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 @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 @@ -285,7 +285,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 @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 @@ -312,7 +312,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 @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 @@ -397,7 +397,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 run miner-extension:build && npm --workspace @jsonbored/gittensory-ui run build + run: npm run extension:build && npm run miner-extension:build && npm --workspace @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 @@ -471,7 +471,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 @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..69eaa82bcf 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 @loopover/engine. + # That package's dist/ is gitignored (see ci.yml's own build --workspace @loopover/engine # step for the same reason) -- without building it first, the MCP release validation gate below - # fails with "Failed to resolve entry for package @jsonbored/gittensory-engine" on every run. + # fails with "Failed to resolve entry for package @loopover/engine" on every run. - name: Build gittensory-engine - run: npm run build --workspace @jsonbored/gittensory-engine + run: npm run build --workspace @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 @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 "@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 "@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 "@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..af9467c208 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 @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 @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 @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/@loopover/engine/dist/index.js'; + import { isTestPath, isCodeFile } from '$TMP/node_modules/@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 "@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 "@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 "@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 238bb378c9..2cb8eb44b5 100644 --- a/.github/workflows/release-selfhost.yml +++ b/.github/workflows/release-selfhost.yml @@ -128,12 +128,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 @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 @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 ced861712c..b0cef4fb7d 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 @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 @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 a8ca4fbf30..a8c29871bb 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://api.loopover.ai - run: npm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm run extension:lint && npm run miner-extension:lint && npm run extension:typecheck && npm run miner-extension:typecheck && npm run extension:build && npm run miner-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:lint && npm run miner-extension:lint && npm run extension:typecheck && npm run miner-extension:typecheck && npm run extension:build && npm run miner-extension:build && npm --workspace @loopover/ui run build diff --git a/AGENTS.md b/AGENTS.md index 3ea8e1c45c..80d4c96a99 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. +(`@loopover/mcp`), and the PR template are all in the skill files above — use them. diff --git a/Dockerfile b/Dockerfile index 45322820a0..a8bba56cde 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 -- @loopover/engine (a workspace dependency of gittensory-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 @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/README.md b/README.md index f4a7d607c5..5ac9e0bf45 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ _Formerly Gittensory._

CI - MCP package + MCP package License Docs Gittensor impact @@ -63,9 +63,9 @@ See [Tuning your reviews](https://gittensory.aethereal.dev/docs/tuning) for the | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Website | [gittensory.aethereal.dev](https://gittensory.aethereal.dev/) | | Docs | [gittensory.aethereal.dev/docs](https://gittensory.aethereal.dev/docs) | -| MCP package | [@jsonbored/gittensory-mcp](https://www.npmjs.com/package/@jsonbored/gittensory-mcp) | -| Engine package | [`@jsonbored/gittensory-engine`](packages/gittensory-engine/README.md) — shared deterministic logic for the review stack and miner | -| Miner package | [`@jsonbored/gittensory-miner`](packages/gittensory-miner/README.md) — local foundation CLI for the autonomous miner runtime | +| MCP package | [@loopover/mcp](https://www.npmjs.com/package/@loopover/mcp) | +| Engine package | [`@loopover/engine`](packages/gittensory-engine/README.md) — shared deterministic logic for the review stack and miner | +| Miner package | [`@loopover/miner`](packages/gittensory-miner/README.md) — local foundation CLI for the autonomous miner runtime | | API | [API browser](https://gittensory.aethereal.dev/api) and [OpenAPI JSON](https://gittensory-api.aethereal.dev/openapi.json) | | GitHub App | [Setup docs](https://gittensory.aethereal.dev/docs/github-app) — self-hosting is the only currently available path | | Browser extension | [Extension page](https://gittensory.aethereal.dev/extension) | @@ -73,7 +73,7 @@ See [Tuning your reviews](https://gittensory.aethereal.dev/docs/tuning) for the ## MCP Install ```sh -npm install -g @jsonbored/gittensory-mcp@latest +npm install -g @loopover/mcp@latest gittensory-mcp login gittensory-mcp doctor gittensory-mcp --stdio diff --git a/apps/gittensory-miner-ui/eslint.config.js b/apps/gittensory-miner-ui/eslint.config.js index 131f9e562a..3705e40ee0 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 @loopover/ui-kit/theme.css.", }, { selector: diff --git a/apps/gittensory-miner-ui/package.json b/apps/gittensory-miner-ui/package.json index c13777a746..e9ae66bb22 100644 --- a/apps/gittensory-miner-ui/package.json +++ b/apps/gittensory-miner-ui/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-miner-ui", + "name": "@loopover/ui-miner", "version": "0.0.0", "private": true, "description": "Local read-only dashboard shell for the Gittensory miner.", @@ -15,7 +15,7 @@ "format": "prettier --write ." }, "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@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 f38fdbee44..0975a3a001 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 "@loopover/ui-kit/components/card"; import { fetchLedgers, type LedgersResult } from "../lib/ledgers"; import { fetchPortfolioQueue, type PortfolioQueueResult } from "../lib/portfolio-queue"; diff --git a/apps/gittensory-miner-ui/src/routes/ledgers.tsx b/apps/gittensory-miner-ui/src/routes/ledgers.tsx index 53e1ea855d..210b82198e 100644 --- a/apps/gittensory-miner-ui/src/routes/ledgers.tsx +++ b/apps/gittensory-miner-ui/src/routes/ledgers.tsx @@ -1,15 +1,8 @@ import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useState } from "react"; -import { Card, CardContent, CardHeader } from "@jsonbored/gittensory-ui-kit/components/card"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@jsonbored/gittensory-ui-kit/components/table"; +import { Card, CardContent, CardHeader } from "@loopover/ui-kit/components/card"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@loopover/ui-kit/components/table"; import { CLAIM_STATUSES, fetchLedgers, type ClaimStatus, type LedgersResult } from "../lib/ledgers"; diff --git a/apps/gittensory-miner-ui/src/routes/portfolio.tsx b/apps/gittensory-miner-ui/src/routes/portfolio.tsx index 8fe932837b..ee106dfc95 100644 --- a/apps/gittensory-miner-ui/src/routes/portfolio.tsx +++ b/apps/gittensory-miner-ui/src/routes/portfolio.tsx @@ -1,14 +1,7 @@ import { createFileRoute } from "@tanstack/react-router"; -import { Card, CardContent, CardHeader } from "@jsonbored/gittensory-ui-kit/components/card"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@jsonbored/gittensory-ui-kit/components/table"; +import { Card, CardContent, CardHeader } from "@loopover/ui-kit/components/card"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@loopover/ui-kit/components/table"; import { DEFAULT_POLL_INTERVAL_MS, usePolledFetch } from "../lib/use-polled-fetch"; 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 f9c113cc54..c0aab92cd5 100644 --- a/apps/gittensory-miner-ui/src/routes/run-history.tsx +++ b/apps/gittensory-miner-ui/src/routes/run-history.tsx @@ -1,15 +1,8 @@ import { createFileRoute } from "@tanstack/react-router"; -import { Badge } from "@jsonbored/gittensory-ui-kit/components/badge"; -import { Card, CardContent, CardHeader } from "@jsonbored/gittensory-ui-kit/components/card"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@jsonbored/gittensory-ui-kit/components/table"; +import { Badge } from "@loopover/ui-kit/components/badge"; +import { Card, CardContent, CardHeader } from "@loopover/ui-kit/components/card"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@loopover/ui-kit/components/table"; import { DEFAULT_POLL_INTERVAL_MS, usePolledFetch } from "../lib/use-polled-fetch"; 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..39f901b1ad 100644 --- a/apps/gittensory-miner-ui/src/styles.css +++ b/apps/gittensory-miner-ui/src/styles.css @@ -2,11 +2,11 @@ @source "../src"; @source "../../../packages/gittensory-ui-kit/src"; @import "tw-animate-css"; -@import "@jsonbored/gittensory-ui-kit/theme.css"; +@import "@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 + * gittensory-ui (imported above from @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 * dark-only deployment — the light tokens ship in the shared theme so a diff --git a/apps/gittensory-ui/package.json b/apps/gittensory-ui/package.json index 480be129ee..527f956b3b 100644 --- a/apps/gittensory-ui/package.json +++ b/apps/gittensory-ui/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-ui", + "name": "@loopover/ui", "version": "0.0.0", "private": true, "description": "Gittensory's public website, docs, and dashboard (TanStack Start SPA/SSR app).", @@ -20,7 +20,7 @@ "format": "prettier --write ." }, "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@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..c8a2fc7a47 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 @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..3ad2737143 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 "@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..b81097fbb1 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 "@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..495788cdce 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 "@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..07794dd896 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 "@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..be509dbf41 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 "@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..d18ec011d0 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 "@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..1f9b647524 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 "@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..95be4ac2ca 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 "@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..8cf6e77fca 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 "@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..8519d6f907 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 "@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..0dcee8614f 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 "@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..22caeff839 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 "@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..ccce644df9 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 "@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..2b0f5b1bff 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 "@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..d0ac94c185 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 "@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..46e99a2472 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 "@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..82c0937603 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 "@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..794888e62d 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 "@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..ad2305d964 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 "@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..de6c828ba0 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 "@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..3deec08a5f 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 "@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..e8fe15e0f8 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 "@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..e15efd3735 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 "@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..50ebca9caf 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 "@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..2ef0591486 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 "@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..631d0d82d5 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 "@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..739fff5623 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 "@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..5c5aa4192b 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 "@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..48d49da785 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 "@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..cb7e6ce5db 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 "@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..60482faa6f 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 "@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..bfa8bff527 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 "@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..2dd7525693 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 "@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..f2e7b76cd4 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 "@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..950df884e9 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 "@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..b188f8b675 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 "@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..aa4bd84e89 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 "@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..6dde70181b 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 "@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..1e6f05761b 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 "@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..fbde4d25a7 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 "@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..b6feba4f96 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 "@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..c9b1a0d8b8 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 "@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..9002498717 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 "@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..496fdabddd 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 "@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..b1f9e592f2 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 "@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..7a02eb49c3 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 "@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..d673b14576 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 "@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..4478e1946d 100644 --- a/apps/gittensory-ui/src/lib/mcp-package.ts +++ b/apps/gittensory-ui/src/lib/mcp-package.ts @@ -2,8 +2,8 @@ import { useQuery } from "@tanstack/react-query"; import { apiFetch } from "@/lib/api/request"; -export const MCP_PACKAGE_NAME = "@jsonbored/gittensory-mcp"; -export const MCP_PACKAGE_ENCODED_NAME = "@jsonbored%2fgittensory-mcp"; +export const MCP_PACKAGE_NAME = "@loopover/mcp"; +export const MCP_PACKAGE_ENCODED_NAME = "@loopover%2fmcp"; 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}`; // Tracks the latest PUBLISHED release: ui:version-audit requires this to equal npm dist-tags.latest, so it is diff --git a/apps/gittensory-ui/src/lib/miner-commands.ts b/apps/gittensory-ui/src/lib/miner-commands.ts index d24de2dc85..348ba84cfc 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 = "@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..0cdfba8704 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 "@loopover/ui-kit/utils"; diff --git a/apps/gittensory-ui/src/routes/agents.tsx b/apps/gittensory-ui/src/routes/agents.tsx index eb08a91152..fffc49f4a1 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..0eb6bc107c 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 @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 @loopover/mcp pulled live from the npm registry.", }, { property: "og:url", content: "/changelog" }, ], diff --git a/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx b/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx index 6508a8da41..ae9c7c2b43 100644 --- a/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx +++ b/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx @@ -58,7 +58,7 @@ function BetaOnboarding() { Install the MCP. Global install or npx — see{" "} Quickstart. diff --git a/apps/gittensory-ui/src/routes/docs.miner-quickstart.tsx b/apps/gittensory-ui/src/routes/docs.miner-quickstart.tsx index 66940f7205..385848b25c 100644 --- a/apps/gittensory-ui/src/routes/docs.miner-quickstart.tsx +++ b/apps/gittensory-ui/src/routes/docs.miner-quickstart.tsx @@ -11,13 +11,13 @@ export const Route = createFileRoute("/docs/miner-quickstart")({ { name: "description", content: - "Pick a contribution lane, install @jsonbored/gittensory-mcp, sign in, and run plan → preflight → packet. Lane-by-lane commands with JSON output and redaction notes.", + "Pick a contribution lane, install @loopover/mcp, sign in, and run plan → preflight → packet. Lane-by-lane commands with JSON output and redaction notes.", }, { property: "og:title", content: "Miner quickstart by lane — LoopOver docs" }, { property: "og:description", content: - "Pick a contribution lane, install @jsonbored/gittensory-mcp, sign in, and run plan → preflight → packet. Lane-by-lane commands with JSON output and redaction notes.", + "Pick a contribution lane, install @loopover/mcp, sign in, and run plan → preflight → packet. Lane-by-lane commands with JSON output and redaction notes.", }, { property: "og:url", content: "/docs/miner-quickstart" }, ], @@ -49,14 +49,14 @@ function MinerQuickstart() {

0. Install and sign in (every lane)

- The MCP is published as @jsonbored/gittensory-mcp. Run it with npx{" "} - or install it globally, then authenticate with GitHub Device Flow — LoopOver never asks for - a Personal Access Token. + The MCP is published as @loopover/mcp. Run it with npx or install + it globally, then authenticate with GitHub Device Flow — LoopOver never asks for a Personal + Access Token.

1. Install

- The MCP is published as @jsonbored/gittensory-mcp. You can run it with{" "} - npx, or install it globally. + The MCP is published as @loopover/mcp. You can run it with npx, or + install it globally.

2. Sign in (GitHub Device Flow)

diff --git a/apps/gittensory-ui/src/routes/index.tsx b/apps/gittensory-ui/src/routes/index.tsx index a6d1d25157..c2e4a974c9 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 @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", "@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", "@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", "@loopover/mcp@latest", "--stdio"] } } }`, diff --git a/apps/gittensory-ui/src/styles.css b/apps/gittensory-ui/src/styles.css index 7c53d8b36a..b755d982b0 100644 --- a/apps/gittensory-ui/src/styles.css +++ b/apps/gittensory-ui/src/styles.css @@ -2,11 +2,11 @@ @source "../src"; @source "../../../packages/gittensory-ui-kit/src"; @import "tw-animate-css"; -@import "@jsonbored/gittensory-ui-kit/theme.css"; +@import "@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 @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 * and dashboard chrome — hero flourishes, gradients, nav accents — not @@ -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 @loopover/ui-kit/theme.css). */ @layer utilities { .gradient-border { position: relative; diff --git a/package-lock.json b/package-lock.json index 320cfef40a..1e60b49450 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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": "*", + "@loopover/engine": "*", "@modelcontextprotocol/sdk": "1.29.0", "@octokit/core": "^7.0.6", "@opentelemetry/api": "^1.9.1", @@ -70,10 +70,10 @@ "version": "0.1.0" }, "apps/gittensory-miner-ui": { - "name": "@jsonbored/gittensory-miner-ui", + "name": "@loopover/ui-miner", "version": "0.0.0", "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@loopover/ui-kit": "^0.1.0", "@tailwindcss/vite": "^4.3.2", "@tanstack/react-router": "^1.170.17", "react": "^19.2.7", @@ -480,10 +480,10 @@ } }, "apps/gittensory-ui": { - "name": "@jsonbored/gittensory-ui", + "name": "@loopover/ui", "version": "0.0.0", "dependencies": { - "@jsonbored/gittensory-ui-kit": "^0.1.0", + "@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", @@ -3102,18 +3102,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@jsonbored/gittensory-engine": { - "resolved": "packages/gittensory-engine", - "link": true - }, - "node_modules/@jsonbored/gittensory-mcp": { - "resolved": "packages/gittensory-mcp", - "link": true - }, - "node_modules/@jsonbored/gittensory-miner": { - "resolved": "packages/gittensory-miner", - "link": true - }, "node_modules/@jsonbored/gittensory-extension": { "resolved": "apps/gittensory-extension", "link": true @@ -3122,18 +3110,30 @@ "resolved": "apps/gittensory-miner-extension", "link": true }, - "node_modules/@jsonbored/gittensory-miner-ui": { - "resolved": "apps/gittensory-miner-ui", + "node_modules/@loopover/engine": { + "resolved": "packages/gittensory-engine", + "link": true + }, + "node_modules/@loopover/mcp": { + "resolved": "packages/gittensory-mcp", + "link": true + }, + "node_modules/@loopover/miner": { + "resolved": "packages/gittensory-miner", "link": true }, - "node_modules/@jsonbored/gittensory-ui": { + "node_modules/@loopover/ui": { "resolved": "apps/gittensory-ui", "link": true }, - "node_modules/@jsonbored/gittensory-ui-kit": { + "node_modules/@loopover/ui-kit": { "resolved": "packages/gittensory-ui-kit", "link": true }, + "node_modules/@loopover/ui-miner": { + "resolved": "apps/gittensory-miner-ui", + "link": true + }, "node_modules/@lovable.dev/vite-plugin-dev-server-bridge": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@lovable.dev/vite-plugin-dev-server-bridge/-/vite-plugin-dev-server-bridge-1.0.3.tgz", @@ -15635,7 +15635,7 @@ } }, "packages/gittensory-engine": { - "name": "@jsonbored/gittensory-engine", + "name": "@loopover/engine", "version": "1.0.0", "license": "AGPL-3.0-only", "dependencies": { @@ -15670,11 +15670,11 @@ "license": "MIT" }, "packages/gittensory-mcp": { - "name": "@jsonbored/gittensory-mcp", + "name": "@loopover/mcp", "version": "0.7.1", "license": "AGPL-3.0-only", "dependencies": { - "@jsonbored/gittensory-engine": "^1.0.0", + "@loopover/engine": "^1.0.0", "@modelcontextprotocol/sdk": "1.29.0", "zod": "^4.4.3" }, @@ -15686,11 +15686,11 @@ } }, "packages/gittensory-miner": { - "name": "@jsonbored/gittensory-miner", + "name": "@loopover/miner", "version": "0.1.0", "license": "AGPL-3.0-only", "dependencies": { - "@jsonbored/gittensory-engine": "*", + "@loopover/engine": "*", "@modelcontextprotocol/sdk": "1.29.0", "zod": "^4.4.3" }, @@ -15703,7 +15703,7 @@ } }, "packages/gittensory-ui-kit": { - "name": "@jsonbored/gittensory-ui-kit", + "name": "@loopover/ui-kit", "version": "0.1.0", "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index ba3dfbe5b4..9dd4c65a07 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "scripts": { "dev": "wrangler dev", "deploy": "wrangler deploy", - "deploy:api": "npm --workspace @jsonbored/gittensory-engine run build && wrangler d1 migrations apply loopover --remote && wrangler deploy", + "deploy:api": "npm --workspace @loopover/engine run build && wrangler d1 migrations apply loopover --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 loopover --local", "db:migrate:remote": "wrangler d1 migrations apply loopover --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 @loopover/mcp run build", + "build:miner": "npm --workspace @loopover/engine run build && npm --workspace @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", @@ -47,12 +47,12 @@ "miner-extension:build": "npm --workspace @jsonbored/gittensory-miner-extension run build", "miner-extension:lint": "npm --workspace @jsonbored/gittensory-miner-extension run lint", "miner-extension:typecheck": "npm --workspace @jsonbored/gittensory-miner-extension run typecheck", - "ui:kit:build": "npm run build --workspace @jsonbored/gittensory-ui-kit", - "ui:build": "npm run ui:kit:build && npm run build --workspace @jsonbored/gittensory-engine && npm run ui:openapi && npm run extension:build && npm run miner-extension:build && npm --workspace @jsonbored/gittensory-ui run build && npm --workspace @jsonbored/gittensory-miner-ui run build", + "ui:kit:build": "npm run build --workspace @loopover/ui-kit", + "ui:build": "npm run ui:kit:build && npm run build --workspace @loopover/engine && npm run ui:openapi && npm run extension:build && npm run miner-extension:build && npm --workspace @loopover/ui run build && npm --workspace @loopover/ui-miner 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 @loopover/ui run lint && npm --workspace @loopover/ui-miner run lint", + "ui:typecheck": "npm run ui:kit:build && npm --workspace @loopover/ui run typecheck && npm --workspace @loopover/ui-miner run typecheck", + "ui:test": "npm run ui:kit:build && npm --workspace @loopover/ui run test && npm --workspace @loopover/ui-miner 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", @@ -87,17 +87,17 @@ "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 build --workspace @jsonbored/gittensory-engine && npm run typecheck && npm run test:coverage && npm run test:engine-parity && npm run test:live-gate-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 build --workspace @loopover/engine && npm run typecheck && npm run test:coverage && npm run test:engine-parity && npm run test:live-gate-parity && npm run test:driver-parity && npm run test --workspace @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", - "validate": "npm run build --workspace @jsonbored/gittensory-engine && npm run typecheck && npm run test:coverage" + "validate": "npm run build --workspace @loopover/engine && npm run typecheck && npm run test:coverage" }, "dependencies": { "@asteasolutions/zod-to-openapi": "^8.5.0", "@cloudflare/puppeteer": "^1.1.0", "@hono/node-server": "^2.0.8", - "@jsonbored/gittensory-engine": "*", + "@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 7e6e0ea05f..e13ba066f4 100644 --- a/packages/gittensory-engine/README.md +++ b/packages/gittensory-engine/README.md @@ -1,11 +1,11 @@ -# @jsonbored/gittensory-engine +# @loopover/engine Shared, deterministic engine logic for the Gittensory review stack and the `gittensory-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 `@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 @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 @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 "@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 "@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 "@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 "@loopover/engine"; const result = computePairwiseCalibrationScore({ objectiveAnchor: 0.55, @@ -218,7 +218,7 @@ secrets, trust scores, reward values, private rankings, or maintainer evidence. import { computeGateVerdictCompositeCalibrationScore, ingestGateVerdictCalibrationSignals, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; const gateVerdicts = ingestGateVerdictCalibrationSignals([ { @@ -277,7 +277,7 @@ to pr_outcome-only gating. import { computePhase7CalibrationLoop, shouldScheduleHistoricalReplayRun, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; const prOutcome = { mergeConfirmed: 74, @@ -353,7 +353,7 @@ import { computeTrackRecordSummary, renderTrackRecordSummaryMarkdown, resolveTrackRecordSummaryConfig, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; const config = resolveTrackRecordSummaryConfig({ miner: { trackRecordSummary: { enabled: true } }, @@ -411,7 +411,7 @@ for raw review text, secrets, trust scores, reward values, private rankings, or import { computeFindingSeverityCompositeCalibrationScore, ingestFindingSeverityCalibrationSignals, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; const findingSeverity = ingestFindingSeverityCalibrationSignals([ { @@ -479,7 +479,7 @@ It has no fields for raw review text, secrets, trust scores, reward values, priv import { computeReviewerConsensusCompositeCalibrationScore, ingestReviewerConsensusCalibrationSignals, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; const reviewerConsensus = ingestReviewerConsensusCalibrationSignals([ { @@ -574,7 +574,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 "@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..bc98b7551f 100644 --- a/packages/gittensory-engine/package.json +++ b/packages/gittensory-engine/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-engine", + "name": "@loopover/engine", "version": "1.0.0", "license": "AGPL-3.0-only", "type": "module", diff --git a/packages/gittensory-engine/src/focus-manifest.ts b/packages/gittensory-engine/src/focus-manifest.ts index 90f672ac22..23bd25f32d 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 `@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 8bcca5b1de..d5b02bdef0 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 @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..446be9a463 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", "@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..8e103ae1fa 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 +// `@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..83d32dd837 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 `@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..0e56cf4944 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 `@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..f5cbeb23b3 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 +// `@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..1e485097e0 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 @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..5d2992fbf3 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 `@loopover/engine`, derived from this package's own package.json. */ export const ENGINE_VERSION: string = ownPackageJson.version; diff --git a/packages/gittensory-mcp/README.md b/packages/gittensory-mcp/README.md index 9bb77ff011..257822b44f 100644 --- a/packages/gittensory-mcp/README.md +++ b/packages/gittensory-mcp/README.md @@ -1,4 +1,4 @@ -# @jsonbored/gittensory-mcp +# @loopover/mcp Local stdio MCP wrapper for the Gittensory base-agent layer. @@ -13,7 +13,7 @@ The package is public. Gittensory keeps sensitive score, trust, wallet, and main Public npm: ```sh -npm install -g @jsonbored/gittensory-mcp@latest +npm install -g @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 @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) +@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": "@loopover/mcp", "version": "0.5.0", "apiVersion": "0.1.0", "node": "v22.12.0" @@ -236,14 +236,14 @@ Metadata-only fallback is used when the command is missing or fails. Run `gitten 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)/@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)/@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 53d6d30838..9871adc608 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 "@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"; @@ -213,7 +213,7 @@ const feasibilityGateShape = { * (#5157), so `gittensory_feasibility_gate` isn't purely trusting a caller-supplied `claimStatus` string. * Returns `null` (fall back to the caller-supplied value unchanged) only when there is genuinely nothing to * look up: no repo/issue supplied, no local install detected (the ledger DB file doesn't exist -- checked - * via `existsSync` BEFORE opening anything), or the sibling `@jsonbored/gittensory-miner` package isn't + * via `existsSync` BEFORE opening anything), or the sibling `@loopover/miner` package isn't * resolvable at all (a standalone gittensory-mcp install with no miner alongside it). When the ledger DB * file DOES exist (a real local install IS present) but reading it fails -- corrupt, locked, permission * denied -- this returns `"unknown"` rather than silently falling back to a caller-supplied string that @@ -231,7 +231,7 @@ async function resolveLedgerClaimStatus(repoFullName, issueNumber) { if (!repoFullName || !issueNumber) return null; let claimLedgerModule; try { - claimLedgerModule = await import("@jsonbored/gittensory-miner/lib/claim-ledger.js"); + claimLedgerModule = await import("@loopover/miner/lib/claim-ledger.js"); } catch { /* v8 ignore next -- gittensory-miner genuinely unresolvable (not installed alongside gittensory-mcp); not reproducible in this monorepo's workspace-hoisted test environment, where the sibling package always @@ -4023,7 +4023,7 @@ async function fetchLatestPackageVersion() { if (/^(1|true|yes)$/i.test(process.env.GITTENSORY_SKIP_NPM_VERSION_CHECK ?? "false")) return { status: "skipped" }; const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 5000); - const response = await fetch(`${npmRegistryUrl}/@jsonbored%2fgittensory-mcp/latest`, { + const response = await fetch(`${npmRegistryUrl}/@loopover%2fmcp/latest`, { signal: controller.signal, headers: { accept: "application/json" }, }).finally(() => clearTimeout(timeout)); diff --git a/packages/gittensory-mcp/lib/local-branch.js b/packages/gittensory-mcp/lib/local-branch.js index edf3a91225..fc5e88c912 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 "@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/@loopover/mcp/scripts/${script}`; } export function redactLocalPath(value) { diff --git a/packages/gittensory-mcp/package.json b/packages/gittensory-mcp/package.json index 56ff9ac2ab..6d6e94b982 100644 --- a/packages/gittensory-mcp/package.json +++ b/packages/gittensory-mcp/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-mcp", + "name": "@loopover/mcp", "version": "0.7.1", "license": "AGPL-3.0-only", "type": "module", @@ -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", + "@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..0812e7567d 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 "@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 1e04d4fa48..322e31eef3 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 `@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 @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 | ## Coding-agent provider configuration @@ -21,9 +21,9 @@ For provider selection and the CLI-specific model/timeout overrides, see 1. Install Node.js 22.13+ and the package: ```sh - npm install -g @jsonbored/gittensory-miner@latest + npm install -g @loopover/miner@latest # or from a checkout: - npm install && npm --workspace @jsonbored/gittensory-miner run build + npm install && npm --workspace @loopover/miner run build ``` 2. Inspect what is installed and where local state will live. `status` and `doctor` stay offline; `init --verify-token` is optional and makes one authenticated GitHub call up front: @@ -60,7 +60,7 @@ For provider selection and the CLI-specific model/timeout overrides, see the first time its subsystem actually runs (an attempt, a discovery pass, a replay, an Orb export, …), so a fresh install that has only run `status`/`doctor` will show a subset. All sixteen default into this one directory. Override the directory for every store at once with `GITTENSORY_MINER_CONFIG_DIR` or - `XDG_CONFIG_HOME` (same resolution chain as `@jsonbored/gittensory-mcp`); every store except `laptop-state.sqlite3` + `XDG_CONFIG_HOME` (same resolution chain as `@loopover/mcp`); every store except `laptop-state.sqlite3` (directory only) also honors its own `GITTENSORY_MINER__DB` path override — e.g. `GITTENSORY_MINER_PORTFOLIO_QUEUE_DB` — to relocate an individual file. `doctor`'s `store-integrity:*` checks report the persistent stores, so it is the quickest way to confirm what exists and is readable on disk. @@ -132,7 +132,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 @loopover/miner gittensory-miner init --verify-token # optional: validate GITHUB_TOKEN before discovery/attempt runs 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..ab95eb90f4 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 @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 +# Same ordering fix as the root gittensory-api Dockerfile — @loopover/engine must be # present when `npm ci` runs or gittensory-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 @loopover/engine run build +RUN npm --workspace @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 01ffeb0d73..48851763f2 100644 --- a/packages/gittensory-miner/README.md +++ b/packages/gittensory-miner/README.md @@ -1,4 +1,4 @@ -# @jsonbored/gittensory-miner +# @loopover/miner Foundation CLI for the local Gittensory miner runtime. @@ -62,7 +62,7 @@ is separate, later-wave scope. (#4851) 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 `@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 @@ -163,7 +163,7 @@ See [`docs/operations-runbook.md`](docs/operations-runbook.md) for SQLite concur Zero-infra local install — no Docker, Redis, or Postgres required: ```sh -npm install -g @jsonbored/gittensory-miner +npm install -g @loopover/miner gittensory-miner init gittensory-miner doctor gittensory-miner status @@ -175,8 +175,8 @@ From a local checkout: ```sh npm install -npm --workspace @jsonbored/gittensory-miner run build -npm link --workspace @jsonbored/gittensory-miner +npm --workspace @loopover/miner run build +npm link --workspace @loopover/miner ``` ### Coding-agent driver configuration @@ -245,7 +245,7 @@ This completes the read-only AMS MCP tool surface (status, portfolio, claims, ev ### Client config -`gittensory-mcp` (ORB's hosted contributor-workflow tools) and `gittensory-miner-mcp` (AMS's own local state-visibility tools above) can run as two separate stdio servers in the same MCP client session — useful for a dual-role operator running both ORB and AMS on the same box. Generate ORB's half with `gittensory-mcp init-client --print claude` (see the [`@jsonbored/gittensory-mcp` README](../gittensory-mcp/README.md#client-config)); `gittensory-miner-mcp` takes no flags, so its entry is just the bin name. Combined, a Claude Desktop / Claude Code style config looks like: +`gittensory-mcp` (ORB's hosted contributor-workflow tools) and `gittensory-miner-mcp` (AMS's own local state-visibility tools above) can run as two separate stdio servers in the same MCP client session — useful for a dual-role operator running both ORB and AMS on the same box. Generate ORB's half with `gittensory-mcp init-client --print claude` (see the [`@loopover/mcp` README](../gittensory-mcp/README.md#client-config)); `gittensory-miner-mcp` takes no flags, so its entry is just the bin name. Combined, a Claude Desktop / Claude Code style config looks like: ```json { @@ -266,4 +266,4 @@ This completes the read-only AMS MCP tool surface (status, portfolio, claims, ev ## 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 `@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 `@loopover/mcp`. diff --git a/packages/gittensory-miner/bin/gittensory-miner-mcp.js b/packages/gittensory-miner/bin/gittensory-miner-mcp.js index 83909e7213..9adee54bc1 100755 --- a/packages/gittensory-miner/bin/gittensory-miner-mcp.js +++ b/packages/gittensory-miner/bin/gittensory-miner-mcp.js @@ -17,7 +17,7 @@ import { PLAN_STATUSES, openPlanStore } from "../lib/plan-store.js"; import { initGovernorLedger } from "../lib/governor-ledger.js"; import { collectStatus, runDoctorChecks } from "../lib/status.js"; -// MCP stdio server for @jsonbored/gittensory-miner (scaffold #5153). Mirrors the packages/gittensory-mcp +// MCP stdio server for @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 8d4df3821a..d2507921a6 100755 --- a/packages/gittensory-miner/bin/gittensory-miner.js +++ b/packages/gittensory-miner/bin/gittensory-miner.js @@ -123,7 +123,7 @@ if (cliArgs[0] === "purge") { process.exit(runPurge(cliArgs.slice(1))); } -const packageName = "@jsonbored/gittensory-miner"; +const packageName = "@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 702f42c525..c5e8c9d450 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 `@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/config-precedence.md b/packages/gittensory-miner/docs/config-precedence.md index a00dc547ce..35b178376e 100644 --- a/packages/gittensory-miner/docs/config-precedence.md +++ b/packages/gittensory-miner/docs/config-precedence.md @@ -1,6 +1,6 @@ # Miner config precedence -AMS does **not** have a single `config.js` resolver. Configuration is layered by concern across several modules under `packages/gittensory-miner/lib/` and `@jsonbored/gittensory-engine`. This document states the order each layer **actually implements today** — not an idealized or corrected order. +AMS does **not** have a single `config.js` resolver. Configuration is layered by concern across several modules under `packages/gittensory-miner/lib/` and `@loopover/engine`. This document states the order each layer **actually implements today** — not an idealized or corrected order. ## Configuration layers diff --git a/packages/gittensory-miner/docs/cross-repo-discovery-phase1.md b/packages/gittensory-miner/docs/cross-repo-discovery-phase1.md index f93d91a6f4..2e9e8ad634 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 `@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..7a7e06716e 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 `@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 3f389addf3..1d7e42fa19 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 `@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..2fe80e5ef0 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`). +`@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 65dfcbc716..0a932adf71 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 `@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/operations-runbook.md b/packages/gittensory-miner/docs/operations-runbook.md index 7cfb420af0..cbae52fb58 100644 --- a/packages/gittensory-miner/docs/operations-runbook.md +++ b/packages/gittensory-miner/docs/operations-runbook.md @@ -163,7 +163,7 @@ Stores use the lightweight **`schema-version.js`** convention ([#4832](https://g **Operator checklist** -1. **Before upgrading** the `@jsonbored/gittensory-miner` package (npm, image tag, or git pull): +1. **Before upgrading** the `@loopover/miner` package (npm, image tag, or git pull): ```sh gittensory-miner doctor --json > /tmp/miner-pre-upgrade-doctor.json @@ -173,7 +173,7 @@ Stores use the lightweight **`schema-version.js`** convention ([#4832](https://g 2. **Stop** supervised loops (`systemctl stop gittensory-miner.service`, `docker compose stop miner`, etc.). -3. **Install** the new version (`npm install -g @jsonbored/gittensory-miner@latest`, rebuild image, …). The CLI prints a one-line npm upgrade nudge when behind registry latest — informational only. +3. **Install** the new version (`npm install -g @loopover/miner@latest`, rebuild image, …). The CLI prints a one-line npm upgrade nudge when behind registry latest — informational only. 4. **Migrate**, before starting any miner process, so every existing store is brought up to date in one deliberate pass instead of relying on whichever command happens to open a given store first: diff --git a/packages/gittensory-miner/docs/repo-agnostic-capability-audit.md b/packages/gittensory-miner/docs/repo-agnostic-capability-audit.md index 1f108ac8c9..13da811319 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 +`@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 `@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 `@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) +### `@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 de0fb4f26e..6fbac40645 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 "@loopover/engine"; export function resolveAmsPolicyConfigPath(env?: Record): string; export type AmsPolicySource = "local" | "default"; diff --git a/packages/gittensory-miner/lib/ams-policy.js b/packages/gittensory-miner/lib/ams-policy.js index 1e83fc567c..5a5bdfe505 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 { DEFAULT_AMS_POLICY_SPEC, parseAmsPolicySpecContent } from "@jsonbored/gittensory-engine"; +import { DEFAULT_AMS_POLICY_SPEC, parseAmsPolicySpecContent } from "@loopover/engine"; import { resolveLocalStoreDbPath } from "./local-store.js"; // Resolver for the operator-local `.gittensory-ams.yml` (#5132, Wave 3.5 follow-up). AmsPolicySpec @@ -52,7 +52,7 @@ function readLocalAmsPolicyContent(resolved) { * readFileSync?: (path: string, encoding: "utf8") => string, existsSync?: (path: string) => boolean, * env?: Record, * }} [options] - * @returns {Promise<{ spec: import("@jsonbored/gittensory-engine").AmsPolicySpec, source: "local"|"default", warnings: string[] }>} + * @returns {Promise<{ spec: import("@loopover/engine").AmsPolicySpec, source: "local"|"default", warnings: string[] }>} */ export async function resolveAmsPolicy(repoFullName, options = {}) { void repoFullName; diff --git a/packages/gittensory-miner/lib/attempt-cli.d.ts b/packages/gittensory-miner/lib/attempt-cli.d.ts index d717ba7bac..3dc05778e3 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 "@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 6d7bc86100..25e5a93b60 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 "@loopover/engine"; import { argsWantJson, describeCliError, reportCliFailure } from "./cli-error.js"; import { constructProductionCodingAgentDriver } from "./coding-agent-construction.js"; import { runSlopAssessment } from "./slop-assessment.js"; diff --git a/packages/gittensory-miner/lib/attempt-input-builder.d.ts b/packages/gittensory-miner/lib/attempt-input-builder.d.ts index 58ac4ae4d1..9df919cc5e 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 "@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 233fef8b44..3b2f11c8ac 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 "@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; @@ -27,7 +27,7 @@ import { isGlobalMinerKillSwitch, isGlobalMinerLiveModeOptIn } from "@jsonbored/ * caller already resolved through; passing nothing keeps the prior fails-open-on-that-axis-only behavior. * * @param {Record} env - * @param {import("@jsonbored/gittensory-engine").AmsPolicySpec} amsPolicySpec + * @param {import("@loopover/engine").AmsPolicySpec} amsPolicySpec * @param {boolean} [repoPaused] * @returns {import("./attempt-runner.js").AttemptGovernorContext} */ @@ -47,17 +47,17 @@ export function buildAttemptGovernorContext(env, amsPolicySpec, repoPaused) { * * @param {{ * codingTaskSpec: Extract, - * reviewContext: import("@jsonbored/gittensory-engine").SelfReviewContext, + * reviewContext: import("@loopover/engine").SelfReviewContext, * worktreePath: string, * attemptId: string, - * mode: import("@jsonbored/gittensory-engine").CodingAgentExecutionMode, + * mode: import("@loopover/engine").CodingAgentExecutionMode, * repoFullName: string, * minerLogin: string, * rejectionSignaled: boolean, - * amsPolicySpec: import("@jsonbored/gittensory-engine").AmsPolicySpec, + * amsPolicySpec: import("@loopover/engine").AmsPolicySpec, * branchRef?: string, * }} input - * @returns {import("@jsonbored/gittensory-engine").IterateLoopInput} + * @returns {import("@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..fddfeba3c7 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 "@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..63a5af4cda 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 "@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..1a6807dc45 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 "@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..c31786d598 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 "@loopover/engine"; +import { runIterateLoop } from "@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 (@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("@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("@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("@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..645c519db8 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 "@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..67ecd62edf 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 "@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 @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("@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("@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("@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/calibration-run.d.ts b/packages/gittensory-miner/lib/calibration-run.d.ts index f728d37a63..ac1d1516ff 100644 --- a/packages/gittensory-miner/lib/calibration-run.d.ts +++ b/packages/gittensory-miner/lib/calibration-run.d.ts @@ -5,7 +5,7 @@ import type { Phase7CalibrationManifest, PrOutcomeCalibrationInput, ReplayHarnessStatus, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; import type { AppendEventInput, LedgerEntry } from "./event-ledger.js"; import type { diff --git a/packages/gittensory-miner/lib/calibration-run.js b/packages/gittensory-miner/lib/calibration-run.js index ac6fc2182a..7babcd1c97 100644 --- a/packages/gittensory-miner/lib/calibration-run.js +++ b/packages/gittensory-miner/lib/calibration-run.js @@ -14,7 +14,7 @@ // (see docs/miner-selfimprove-calibration.md's maintainer-only boundary). The engine owns the deterministic // combine/freshness/threshold/hold-reason logic; this module owns scheduling the score and persisting the row. -import { computePhase7CalibrationLoop } from "@jsonbored/gittensory-engine"; +import { computePhase7CalibrationLoop } from "@loopover/engine"; import { computeObjectiveAnchor } from "./replay-objective-anchor.js"; /** Event-ledger vocabulary for a persisted Phase 7 calibration snapshot (mirrors MINER_PR_OUTCOME_EVENT). */ diff --git a/packages/gittensory-miner/lib/claim-adjudication.js b/packages/gittensory-miner/lib/claim-adjudication.js index fe99581bd8..f063c40eb8 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 @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 "@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-conflict-resolver.d.ts b/packages/gittensory-miner/lib/claim-conflict-resolver.d.ts index 5530cede2f..3f71336503 100644 --- a/packages/gittensory-miner/lib/claim-conflict-resolver.d.ts +++ b/packages/gittensory-miner/lib/claim-conflict-resolver.d.ts @@ -1,6 +1,6 @@ import type { LiveIssueSnapshot } from "./submission-freshness-check.js"; import type { ObservedClaim } from "./claim-adjudication.js"; -import type { LocalWriteActionSpec } from "@jsonbored/gittensory-engine"; +import type { LocalWriteActionSpec } from "@loopover/engine"; export function assembleCompetingClaims( snapshot: LiveIssueSnapshot | null | undefined, diff --git a/packages/gittensory-miner/lib/claim-conflict-resolver.js b/packages/gittensory-miner/lib/claim-conflict-resolver.js index 85c6689fea..50511bbdc9 100644 --- a/packages/gittensory-miner/lib/claim-conflict-resolver.js +++ b/packages/gittensory-miner/lib/claim-conflict-resolver.js @@ -23,7 +23,7 @@ // invisible to this one-shot check -- there is no retry/backoff here, which would be its own separate scope. import { adjudicateSoftClaim } from "./claim-adjudication.js"; -import { buildClosePrSpec } from "@jsonbored/gittensory-engine"; +import { buildClosePrSpec } from "@loopover/engine"; /** * Assemble the real competing-claims set from a fetched LiveIssueSnapshot: every OTHER open PR referencing @@ -56,7 +56,7 @@ export function assembleCompetingClaims(snapshot, selfPrNumber, minerLogin) { * @param {{ repoFullName: string, issueNumber: number, selfPrNumber: number, selfClaimedAt: string | null, minerLogin: string }} input * @param {{ * fetchLiveIssueSnapshot: (repoFullName: string, issueNumber: number) => Promise, - * executeLocalWrite: (spec: import("@jsonbored/gittensory-engine").LocalWriteActionSpec) => Promise, + * executeLocalWrite: (spec: import("@loopover/engine").LocalWriteActionSpec) => Promise, * }} deps * @returns {Promise<{ * checked: boolean, diff --git a/packages/gittensory-miner/lib/claim-ledger.js b/packages/gittensory-miner/lib/claim-ledger.js index d6eff9a429..1faa8a7218 100644 --- a/packages/gittensory-miner/lib/claim-ledger.js +++ b/packages/gittensory-miner/lib/claim-ledger.js @@ -103,7 +103,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 `@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 fe3eda2c96..26d8feeaa0 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 "@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 79308aa510..b3109bf343 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 "@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("@loopover/engine").CliSubprocessSpawnFn} */ export function createRealCliSubprocessSpawn() { return (cmd, args, opts) => @@ -73,14 +73,14 @@ 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("@loopover/engine").CliSubprocessSpawnFn, + * query?: import("@loopover/engine").AgentSdkQueryFn, + * hooks?: import("@loopover/engine").AgentSdkHooks, * listChangedFiles?: (cwd: string) => Promise, * houseRulesConfig?: unknown, * houseRulesOptions?: unknown, * }} [options] - * @returns {import("@jsonbored/gittensory-engine").CodingAgentDriver} + * @returns {import("@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..a47aca9a62 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 "@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 c989335efc..b8ddea8764 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 -> @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 @@ -20,7 +20,7 @@ // no production caller today -- it's a lower-level composable for a hypothetical caller that wants the // non-iterate-loop path, not something this package currently needs. -import { runCodingAgentAttempt } from "@jsonbored/gittensory-engine"; +import { runCodingAgentAttempt } from "@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..711851d2c8 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 "@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 46e531508c..8fd2864d53 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 "@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 +// @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. +// @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("@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("@loopover/engine").FeasibilityGateResult} feasibility + * @returns {import("@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("@loopover/engine").AcceptanceCriteria} acceptanceCriteria * @returns {{ written: boolean, path: string | null }} */ function assertContainedPath(root, path) { diff --git a/packages/gittensory-miner/lib/config-precedence.d.ts b/packages/gittensory-miner/lib/config-precedence.d.ts index f88be25fb1..8f62cd42c1 100644 --- a/packages/gittensory-miner/lib/config-precedence.d.ts +++ b/packages/gittensory-miner/lib/config-precedence.d.ts @@ -1,5 +1,5 @@ -import type { MinerActionMode, MinerKillSwitchScope } from "@jsonbored/gittensory-engine"; -import type { CodingAgentExecutionMode } from "@jsonbored/gittensory-engine"; +import type { MinerActionMode, MinerKillSwitchScope } from "@loopover/engine"; +import type { CodingAgentExecutionMode } from "@loopover/engine"; import type { ForgeConfig } from "./forge-config.js"; export function resolveDocumentedKillSwitchScope( diff --git a/packages/gittensory-miner/lib/config-precedence.js b/packages/gittensory-miner/lib/config-precedence.js index be8badba36..27b1bbe71e 100644 --- a/packages/gittensory-miner/lib/config-precedence.js +++ b/packages/gittensory-miner/lib/config-precedence.js @@ -6,7 +6,7 @@ import { resolveCodingAgentExecutionMode, resolveMinerActionMode, resolveMinerKillSwitch, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; import { resolveForgeConfig } from "./forge-config.js"; /** Kill-switch scope from operator env + parsed goal-spec `killSwitch.paused`. */ diff --git a/packages/gittensory-miner/lib/deployment-docs-audit.js b/packages/gittensory-miner/lib/deployment-docs-audit.js index 6ac07b5018..424f816929 100644 --- a/packages/gittensory-miner/lib/deployment-docs-audit.js +++ b/packages/gittensory-miner/lib/deployment-docs-audit.js @@ -7,7 +7,7 @@ /** The miner's own env-var namespace: GITTENSORY_MINER_* and the shorter MINER_* aliases it reads. */ const ENV_VAR_PATTERN = /\b(?:GITTENSORY_MINER|MINER)_[A-Z0-9_]+\b/g; -/** `gittensory-miner ` CLI invocations, excluding the `@jsonbored/gittensory-miner` package spelling. */ +/** `gittensory-miner ` CLI invocations, excluding the `@loopover/miner` package spelling. */ const SUBCOMMAND_PATTERN = /(?} */ diff --git a/packages/gittensory-miner/lib/feasibility-cli.d.ts b/packages/gittensory-miner/lib/feasibility-cli.d.ts index 4cf46b633e..38fb85a5de 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 "@loopover/engine"; export type ParsedFeasibilityArgs = | { diff --git a/packages/gittensory-miner/lib/feasibility-cli.js b/packages/gittensory-miner/lib/feasibility-cli.js index a97b9227b4..06cfd76757 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 "@loopover/engine"; import { argsWantJson, reportCliFailure } from "./cli-error.js"; const CLAIM_STATUSES = ["unclaimed", "claimed", "solved", "unknown"]; diff --git a/packages/gittensory-miner/lib/governor-action-mode.d.ts b/packages/gittensory-miner/lib/governor-action-mode.d.ts index 90ee4db0a4..b4d2138131 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 "@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..ca2db0357a 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 "@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("@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("@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..e98c9c34b7 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 "@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..82f3ac8dbd 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 "@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..3c29a3b273 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 "@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("@loopover/engine").GovernorChokepointInput} input * @param {{ append?: typeof appendGovernorEvent }} [options] * @returns {{ - * decision: import("@jsonbored/gittensory-engine").GovernorDecision, + * decision: import("@loopover/engine").GovernorDecision, * recorded: import("./governor-ledger.js").GovernorLedgerEntry, - * rateLimitBuckets: import("@jsonbored/gittensory-engine").WriteRateLimitBucketStore, - * rateLimitBackoffAttempts: import("@jsonbored/gittensory-engine").WriteRateLimitBackoffStore, + * rateLimitBuckets: import("@loopover/engine").WriteRateLimitBucketStore, + * rateLimitBackoffAttempts: import("@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..071e21d215 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 "@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..6cd2bdbf5d 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 "@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("@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("@loopover/engine").MinerKillSwitchScope} input.previousScope + * @param {import("@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 f8f9a4f931..6f1a219f9d 100644 --- a/packages/gittensory-miner/lib/governor-ledger-cli.js +++ b/packages/gittensory-miner/lib/governor-ledger-cli.js @@ -1,6 +1,6 @@ import { runGovernorPause, runGovernorResume, runGovernorStatus } from "./governor-pause-cli.js"; -/** Must match `GOVERNOR_LEDGER_EVENT_TYPES` in `@jsonbored/gittensory-engine`. */ +/** Must match `GOVERNOR_LEDGER_EVENT_TYPES` in `@loopover/engine`. */ import { argsWantJson, describeCliError, reportCliFailure } from "./cli-error.js"; const GOVERNOR_LEDGER_EVENT_TYPES = Object.freeze([ diff --git a/packages/gittensory-miner/lib/governor-ledger.js b/packages/gittensory-miner/lib/governor-ledger.js index e5828597c8..55544c611e 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 "@loopover/engine"; import { applySchemaMigrations } from "./schema-version.js"; import { GOVERNOR_LEDGER_PURGE_SPEC, diff --git a/packages/gittensory-miner/lib/governor-open-pr.d.ts b/packages/gittensory-miner/lib/governor-open-pr.d.ts index 5e0dd95270..1dc5181027 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 "@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..88d0e802ee 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 "@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("@loopover/engine").SelfPlagiarismCandidate} input.candidate + * @param {readonly import("@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..aaae0332e4 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 "@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..a5bd67e132 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 "@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("@loopover/engine").GovernorCapUsage} input.usage cumulative run usage + * @param {import("@loopover/engine").GovernorCapLimits} input.limits run ceilings + * @param {import("@loopover/engine").PortfolioConvergenceInput} input.convergence in-flight item history + * @param {import("@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 d2efc4030e..fd62be4224 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 "@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..34af17d2f2 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 "@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..52cce9e66c 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 "@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("@loopover/engine").WriteRateLimitBucketStore} input.buckets + * @param {import("@loopover/engine").WriteRateLimitBackoffStore} input.backoffAttempts * @param {number} input.nowMs clock reading in epoch ms - * @param {import("@jsonbored/gittensory-engine").WriteRateLimitPolicies} [input.policies] + * @param {import("@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..74ee4af9c2 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 "@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`, @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 76662fb768..9b6ff15131 100644 --- a/packages/gittensory-miner/lib/loop-cli.js +++ b/packages/gittensory-miner/lib/loop-cli.js @@ -43,7 +43,7 @@ import { recordPrOutcomeSnapshot } from "./pr-outcome.js"; import { buildLoopClosureSummary } from "./loop-closure.js"; import { attemptLoopReentry } from "./loop-reentry.js"; import { parsePrNumberFromExecResult } from "./pr-number-parse.js"; -import { DEFAULT_AMS_POLICY_SPEC } from "@jsonbored/gittensory-engine"; +import { DEFAULT_AMS_POLICY_SPEC } from "@loopover/engine"; const LOOP_USAGE = "Usage: gittensory-miner loop [...] | --search --miner-login [--base ] [--live] [--dry-run] [--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..d183502384 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 "@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, @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/metrics-cli.d.ts b/packages/gittensory-miner/lib/metrics-cli.d.ts index 921b782d90..ada117cd75 100644 --- a/packages/gittensory-miner/lib/metrics-cli.d.ts +++ b/packages/gittensory-miner/lib/metrics-cli.d.ts @@ -1,4 +1,4 @@ -import type { MinerPredictionMetricRow } from "@jsonbored/gittensory-engine"; +import type { MinerPredictionMetricRow } from "@loopover/engine"; import type { PredictionLedger } from "./prediction-ledger.js"; export function collectPredictionMetricRows(ledger: PredictionLedger): MinerPredictionMetricRow[]; diff --git a/packages/gittensory-miner/lib/metrics-cli.js b/packages/gittensory-miner/lib/metrics-cli.js index 30da05754a..5c46a596be 100644 --- a/packages/gittensory-miner/lib/metrics-cli.js +++ b/packages/gittensory-miner/lib/metrics-cli.js @@ -1,4 +1,4 @@ -import { renderMinerPredictionMetrics } from "@jsonbored/gittensory-engine"; +import { renderMinerPredictionMetrics } from "@loopover/engine"; import { initPredictionLedger } from "./prediction-ledger.js"; import { argsWantJson, describeCliError, reportCliFailure } from "./cli-error.js"; diff --git a/packages/gittensory-miner/lib/miner-goal-spec.d.ts b/packages/gittensory-miner/lib/miner-goal-spec.d.ts index 0815fc6e63..14eee74ffc 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 "@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 0f6ad3933c..a61b1d169e 100644 --- a/packages/gittensory-miner/lib/miner-goal-spec.js +++ b/packages/gittensory-miner/lib/miner-goal-spec.js @@ -1,6 +1,6 @@ import { closeSync, constants, existsSync, fstatSync, openSync, readSync } from "node:fs"; import { join } from "node:path"; -import { discoverMinerGoalSpecPath, parseMinerGoalSpecContent } from "@jsonbored/gittensory-engine"; +import { discoverMinerGoalSpecPath, parseMinerGoalSpecContent } from "@loopover/engine"; const MAX_MINER_GOAL_SPEC_BYTES = 32_768; @@ -50,7 +50,7 @@ function readRegularUtf8File(path, options) { * * @param {string} repoPath * @param {{ existsSync?: (path: string) => boolean, openSync?: (path: string, flags: number) => number, fstatSync?: (fd: number) => import("node:fs").Stats, readSync?: (fd: number, buffer: Buffer, offset: number, length: number, position: number | null) => number, closeSync?: (fd: number) => void }} [options] - * @returns {import("@jsonbored/gittensory-engine").ParsedMinerGoalSpec} + * @returns {import("@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 2786da4e95..24ad54be69 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 "@loopover/engine"; import { resolveForgeConfig } from "./forge-config.js"; import { DEFAULT_RATE_LIMIT_HIGH_WATER_MARK, diff --git a/packages/gittensory-miner/lib/opportunity-ranker.d.ts b/packages/gittensory-miner/lib/opportunity-ranker.d.ts index efc76dee3a..42738b4c10 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 "@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..8b9b8e75ef 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 "@loopover/engine"; function finiteEpochMs(value) { return Number.isFinite(value) ? value : Date.now(); diff --git a/packages/gittensory-miner/lib/policy-verdict-cache.d.ts b/packages/gittensory-miner/lib/policy-verdict-cache.d.ts index 7a4bd3ad87..8fab1f4aef 100644 --- a/packages/gittensory-miner/lib/policy-verdict-cache.d.ts +++ b/packages/gittensory-miner/lib/policy-verdict-cache.d.ts @@ -1,4 +1,4 @@ -import type { AiPolicyVerdict } from "@jsonbored/gittensory-engine"; +import type { AiPolicyVerdict } from "@loopover/engine"; export type PolicyVerdictDecisiveDoc = "AI-USAGE.md" | "CONTRIBUTING.md"; diff --git a/packages/gittensory-miner/lib/portfolio-queue-manager.d.ts b/packages/gittensory-miner/lib/portfolio-queue-manager.d.ts index 86ebd80cd7..8f7cb8937b 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 "@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 bd94ac2c76..c152ddc499 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 "@loopover/engine"; import { DEFAULT_FORGE_CONFIG } from "./forge-config.js"; import { initPortfolioQueueStore } from "./portfolio-queue.js"; import { DEFAULT_MAX_LEASE_MS, sweepStuckItems } from "./portfolio-queue-expiry.js"; @@ -113,7 +113,7 @@ export function initPortfolioQueueManager(options = {}) { reclaimStuckItems(maxLeaseMs = staleLeaseMs) { return sweepStuckItems(store, Date.now(), maxLeaseMs); }, - // The engine primitive itself (@jsonbored/gittensory-engine's nextEligibleItems) has no apiBaseUrl concept -- + // The engine primitive itself (@loopover/engine's nextEligibleItems) has no apiBaseUrl concept -- // it only ever sees the opaque `id` string. queueItemId/parseQueueItemId (#5563) smuggle the host through // that id round-trip, so selectFn's output below correctly carries each selected item's OWN apiBaseUrl into // batchClaim, instead of every claim defaulting to github.com regardless of which host's row was selected. diff --git a/packages/gittensory-miner/lib/rejection-signal.js b/packages/gittensory-miner/lib/rejection-signal.js index d05124d764..6f5c225883 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 "@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..8c1d6a993d 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 "@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..dd03136559 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 "@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 +// @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..a168d0fa2b 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 "@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 2c653062b6..fa9164d684 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, MAX_FOCUS_MANIFEST_BYTES, parseFocusManifestContent } from "@jsonbored/gittensory-engine"; +import { buildCollisionReport, MAX_FOCUS_MANIFEST_BYTES, parseFocusManifestContent } from "@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, MAX_FOCUS_MANIFEST_BYTES, parseFocusManifestConte // 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 @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..833e490e67 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 "@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..3e447c12fe 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 "@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("@loopover/engine").SlopAssessmentInput} input + * @returns {import("@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 9835cc9952..0382c4957f 100644 --- a/packages/gittensory-miner/lib/status.js +++ b/packages/gittensory-miner/lib/status.js @@ -2,7 +2,7 @@ import { accessSync, constants, existsSync, mkdirSync, readFileSync, rmSync, wri import { createRequire } from "node:module"; import { homedir } from "node:os"; import { join } from "node:path"; -import { CODING_AGENT_DRIVER_CONFIG_ENV, parseMinerGoalSpecContent, resolveFirstConfiguredCodingAgentDriverName } from "@jsonbored/gittensory-engine"; +import { CODING_AGENT_DRIVER_CONFIG_ENV, parseMinerGoalSpecContent, resolveFirstConfiguredCodingAgentDriverName } from "@loopover/engine"; import { checkClaudeCliPresent, checkCodexCliPresent, @@ -38,8 +38,8 @@ function moduleDir() { return (cachedModuleDir ??= import.meta.dirname); } -const PACKAGE_NAME = "@jsonbored/gittensory-miner"; -const ENGINE_PACKAGE = "@jsonbored/gittensory-engine"; +const PACKAGE_NAME = "@loopover/miner"; +const ENGINE_PACKAGE = "@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", @@ -62,7 +62,7 @@ export function resolveMinerStateDir(env = process.env) { } /** - * The REAL installed @jsonbored/gittensory-engine version, for `status`'s own display. Prefers `readInstalled` + * The REAL installed @loopover/engine version, for `status`'s own display. Prefers `readInstalled` * (the actually-resolved semver from node_modules/the monorepo workspace, the same real resolution `doctor`'s * engine-version-skew check already relies on) -- a self-hoster asking "what's installed" wants the real * answer, not the declared dependency RANGE ("*" in this monorepo, which tells them nothing). Falls back to @@ -112,7 +112,7 @@ export function readInstalledEnginePackageVersionFromPaths( return null; } -/** Installed @jsonbored/gittensory-engine semver from node_modules (not the declared dependency range). */ +/** Installed @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..551b18035d 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 = "@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 d7030a9a41..65c1e05744 100644 --- a/packages/gittensory-miner/package.json +++ b/packages/gittensory-miner/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-miner", + "name": "@loopover/miner", "version": "0.1.0", "license": "AGPL-3.0-only", "type": "module", @@ -40,7 +40,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-run.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-conflict-resolver.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/deployment-docs-audit.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/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-pause-cli.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/logger.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/metrics-cli.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/policy-doc-cache.js && node --check lib/policy-verdict-cache.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-number-parse.js && node --check lib/pr-outcome.js && node --check lib/prediction-ledger.js && node --check lib/pretooluse-hook.js && node --check lib/purge-cli.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/stack-detection.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": "*", + "@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..cd0153c712 100644 --- a/packages/gittensory-ui-kit/package.json +++ b/packages/gittensory-ui-kit/package.json @@ -1,5 +1,5 @@ { - "name": "@jsonbored/gittensory-ui-kit", + "name": "@loopover/ui-kit", "version": "0.1.0", "license": "AGPL-3.0-only", "type": "module", diff --git a/release-please-config.json b/release-please-config.json index 48a78a1f36..8ee2e4c90e 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": "@loopover/mcp" }, "packages/gittensory-engine": { "release-type": "node", "component": "engine", - "package-name": "@jsonbored/gittensory-engine" + "package-name": "@loopover/engine" } }, "include-component-in-tag": true, diff --git a/review-enrichment/package-lock.json b/review-enrichment/package-lock.json index f43aa44d53..9a8078195f 100644 --- a/review-enrichment/package-lock.json +++ b/review-enrichment/package-lock.json @@ -1,11 +1,11 @@ { - "name": "gittensory-review-enrichment", + "name": "@loopover/rees", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "gittensory-review-enrichment", + "name": "@loopover/rees", "version": "0.1.0", "dependencies": { "@hono/node-server": "^1.19.14", diff --git a/review-enrichment/package.json b/review-enrichment/package.json index 029d8cce7f..f2fb9ff7da 100644 --- a/review-enrichment/package.json +++ b/review-enrichment/package.json @@ -1,5 +1,5 @@ { - "name": "gittensory-review-enrichment", + "name": "@loopover/rees", "version": "0.1.0", "private": true, "type": "module", diff --git a/review-enrichment/src/github-headers.ts b/review-enrichment/src/github-headers.ts index f47e7029d2..45b9574d7a 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-rees"; /** 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..090454aefc 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-rees", }); }); @@ -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-rees", }); }); diff --git a/scripts/check-engine-parity.ts b/scripts/check-engine-parity.ts index 7c6cb53692..8e225addeb 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 @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 = "@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 @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..1d97263e2b 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", "@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..8b504c13cb 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 = "@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 7ebd99d57a..1aeafcce4c 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", "@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 3982471907..34c75490c7 100644 --- a/scripts/check-miner-package.mjs +++ b/scripts/check-miner-package.mjs @@ -66,7 +66,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", "@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..0f1238dcf2 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 @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..6510446b76 100644 --- a/scripts/check-ui-mcp-version-copy.mjs +++ b/scripts/check-ui-mcp-version-copy.mjs @@ -4,8 +4,8 @@ import { join, relative } from "node:path"; import { get } from "node:https"; const root = process.cwd(); -const packageName = "@jsonbored/gittensory-mcp"; -const registryUrl = "https://registry.npmjs.org/@jsonbored%2fgittensory-mcp"; +const packageName = "@loopover/mcp"; +const registryUrl = "https://registry.npmjs.org/@loopover%2fmcp"; const sourceLatestPath = join(root, "apps/gittensory-ui/src/lib/mcp-package.ts"); const targets = [ "README.md", @@ -54,13 +54,13 @@ for (const file of targets.flatMap(collectSourceFiles)) { if (/\b0\.2\.0\b/.test(line) && !isMinimumSupportedContext(line)) { failures.push(`${label}:${lineNumber}: 0.2.0 is only allowed as an explicit minimum-supported compatibility floor`); } - if (/@jsonbored\/gittensory-mcp(?:\s+|@)v?\d+\.\d+\.\d+/.test(line)) { + if (/@loopover\/mcp(?:\s+|@)v?\d+\.\d+\.\d+/.test(line)) { failures.push(`${label}:${lineNumber}: hardcoded ${packageName} display version`); } - if (/(?:npm (?:i|install) -g|npx -y)\s+@jsonbored\/gittensory-mcp(?!@)/.test(line)) { + if (/(?:npm (?:i|install) -g|npx -y)\s+@loopover\/mcp(?!@)/.test(line)) { failures.push(`${label}:${lineNumber}: install command must use ${packageName}@latest or resolved npm latest`); } - if (/args\s*=\s*\[.*"@jsonbored\/gittensory-mcp"/.test(line) || /"args":\s*\[.*"@jsonbored\/gittensory-mcp"/.test(line)) { + if (/args\s*=\s*\[.*"@loopover\/mcp"/.test(line) || /"args":\s*\[.*"@loopover\/mcp"/.test(line)) { failures.push(`${label}:${lineNumber}: MCP client args must use ${packageName}@latest or resolved npm latest`); } }); diff --git a/scripts/deploy-selfhost-prebuilt.sh b/scripts/deploy-selfhost-prebuilt.sh index 039e6cb747..b6965a4e8b 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 @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..603a6289fd 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: @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..1033e46067 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. +// `@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 bfd02f215d..0beac8ccf6 100644 --- a/src/mcp/local-write-tools.ts +++ b/src/mcp/local-write-tools.ts @@ -18,4 +18,4 @@ export { buildTestGenSpec, type LocalWriteActionSpec, type LocalWriteJsonValue, -} from "@jsonbored/gittensory-engine"; +} from "@loopover/engine"; diff --git a/src/review/issue-rag-wire.ts b/src/review/issue-rag-wire.ts index 9ca4e0a695..e5d4e83c16 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 `@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..ab39f9106e 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 `@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..5bd7775719 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 `@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..96e724df3f 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 `@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 446bd635e0..081df6b08a 100644 --- a/src/selfhost/ai.ts +++ b/src/selfhost/ai.ts @@ -410,7 +410,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 `@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 cbb79b4505..9db3bad3b4 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 = "@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..21b86c7a79 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 `@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..1b22db05fd 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 `@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..9ff007beaf 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 `@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..07c988745d 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 +// `@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..964bdc42e4 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 `@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 `@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 `@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..78b75b9764 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 `@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/systemd/gittensory-miner.service.example b/systemd/gittensory-miner.service.example index 761d3998a8..62603303a8 100644 --- a/systemd/gittensory-miner.service.example +++ b/systemd/gittensory-miner.service.example @@ -9,7 +9,7 @@ # .timer.) See DEPLOYMENT.md's "Bare-host (systemd, no Docker)" section. # # Install (adjust the placeholders below to your host): -# npm install -g @jsonbored/gittensory-miner # puts the `gittensory-miner` bin on PATH +# npm install -g @loopover/miner # puts the `gittensory-miner` bin on PATH # gittensory-miner init # one-time local state-dir setup # gittensory-miner doctor # confirm Node/state-dir/SQLite readiness # sudo cp systemd/gittensory-miner.service.example /etc/systemd/system/gittensory-miner.service diff --git a/test/integration/api.test.ts b/test/integration/api.test.ts index ce09377ab4..86c8c3c337 100644 --- a/test/integration/api.test.ts +++ b/test/integration/api.test.ts @@ -120,7 +120,7 @@ describe("api routes", () => { service: "loopover-api", apiVersion: "0.1.0", mcp: { - packageName: "@jsonbored/gittensory-mcp", + packageName: "@loopover/mcp", minimumSupportedVersion: "0.5.0", latestRecommendedVersion: mcpPackageJson.version, latestPackageVersion: mcpPackageJson.version, @@ -3591,7 +3591,7 @@ describe("api routes", () => { method: "POST", headers: { ...apiHeaders(env), - "x-gittensory-mcp-package": "@jsonbored/gittensory-mcp", + "x-gittensory-mcp-package": "@loopover/mcp", "x-gittensory-mcp-version": "0.4.0", "x-gittensory-mcp-client": "gittensory-mcp-cli", }, @@ -6670,7 +6670,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": "@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-calibration-loop.test.ts b/test/integration/miner-calibration-loop.test.ts index ddd5a8b5f7..6d0c0d7d7a 100644 --- a/test/integration/miner-calibration-loop.test.ts +++ b/test/integration/miner-calibration-loop.test.ts @@ -12,7 +12,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; // Resolve the engine PACKAGE import inside calibration-run.js to the in-repo source, so the runner's default // (non-injected) combine runs the real computePhase7CalibrationLoop rather than a stub. -vi.mock("@jsonbored/gittensory-engine", async () => import("../../packages/gittensory-engine/src/index")); +vi.mock("@loopover/engine", async () => import("../../packages/gittensory-engine/src/index")); import { MINER_CALIBRATION_SNAPSHOT_EVENT, diff --git a/test/integration/miner-discovery-pipeline.test.ts b/test/integration/miner-discovery-pipeline.test.ts index 546ad4c55b..e635a1192a 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("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/check-engine-parity-script.test.ts b/test/unit/check-engine-parity-script.test.ts index 598fb058cb..cb46d4ea39 100644 --- a/test/unit/check-engine-parity-script.test.ts +++ b/test/unit/check-engine-parity-script.test.ts @@ -465,7 +465,7 @@ describe("check-engine-parity script", () => { throw new Error("unreadable"); })).toBeNull(); - const engineDir = join(emptyRoot, "node_modules", "@jsonbored", "gittensory-engine"); + const engineDir = join(emptyRoot, "node_modules", "@loopover", "engine"); mkdirSync(engineDir, { recursive: true }); writeFileSync(join(engineDir, "package.json"), "not-json"); expect(defaultResolveInstalledEngineVersion(emptyRoot)).toBeNull(); diff --git a/test/unit/ci-engine-miner-filters.test.ts b/test/unit/ci-engine-miner-filters.test.ts index 6881baf109..0a08fa51e3 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 @loopover/engine"); expect(ci).toContain("npm run build:miner"); expect(ci).toContain("npm run test:miner-pack"); }); diff --git a/test/unit/ci-extension-packages.test.ts b/test/unit/ci-extension-packages.test.ts index 9402927cae..d73d7c3316 100644 --- a/test/unit/ci-extension-packages.test.ts +++ b/test/unit/ci-extension-packages.test.ts @@ -31,7 +31,7 @@ describe("browser extension workspace packages (#4866)", () => { expect(workflow).toContain("npm run extension:lint && npm run miner-extension:lint"); expect(workflow).toContain("npm run extension:typecheck && npm run miner-extension:typecheck"); expect(workflow).toContain( - "npm run extension:build && npm run miner-extension:build && npm --workspace @jsonbored/gittensory-ui run build", + "npm run extension:build && npm run miner-extension:build && npm --workspace @loopover/ui run build", ); }); }); diff --git a/test/unit/ci-ui-build-openapi.test.ts b/test/unit/ci-ui-build-openapi.test.ts index d05a6f1e7c..cc9be24969 100644 --- a/test/unit/ci-ui-build-openapi.test.ts +++ b/test/unit/ci-ui-build-openapi.test.ts @@ -16,7 +16,7 @@ describe("UI build steps skip the redundant OpenAPI regen", () => { const step = workflow.slice(stepStart, stepEnd === -1 ? undefined : stepEnd); expect(step).toContain( - "run: npm run extension:build && npm run miner-extension:build && npm --workspace @jsonbored/gittensory-ui run build", + "run: npm run extension:build && npm run miner-extension:build && npm --workspace @loopover/ui run build", ); expect(step).not.toContain("npm run ui:build"); }); @@ -25,7 +25,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:lint && npm run miner-extension:lint && npm run extension:typecheck && npm run miner-extension:typecheck && npm run extension:build && npm run miner-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:lint && npm run miner-extension:lint && npm run extension:typecheck && npm run miner-extension:typecheck && npm run extension:build && npm run miner-extension:build && npm --workspace @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 63fc760978..9504fc9c1b 100644 --- a/test/unit/coding-agent-miner.test.ts +++ b/test/unit/coding-agent-miner.test.ts @@ -649,7 +649,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 @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-miner-quickstart.test.ts b/test/unit/docs-miner-quickstart.test.ts index 038fcdad37..837a263440 100644 --- a/test/unit/docs-miner-quickstart.test.ts +++ b/test/unit/docs-miner-quickstart.test.ts @@ -12,7 +12,7 @@ describe("docs miner quickstart page", () => { const normalizedSource = source.replace(/\s+/g, " "); it("documents the full miner loop: install, auth, doctor, plan, preflight, packet", () => { - expect(source).toMatch(/@jsonbored\/gittensory-mcp/); + expect(source).toMatch(/@loopover\/mcp/); expect(source).toMatch(/gittensory-mcp login/); expect(source).toMatch(/gittensory-mcp whoami/); expect(source).toMatch(/gittensory-mcp status/); diff --git a/test/unit/docs-selfhost-update-rollback.test.ts b/test/unit/docs-selfhost-update-rollback.test.ts index a4b7aea365..cfe3a1789b 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("@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..50626ba795 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("@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..47fd9d9ad2 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("@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..e32e6ef89c 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\/@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 448b99fe73..24c3616b0b 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("@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..070b67e443 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 = `@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("@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..7ff96e6661 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 @loopover/mcp@latest", }); - expect(payload.package.npxFallback).toContain("npx @jsonbored/gittensory-mcp@latest"); + expect(payload.package.npxFallback).toContain("npx @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 @loopover/mcp@latest"); + expect(version?.remediation).toContain("npx @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 @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 @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 @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 @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 @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..50a03b8ea0 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: "@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("@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..f04641942c 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": "@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: "@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": "@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..fc24d19aa9 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("@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..466d19c12c 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 @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..0209147142 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": "@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 5ec31c32b5..e7f301bfd7 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("@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 dbe4ef73bf..9cdfafbb5c 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("@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 7c9f5b1fc8..f566f2e7de 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("@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..5f65906044 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("@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 ab3b1314c3..c5acc59633 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("@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..eb5eea6812 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("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-calibration-run.test.ts b/test/unit/miner-calibration-run.test.ts index 92ef0be113..c5dfe12fa8 100644 --- a/test/unit/miner-calibration-run.test.ts +++ b/test/unit/miner-calibration-run.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it, vi } from "vitest"; // The runner imports `computePhase7CalibrationLoop` from the engine PACKAGE; resolve it to the in-repo source so the // default (non-injected) combine branch runs against the real engine, exactly like miner-feasibility-cli.test.ts. -vi.mock("@jsonbored/gittensory-engine", async () => import("../../packages/gittensory-engine/src/index")); +vi.mock("@loopover/engine", async () => import("../../packages/gittensory-engine/src/index")); import { MINER_CALIBRATION_SNAPSHOT_EVENT, diff --git a/test/unit/miner-claim-conflict-resolver.test.ts b/test/unit/miner-claim-conflict-resolver.test.ts index a5c088e903..d8e64ba0a9 100644 --- a/test/unit/miner-claim-conflict-resolver.test.ts +++ b/test/unit/miner-claim-conflict-resolver.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@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..c06dc234bb 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("@loopover/engine"); }); }); diff --git a/test/unit/miner-cli-e2e.test.ts b/test/unit/miner-cli-e2e.test.ts index ca84128b10..7270d50e60 100644 --- a/test/unit/miner-cli-e2e.test.ts +++ b/test/unit/miner-cli-e2e.test.ts @@ -45,7 +45,7 @@ describe("gittensory-miner true CLI end-to-end flows (#4869)", () => { expect(status.status).toBe(0); const statusPayload = JSON.parse(status.stdout); expect(statusPayload.stateDir).toBe(configDir); - expect(statusPayload.package.name).toBe("@jsonbored/gittensory-miner"); + expect(statusPayload.package.name).toBe("@loopover/miner"); const doctor = await runAsync(["doctor", "--json"], env); expect(doctor.status).toBe(0); diff --git a/test/unit/miner-cli.test.ts b/test/unit/miner-cli.test.ts index acf16de9dc..162261763c 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: "@loopover/miner", packageVersion: "0.1.0", }); expect(log).toHaveBeenCalledWith( - expect.stringContaining("@jsonbored/gittensory-miner/0.1.0"), + expect.stringContaining("@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: "@loopover/miner" }); const text = log.mock.calls[0]?.[0]; expect(text).toContain("gittensory-miner --help"); expect(text).toContain("gittensory-miner version"); @@ -75,10 +75,10 @@ describe("gittensory-miner CLI helpers", () => { .spyOn(console, "error") .mockImplementation(() => undefined); expect( - runCli(["mystery"], { packageName: "@jsonbored/gittensory-miner" }), + runCli(["mystery"], { packageName: "@loopover/miner" }), ).toBe(1); expect(error).toHaveBeenCalledWith( - "Unknown command: mystery. Run @jsonbored/gittensory-miner --help.", + "Unknown command: mystery. Run @loopover/miner --help.", ); }); @@ -86,11 +86,11 @@ describe("gittensory-miner CLI helpers", () => { const log = vi.spyOn(console, "log").mockImplementation(() => undefined); const error = vi.spyOn(console, "error").mockImplementation(() => undefined); expect( - runCli(["mystery", "--json"], { packageName: "@jsonbored/gittensory-miner" }), + runCli(["mystery", "--json"], { packageName: "@loopover/miner" }), ).toBe(1); expect(JSON.parse(String(log.mock.calls[0]?.[0]))).toEqual({ ok: false, - error: "Unknown command: mystery. Run @jsonbored/gittensory-miner --help.", + error: "Unknown command: mystery. Run @loopover/miner --help.", }); expect(error).not.toHaveBeenCalled(); }); @@ -112,8 +112,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("@loopover/miner")).toBe( + "npm install -g @loopover/miner@latest", ); }); @@ -194,13 +194,13 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await maybePrintUpdateNudge({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@loopover/miner", packageVersion: "0.1.0", npmRegistryUrl: registryUrl, - upgradeCommand: "npm install -g @jsonbored/gittensory-miner@latest", + upgradeCommand: "npm install -g @loopover/miner@latest", }); expect(stderr).toHaveBeenCalledWith( - "npm install -g @jsonbored/gittensory-miner@latest\n", + "npm install -g @loopover/miner@latest\n", ); }); @@ -210,10 +210,10 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await maybePrintUpdateNudge({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@loopover/miner", packageVersion: "0.1.0", npmRegistryUrl: registryUrl, - upgradeCommand: "npm install -g @jsonbored/gittensory-miner@latest", + upgradeCommand: "npm install -g @loopover/miner@latest", }); expect(stderr).not.toHaveBeenCalled(); }); @@ -222,10 +222,10 @@ describe("gittensory-miner startup update check (#2331)", () => { const registryUrl = await startRegistryFixture({ npmStatus: 500 }); await expect( maybePrintUpdateNudge({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@loopover/miner", packageVersion: "0.1.0", npmRegistryUrl: registryUrl, - upgradeCommand: "npm install -g @jsonbored/gittensory-miner@latest", + upgradeCommand: "npm install -g @loopover/miner@latest", }), ).resolves.toBeUndefined(); }); @@ -234,7 +234,7 @@ describe("gittensory-miner startup update check (#2331)", () => { const registryUrl = await startRegistryFixture({ npmStatus: 503 }); await expect( fetchLatestPackageVersion({ - packageName: "@jsonbored/gittensory-miner", + packageName: "@loopover/miner", npmRegistryUrl: registryUrl, }), ).rejects.toThrow("npm_latest_version_unavailable"); @@ -243,7 +243,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: "@loopover/miner", packageVersion: "0.1.0", }); expect(fetchSpy).not.toHaveBeenCalled(); @@ -255,12 +255,12 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await startUpdateCheck(["--version"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@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 @loopover/miner@latest\n", ); }); @@ -270,7 +270,7 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); await startUpdateCheck(["--version"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@loopover/miner", packageVersion: "0.1.0", env: { GITTENSORY_NPM_REGISTRY_URL: registryUrl }, }); @@ -281,7 +281,7 @@ describe("gittensory-miner startup update check (#2331)", () => { const registryUrl = await startRegistryFixture({ npmStatus: 500 }); await expect( startUpdateCheck(["--version"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@loopover/miner", packageVersion: "0.1.0", env: { GITTENSORY_NPM_REGISTRY_URL: registryUrl }, }), @@ -307,19 +307,19 @@ describe("gittensory-miner startup update check (#2331)", () => { .spyOn(process.stderr, "write") .mockImplementation(() => true); const updateCheck = startUpdateCheck(["mystery"], { - packageName: "@jsonbored/gittensory-miner", + packageName: "@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 @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("@loopover/miner/0.1.0"); }); it("serves --help immediately without waiting for a slow registry check", async () => { @@ -334,7 +334,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 @loopover/miner@latest", ); }); diff --git a/test/unit/miner-coding-agent-construction.test.ts b/test/unit/miner-coding-agent-construction.test.ts index 15ba7c0bb8..d1500114ad 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("@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 7e06b98c6c..51682c06c4 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("@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 "@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 b9ee362c1d..6c0db2025c 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("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-config-precedence.test.ts b/test/unit/miner-config-precedence.test.ts index e38008d584..e799c0c702 100644 --- a/test/unit/miner-config-precedence.test.ts +++ b/test/unit/miner-config-precedence.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@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..952e562667 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("@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-deployment-docs-audit.test.ts b/test/unit/miner-deployment-docs-audit.test.ts index b6d1c30594..8b6f6170de 100644 --- a/test/unit/miner-deployment-docs-audit.test.ts +++ b/test/unit/miner-deployment-docs-audit.test.ts @@ -105,7 +105,7 @@ describe("gittensory-miner DEPLOYMENT.md docs-accuracy audit (#5180)", () => { it("extracts documented CLI subcommands, not the npm package spelling", () => { expect(claims.subcommands).toEqual(expect.arrayContaining(["status", "doctor", "init", "loop"])); - // `@jsonbored/gittensory-miner run build` must not be mistaken for a `run` subcommand. + // `@loopover/miner run build` must not be mistaken for a `run` subcommand. expect(claims.subcommands).not.toContain("run"); }); diff --git a/test/unit/miner-discovery-throttle.test.ts b/test/unit/miner-discovery-throttle.test.ts index 80db659cf2..d8ccb9dd68 100644 --- a/test/unit/miner-discovery-throttle.test.ts +++ b/test/unit/miner-discovery-throttle.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-feasibility-cli.test.ts b/test/unit/miner-feasibility-cli.test.ts index cfc78373ba..ad3b9e530b 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("@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 e61813c98b..dc2f8c5c22 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("@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..ffad7c7d6a 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("@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..351980f5cd 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("@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..c2a672da1d 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("@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..c1b39e7053 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("@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 edcf6f98a8..1d4ec25f23 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("@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 981c5e38b6..520a4b393e 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("@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..5834a8cacd 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("@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..81b3f5e14d 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("@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..36ab9a6af0 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("@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..988ed69b0c 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("@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 77a4b8b961..59b6c0b97d 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("@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..48dae27b30 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("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-mcp-contract.test.ts b/test/unit/miner-mcp-contract.test.ts index 3eb83eb4cd..a61f3a0029 100644 --- a/test/unit/miner-mcp-contract.test.ts +++ b/test/unit/miner-mcp-contract.test.ts @@ -111,8 +111,8 @@ const READ_ONLY_TOOLS: ToolContract[] = [ args: {}, valid: { collectStatus: () => ({ - package: { name: "@jsonbored/gittensory-miner", version: "0.1.0" }, - engine: { name: "@jsonbored/gittensory-engine", version: "1.0.0" }, + package: { name: "@loopover/miner", version: "0.1.0" }, + engine: { name: "@loopover/engine", version: "1.0.0" }, node: "v22.13.0", stateDir: "/home/miner/.config/gittensory-miner", configFile: null, diff --git a/test/unit/miner-mcp-scaffold.test.ts b/test/unit/miner-mcp-scaffold.test.ts index fd6017b3ed..bbff0a8709 100644 --- a/test/unit/miner-mcp-scaffold.test.ts +++ b/test/unit/miner-mcp-scaffold.test.ts @@ -342,8 +342,8 @@ describe("gittensory_miner_list_plans / get_plan (#5161)", () => { }); const FAKE_STATUS = { - package: { name: "@jsonbored/gittensory-miner", version: "0.1.0" }, - engine: { name: "@jsonbored/gittensory-engine", version: "1.0.0" }, + package: { name: "@loopover/miner", version: "0.1.0" }, + engine: { name: "@loopover/engine", version: "1.0.0" }, node: "v22.13.0", stateDir: "/home/miner/.config/gittensory-miner", configFile: null, diff --git a/test/unit/miner-opportunity-fanout-forge.test.ts b/test/unit/miner-opportunity-fanout-forge.test.ts index 5f71880997..c29f9e6172 100644 --- a/test/unit/miner-opportunity-fanout-forge.test.ts +++ b/test/unit/miner-opportunity-fanout-forge.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("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/miner-opportunity-fanout-pagination.test.ts b/test/unit/miner-opportunity-fanout-pagination.test.ts index 6309b313e3..a574831d58 100644 --- a/test/unit/miner-opportunity-fanout-pagination.test.ts +++ b/test/unit/miner-opportunity-fanout-pagination.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@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 3a8db62489..74fd33fb5e 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("@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..b0131014dc 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("@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..f16826ee8a 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("@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["@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", "@loopover/miner", "--depth=0"], { cwd: process.cwd(), encoding: "utf8" }, ); - expect(result.stdout).toContain("@jsonbored/gittensory-miner@"); + expect(result.stdout).toContain("@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("@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 @loopover/miner"); expect(readme).toContain("gittensory-miner --help"); expect(readme).toContain("gittensory-miner --version"); }); diff --git a/test/unit/miner-policy-verdict-cache.test.ts b/test/unit/miner-policy-verdict-cache.test.ts index e4ebac45b3..3fddab3ac5 100644 --- a/test/unit/miner-policy-verdict-cache.test.ts +++ b/test/unit/miner-policy-verdict-cache.test.ts @@ -1,7 +1,7 @@ import { mkdtempSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import type { AiPolicyVerdict } from "@jsonbored/gittensory-engine"; +import type { AiPolicyVerdict } from "@loopover/engine"; import { afterEach, describe, expect, it, vi } from "vitest"; import { initPolicyVerdictCacheStore, diff --git a/test/unit/miner-rejection-signal.test.ts b/test/unit/miner-rejection-signal.test.ts index f1d2f63406..698eaebf69 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("@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 d548340145..efbe7bc344 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("@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..d5ffc96ee5 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("@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 2de30c49d7..57a858df70 100644 --- a/test/unit/miner-status.test.ts +++ b/test/unit/miner-status.test.ts @@ -53,9 +53,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("@loopover/miner"); expect(typeof status.package.version).toBe("string"); - expect(status.engine.name).toBe("@jsonbored/gittensory-engine"); + expect(status.engine.name).toBe("@loopover/engine"); expect(status.stateDir).toBe(join(root, "state")); expect(status.configFile).toBe(join(root, ".gittensory-miner.yml")); // discovered }); @@ -92,7 +92,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("@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..cc9e7b7fc8 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 "@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("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/opportunity-fanout-policy-doc-cache.test.ts b/test/unit/opportunity-fanout-policy-doc-cache.test.ts index 7401c99b49..60adb249cd 100644 --- a/test/unit/opportunity-fanout-policy-doc-cache.test.ts +++ b/test/unit/opportunity-fanout-policy-doc-cache.test.ts @@ -4,9 +4,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 "@loopover/engine" import at the engine source (mirrors // opportunity-fanout-ai-policy.test.ts) so the fan-out uses the real resolveAiPolicyVerdict. -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@loopover/engine", async () => { return import("../../packages/gittensory-engine/src/index"); }); diff --git a/test/unit/opportunity-fanout-policy-verdict-cache.test.ts b/test/unit/opportunity-fanout-policy-verdict-cache.test.ts index e5df64e058..5bc13591c7 100644 --- a/test/unit/opportunity-fanout-policy-verdict-cache.test.ts +++ b/test/unit/opportunity-fanout-policy-verdict-cache.test.ts @@ -4,9 +4,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 "@loopover/engine" import at the engine source (mirrors // opportunity-fanout-ai-policy.test.ts) so the fan-out uses the real resolveAiPolicyVerdict. -vi.mock("@jsonbored/gittensory-engine", async () => { +vi.mock("@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 271c7121cd..3bc32e3218 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%2Fmcp/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: "loopover-api", apiVersion: "0.1.0", mcp: { - packageName: "@jsonbored/gittensory-mcp", + packageName: "@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 @loopover/mcp@latest", + npxFallbackCommand: "npx @loopover/mcp@latest ", }, compatibilityWarnings: [], breakingChanges: [], diff --git a/test/unit/support/miner-cli-harness.ts b/test/unit/support/miner-cli-harness.ts index f3530b4cbc..fc5b282a35 100644 --- a/test/unit/support/miner-cli-harness.ts +++ b/test/unit/support/miner-cli-harness.ts @@ -109,7 +109,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%2Fminer/latest")) { if (options.npmStatus && options.npmStatus >= 400) { response.statusCode = options.npmStatus; response.end(JSON.stringify({ error: "registry_error" }));