Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ jobs:
# 6 of the 7 MCP CLI-cluster test files, and ONLY these 6, are truly self-contained w.r.t. root
# src/**: verified by direct-import inspection that test/unit/mcp-cli-*.test.ts (5 files) and
# their shared test/unit/support/mcp-cli-harness.ts import nothing but node:* builtins + vitest,
# and mcp-discovery.test.ts spawns packages/gittensory-mcp/bin/gittensory-mcp.js as a real
# and mcp-discovery.test.ts spawns packages/gittensory-mcp/bin/loopover-mcp.js as a real
# subprocess via StdioClientTransport -- none of the 6 ever load root src/ in-process. This mirrors
# the `mcp` filter's own established trust boundary above (a self-contained package build). They are
# NOT self-contained w.r.t. packages/gittensory-engine/**, though: gittensory-mcp now has a real
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-mcp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ jobs:
TMP="$(mktemp -d)"
npm --prefix "$TMP" init -y >/dev/null
npm --prefix "$TMP" install "$TARBALL_PATH" >/dev/null
"$TMP/node_modules/.bin/gittensory-mcp" --help >/dev/null
"$TMP/node_modules/.bin/loopover-mcp" --help >/dev/null

- name: Upload package tarball
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-miner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ jobs:
TMP="$(mktemp -d)"
npm --prefix "$TMP" init -y >/dev/null
npm --prefix "$TMP" install "$TARBALL_PATH" >/dev/null
"$TMP/node_modules/.bin/gittensory-miner" --help | grep -q "Foundation CLI for the local Gittensory miner runtime"
"$TMP/node_modules/.bin/gittensory-miner-mcp" --help >/dev/null
"$TMP/node_modules/.bin/loopover-miner" --help | grep -q "Foundation CLI for the local LoopOver miner runtime"
"$TMP/node_modules/.bin/loopover-miner-mcp" --help >/dev/null

