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
6 changes: 3 additions & 3 deletions .gittensory.minimal.yml → .loopover.minimal.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# ============================================================================
# .gittensory.minimal.yml — smallest safe starter config for a new repo
# .loopover.minimal.yml — smallest safe starter config for a new repo
# ============================================================================
#
# Copy this file to your repo root as `.loopover.yml` and customize from here.
# (This filename is not read directly — only `.loopover.yml` / `.github/loopover.yml` are.)
# Also shipped at config/examples/gittensory.minimal.yml for self-host operators.
# Also shipped at config/examples/loopover.minimal.yml for self-host operators.
# For every supported field, defaults, and examples see `.loopover.yml.example` or
# config/examples/gittensory.full.yml.
# config/examples/loopover.full.yml.
#
# Safe by default:
# - Gate off (enable explicitly when you are ready)
Expand Down
30 changes: 15 additions & 15 deletions .loopover.yml.example
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
# config-as-code, versioned alongside the project it governs.
#
# STARTER TEMPLATES (also shipped under config/examples/ for self-host operators):
# config/examples/gittensory.minimal.yml — smallest safe starter (gate off, observe-only autonomy)
# config/examples/gittensory.full.yml — exhaustive reference (body synced with this file)
# .gittensory.minimal.yml — same minimal starter at repo root
# config/examples/loopover.minimal.yml — smallest safe starter (gate off, observe-only autonomy)
# config/examples/loopover.full.yml — exhaustive reference (body synced with this file)
# .loopover.minimal.yml — same minimal starter at repo root
# .loopover.yml.example — this file
#
# WHERE IT LIVES (first match wins):
Expand Down Expand Up @@ -405,7 +405,7 @@ gate:
#
# SELF-HOST ONLY (`review.shared_config`, #2046): when `GITTENSORY_REPO_CONFIG_DIR` is mounted,
# place a shared review base at `${GITTENSORY_REPO_CONFIG_DIR}/_shared/.loopover.yml` (see
# `config/examples/shared.gittensory.yml`). Per-repo `review:` keys overlay it field-by-field —
# `config/examples/shared.loopover.yml`). Per-repo `review:` keys overlay it field-by-field —
# repo value wins when set, shared fills gaps, defaults stay byte-identical. Absent shared base is
# the common case and changes nothing. A malformed shared base warns and is ignored (never blocks a
# review). The loader records provenance at runtime in `review.sharedConfigSource` (not a YAML key).
Expand Down Expand Up @@ -515,7 +515,7 @@ review:
# quiet | normal | detailed. Default: null/normal (byte-identical).
# comment_verbosity: normal

# How a `@gittensory generate-tests` result is delivered, once features.e2eTests is on (#4197, part of
# How a `@loopover generate-tests` result is delivered, once features.e2eTests is on (#4197, part of
# the #4189 E2E-test-generation epic). `comment` (default, null/absent) posts the generated test as a
# reply comment only. `commit` pushes it as a real commit onto the PR's own head branch instead -- a
# bigger blast radius, so it stays opt-in even with e2eTests already enabled. `commit` mode is ALSO
Expand All @@ -527,7 +527,7 @@ review:

# Opts THIS repo into the manifest_missing_tests AUTO-TRIGGER (#4196, part of the #4189 epic) -- an
# unprompted generation run whenever a PR looks like it needs tests. Separate from features.e2eTests, which
# only unlocks the maintainer-initiated paths (the `@gittensory generate-tests` command and the PR-panel
# only unlocks the maintainer-initiated paths (the `@loopover generate-tests` command and the PR-panel
# checkbox). Bool | null. Default: null/false -- the auto-trigger never fires, even with e2eTests already
# on; a maintainer who wants unprompted generation opts in here explicitly, per repo.
# e2e_test_auto_trigger: false
Expand Down Expand Up @@ -797,7 +797,7 @@ settings:
# contributorCapCancelCi: true

