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
18 changes: 10 additions & 8 deletions .claude/skills/contributing-to-loopover/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,11 @@ gittensory-mcp init-client --print claude # or --print cursor — prints the co

Use that generator instead of hand-writing config (**Codex uses TOML, Claude/Cursor use JSON** — a
pasted JSON block will not work in Codex). You'll use these tools in Phases 1 and 6 (inputs in
`reference.md`): `gittensory_check_before_start`, `gittensory_validate_linked_issue`,
`gittensory_check_slop_risk`, `gittensory_lint_pr_text`, `gittensory_predict_gate` — all metadata-only
(no source upload, no secrets).
`reference.md`): `loopover_check_before_start`, `loopover_validate_linked_issue`,
`loopover_check_slop_risk`, `loopover_lint_pr_text`, `gittensory_predict_gate` — all metadata-only
(no source upload, no secrets). The first four are the new `loopover_`-prefixed primary names (#4775);
their old `gittensory_`-prefixed names still work, unchanged, as deprecated aliases for one full
minor-version deprecation cycle.

---

Expand All @@ -116,14 +118,14 @@ pasted JSON block will not work in Codex). You'll use these tools in Phases 1 an
signal. And only link an issue that is **open, not assigned to someone else, not maintainer-only,
and (on scored repos) carries a point label**: linking an owner-assigned / maintainer-only /
ineligible issue trips a **deterministic linked-issue hard rule that auto-closes your PR**. Verify
with `gittensory_check_before_start` + `gittensory_validate_linked_issue`.
with `loopover_check_before_start` + `loopover_validate_linked_issue`.
- **A linked, currently-open, unassigned, eligible issue is always required before opening a PR** —
there is no "small enough to skip it" exemption, no matter how self-evident the fix looks. This
holds regardless of what the committed root `.gittensory.yml`'s `linkedIssuePolicy` says: that
file is a non-representative **example** checked into the repo, not the live enforced rule. If no
suitable open issue exists, open one yourself first, then link it from the PR.
- **Run the pre-start checks** via MCP: `gittensory_check_before_start` (is it claimed / a duplicate
cluster / already solved?) and, if linking an issue, `gittensory_validate_linked_issue`.
- **Run the pre-start checks** via MCP: `loopover_check_before_start` (is it claimed / a duplicate
cluster / already solved?) and, if linking an issue, `loopover_validate_linked_issue`.
- **Stay in scope.** The gate's `wantedPaths` are `src/`, `packages/`, `test/`, `migrations/`,
`scripts/`, `review-enrichment/`, `.github/workflows/`, `wrangler.jsonc`, `apps/gittensory-ui/`. Avoid `blockedPaths`
(`site/`, `CNAME`, `**/lovable/**`). Keep the PR narrow — one coherent change.
Expand Down Expand Up @@ -243,9 +245,9 @@ named **`Gittensory Orb Review Agent`** — watch both go green/passing.

Run the MCP predictor with your actual PR shape:

- `gittensory_check_slop_risk` — keep slop **low**: fill the PR description, include tests, keep the
- `loopover_check_slop_risk` — keep slop **low**: fill the PR description, include tests, keep the
diff focused (no lockfile/docs/generated noise dominating), real source ratio.
- `gittensory_lint_pr_text` — your commit + PR body must read as **strong**: Conventional Commit
- `loopover_lint_pr_text` — your commit + PR body must read as **strong**: Conventional Commit
subject, traceability (a linked, currently-open, eligible issue — no no-issue rationale accepted),
and a body that says what changed, why, and how it was validated.
- `gittensory_predict_gate` — simulate the repo's public `.gittensory.yml` gate. Resolve any
Expand Down
29 changes: 16 additions & 13 deletions .claude/skills/contributing-to-loopover/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ Implications for you:
a coverage miss closes the PR. This is why Phases 3–5 are non-negotiable.
- **A merge conflict closes the PR** — keep your branch current with `main`.
- **Linking the wrong issue closes the PR** — only link an open, unassigned, eligible issue (verify
with `gittensory_validate_linked_issue`).
with `loopover_validate_linked_issue`, aliased for one deprecation cycle as `gittensory_validate_linked_issue`).
- Owner / automation-bot PRs are exempt from auto-close, and crucial guarded-path PRs are held — but
**assume you are a contributor** and that adverse = close.