- name: Upload package tarball
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand Down
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,27 +74,27 @@ See [Tuning your reviews](https://gittensory.aethereal.dev/docs/tuning) for the

```sh
npm install -g @loopover/mcp@latest
gittensory-mcp login
gittensory-mcp doctor
gittensory-mcp --stdio
loopover-mcp login
loopover-mcp doctor
loopover-mcp --stdio
```

Print editor/client snippets:

```sh
gittensory-mcp init-client --print codex
gittensory-mcp init-client --print claude
gittensory-mcp init-client --print cursor
loopover-mcp init-client --print codex
loopover-mcp init-client --print claude
loopover-mcp init-client --print cursor
```

For full editor setup and stdio configuration, use [MCP client setup](https://gittensory.aethereal.dev/docs/mcp-clients).

Run base-agent commands:

```sh
gittensory-mcp agent plan --login jsonbored --json
gittensory-mcp agent packet --login jsonbored --json
gittensory-mcp agent status <run-id> --json
loopover-mcp agent plan --login jsonbored --json
loopover-mcp agent packet --login jsonbored --json
loopover-mcp agent status <run-id> --json
```

## Local Development
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const candidates = [
function deps(overrides: Partial<RankedCandidatesApiDeps> = {}): RankedCandidatesApiDeps {
return {
loadRankedCandidatesModule: async () => ({
resolveRankedCandidatesDbPath: () => "/home/miner/.config/gittensory-miner/ranked-candidates.sqlite3",
resolveRankedCandidatesDbPath: () => "/home/miner/.config/loopover-miner/ranked-candidates.sqlite3",
listRankedCandidates: () => candidates,
}),
fileExists: () => true,
Expand Down
2 changes: 1 addition & 1 deletion apps/gittensory-miner-ui/src/run-state-api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const rows = [{ repoFullName: "acme/widgets", state: "idle", updatedAt: "2026-07
function deps(overrides: Partial<RunStateApiDeps> = {}): RunStateApiDeps {
return {
loadRunStateModule: async () => ({
resolveRunStateDbPath: () => "/home/miner/.config/gittensory-miner/run-state.sqlite3",
resolveRunStateDbPath: () => "/home/miner/.config/loopover-miner/run-state.sqlite3",
listRunStates: () => rows,
}),
fileExists: () => true,
Expand Down
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

144 changes: 72 additions & 72 deletions packages/gittensory-mcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Public npm:

```sh
npm install -g @loopover/mcp@latest
gittensory-mcp login
loopover-mcp login
```

From a local checkout:
Expand All @@ -27,51 +27,51 @@ npm link --workspace @loopover/mcp
## Commands

```sh
gittensory-mcp version
gittensory-mcp version --json
gittensory-mcp tools
gittensory-mcp tools --json
gittensory-mcp login
gittensory-mcp logout
gittensory-mcp whoami
gittensory-mcp config
gittensory-mcp config --json
gittensory-mcp status
gittensory-mcp changelog
gittensory-mcp doctor
gittensory-mcp doctor --exit-code
gittensory-mcp profile list
gittensory-mcp profile create work
gittensory-mcp profile switch work
gittensory-mcp cache status
gittensory-mcp cache list
gittensory-mcp cache clear
gittensory-mcp init-client --print codex
gittensory-mcp init-client --print claude
gittensory-mcp init-client --print cursor
gittensory-mcp init-client --print vscode
gittensory-mcp init-client --print codex --agent-profile miner-planner
gittensory-mcp completion bash
gittensory-mcp completion zsh
gittensory-mcp completion fish
gittensory-mcp completion powershell
gittensory-mcp decision-pack --login jsonbored --json
gittensory-mcp repo-decision --login jsonbored --repo we-promise/sure --json
gittensory-mcp analyze-branch --login jsonbored --json
gittensory-mcp preflight --login jsonbored --json
gittensory-mcp review-pr --login jsonbored --commit "feat(mcp): add doctor grouping" --body "Fixes #160. Validated with npm test." --linked-issue 160 --json
gittensory-mcp lint-pr-text --commit "feat(mcp): add doctor grouping" --body "Fixes #160. Validated with npm test." --linked-issue 160 --json
gittensory-mcp validate-config --file ./.loopover.yml --json
gittensory-mcp slop-risk --changed-file src/widget.ts:80:2 --description "Adds retry handling." --test-file test/unit/widget.test.ts --json
gittensory-mcp issue-slop --title "Add retry handling" --body "Widget reconnects fail without bounded retries." --json
gittensory-mcp agent plan --login jsonbored --json
gittensory-mcp agent packet --login jsonbored --json
gittensory-mcp agent status <run-id> --json
gittensory-mcp agent explain <run-id> --json
gittensory-mcp --stdio
loopover-mcp version
loopover-mcp version --json
loopover-mcp tools
loopover-mcp tools --json
loopover-mcp login
loopover-mcp logout
loopover-mcp whoami
loopover-mcp config
loopover-mcp config --json
loopover-mcp status
loopover-mcp changelog
loopover-mcp doctor
loopover-mcp doctor --exit-code
loopover-mcp profile list
loopover-mcp profile create work
loopover-mcp profile switch work
loopover-mcp cache status
loopover-mcp cache list
loopover-mcp cache clear
loopover-mcp init-client --print codex
loopover-mcp init-client --print claude
loopover-mcp init-client --print cursor
loopover-mcp init-client --print vscode
loopover-mcp init-client --print codex --agent-profile miner-planner
loopover-mcp completion bash
loopover-mcp completion zsh
loopover-mcp completion fish
loopover-mcp completion powershell
loopover-mcp decision-pack --login jsonbored --json
loopover-mcp repo-decision --login jsonbored --repo we-promise/sure --json
loopover-mcp analyze-branch --login jsonbored --json
loopover-mcp preflight --login jsonbored --json
loopover-mcp review-pr --login jsonbored --commit "feat(mcp): add doctor grouping" --body "Fixes #160. Validated with npm test." --linked-issue 160 --json
loopover-mcp lint-pr-text --commit "feat(mcp): add doctor grouping" --body "Fixes #160. Validated with npm test." --linked-issue 160 --json
loopover-mcp validate-config --file ./.loopover.yml --json
loopover-mcp slop-risk --changed-file src/widget.ts:80:2 --description "Adds retry handling." --test-file test/unit/widget.test.ts --json
loopover-mcp issue-slop --title "Add retry handling" --body "Widget reconnects fail without bounded retries." --json
loopover-mcp agent plan --login jsonbored --json
loopover-mcp agent packet --login jsonbored --json
loopover-mcp agent status <run-id> --json
loopover-mcp agent explain <run-id> --json
loopover-mcp --stdio
```

`gittensory-mcp version` (aliases `--version` and `-v`) prints the installed package version, the targeted API version, and the Node.js runtime version:
`loopover-mcp version` (aliases `--version` and `-v`) prints the installed package version, the targeted API version, and the Node.js runtime version:

```text
@loopover/mcp/0.5.0 (api 0.1.0, node v22.12.0)
Expand All @@ -88,32 +88,32 @@ Add `--json` for machine-readable output:
}
```

`gittensory-mcp tools` lists every stdio MCP tool the local wrapper registers, with its one-line description. Add `--json` for `{ "count": N, "tools": [{ "name", "description" }, ...] }`.
`loopover-mcp tools` lists every stdio MCP tool the local wrapper registers, with its one-line description. Add `--json` for `{ "count": N, "tools": [{ "name", "description" }, ...] }`.

### Shell completion

`gittensory-mcp completion <bash|zsh|fish|powershell>` prints a tab-completion script for your shell. It completes top-level commands and the subcommands of `profile`, `cache`, `agent`, and `maintain`. Add `--json` to get `{ "shell": "...", "script": "..." }` for tooling.
`loopover-mcp completion <bash|zsh|fish|powershell>` prints a tab-completion script for your shell. It completes top-level commands and the subcommands of `profile`, `cache`, `agent`, and `maintain`. Add `--json` to get `{ "shell": "...", "script": "..." }` for tooling.

```sh
# bash (add to ~/.bashrc)
source <(gittensory-mcp completion bash)
source <(loopover-mcp completion bash)

# zsh (add to a file on your fpath, or to ~/.zshrc)
source <(gittensory-mcp completion zsh)
source <(loopover-mcp completion zsh)

# fish
gittensory-mcp completion fish > ~/.config/fish/completions/gittensory-mcp.fish
loopover-mcp completion fish > ~/.config/fish/completions/loopover-mcp.fish
```

```powershell
# PowerShell (add to your $PROFILE)
gittensory-mcp completion powershell | Out-String | Invoke-Expression
loopover-mcp completion powershell | Out-String | Invoke-Expression
```

For near-term what-if scoreability, pass the situational assumptions explicitly:

```sh
gittensory-mcp analyze-branch --login jsonbored \
loopover-mcp analyze-branch --login jsonbored \
--pending-merged-prs 3 \
--expected-open-prs 0 \
--projected-credibility 0.8 \
Expand All @@ -123,14 +123,14 @@ gittensory-mcp analyze-branch --login jsonbored \

## Review your PR locally before you push

`gittensory-mcp review-pr` composes the existing preflight, slop-risk, and PR-text-lint checks into
`loopover-mcp review-pr` composes the existing preflight, slop-risk, and PR-text-lint checks into
ONE report, so your own local agent (Claude Code, Codex, etc.) can see everything the gittensory gate
would flag before you ever open a PR. It is a thin composition layer — it calls the same checks
`preflight`, `slop-risk`, and `lint-pr-text` already run and merges their output; it does not
reimplement any of them.

```sh
gittensory-mcp review-pr --login jsonbored \
loopover-mcp review-pr --login jsonbored \
--commit "feat(mcp): add review-pr" \
--body "Composes preflight + slop-risk + lint-pr-text. Validated with npm test." \
--linked-issue 1968 \
Expand All @@ -149,35 +149,35 @@ The same composed check is exposed to MCP clients as `loopover_review_pr_before_
`login` uses GitHub Device Flow by default. For non-interactive bootstrap:

```sh
gittensory-mcp login --github-token "$(gh auth token)"
loopover-mcp login --github-token "$(gh auth token)"
```

The wrapper stores a Gittensory session token, not a GitHub token.

The default profile keeps normal single-account usage simple. For multiple identities, use named profiles:

```sh
gittensory-mcp login --profile personal --github-token "$(gh auth token)"
gittensory-mcp login --profile work --github-token "$WORK_GITHUB_TOKEN"
gittensory-mcp profile list
gittensory-mcp profile switch work
gittensory-mcp whoami
gittensory-mcp logout --profile work
loopover-mcp login --profile personal --github-token "$(gh auth token)"
loopover-mcp login --profile work --github-token "$WORK_GITHUB_TOKEN"
loopover-mcp profile list
loopover-mcp profile switch work
loopover-mcp whoami
loopover-mcp logout --profile work
```

Use `--profile <name>` on `login`, `logout`, `whoami`, `config`, `status`, and `doctor`, or set `GITTENSORY_PROFILE`. `logout` only clears the selected local profile unless `--all` is passed. Profile output redacts session tokens and local config paths.

`gittensory-mcp config` prints the resolved effective configuration and the source that supplied each value (`environment`, `profile`, `config`, or `default`): the active API URL and its source, active profile and profile count, whether a config file is present and which environment variable steers its location, the cache-dir source, whether a token is configured and where it came from, and whether `GITTENSORY_UPLOAD_SOURCE` has enabled the unsupported source-upload setting. It never prints token values or local absolute paths. Add `--json` for machine-readable output.
`loopover-mcp config` prints the resolved effective configuration and the source that supplied each value (`environment`, `profile`, `config`, or `default`): the active API URL and its source, active profile and profile count, whether a config file is present and which environment variable steers its location, the cache-dir source, whether a token is configured and where it came from, and whether `GITTENSORY_UPLOAD_SOURCE` has enabled the unsupported source-upload setting. It never prints token values or local absolute paths. Add `--json` for machine-readable output.

By default `gittensory-mcp doctor` always exits 0. Pass `--exit-code` to make it exit non-zero when a diagnostic check fails (`status: "needs_attention"`), so it can gate a CI step or pre-commit hook. Warnings still exit 0.
By default `loopover-mcp doctor` always exits 0. Pass `--exit-code` to make it exit non-zero when a diagnostic check fails (`status: "needs_attention"`), so it can gate a CI step or pre-commit hook. Warnings still exit 0.

## Base-Agent Mode

The agent commands are copilot-only. They rank, explain, preflight, and draft public-safe packets, but they do not edit code, open PRs, post comments, close, merge, or label from the local wrapper.

```sh
gittensory-mcp agent plan --login jsonbored --repo we-promise/sure --json
gittensory-mcp agent packet --login jsonbored --repo we-promise/sure --base origin/main --json
loopover-mcp agent plan --login jsonbored --repo we-promise/sure --json
loopover-mcp agent packet --login jsonbored --repo we-promise/sure --base origin/main --json
```

The same capabilities are exposed to MCP clients as:
Expand All @@ -197,9 +197,9 @@ The same capabilities are exposed to MCP clients as:
`init-client` can print optional agent-profile instructions next to the MCP client config:

```sh
gittensory-mcp init-client --print codex --agent-profile miner-planner
gittensory-mcp init-client --print claude --agent-profile maintainer-triage
gittensory-mcp init-client --print cursor --agent-profile repo-owner-intake
loopover-mcp init-client --print codex --agent-profile miner-planner
loopover-mcp init-client --print claude --agent-profile maintainer-triage
loopover-mcp init-client --print cursor --agent-profile repo-owner-intake
```

Profiles are prompt instructions for the coding-agent environment, not autonomous GitHub actors:
Expand Down Expand Up @@ -229,7 +229,7 @@ Use them when an agent should plan, explain, draft, or prepare packets from Gitt

Branch analysis can call a local scorer command that reads branch metadata JSON from stdin and prints one JSON object to stdout. Gittensory never uploads source contents; the scorer runs on your machine.

Metadata-only fallback is used when the command is missing or fails. Run `gittensory-mcp doctor` for setup diagnostics.
Metadata-only fallback is used when the command is missing or fails. Run `loopover-mcp doctor` for setup diagnostics.

Reference wrappers ship with the package:

Expand Down Expand Up @@ -264,10 +264,10 @@ Snake_case aliases such as `source_token_score` are also accepted.
The package ships with `CHANGELOG.md`. Run:

```sh
gittensory-mcp changelog
loopover-mcp changelog
```

`gittensory-mcp status` also reports the local package version, latest npm version when reachable, API health, auth state, and source-upload posture.
`loopover-mcp status` also reports the local package version, latest npm version when reachable, API health, auth state, and source-upload posture.

## Offline decision-pack fallback

Expand All @@ -276,7 +276,7 @@ Successful `decision-pack` and MCP `loopover_get_decision_pack` calls store a bo
The cache excludes source contents and local paths, is bounded, and can be removed with:

```sh
gittensory-mcp cache clear
loopover-mcp cache clear
```

`gittensory-mcp cache list` shows the cached entries (newest first) with the login, when each was cached, and its API/package version and size — never the cached payload or the auth-cache key. `gittensory-mcp cache status` reports the aggregate entry count.
`loopover-mcp cache list` shows the cached entries (newest first) with the login, when each was cached, and its API/package version and size — never the cached payload or the auth-cache key. `loopover-mcp cache status` reports the aggregate entry count.
Loading
Loading