# Review-request nagging cooldown (#2463, anti-abuse): throttle a non-owner/non-admin/non-bot
# contributor who repeatedly pings @gittensory for review on the same PR/issue. "hold" replies with a
# contributor who repeatedly pings @loopover for review on the same PR/issue. "hold" replies with a
# cooldown notice and takes no further action; "close" closes the PR (issues degrade to "hold" until
# a dedicated closeIssue primitive lands) with a clear reason. Off by default.
# reviewNagPolicy: off # off | hold | close. Default: off.
Expand All @@ -809,9 +809,9 @@ settings:

# Maintainer-mention nag moderation (#label-scoping): GitHub logins ALSO throttled under the SAME
# reviewNagPolicy/reviewNagMaxPings/reviewNagCooldownDays/reviewNagLabel cooldown above, on top of the
# bot's own @gittensory handle — e.g. a contributor who keeps tagging a specific maintainer for review
# instead of (or in addition to) pinging @gittensory. Counted independently per mentioned login and
# independently of the @gittensory counter. Only fires for the thread's OWN author, never a third party
# bot's own @loopover handle — e.g. a contributor who keeps tagging a specific maintainer for review
# instead of (or in addition to) pinging @loopover. Counted independently per mentioned login and
# independently of the @loopover counter. Only fires for the thread's OWN author, never a third party
# commenting on someone else's thread; owner/admin/automation-bot/autoCloseExemptLogins are always exempt.
# List of GitHub logins. Default: [] (no logins watched).
# reviewNagMonitoredMentions: [your-maintainer-login]
Expand All @@ -828,8 +828,8 @@ settings:
# accountAgeThresholdDays: null # Positive integer, or null/omitted to disable. Default: null (off).
# newAccountLabel: new-account # Label applied to a below-threshold-age account's PR. Default: new-account.

# Per-command @gittensory rate limit (#2560, anti-abuse): generalizes review-nag's cooldown pattern to
# EVERY @gittensory command (help/ask/preflight/blockers/... and the maintainer queue-digest commands),
# Per-command @loopover rate limit (#2560, anti-abuse): generalizes review-nag's cooldown pattern to
# EVERY @loopover command (help/ask/preflight/blockers/... and the maintainer queue-digest commands),
# not just review-request pings — independent of review-nag's own thread-author-only scope. "hold"
# replies with a cooldown notice and skips the command's own dispatch. Off by default.
# commandRateLimitPolicy: off # off | hold. Default: off.
Expand Down Expand Up @@ -917,11 +917,11 @@ settings:
# advisoryAiRouting:
# slop: false # gate.slop.aiAdvisory's second opinion. Default: false.
# e2eTestGen: false # Auto-generated E2E test scaffolding. Default: false.
# planner: false # The @gittensory plan / issue-planner completion. Default: false.
# planner: false # The @loopover plan / issue-planner completion. Default: false.
# summaries: false # AI summaries/rewrite text. Default: false.
# chatQa: false # @gittensory chat <question> grounded LLM Q&A. Ollama-first (never the frontier env.AI unless chatQaFrontierFallback below is also true); needs env.AI_ADVISORY set. Co-requisite: commandRateLimitPolicy: hold (defaults off). Default: false.
# chatQa: false # @loopover chat <question> grounded LLM Q&A. Ollama-first (never the frontier env.AI unless chatQaFrontierFallback below is also true); needs env.AI_ADVISORY set. Co-requisite: commandRateLimitPolicy: hold (defaults off). Default: false.
# chatQaFrontierFallback: false # Opt-in only: falls back to the frontier env.AI chain if env.AI_ADVISORY is unconfigured, instead of declining. Meaningless unless chatQa is also true. Default: false.
# intentRouting: false # Closed-set intent classifier for unrecognized @gittensory mentions -> existing Q&A commands only. Ollama-ONLY, same as chatQa (never uses chatQaFrontierFallback). Co-requisite: commandRateLimitPolicy: hold. Default: false.
# intentRouting: false # Closed-set intent classifier for unrecognized @loopover mentions -> existing Q&A commands only. Ollama-ONLY, same as chatQa (never uses chatQaFrontierFallback). Co-requisite: commandRateLimitPolicy: hold. Default: false.

