Pick work with fewer blind spots.
+Score blockers, lane fit, queue pressure, and local branch preflight before opening another PR.
+From 7fb86e1c62dd332f7c5d0e542201ace7938cf890 Mon Sep 17 00:00:00 2001 From: JSONbored <49853598+JSONbored@users.noreply.github.com> Date: Tue, 26 May 2026 09:55:22 -0700 Subject: [PATCH] feat(docs): refresh Gittensor-aligned homepage --- CHANGELOG.md | 2 + scripts/check-docs-build.mjs | 5 + scripts/check-docs.mjs | 8 +- site/.vitepress/config.mts | 43 +- site/.vitepress/theme/custom.css | 390 ++++++++++-------- site/guide/github-app-setup.md | 88 ++-- site/guide/install.md | 62 +-- site/guide/maintainers.md | 69 ++-- site/guide/mcp.md | 34 +- site/guide/miners.md | 64 ++- site/index.md | 142 ++++--- site/public/images/gittensor-home-signal.webp | Bin 0 -> 18208 bytes 12 files changed, 472 insertions(+), 435 deletions(-) create mode 100644 site/public/images/gittensor-home-signal.webp diff --git a/CHANGELOG.md b/CHANGELOG.md index c417a18648..f279733aa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ - Add analytics and mcp version widget +- Refresh Gittensor-aligned homepage + ### Fixes diff --git a/scripts/check-docs-build.mjs b/scripts/check-docs-build.mjs index efee5b81dc..e3e157a70f 100644 --- a/scripts/check-docs-build.mjs +++ b/scripts/check-docs-build.mjs @@ -17,6 +17,11 @@ if (!existsSync(indexPath)) { const html = readFileSync(indexPath, "utf8"); if (!html.includes("gtn-version-pill")) failures.push("built docs are missing the MCP version pill markup."); if (!html.includes("MCP")) failures.push("built docs are missing MCP version text."); + if (!html.includes("/images/gittensor-home-signal.webp")) failures.push("built docs are missing the Gittensor context image."); +} + +if (!existsSync(join(dist, "images/gittensor-home-signal.webp"))) { + failures.push("built docs are missing the Gittensor context image asset."); } const builtFiles = existsSync(dist) ? collect(dist).filter((file) => /\.(html|js)$/.test(file)) : []; diff --git a/scripts/check-docs.mjs b/scripts/check-docs.mjs index e1c1ab841f..935e644af9 100644 --- a/scripts/check-docs.mjs +++ b/scripts/check-docs.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { readdirSync, readFileSync, statSync } from "node:fs"; +import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; import { join } from "node:path"; const root = process.cwd(); @@ -43,6 +43,12 @@ const siteIndex = readFileSync(join(root, "site/index.md"), "utf8"); for (const phrase of ["Gittensor miners", "GitHub App", "MCP", "not a Gittensor frontend"]) { if (!siteIndex.includes(phrase)) failures.push(`site/index.md: missing required positioning phrase ${JSON.stringify(phrase)}`); } +if (!siteIndex.includes("/images/gittensor-home-signal.webp")) { + failures.push("site/index.md: missing Gittensor context image reference"); +} +if (!existsSync(join(root, "site/public/images/gittensor-home-signal.webp"))) { + failures.push("site/public/images/gittensor-home-signal.webp: missing Gittensor context image asset"); +} for (const required of ["SUPPORT.md", "site/security/privacy.md", "site/security/terms.md", "site/support.md"]) { try { diff --git a/site/.vitepress/config.mts b/site/.vitepress/config.mts index 98450895a8..5c5f4ab1f0 100644 --- a/site/.vitepress/config.mts +++ b/site/.vitepress/config.mts @@ -25,7 +25,7 @@ const analyticsHead: HeadConfig[] = umamiScriptUrl && umamiWebsiteId export default defineConfig({ title: "Gittensory", - description: "Backend intelligence, MCP preflight, and GitHub App review context for Gittensor contributors and maintainers.", + description: "MCP and GitHub App decision intelligence for Gittensor contributors and maintainers.", base: siteBase, cleanUrls: true, lastUpdated: true, @@ -34,9 +34,9 @@ export default defineConfig({ ["link", { rel: "icon", type: "image/svg+xml", href: "/logo.svg" }], ["link", { rel: "preconnect", href: "https://fonts.googleapis.com" }], ["link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: "" }], - ["link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap" }], + ["link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700;800&display=swap" }], ["meta", { property: "og:title", content: "Gittensory" }], - ["meta", { property: "og:description", content: "Private decision intelligence for healthier Gittensor repo participation." }], + ["meta", { property: "og:description", content: "Score blockers, lane fit, queue pressure, and reviewability context for Gittensor work." }], ["meta", { property: "og:url", content: siteUrl }], ["meta", { name: "theme-color", content: "#050608" }], ...analyticsHead, @@ -44,18 +44,45 @@ export default defineConfig({ themeConfig: { logo: "/logo.svg", nav: [ - { text: "Install", link: "/guide/install" }, - { text: "MCP", link: "/guide/mcp" }, - { text: "GitHub App", link: "/guide/github-app-setup" }, + { + text: "Start", + items: [ + { text: "Install", link: "/guide/install" }, + { text: "Auth", link: "/guide/auth" }, + { text: "MCP Clients", link: "/guide/mcp" }, + ], + }, + { + text: "Workflows", + items: [ + { text: "For Miners", link: "/guide/miners" }, + { text: "For Maintainers", link: "/guide/maintainers" }, + { text: "GitHub App Setup", link: "/guide/github-app-setup" }, + ], + }, { text: "API", link: "/reference/api" }, + { + text: "Safety", + items: [ + { text: "Privacy", link: "/security/privacy" }, + { text: "Terms", link: "/security/terms" }, + { text: "Support", link: "/support" }, + { text: "Troubleshooting", link: "/troubleshooting" }, + ], + }, ], sidebar: [ { - text: "Guide", + text: "Start", items: [ { text: "Install", link: "/guide/install" }, - { text: "MCP", link: "/guide/mcp" }, { text: "Auth", link: "/guide/auth" }, + { text: "MCP Clients", link: "/guide/mcp" }, + ], + }, + { + text: "Workflows", + items: [ { text: "For Miners", link: "/guide/miners" }, { text: "For Maintainers", link: "/guide/maintainers" }, { text: "GitHub App Setup", link: "/guide/github-app-setup" }, diff --git a/site/.vitepress/theme/custom.css b/site/.vitepress/theme/custom.css index 99abb928e6..a1b2d55bd1 100644 --- a/site/.vitepress/theme/custom.css +++ b/site/.vitepress/theme/custom.css @@ -44,7 +44,7 @@ --vp-button-alt-hover-text: var(--gt-green); --vp-code-color: var(--gt-green); --vp-code-bg: rgba(101, 108, 118, 0.2); - --vp-font-family-base: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --vp-font-family-base: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --vp-font-family-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --vp-home-hero-name-color: var(--gt-text); --vp-home-hero-name-background: none; @@ -248,65 +248,11 @@ body { .VPHome { background: - linear-gradient(180deg, rgba(3, 28, 220, 0.14), transparent 260px), - radial-gradient(circle at 72% 20%, rgba(126, 231, 135, 0.1), transparent 330px), + linear-gradient(180deg, rgba(255, 255, 255, 0.035), transparent 240px), + linear-gradient(90deg, rgba(126, 231, 135, 0.08), transparent 28%, transparent 72%, rgba(126, 231, 135, 0.045)), var(--gt-black); } -.VPHome .main { - max-width: 1180px; -} - -.VPHomeHero { - padding-top: 92px !important; - padding-bottom: 44px !important; -} - -.VPHomeHero .container { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(320px, 430px); - gap: 48px; - max-width: 1180px; -} - -.VPHomeHero .main { - display: flex; - flex-direction: column; - align-items: flex-start; - text-align: left; -} - -.VPHomeHero .name, -.VPHomeHero .text { - max-width: 780px; - letter-spacing: 0; -} - -.VPHomeHero .name { - font-size: clamp(56px, 8vw, 112px); - line-height: 0.9; - font-weight: 800; -} - -.VPHomeHero .text { - margin-top: 20px; - color: #d7dee8; - font-size: clamp(24px, 3.4vw, 44px); - line-height: 1; - font-weight: 600; -} - -.VPHomeHero .tagline { - max-width: 660px; - color: var(--gt-muted); - font-size: 17px; - line-height: 1.7; -} - -.VPHomeHero .actions { - justify-content: flex-start; -} - .VPButton { border-radius: 4px !important; font-family: var(--vp-font-family-mono); @@ -316,79 +262,6 @@ body { text-transform: uppercase; } -.VPHomeHero .image { - display: block; -} - -.VPHomeHero .image-container { - display: flex; - align-items: center; - justify-content: center; - width: 420px; - height: 420px; - transform: none !important; -} - -.VPHomeHero .image-bg { - display: none; -} - -.VPHomeHero .image-src { - position: static !important; - width: min(100%, 420px); - max-width: 420px !important; - height: auto; - border: 1px solid var(--gt-line-strong); - border-radius: 0; - background: linear-gradient(180deg, var(--gt-panel), var(--gt-black)); - box-shadow: 0 0 0 1px rgba(126, 231, 135, 0.08), 0 24px 80px rgba(0, 0, 0, 0.38); - transform: none !important; -} - -.VPFeatures { - padding: 28px 24px 72px !important; -} - -.VPFeatures .container { - max-width: 1180px; -} - -.VPFeatures .items { - display: grid !important; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 1px !important; - border: 1px solid var(--gt-line); - background: var(--gt-line); -} - -.VPFeatures .item { - width: auto !important; - padding: 0 !important; -} - -.VPFeature { - height: 100%; - min-height: 168px; - border: 0 !important; - border-radius: 0 !important; - background: var(--gt-ink) !important; - padding: 22px !important; -} - -.VPFeature .title { - color: var(--gt-text); - font-family: var(--vp-font-family-mono); - font-size: 13px; - line-height: 1.35; - text-transform: uppercase; -} - -.VPFeature .details { - color: var(--gt-muted); - font-size: 14px; - line-height: 1.65; -} - .vp-doc { color: #d7dee8; } @@ -499,77 +372,230 @@ body { background: var(--gt-black); } -.gtn-home { +.gtn-hero, +.gtn-proof-strip, +.gtn-when, +.gtn-signal-panel { max-width: 1180px; - margin: 0 auto 72px; - padding: 0 24px; + margin-right: auto; + margin-left: auto; + padding-right: 24px; + padding-left: 24px; } -.gtn-strip { +.gtn-hero { display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - border: 1px solid var(--gt-line); - background: var(--gt-line); + grid-template-columns: minmax(0, 1fr) minmax(320px, 460px); + gap: 48px; + padding-top: 96px; + padding-bottom: 54px; + align-items: center; } -.gtn-strip__item { - min-height: 112px; - padding: 20px; - background: var(--gt-ink); +.gtn-hero__copy { + min-width: 0; } -.gtn-kicker { +.gtn-eyebrow { color: var(--gt-green); font-family: var(--vp-font-family-mono); font-size: 12px; font-weight: 700; + letter-spacing: 0.08em; text-transform: uppercase; } -.gtn-strip__item strong { - display: block; - margin-top: 12px; +.gtn-hero h1 { + margin: 18px 0 0; color: var(--gt-text); - font-size: 22px; - line-height: 1.1; + font-size: clamp(62px, 11vw, 132px); + font-weight: 800; + line-height: 0.84; + letter-spacing: 0; +} + +.gtn-hero__lead { + max-width: 760px; + margin: 28px 0 0; + color: #f8fafc; + font-size: clamp(28px, 4vw, 54px); + font-weight: 700; + line-height: 1; +} + +.gtn-hero__body { + max-width: 700px; + margin: 22px 0 0; + color: #a8b0bb; + font-size: 16px; + line-height: 1.75; } -.gtn-strip__item span { +.gtn-hero__actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 32px; +} + +.gtn-button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 46px; + border: 1px solid var(--gt-line-strong); + border-radius: 4px; + padding: 0 18px; + color: var(--gt-text); + font-size: 12px; + font-weight: 800; + text-decoration: none !important; + text-transform: uppercase; +} + +.gtn-button:hover { + border-color: var(--gt-green); + color: var(--gt-green); +} + +.gtn-button--primary { + border-color: var(--gt-green); + background: var(--gt-green); + color: var(--gt-black); +} + +.gtn-button--primary:hover { + background: #a4f2aa; + color: var(--gt-black); +} + +.gtn-hero__media { + position: relative; + margin: 0; + border: 1px solid rgba(126, 231, 135, 0.34); + border-radius: 8px; + padding: 10px; + background: rgba(0, 0, 0, 0.74); + box-shadow: + 0 0 0 1px rgba(255, 255, 255, 0.04), + 0 28px 72px rgba(0, 0, 0, 0.46); +} + +.gtn-hero__media img { display: block; - margin-top: 8px; + width: 100%; + height: auto; + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 4px; + background: #000; +} + +.gtn-hero__media figcaption { + position: absolute; + right: 18px; + bottom: 18px; + border: 1px solid rgba(126, 231, 135, 0.32); + border-radius: 4px; + padding: 6px 8px; + background: rgba(0, 0, 0, 0.84); + font-size: 10px; + font-weight: 700; + text-transform: uppercase; +} + +.gtn-hero__media a { + color: var(--gt-green); + text-decoration: none !important; +} + +.gtn-proof-strip { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 1px; + border: 1px solid var(--gt-line); + background: var(--gt-line); +} + +.gtn-proof-strip article { + min-height: 180px; + padding: 22px; + background: var(--gt-ink); +} + +.gtn-proof-strip span { + color: var(--gt-green); + font-size: 11px; + font-weight: 800; + text-transform: uppercase; +} + +.gtn-proof-strip h2 { + margin: 14px 0 0; + border: 0; + padding: 0; + color: var(--gt-text); + font-size: 20px; + line-height: 1.14; +} + +.gtn-proof-strip p { + margin: 12px 0 0; color: var(--gt-muted); font-size: 13px; - line-height: 1.55; + line-height: 1.58; } -.gtn-panel { +.gtn-when, +.gtn-signal-panel { display: grid; - grid-template-columns: minmax(0, 1fr) minmax(280px, 420px); + grid-template-columns: minmax(0, 0.82fr) minmax(320px, 1fr); gap: 1px; margin-top: 28px; border: 1px solid var(--gt-line); background: var(--gt-line); + padding: 0; } -.gtn-panel > section { +.gtn-when > div, +.gtn-signal-panel > div { background: var(--gt-ink); - padding: 28px; + padding: 30px; } -.gtn-panel h2 { - margin: 0; +.gtn-when h2, +.gtn-signal-panel h2 { + margin: 12px 0 0; + border: 0; + padding: 0; color: var(--gt-text); font-size: clamp(30px, 5vw, 56px); line-height: 0.98; } -.gtn-panel p { +.gtn-signal-panel p { max-width: 640px; color: var(--gt-muted); font-size: 16px; line-height: 1.72; } +.gtn-when__grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1px; + padding: 0 !important; + background: var(--gt-line) !important; +} + +.gtn-when__grid p { + margin: 0; + padding: 22px; + background: var(--gt-panel-soft); + color: #c9d1d9; + font-size: 13px; + line-height: 1.65; +} + .gtn-terminal { font-family: var(--vp-font-family-mono); font-size: 12px; @@ -597,24 +623,22 @@ body { } @media (max-width: 960px) { - .VPHomeHero .container, - .gtn-panel { + .gtn-hero, + .gtn-when, + .gtn-signal-panel { grid-template-columns: 1fr; } - .VPHomeHero .image { - order: -1; - } - - .VPHomeHero .image-src { - width: 220px; + .gtn-hero { + gap: 28px; + padding-top: 72px; } - .gtn-strip { - grid-template-columns: repeat(2, minmax(0, 1fr)); + .gtn-hero__media { + max-width: 520px; } - .VPFeatures .items { + .gtn-proof-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @@ -651,27 +675,35 @@ body { overflow-wrap: anywhere; } - .VPHomeHero { - padding-top: 64px !important; + .gtn-hero, + .gtn-proof-strip, + .gtn-when, + .gtn-signal-panel { + padding-right: 18px; + padding-left: 18px; } - .VPHomeHero .name { - font-size: 54px; + .gtn-hero h1 { + font-size: 58px; } - .VPHomeHero .text { - font-size: 26px; + .gtn-hero__lead { + font-size: 29px; } - .gtn-strip { + .gtn-proof-strip, + .gtn-when__grid { grid-template-columns: 1fr; } - .VPFeatures .items { - grid-template-columns: 1fr; + .gtn-when > div, + .gtn-signal-panel > div { + padding: 22px; } - .gtn-panel > section { - padding: 22px; + .gtn-hero__media figcaption { + position: static; + margin-top: 8px; + text-align: center; } } diff --git a/site/guide/github-app-setup.md b/site/guide/github-app-setup.md index 1fea17f786..173421d29a 100644 --- a/site/guide/github-app-setup.md +++ b/site/guide/github-app-setup.md @@ -1,39 +1,27 @@ # GitHub App Setup -The GitHub App is the maintainer/install surface. GitHub OAuth is the MCP user-auth surface. +The GitHub App is the maintainer surface. GitHub OAuth is the MCP user-auth surface. -## Basic Fields - -Use these values: +## Required Settings | Field | Value | | --- | --- | | Homepage URL | `https://gittensory.aethereal.dev` | -| Webhook URL | `${GITTENSORY_API_URL}/v1/github/webhook` | -| Webhook active | enabled | -| SSL verification | enabled | -| Device Flow | enabled | - -`GITTENSORY_API_URL` is the private API origin for the deployed backend. Do not use the GitHub Pages docs domain for webhooks; Pages only serves static docs. - -Use a generated webhook secret and set the same value in Cloudflare as `GITHUB_WEBHOOK_SECRET`. - -## Required Repository Permissions +| Webhook URL | your Gittensory API origin plus `/v1/github/webhook` | +| Webhook active | Enabled | +| SSL verification | Enabled | +| Install target | Current account or selected organizations | -| Permission | Access | Why | -| --- | --- | --- | -| Metadata | Read | Required for repository identity and repository events. | -| Pull requests | Read | Required for PR metadata and webhook events. | -| Issues | Write | Required to post the sticky PR comment and apply the maintainer-configured label. | - -Optional: +## Repository Permissions | Permission | Access | Why | | --- | --- | --- | -| Checks | Write | Only needed if minimal check runs are explicitly enabled. | -| Contents | Read | Only needed if a future feature reads repository files directly through the App. | +| Metadata | Read | Required by GitHub Apps. | +| Pull requests | Read | Inspect PR author, branch, state, and linked context. | +| Issues | Write | Post sticky comments and apply the configured label. | +| Checks | Write | Optional; only needed if a maintainer explicitly enables minimal checks. | -## Required Events +## Events Subscribe to: @@ -41,51 +29,27 @@ Subscribe to: - Issues - Repository -If GitHub shows `Installation target`, select it. Some installation-related events are not always shown as normal selectable event rows; Gittensory should not block health on event names that are hidden in the app UI. - -## Default Visibility +If GitHub shows `Installation target`, select it. Some installation-related events are hidden in parts of GitHub’s UI; Gittensory health should not fail on event names that are not selectable. -Gittensory inspects PR webhooks quietly first. It publishes a public surface only when the PR author is confirmed through the official Gittensor API. +## Public Behavior -Default visible behavior: +Gittensory inspects PR webhooks quietly first. It publishes a public surface only when the author is confirmed through the official Gittensor API. - non-miner authors: no comment, no label, no check -- bot authors: no comment, no label, no check -- maintainer-associated authors: no public output unless `includeMaintainerAuthors=true` +- bot authors: no public output +- maintainer-associated authors: skipped unless `includeMaintainerAuthors=true` - confirmed miners: one sticky public-safe comment plus the configured label, defaulting to `gittensor` Check runs default to off. If enabled later, they stay minimal and do not include private reviewability, scoring, wallet, hotkey, or reward/risk context. -## Install Or Repair - -1. Update the GitHub App permissions and events. -2. Reinstall the app or approve the changed permissions. -3. Select the repos Gittensory should inspect. -4. Trigger installation-health refresh: - -```sh -curl -X POST "$GITTENSORY_API_URL/v1/internal/jobs/refresh-installation-health/run" \ - -H "Authorization: Bearer $INTERNAL_JOB_TOKEN" -``` - -5. Check health: - -```sh -curl "$GITTENSORY_API_URL/v1/readiness" \ - -H "Authorization: Bearer $GITTENSORY_API_TOKEN" -``` - -Healthy app installation state should remove the readiness warning about GitHub App installations needing attention. - -## Marketplace Readiness - -Before Marketplace submission, add: +::: warning Not an official Gittensor frontend +The app adds maintainer workflow context around Gittensor participation. It does not replace the official Gittensor site or dashboard. +::: -- public docs URL -- support contact -- privacy policy -- terms page if needed -- clear setup flow -- valid webhook and install diagnostics +## Repair Checklist -Do not submit until the privacy, support, terms, install diagnostics, and public setup flow are complete. +1. Update GitHub App permissions and event subscriptions. +2. Reinstall or approve changed permissions on the installed account. +3. Refresh installation health. +4. Confirm comments and labels are enabled only when `Issues: write` is available. +5. Confirm checks are off unless the repo explicitly opted into minimal check runs. diff --git a/site/guide/install.md b/site/guide/install.md index 194b89de28..9898f0aa81 100644 --- a/site/guide/install.md +++ b/site/guide/install.md @@ -1,54 +1,58 @@ # Install -Gittensory has two install paths: public npm for normal use, and local checkout for development. +Start here when you want Gittensory available from Codex, Claude Desktop, Cursor, or another stdio MCP client. -## Public npm - -Use this for Codex, Claude Desktop, Cursor, or any other stdio MCP client: +## 3-Step Quick Start ```sh npm install -g @jsonbored/gittensory-mcp gittensory-mcp login -gittensory-mcp status +gittensory-mcp doctor +``` + +Then run the server: + +```sh gittensory-mcp --stdio ``` -The login command uses GitHub Device Flow and stores a short-lived Gittensory session token in your local config directory. +`login` uses GitHub Device Flow and stores a short-lived Gittensory session token locally. It does not store a user PAT. -## Local checkout +::: tip No source upload by default +MCP v1 sends repository metadata, changed file paths, counts, linked issue refs, commit messages, and validation summaries. It does not upload source contents. +::: -Use this when developing Gittensory itself: +## Configure A Client + +Print a client snippet without editing local config files: ```sh -git clone https://github.com/JSONbored/gittensory.git -cd gittensory -npm install -npm link --workspace @jsonbored/gittensory-mcp -gittensory-mcp login -gittensory-mcp --stdio +gittensory-mcp init-client --print codex +gittensory-mcp init-client --print claude +gittensory-mcp init-client --print cursor ``` -## Verify The Install +If a client cannot find `gittensory-mcp`, use an absolute command path in that client’s MCP config. + +## Verify In A Repo -Run: +From any GitHub repository: ```sh -gittensory-mcp doctor -gittensory-mcp whoami gittensory-mcp analyze-branch --login YOUR_GITHUB_LOGIN --json +gittensory-mcp preflight --login YOUR_GITHUB_LOGIN --json ``` -`doctor` checks API health, auth state, source-upload defaults, local git metadata, and whether the binary is likely visible to MCP clients. +Use `doctor` when auth, PATH, API reachability, or git metadata looks wrong. -## Privacy Defaults +## Local Development -Gittensory MCP v1 sends structured metadata only: +Use this only when working on Gittensory itself: -- repository full name -- branch and base refs -- changed file paths and counts -- linked issue references -- commit messages -- validation command summaries - -It does not upload source contents. `GITTENSORY_UPLOAD_SOURCE=true` is rejected. +```sh +git clone https://github.com/JSONbored/gittensory.git +cd gittensory +npm install +npm link --workspace @jsonbored/gittensory-mcp +gittensory-mcp login +``` diff --git a/site/guide/maintainers.md b/site/guide/maintainers.md index 0c134b0ee1..7690171f74 100644 --- a/site/guide/maintainers.md +++ b/site/guide/maintainers.md @@ -1,52 +1,45 @@ # For Maintainers -Gittensory is meant to make Gittensor-driven contribution flow less noisy. +Gittensory is designed to make Gittensor-driven contribution flow less noisy. It inspects PRs quietly first and only publishes public output when the author is an officially confirmed Gittensor miner. -## GitHub App Surface +## Default Public Behavior -The GitHub App is designed to stay quiet unless a PR author is an officially confirmed Gittensor miner. +- non-miner authors: no comment, no label, no check +- bot authors: no public output +- maintainer-associated authors: no public output unless explicitly enabled +- confirmed miners: one sticky public-safe comment plus the configured label -Default visible output for confirmed miner PRs: +::: tip Public GitHub output is sanitized +Comments and labels never include private reviewability scores, wallet data, hotkeys, raw trust scores, public score estimates, or public reward estimates. +::: -- one sticky public-safe PR comment -- one maintainer-configured label, defaulting to `gittensor` -- no public output for bots, non-miners, or maintainer-associated authors unless explicitly enabled +## What Maintainers Get -Private reviewability context, queue risk, score blockers, and reward/risk reasoning stay in the API/MCP. GitHub checks default to off; if a maintainer enables them later, they remain minimal and do not carry detailed findings. +Private API/MCP surfaces can explain: -## Reviewability Actions +- contributor role context +- repo-specific outcome history +- linked issue and lane fit +- duplicate or WIP collision risk +- validation evidence +- likely review action: review now, needs author, watch, redirect, or maintainer lane -Gittensory maps PRs to maintainer-friendly actions: +The GitHub App stays low-noise. It does not close, merge, rewrite, or publicly judge contributor work. -- `review_now` -- `needs_author` -- `likely_duplicate` -- `close_or_redirect` -- `watch` -- `maintainer_lane` +## Intake Health -The point is not to shame contributors. The point is to identify the lowest-friction next step. +Repo owners can use Gittensory signals to inspect: -## Public Comments +- queue pressure +- label readiness +- config quality +- maintainer-cut readiness +- whether issue discovery is appropriate yet +- whether the installed GitHub App has the permissions needed for comments and labels -Confirmed miner comments can include: +## When To Use Gittensory -- contribution context -- PR hygiene -- duplicate or WIP risk -- maintainer review notes -- contributor next steps - -Comments must not include raw trust scores, wallet data, hotkeys, public reward estimates, or public score optimization language. - -## Repo Owner Signals - -Repo owners can use Gittensory to inspect: - -- repo lane clarity -- label configuration -- maintainer cut readiness -- queue health -- contributor intake health -- GitHub App installation health -- stale or degraded backfill state +- when confirmed Gittensor miner PRs need triage context +- when duplicate or broad PRs are increasing review load +- when you want labels/comments without public check-run noise +- before changing repo rules that affect contributor intake diff --git a/site/guide/mcp.md b/site/guide/mcp.md index d7d5d1068e..da6d7930e5 100644 --- a/site/guide/mcp.md +++ b/site/guide/mcp.md @@ -1,10 +1,20 @@ -# MCP +# MCP Clients -The MCP package is the contributor-facing surface for coding agents. It runs locally over stdio and calls the private Gittensory API with your Gittensory session token. +The MCP package is the contributor-facing surface. Your coding agent can ask Gittensory what the current branch means in Gittensor terms before you open or update a PR. -## Generate Client Config +## What Agents Can Ask -Print a config snippet: +- what repo lane applies: direct PR, issue discovery, split, inactive, or unknown +- what blocks scoreability right now +- whether local work looks stale, broad, duplicate-prone, or missing validation evidence +- what to clean up before opening more PRs +- what public-safe PR packet should be included for a maintainer + +::: warning Private score/reward-risk only +Scoreability projections and reward/risk reasoning are private MCP/API output. Public GitHub comments stay sanitized. +::: + +## Generate Config ```sh gittensory-mcp init-client --print codex @@ -12,7 +22,7 @@ gittensory-mcp init-client --print claude gittensory-mcp init-client --print cursor ``` -These commands do not edit your files. Use an absolute command path if your client does not inherit your shell `PATH`. +These commands print config only. They do not mutate your local client files. ## Codex @@ -48,11 +58,7 @@ args = ["--stdio"] } ``` -## Tools - -The local wrapper exposes repo context, contributor decision packs, local branch preflight, score blockers, PR packets, variant comparison, and registry change tools. - -Useful tools: +## Useful Tools - `gittensory_local_status` - `gittensory_get_decision_pack` @@ -65,7 +71,7 @@ Useful tools: ## Runtime Rules -- Stdio only for the local wrapper. -- No source upload in v1. -- Private score and reward/risk reasoning stay in MCP/API output. -- Public PR packets are sanitized and do not include wallet, hotkey, raw trust score, or public score estimates. +- local wrapper uses stdio +- source upload is unsupported in v1 +- auth uses a Gittensory session token minted through GitHub OAuth +- public PR packets exclude wallets, hotkeys, raw trust scores, and public score estimates diff --git a/site/guide/miners.md b/site/guide/miners.md index c3e9c575a6..a8e79a2f46 100644 --- a/site/guide/miners.md +++ b/site/guide/miners.md @@ -1,39 +1,28 @@ # For Miners -Gittensory helps miners decide what to do next with evidence instead of guesswork. +Gittensory helps miners choose work with evidence: lane fit, score blockers, queue pressure, local diff quality, and realistic scenario projections. -## What It Answers +## Branch Analysis Flow -- Is this repo a direct-PR lane, issue-discovery lane, split lane, inactive lane, or unknown lane? -- Am I in a normal contributor lane or a maintainer lane for this repo? -- Does my current branch look reviewable? -- What blocks scoreability right now? -- Should I clean up open PRs before opening more work? -- Is there duplicate or WIP collision risk? -- What public-safe PR packet should I give a maintainer? - -## Branch Analysis - -Run from a Git repo: +Run this before opening or updating a PR: ```sh gittensory-mcp analyze-branch --login YOUR_GITHUB_LOGIN --json ``` -The response includes: +The response explains: + +- repo lane and role context +- current scoreability and blocker gates +- open PR pressure and cleanup-first guidance +- duplicate or WIP collision risk +- stale-base warnings when the local diff looks inflated +- validation evidence from changed test paths and command summaries +- a public-safe PR packet for maintainers -- lane context -- role context -- preflight findings -- private score blockers -- current vs projected scoreability scenarios -- reward/risk reasoning -- base freshness warnings when the local diff may be inflated -- maintainer-fit notes -- public-safe PR packet -- ranked next actions +## Scenario Flags -When the current score is blocked by temporary account/queue state, pass the assumptions explicitly: +When approved PRs are expected to land soon, pass the assumption explicitly: ```sh gittensory-mcp analyze-branch --login YOUR_GITHUB_LOGIN \ @@ -44,7 +33,11 @@ gittensory-mcp analyze-branch --login YOUR_GITHUB_LOGIN \ --json ``` -Gittensory labels that as a user-supplied scenario. It shows the current effective score, the underlying potential score, and what changes if the open-PR and credibility gates clear. +Gittensory labels this as a user-supplied scenario. It separates the current effective score, the underlying potential score, and what changes if open-PR and credibility gates clear. + +::: tip No source upload by default +Local branch analysis sends metadata only. File contents are not uploaded. +::: ## Preflight @@ -52,18 +45,13 @@ Gittensory labels that as a user-supplied scenario. It shows the current effecti gittensory-mcp preflight --login YOUR_GITHUB_LOGIN --json ``` -Use this before opening a PR. It is especially useful when you need to know whether a branch is missing tests, missing a linked issue, colliding with active work, or likely to increase maintainer burden. - -## How This Helps +Use preflight when you need a quick answer on linked issues, tests, duplicate risk, lane fit, and maintainer review friction. -Gittensory does not promise payouts. It explains scoreability and risk: +## When To Use Gittensory -- open PR pressure -- credibility assumptions -- lane eligibility -- issue-discovery vs direct PR fit -- duplicate clusters -- stale work -- review friction +- before opening a PR +- after PR approvals but before rerunning score projections +- when deciding whether to clean up existing PRs first +- when choosing between direct PR work and issue-discovery flow -That makes recommendations actionable: land or withdraw blocked work, avoid direct PRs in issue-discovery-only repos, improve validation evidence, or pick a repo where your history and the lane actually fit. +Gittensory does not promise payouts. It explains scoreability, risk, and what actions make the work more likely to be reviewable and scoreable. diff --git a/site/index.md b/site/index.md index 26bfed92da..a39d285484 100644 --- a/site/index.md +++ b/site/index.md @@ -1,74 +1,84 @@ --- layout: home - -hero: - name: Gittensory - text: Private repo intelligence for Gittensor work. - tagline: "For Gittensor miners, maintainers, and agents: MCP preflight, scoreability projections, and GitHub App review packets. Still not a Gittensor frontend." - image: - src: /logo.svg - alt: Gittensory signal mark - actions: - - theme: brand - text: Install MCP - link: /guide/install - - theme: alt - text: GitHub App Setup - link: /guide/github-app-setup - -features: - - title: Scoreability - details: Current estimate, ungated potential, and near-term what-if scenarios. - - title: Queue Pressure - details: Open PR gates, stale branches, duplicate risk, and cleanup-first actions. - - title: Role Context - details: Contributor lane, maintainer lane, owner history, and repo-specific evidence. - - title: Reviewability - details: Private maintainer packets plus public-safe PR guidance. - - title: Registry Signals - details: Repo lanes, label multipliers, issue discovery, bounties, and config drift. - - title: MCP Native - details: Codex, Claude, Cursor, and agents get structured JSON without code upload. --- -
Gittensor contribution intelligence
+Decision intelligence for Gittensor contributors and maintainers.
++ Use MCP and GitHub App signals to help Gittensor miners choose better work, understand score blockers, + reduce maintainer noise, and ship cleaner Gittensor submissions. +
+
+ - Gittensory is the private signal layer behind better contributions: - official miner context, registry lanes, queue pressure, scoreability - projections, maintainer friction, and public-safe PR packets. -
-Score blockers, lane fit, queue pressure, and local branch preflight before opening another PR.
+Confirmed-miner comments, configured labels, reviewability context, and public-safe next steps.
+Metadata-only MCP branch analysis for Codex, Claude, Cursor, and local automation.
+Config quality, label readiness, maintainer-lane handling, and contribution intake health.
+When to use it
+Before opening a PR, check lane fit, linked issue expectations, validation evidence, and duplicate risk.
+After approvals, rerun scoreability projections with realistic pending-merge assumptions.
+When open PR pressure is high, decide whether cleanup beats opening new work.
+When a maintainer wants confirmed-miner context, keep the public surface quiet and sanitized.
+What Gittensory is
++ Gittensory is not a Gittensor frontend. It is the private signal layer behind better Gittensor contributions: + official miner context, registry lanes, queue pressure, scoreability projections, + maintainer friction, and public-safe PR packets. +
+