Expand Down Expand Up @@ -149,30 +149,33 @@ gittensory-mcp init-client --print codex # → ~/.codex/config.toml ([mcp_se
gittensory-mcp init-client --print claude # or --print cursor (→ mcpServers JSON)
```

All tools are metadata-only (no source upload). Run in this order:
All tools are metadata-only (no source upload). Each local-package tool below is now primarily named
`loopover_*` (#4775) — the old `gittensory_*` name still works, unchanged, as a deprecated alias for
one full minor-version deprecation cycle. Run in this order:

1. `gittensory_check_before_start` — `{owner, repo, issueNumber, plannedChange{title, paths}}` →
go/raise/avoid (claimed? duplicate cluster? already solved?).
2. `gittensory_validate_linked_issue` — `{owner, repo, issueNumber, plannedChange}` → is the issue
open, valid, single-owner, solvable by this PR.
3. `gittensory_check_slop_risk` — `{changedFiles[{path,additions,deletions}], description, tests,
1. `loopover_check_before_start` (was `gittensory_check_before_start`) — `{owner, repo, issueNumber,
plannedChange{title, paths}}` → go/raise/avoid (claimed? duplicate cluster? already solved?).
2. `loopover_validate_linked_issue` (was `gittensory_validate_linked_issue`) — `{owner, repo,
issueNumber, plannedChange}` → is the issue open, valid, single-owner, solvable by this PR.
3. `loopover_check_slop_risk` (was `gittensory_check_slop_risk`) — `{changedFiles[{path,additions,deletions}], description, tests,
testFiles}` → band + findings.
4. `gittensory_check_improvement_potential` — `{changedFiles?[{path,additions,deletions}], tests?,
testFiles?, patchCoverageDeltaPercent?, complexityDeltas?[{file,line,name,before,after,delta}],
duplicationDeltas?[{file,line,duplicateOfLine,lines}]}` → improvementScore + band
(insufficient-signal/none/minor/moderate/significant) + findings. The positive-axis mirror of
`gittensory_check_slop_risk` — deterministic tier only (no LLM judgment); complexityDeltas/
`loopover_check_slop_risk` — deterministic tier only (no LLM judgment); complexityDeltas/
duplicationDeltas are optional precomputed deltas the calling agent supplies, never raw source.
5. `gittensory_lint_pr_text` — `{commitMessages[], prBody, linkedIssue}` → verdict
5. `loopover_lint_pr_text` (was `gittensory_lint_pr_text`) — `{commitMessages[], prBody, linkedIssue}` → verdict
strong/adequate/weak + specific fixes.
6. `gittensory_validate_config` — `{content, source?}` → normalized manifest fields,
6. `loopover_validate_config` (was `gittensory_validate_config`) — `{content, source?}` → normalized manifest fields,
warnings, and ok/warn/error status.
7. `gittensory_predict_gate` — `{login, owner, repo, title, body, labels, linkedIssues}` → predicted
conclusion + blockers + warnings + readiness score.

(Auth'd extras: `gittensory_preflight_pr` / `…_local_diff` for lane fit + collision + queue health;
`gittensory_get_pr_ai_review_findings` — `{login, owner, repo, pullNumber}` → structured post-submission
AI-review inline findings (category/path/severity) for your own PR.)
(Auth'd extras: `loopover_preflight_pr` / `…_local_diff` (was `gittensory_preflight_pr` / `…_local_diff`)
for lane fit + collision + queue health; `gittensory_get_pr_ai_review_findings` — `{login, owner, repo,
pullNumber}` → structured post-submission AI-review inline findings (category/path/severity) for your
own PR.)

---

Expand Down
16 changes: 9 additions & 7 deletions packages/gittensory-mcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ The report has an `overallStatus` (`pass`/`warn`/`fail`) and a `sections` array
degrades to `fail` with a public-safe `slopRiskError`/`prTextLintError` reason instead of aborting the
whole report — the other sections still return.

The same composed check is exposed to MCP clients as `gittensory_review_pr_before_push`.
The same composed check is exposed to MCP clients as `loopover_review_pr_before_push` (aliased for one deprecation cycle as `gittensory_review_pr_before_push`).

## Auth

Expand Down Expand Up @@ -182,11 +182,13 @@ gittensory-mcp agent packet --login jsonbored --repo we-promise/sure --base orig

The same capabilities are exposed to MCP clients as:

- `gittensory_agent_plan_next_work`
- `gittensory_agent_start_run`
- `gittensory_agent_get_run`
- `gittensory_agent_explain_next_action`
- `gittensory_agent_prepare_pr_packet`
- `loopover_agent_plan_next_work`
- `loopover_agent_start_run`
- `loopover_agent_get_run`
- `loopover_agent_explain_next_action`
- `loopover_agent_prepare_pr_packet`

(Each is aliased for one deprecation cycle under its old `gittensory_agent_*` name.)

### Client config

Expand Down Expand Up @@ -271,7 +273,7 @@ gittensory-mcp changelog

## Offline decision-pack fallback

Successful `decision-pack` and MCP `gittensory_get_decision_pack` calls store a bounded last-good local cache entry keyed by API version and login. If the API or network is temporarily unavailable, the wrapper can return that last-good guidance as `source: "local_cache"` with `stale: true`, `cachedAt`, and rerun guidance. Auth and permission failures do not use stale fallback data.
Successful `decision-pack` and MCP `loopover_get_decision_pack` calls (aliased for one deprecation cycle as `gittensory_get_decision_pack`) store a bounded last-good local cache entry keyed by API version and login. If the API or network is temporarily unavailable, the wrapper can return that last-good guidance as `source: "local_cache"` with `stale: true`, `cachedAt`, and rerun guidance. Auth and permission failures do not use stale fallback data.

The cache excludes source contents and local paths, is bounded, and can be removed with:

Expand Down
Loading