# Maintainer AI review tuning (`.loopover.yml` top-level `review:` block). These knobs shape the advisory AI
# review prompt and file selection only — gate/slop/secret-scan are unaffected.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ export function MaintainerSettings({ reviewability }: { reviewability: Array<{ p
Repository settings
</h2>
<p className="mt-1 text-token-xs text-muted-foreground">
Configure exactly what Gittensory enforces and surfaces on this repo — gate modes,
Configure exactly what LoopOver enforces and surfaces on this repo — gate modes,
anti-slop, labels, public output, and who can run each command. Changes are audited.
</p>
</div>
Expand Down Expand Up @@ -389,7 +389,7 @@ export function MaintainerSettings({ reviewability }: { reviewability: Array<{ p
<div>
<h3 className={LABEL_CLASS}>Command authorization</h3>
<p className="mt-1 text-token-2xs text-muted-foreground">
Default roles allowed to run any <code className="font-mono">@gittensory</code>{" "}
Default roles allowed to run any <code className="font-mono">@loopover</code>{" "}
command. Per-command overrides (edited via the focus manifest) are shown below.
</p>
<div className="mt-2 flex flex-wrap gap-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ function formatOutputForClipboard(tool: Tool, result: unknown): string {
"Thanks for the PR.",
"",
"This branch links to issue #1204 and passes basic preflight.",
"Maintainers can run `@gittensory blockers` for non-public context.",
"Maintainers can run `@loopover blockers` for non-public context.",
].join("\n");
}
const header = `// gittensory · ${tool} · preview`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const DEFAULT_ITEMS: PaletteItem[] = [
{ label: "Repo owner workspace", to: "/app/owner", group: "App" },
{ label: "Agent runs", to: "/app/runs", group: "App" },
{ label: "Agent playground", to: "/app/playground", group: "App" },
{ label: "@gittensory command simulator", to: "/app/commands", group: "App" },
{ label: "@loopover command simulator", to: "/app/commands", group: "App" },
{ label: "Product analytics", to: "/app/analytics", group: "App" },
{ label: "Maintainer digest", to: "/app/digest", group: "App" },
{ label: "Skipped PR audit", to: "/app/audit", group: "App" },
Expand Down
50 changes: 25 additions & 25 deletions apps/gittensory-ui/src/lib/command-reference.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,116 +3,116 @@
export const PUBLIC_COMMAND_ENTRIES = [
{
id: "help",
title: "Gittensory command help",
description: "Show public-safe @gittensory command help.",
title: "LoopOver command help",
description: "Show public-safe @loopover command help.",
},
{
id: "ask",
title: "Gittensory contribution context Q&A",
title: "LoopOver contribution context Q&A",
description:
"Answer contribution-quality questions from connected cached sources with citations.",
},
{
id: "chat",
title: "Gittensory grounded chat Q&A",
title: "LoopOver grounded chat Q&A",
description:
"Answer a question in natural prose from cached decision-pack facts via local Ollama (maintainer/collaborator; read-only).",
},
{
id: "preflight",
title: "Gittensory preflight",
title: "LoopOver preflight",
description: "Summarize public PR hygiene and validation readiness.",
},
{
id: "blockers",
title: "Gittensory readiness blockers",
title: "LoopOver readiness blockers",
description: "Explain public-safe readiness blockers.",
},
{
id: "duplicate-check",
title: "Gittensory duplicate & WIP check",
title: "LoopOver duplicate & WIP check",
description: "Summarize duplicate and in-progress overlap caution.",
},
{
id: "miner-context",
title: "Gittensory miner context",
title: "LoopOver miner context",
description: "Confirm public Gittensor miner context when available.",
},
{
id: "next-action",
title: "Gittensory next step",
title: "LoopOver next step",
description: "Suggest the next public-safe action.",
},
{
id: "reviewability",
title: "Gittensory PR readiness",
title: "LoopOver PR readiness",
description: "Summarize maintainer-friendly PR readiness without private review internals.",
},
{
id: "repo-fit",
title: "Gittensory repository fit",
title: "LoopOver repository fit",
description: "Summarize public-safe repository fit signals.",
},
{
id: "packet",
title: "Gittensory public packet",
title: "LoopOver public packet",
description: "Prepare public-safe PR packet guidance.",
},
] as const;

export const PUBLIC_COMMAND_LIST =
"@gittensory help\n@gittensory ask\n@gittensory chat\n@gittensory preflight\n@gittensory blockers\n@gittensory duplicate-check\n@gittensory miner-context\n@gittensory next-action\n@gittensory reviewability\n@gittensory repo-fit\n@gittensory packet";
"@loopover help\n@loopover ask\n@loopover chat\n@loopover preflight\n@loopover blockers\n@loopover duplicate-check\n@loopover miner-context\n@loopover next-action\n@loopover reviewability\n@loopover repo-fit\n@loopover packet";

export const MAINTAINER_COMMAND_ENTRIES = [
{
id: "queue-summary",
title: "Gittensory maintainer queue summary",
title: "LoopOver maintainer queue summary",
description: "Post a maintainer-only queue digest from cached GitHub metadata.",
},
{
id: "confirmed-miners",
title: "Gittensory confirmed-miner PRs",
title: "LoopOver confirmed-miner PRs",
description: "List open PRs whose authors are confirmed in the official-miner cache.",
},
{
id: "review-now",
title: "Gittensory review-now queue",
title: "LoopOver review-now queue",
description: "List cached PRs that look ready for maintainer review.",
},
{
id: "needs-author",
title: "Gittensory needs-author queue",
title: "LoopOver needs-author queue",
description: "List cached PRs that need author cleanup before detailed review.",
},
{
id: "duplicate-clusters",
title: "Gittensory duplicate clusters",
title: "LoopOver duplicate clusters",
description: "List duplicate or WIP clusters visible from cached GitHub metadata.",
},
{
id: "burden-forecast",
title: "Gittensory burden forecast",
title: "LoopOver burden forecast",
description: "Project maintainer review load and queue-growth risk from cached metadata.",
},
{
id: "intake-health",
title: "Gittensory intake health",
title: "LoopOver intake health",
description: "Summarize contributor-intake health from cached queue and config signals.",
},
{
id: "outcome-patterns",
title: "Gittensory outcome patterns",
title: "LoopOver outcome patterns",
description: "Summarize what this repo actually merges vs closes from cached PR outcomes.",
},
{
id: "noise-report",
title: "Gittensory noise report",
title: "LoopOver noise report",
description: "Highlight queue noise sources maintainers should triage first.",
},
] as const;

export const MAINTAINER_COMMAND_LIST =
"@gittensory queue-summary\n@gittensory confirmed-miners\n@gittensory review-now\n@gittensory needs-author\n@gittensory duplicate-clusters\n@gittensory burden-forecast\n@gittensory intake-health\n@gittensory outcome-patterns\n@gittensory noise-report";
"@loopover queue-summary\n@loopover confirmed-miners\n@loopover review-now\n@loopover needs-author\n@loopover duplicate-clusters\n@loopover burden-forecast\n@loopover intake-health\n@loopover outcome-patterns\n@loopover noise-report";

export const ACTION_COMMAND_ENTRIES = [
{
Expand All @@ -125,7 +125,7 @@ export const ACTION_COMMAND_ENTRIES = [
id: "review",
title: "Request review",
description:
"Request an auto-review run on the current PR head (`@gittensory re-review` is an alias).",
"Request an auto-review run on the current PR head (`@loopover re-review` is an alias).",
},
{
id: "pause",
Expand Down Expand Up @@ -165,4 +165,4 @@ export const ACTION_COMMAND_ENTRIES = [
] as const;

export const ACTION_COMMAND_LIST =
"@gittensory gate-override\n@gittensory review\n@gittensory pause\n@gittensory resume\n@gittensory resolve\n@gittensory configuration\n@gittensory explain\n@gittensory generate-tests";
"@loopover gate-override\n@loopover review\n@loopover pause\n@loopover resume\n@loopover resolve\n@loopover configuration\n@loopover explain\n@loopover generate-tests";
2 changes: 1 addition & 1 deletion apps/gittensory-ui/src/lib/selfhost-docs-audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ export const SELFHOST_SOURCE_OF_TRUTH_ROWS: readonly SelfHostSourceOfTruthRow[]
},
{
topic: "Activation and onboarding paths",
runtimeSources: ["src/server.ts", "config/examples/global.gittensory.yml"],
runtimeSources: ["src/server.ts", "config/examples/global.loopover.yml"],
docsPath: "/docs/self-hosting-configuration",
driftGuard: "docs-selfhost-activation-paths.test.ts",
},
Expand Down
2 changes: 1 addition & 1 deletion apps/gittensory-ui/src/routes/app.commands.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ function CommandsRoute() {
<div className="space-y-6">
<PageHeader
eyebrow="Commands"
title="@gittensory command catalog"
title="@loopover command catalog"
description="Preview maintainer command behavior against live API contracts without rerouting through the workbench."
/>
<CommandsPanel />
Expand Down
6 changes: 3 additions & 3 deletions apps/gittensory-ui/src/routes/app.index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ const CARDS = [
{
to: "/app/runs",
title: "Agent runs",
desc: "Unified feed of MCP, API, and @gittensory runs with evidence and boundary tags.",
desc: "Unified feed of MCP, API, and @loopover runs with evidence and boundary tags.",
icon: Activity,
roles: ["miner", "maintainer", "owner", "operator"],
},
Expand Down Expand Up @@ -154,7 +154,7 @@ function AppOverview() {
</span>
}
title={<>Welcome back, {session.login}</>}
description="Live control-panel metrics from the Gittensory API. Missing backend data renders as empty states instead of demo records."
description="Live control-panel metrics from the LoopOver API. Missing backend data renders as empty states instead of demo records."
/>

<RoleSummaryPanel session={session} />
Expand Down Expand Up @@ -338,7 +338,7 @@ function QuickActions({ lastRunId, roles }: { lastRunId?: string; roles: AppRole
{
to: "/app/workbench",
search: { tab: "commands" },
label: "@gittensory commands",
label: "@loopover commands",
icon: TerminalSquare,
roles: ["maintainer", "owner", "operator"],
},
Expand Down
2 changes: 1 addition & 1 deletion apps/gittensory-ui/src/routes/app.runs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ function AgentRuns() {
Agent runs
</h1>
<p className="mt-1 max-w-2xl text-token-sm text-muted-foreground">
Unified feed of MCP, API, and @gittensory runs. Each entry carries a ruleset snapshot
Unified feed of MCP, API, and @loopover runs. Each entry carries a ruleset snapshot
and a public/private boundary.
</p>
</div>
Expand Down
4 changes: 2 additions & 2 deletions apps/gittensory-ui/src/routes/app.workbench.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export const Route = createFileRoute("/app/workbench")({
const LABELS: Record<Tab, string> = {
miner: "Miner",
playground: "Playground",
commands: "@gittensory",
commands: "@loopover",
digest: "Digest",
};

Expand All @@ -50,7 +50,7 @@ function Workbench() {
<PageHeader
eyebrow="Workbench"
title="Plan, preflight, and explain"
description="Drive ranked next actions, run agent tools, preview maintainer commands, and inspect digests from the live Gittensory API."
description="Drive ranked next actions, run agent tools, preview maintainer commands, and inspect digests from the live LoopOver API."
/>
<Tabs
value={value}
Expand Down
Loading
Loading