From 72c604520bce63a9c7575c9004648eb33a4f8048 Mon Sep 17 00:00:00 2001 From: GodsBoy Date: Tue, 31 Mar 2026 08:02:06 +0200 Subject: [PATCH] feat: attribution footer, interactive playground, and config extension --- README.md | 15 ++- docs/images/repokeeper-demo.gif | Bin 0 -> 133113 bytes package.json | 2 + pnpm-lock.yaml | 128 +++++++++++++++++++++++++ repokeeper.config.example.ts | 6 ++ src/config.ts | 8 ++ src/index.ts | 3 + src/playground.ts | 164 ++++++++++++++++++++++++++++++++ src/pr/summariser.ts | 12 +-- src/review/comment-poster.ts | 15 +-- src/review/reviewer.ts | 2 +- src/triage/responder.ts | 3 +- src/utils/attribution.ts | 12 +++ tests/attribution.test.ts | 34 +++++++ tests/playground.test.ts | 117 +++++++++++++++++++++++ tests/responder.test.ts | 65 +++++++++++++ tests/summariser.test.ts | 38 ++++++++ 17 files changed, 608 insertions(+), 16 deletions(-) create mode 100644 docs/images/repokeeper-demo.gif create mode 100644 src/playground.ts create mode 100644 src/utils/attribution.ts create mode 100644 tests/attribution.test.ts create mode 100644 tests/playground.test.ts diff --git a/README.md b/README.md index f617c99..65ab484 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/GodsBoy/repokeeper/pulls) ![Maintained by RepoKeeper](https://img.shields.io/badge/maintained%20by-RepoKeeper-blue) -[Getting Started](#quick-start) · [Features](#what-repokeeper-does) · [Deploy to VPS](#production-deployment) · [Multi-Repo](#multi-repo-configuration) · [Contributing](#contributing) +[Getting Started](#quick-start) · [Features](#what-repokeeper-does) · [Try it live](#interactive-playground) · [Deploy to VPS](#production-deployment) · [Multi-Repo](#multi-repo-configuration) · [Contributing](#contributing) [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy) @@ -27,7 +27,7 @@ --- -![RepoKeeper Hero](docs/images/repokeeper-hero.png) +![RepoKeeper Demo](docs/images/repokeeper-demo.gif) ## Demo @@ -35,6 +35,14 @@ See [demo/demo.cast](demo/demo.cast) — play with: `asciinema play demo/demo.ca > **Live demo:** This repository is maintained by RepoKeeper itself — every issue, PR, and review goes through the same pipeline you can deploy in minutes. +## Interactive Playground + +**Try it live** — paste a GitHub issue or PR diff and see RepoKeeper's AI in action, no deployment required. + +Once running, visit `http://your-server:3001/playground` to try issue triage and PR summarisation instantly. + +Set `attribution.playgroundUrl` in your config to link the playground from every AI-generated comment. + ## The Problem Maintainers are drowning. AI-generated pull requests, duplicate issues, low-effort bug reports, and community questions pile up faster than any human can triage them. In 2026, the average popular open source repo receives more noise than signal — and maintainer burnout is at an all-time high. @@ -191,6 +199,8 @@ All configuration lives in `repokeeper.config.ts`: | `codeReview.focus` | `string[]` | `["security", "performance", "test-coverage", "breaking-changes"]` | Review focus areas | | `codeReview.maxContextFiles` | `number` | `5` | Max dependency files to include per changed file | | `codeReview.minDiffLines` | `number` | `10` | Minimum added lines to trigger review | +| `attribution.enabled` | `boolean` | `true` | Add "Powered by RepoKeeper" footer to AI comments | +| `attribution.playgroundUrl` | `string` | — | Absolute URL to your playground (adds "Try it live" link to footer) | | `port` | `number` | `3001` | Port for the webhook server | ## Per-Repository YAML Config @@ -269,6 +279,7 @@ The code review feature works with all three AI providers. Use Ollama for comple ┌──────────▼──────────┐ │ Express Server │ │ /webhook │ + │ /playground │ │ /health │ │ /metrics │ └──────────┬──────────┘ diff --git a/docs/images/repokeeper-demo.gif b/docs/images/repokeeper-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..68f0f887bdece0a7bb09d4cea5291b2328e163ec GIT binary patch literal 133113 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 xCjm->cwUw8%*=K4m>?e;ikZp| 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 fnCp$v?_+xpfZgUi>>`1+eiZu?t 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�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 F{|ARaR4D)e literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 0b8e0fb..6e4335a 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,10 @@ "@types/express": "^5.0.0", "@types/js-yaml": "^4.0.9", "@types/node": "^22.0.0", + "@types/supertest": "^7.2.0", "eslint": "^9.0.0", "prettier": "^3.4.0", + "supertest": "^7.2.2", "tsx": "^4.19.0", "typescript": "^5.7.0", "vitest": "^3.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3851613..1d3ff37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,12 +36,18 @@ importers: '@types/node': specifier: ^22.0.0 version: 22.19.15 + '@types/supertest': + specifier: ^7.2.0 + version: 7.2.0 eslint: specifier: ^9.0.0 version: 9.39.4 prettier: specifier: ^3.4.0 version: 3.8.1 + supertest: + specifier: ^7.2.2 + version: 7.2.2 tsx: specifier: ^4.19.0 version: 4.21.0 @@ -270,6 +276,10 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@octokit/auth-token@5.1.2': resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} engines: {node: '>= 18'} @@ -328,6 +338,9 @@ packages: '@octokit/types@14.1.0': resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] @@ -475,6 +488,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -496,6 +512,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} @@ -517,6 +536,12 @@ packages: '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/supertest@7.2.0': + resolution: {integrity: sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==} + '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} @@ -578,6 +603,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -641,6 +669,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -660,6 +691,9 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -688,6 +722,9 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -809,6 +846,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -848,6 +888,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -999,6 +1043,10 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1015,6 +1063,11 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -1226,6 +1279,14 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + superagent@10.3.0: + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} + + supertest@7.2.2: + resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} + engines: {node: '>=14.18.0'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1552,6 +1613,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@noble/hashes@1.8.0': {} + '@octokit/auth-token@5.1.2': {} '@octokit/core@6.1.6': @@ -1620,6 +1683,10 @@ snapshots: dependencies: '@octokit/openapi-types': 25.1.0 + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -1709,6 +1776,8 @@ snapshots: dependencies: '@types/node': 22.19.15 + '@types/cookiejar@2.1.5': {} + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.8': {} @@ -1732,6 +1801,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/methods@1.1.4': {} + '@types/node-fetch@2.6.13': dependencies: '@types/node': 22.19.15 @@ -1758,6 +1829,18 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 22.19.15 + '@types/superagent@8.1.9': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 22.19.15 + form-data: 4.0.5 + + '@types/supertest@7.2.0': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.9 + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.3 @@ -1832,6 +1915,8 @@ snapshots: argparse@2.0.1: {} + asap@2.0.6: {} + assertion-error@2.0.1: {} asynckit@0.4.0: {} @@ -1900,6 +1985,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + component-emitter@1.3.1: {} + concat-map@0.0.1: {} content-disposition@1.0.1: {} @@ -1910,6 +1997,8 @@ snapshots: cookie@0.7.2: {} + cookiejar@2.1.4: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -1928,6 +2017,11 @@ snapshots: depd@2.0.0: {} + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -2110,6 +2204,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-safe-stringify@2.1.1: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -2156,6 +2252,12 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + forwarded@0.2.0: {} fresh@2.0.0: {} @@ -2287,6 +2389,8 @@ snapshots: merge-descriptors@2.0.0: {} + methods@1.1.2: {} + mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -2299,6 +2403,8 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@2.6.0: {} + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 @@ -2530,6 +2636,28 @@ snapshots: dependencies: js-tokens: 9.0.1 + superagent@10.3.0: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3 + fast-safe-stringify: 2.1.1 + form-data: 4.0.5 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.15.0 + transitivePeerDependencies: + - supports-color + + supertest@7.2.2: + dependencies: + cookie-signature: 1.2.2 + methods: 1.1.2 + superagent: 10.3.0 + transitivePeerDependencies: + - supports-color + supports-color@7.2.0: dependencies: has-flag: 4.0.0 diff --git a/repokeeper.config.example.ts b/repokeeper.config.example.ts index 159d99d..dafb698 100644 --- a/repokeeper.config.example.ts +++ b/repokeeper.config.example.ts @@ -19,5 +19,11 @@ export default { minDiffLines: 50, generateReleaseNotes: true, }, + // Attribution footer on AI-generated comments (default: enabled) + attribution: { + enabled: true, + // Set to your deployment URL to add a "Try it live" link in the footer + // playgroundUrl: 'https://your-server.example.com/playground', + }, port: 3001, }; diff --git a/src/config.ts b/src/config.ts index 747ea1e..5ce6019 100644 --- a/src/config.ts +++ b/src/config.ts @@ -44,6 +44,10 @@ export interface RepoKeeperConfig { ignore?: string[]; commitStatus?: boolean; }; + attribution: { + enabled: boolean; + playgroundUrl?: string; + }; port: number; } @@ -76,6 +80,10 @@ const defaults: RepoKeeperConfig = { ignore: [], commitStatus: false, }, + attribution: { + enabled: true, + playgroundUrl: undefined, + }, port: 3001, }; diff --git a/src/index.ts b/src/index.ts index 854820a..14386b0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { createAIProvider } from './ai/index.js'; import { GitHubClient } from './github/client.js'; import { createWebhookHandler } from './webhook/handler.js'; import { getMetrics } from './metrics.js'; +import { registerPlayground } from './playground.js'; import { log } from './logger.js'; async function main(): Promise { @@ -60,6 +61,8 @@ async function main(): Promise { res.json(getMetrics()); }); + registerPlayground(app, ai, config); + const server = app.listen(config.port, () => { log('info', `RepoKeeper listening on port ${config.port}`); log('info', `AI provider: ${config.ai.provider} (${config.ai.model})`); diff --git a/src/playground.ts b/src/playground.ts new file mode 100644 index 0000000..ed1bbd8 --- /dev/null +++ b/src/playground.ts @@ -0,0 +1,164 @@ +import type { Express, Request, Response } from 'express'; +import rateLimit from 'express-rate-limit'; +import type { AIProvider } from './ai/provider.js'; +import type { RepoKeeperConfig } from './config.js'; +import { log } from './logger.js'; + +const MAX_INPUT_LENGTH = 10_000; + +const ISSUE_PROMPT = `You are a GitHub issue triage assistant. Given the following issue, classify it, suggest labels, and write a helpful response. Issue:\n\n`; + +const PR_PROMPT = `You are a code review assistant. Given the following PR diff, write a concise plain-English summary of what changed and why it matters.\n\nDiff:\n\n`; + +const PLAYGROUND_HTML = ` + + + + +RepoKeeper Playground + + + +
+

RepoKeeper Playground

+

Try AI-powered repo maintenance instantly — View on GitHub

+ + +
+ + +
+ +
+
+ + +`; + +interface PreviewRequest { + type: string; + input: string; +} + +export function registerPlayground(app: Express, ai: AIProvider, config: RepoKeeperConfig): void { + const playgroundLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, + max: 10, + standardHeaders: true, + legacyHeaders: false, + message: { error: 'Rate limit exceeded. Try again in a few minutes.' }, + }); + + app.get('/playground', (_req: Request, res: Response) => { + res.type('html').send(PLAYGROUND_HTML); + }); + + app.post('/playground/preview', playgroundLimiter, async (req: Request, res: Response) => { + const { type, input } = req.body as PreviewRequest; + + if (!type || !['issue', 'pr-summary'].includes(type)) { + res.status(400).json({ error: 'Invalid type. Must be "issue" or "pr-summary".' }); + return; + } + + if (!input || typeof input !== 'string' || input.trim().length === 0) { + res.status(400).json({ error: 'Please paste some content to preview.' }); + return; + } + + if (input.length > MAX_INPUT_LENGTH) { + res.status(400).json({ error: `Input too long. Maximum ${MAX_INPUT_LENGTH} characters.` }); + return; + } + + const prompt = type === 'issue' + ? ISSUE_PROMPT + input + : PR_PROMPT + input; + + try { + const { text } = await ai.complete(prompt); + res.json({ result: text.trim() }); + } catch (err) { + log('error', 'Playground AI error', { + error: err instanceof Error ? err.message : String(err), + }); + res.status(503).json({ error: 'AI provider unavailable. Check server configuration.' }); + } + }); + + log('info', 'Playground registered at /playground'); +} diff --git a/src/pr/summariser.ts b/src/pr/summariser.ts index 6394783..981356a 100644 --- a/src/pr/summariser.ts +++ b/src/pr/summariser.ts @@ -2,6 +2,7 @@ import type { AIProvider } from '../ai/provider.js'; import type { GitHubClient } from '../github/client.js'; import type { RepoKeeperConfig } from '../config.js'; import { getPRSizeLabel } from './labeler.js'; +import { withAttribution } from '../utils/attribution.js'; import { log } from '../logger.js'; interface PRPayload { @@ -87,11 +88,11 @@ export async function handlePullRequest( .map((f) => `- \`${f.filename}\` (+${f.additions}/-${f.deletions}) [${f.status}]`) .join('\n'); - const comment = + const commentBody = `## PR Summary\n\n${summary}\n\n` + `### Files Changed (${files.length})\n${fileList}\n\n` + - `---\n*Size: **${sizeLabel.replace('size/', '')}** (${totalLines} lines changed)*\n` + - `*Generated by [RepoKeeper](https://github.com/GodsBoy/repokeeper)*`; + `---\n*Size: **${sizeLabel.replace('size/', '')}** (${totalLines} lines changed)*`; + const comment = withAttribution(commentBody, config.attribution); await github.addComment(number, comment); @@ -124,9 +125,8 @@ export async function handlePullRequestMerged( const { text: releaseNotes } = await ai.complete(prompt); - const comment = - `## Release Notes\n\n${releaseNotes}\n\n` + - `---\n*Generated by [RepoKeeper](https://github.com/GodsBoy/repokeeper)*`; + const commentBody = `## Release Notes\n\n${releaseNotes}`; + const comment = withAttribution(commentBody, config.attribution); await github.addComment(number, comment); diff --git a/src/review/comment-poster.ts b/src/review/comment-poster.ts index a1c3182..f1445c2 100644 --- a/src/review/comment-poster.ts +++ b/src/review/comment-poster.ts @@ -1,6 +1,8 @@ import { Octokit } from '@octokit/rest'; import { log } from '../logger.js'; import type { ReviewFinding, ReviewResult } from './types.js'; +import type { AttributionConfig } from '../utils/attribution.js'; +import { withAttribution } from '../utils/attribution.js'; type ReviewEvent = 'APPROVE' | 'REQUEST_CHANGES' | 'COMMENT'; @@ -25,9 +27,10 @@ function determineEvent(findings: ReviewFinding[]): ReviewEvent { return 'COMMENT'; } -function buildReviewBody(result: ReviewResult): string { +function buildReviewBody(result: ReviewResult, attribution: AttributionConfig): string { if (result.findings.length === 0) { - return `## RepoKeeper Code Review\n\n${result.summary}\n\nNo issues found. Looks good! ✅`; + const body = `## RepoKeeper Code Review\n\n${result.summary}\n\nNo issues found. Looks good! ✅`; + return withAttribution(body, attribution); } const blocking = result.findings.filter((f) => f.severity === 'BLOCKING'); @@ -36,10 +39,9 @@ function buildReviewBody(result: ReviewResult): string { let body = `## RepoKeeper Code Review\n\n${result.summary}\n\n`; body += `**Found ${result.findings.length} issue(s):** `; - body += `${blocking.length} blocking, ${warnings.length} warning(s), ${suggestions.length} suggestion(s)\n\n`; - body += `---\n*Review by [RepoKeeper](https://github.com/GodsBoy/repokeeper)*`; + body += `${blocking.length} blocking, ${warnings.length} warning(s), ${suggestions.length} suggestion(s)`; - return body; + return withAttribution(body, attribution); } function buildComments(findings: ReviewFinding[]): ReviewComment[] { @@ -57,9 +59,10 @@ export async function postReview( pullNumber: number, commitSha: string, result: ReviewResult, + attribution: AttributionConfig = { enabled: true }, ): Promise { const event = determineEvent(result.findings); - const body = buildReviewBody(result); + const body = buildReviewBody(result, attribution); const comments = buildComments(result.findings); try { diff --git a/src/review/reviewer.ts b/src/review/reviewer.ts index 8dc1b6c..90a74de 100644 --- a/src/review/reviewer.ts +++ b/src/review/reviewer.ts @@ -237,7 +237,7 @@ export async function handleCodeReview( // Post review via GitHub API const octokit = new Octokit({ auth: config.github.token }); - await postReview(octokit, owner, repo, prNumber, headSha, result); + await postReview(octokit, owner, repo, prNumber, headSha, result, config.attribution); // Post commit status if enabled if (reviewConfig.commitStatus) { diff --git a/src/triage/responder.ts b/src/triage/responder.ts index ce13664..e398f02 100644 --- a/src/triage/responder.ts +++ b/src/triage/responder.ts @@ -3,6 +3,7 @@ import type { GitHubClient } from '../github/client.js'; import type { RepoKeeperConfig } from '../config.js'; import { classifyIssue, categoryToLabel } from './classifier.js'; import { findDuplicates } from './duplicate.js'; +import { withAttribution } from '../utils/attribution.js'; import { log } from '../logger.js'; interface IssuePayload { @@ -91,7 +92,7 @@ export async function handleIssueOpened( // Generate contextual response using AI const comment = await generateComment(title, bodyText, category, ai); - await github.addComment(number, comment); + await github.addComment(number, withAttribution(comment, config.attribution)); log('info', `Issue #${number} classified as "${category}", labelled [${labels.join(', ')}]`); } diff --git a/src/utils/attribution.ts b/src/utils/attribution.ts new file mode 100644 index 0000000..7cab02d --- /dev/null +++ b/src/utils/attribution.ts @@ -0,0 +1,12 @@ +export interface AttributionConfig { + enabled: boolean; + playgroundUrl?: string; +} + +export function withAttribution(body: string, config: AttributionConfig): string { + if (!config.enabled) return body; + const playgroundLink = config.playgroundUrl + ? ` · [Try it live](${config.playgroundUrl})` + : ''; + return `${body}\n\n---\n*Powered by [RepoKeeper](https://github.com/GodsBoy/repokeeper) — AI-powered repo maintenance${playgroundLink}*`; +} diff --git a/tests/attribution.test.ts b/tests/attribution.test.ts new file mode 100644 index 0000000..53e8ee4 --- /dev/null +++ b/tests/attribution.test.ts @@ -0,0 +1,34 @@ +import { describe, it, expect } from 'vitest'; +import { withAttribution } from '../src/utils/attribution.js'; + +describe('withAttribution', () => { + it('appends attribution footer when enabled', () => { + const result = withAttribution('Hello world', { enabled: true }); + expect(result).toContain('Hello world'); + expect(result).toContain('Powered by [RepoKeeper]'); + expect(result).toContain('AI-powered repo maintenance'); + }); + + it('returns body unchanged when disabled', () => { + const result = withAttribution('Hello world', { enabled: false }); + expect(result).toBe('Hello world'); + }); + + it('includes playground link when playgroundUrl is set', () => { + const result = withAttribution('Body', { + enabled: true, + playgroundUrl: 'https://example.com/playground', + }); + expect(result).toContain('[Try it live](https://example.com/playground)'); + }); + + it('omits playground link when playgroundUrl is undefined', () => { + const result = withAttribution('Body', { enabled: true }); + expect(result).not.toContain('Try it live'); + }); + + it('separates footer with horizontal rule', () => { + const result = withAttribution('Body', { enabled: true }); + expect(result).toContain('\n\n---\n'); + }); +}); diff --git a/tests/playground.test.ts b/tests/playground.test.ts new file mode 100644 index 0000000..ad67b4e --- /dev/null +++ b/tests/playground.test.ts @@ -0,0 +1,117 @@ +import { describe, it, expect, vi } from 'vitest'; +import express from 'express'; +import request from 'supertest'; +import { registerPlayground } from '../src/playground.js'; +import type { AIProvider } from '../src/ai/provider.js'; +import type { RepoKeeperConfig } from '../src/config.js'; + +function createApp(ai: AIProvider) { + const app = express(); + app.use(express.json()); + + const config: RepoKeeperConfig = { + github: { token: 'test', webhookSecret: 'test', owner: 'test', repo: 'test' }, + ai: { provider: 'claude', model: 'test' }, + triage: { enabled: true, duplicateThreshold: 0.7, minimumBodyLength: 100 }, + prSummariser: { enabled: true, minDiffLines: 50, generateReleaseNotes: false }, + codeReview: { enabled: true, focus: [], maxContextFiles: 5, minDiffLines: 10 }, + attribution: { enabled: true }, + port: 3001, + }; + + registerPlayground(app, ai, config); + return app; +} + +function mockAI(response: string): AIProvider { + return { + complete: vi.fn().mockResolvedValue({ text: response, usage: { inputTokens: 10, outputTokens: 20 } }), + }; +} + +function failingAI(): AIProvider { + return { + complete: vi.fn().mockRejectedValue(new Error('API key invalid')), + }; +} + +describe('GET /playground', () => { + it('returns HTML page', async () => { + const app = createApp(mockAI('response')); + const res = await request(app).get('/playground'); + expect(res.status).toBe(200); + expect(res.headers['content-type']).toContain('html'); + expect(res.text).toContain('RepoKeeper Playground'); + expect(res.text).toContain('textarea'); + }); +}); + +describe('POST /playground/preview', () => { + it('returns AI result for issue type', async () => { + const ai = mockAI('This is a bug report about login failures.'); + const app = createApp(ai); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'issue', input: 'Login is broken' }); + expect(res.status).toBe(200); + expect(res.body.result).toBe('This is a bug report about login failures.'); + expect(ai.complete).toHaveBeenCalledWith(expect.stringContaining('triage assistant')); + }); + + it('returns AI result for pr-summary type', async () => { + const ai = mockAI('Added a new feature to handle auth.'); + const app = createApp(ai); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'pr-summary', input: 'diff --git a/auth.ts' }); + expect(res.status).toBe(200); + expect(res.body.result).toBe('Added a new feature to handle auth.'); + expect(ai.complete).toHaveBeenCalledWith(expect.stringContaining('code review assistant')); + }); + + it('returns 400 for empty input', async () => { + const app = createApp(mockAI('x')); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'issue', input: '' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('paste some content'); + }); + + it('returns 400 for whitespace-only input', async () => { + const app = createApp(mockAI('x')); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'issue', input: ' \n ' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('paste some content'); + }); + + it('returns 400 for input exceeding 10000 characters', async () => { + const app = createApp(mockAI('x')); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'issue', input: 'a'.repeat(10_001) }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('too long'); + }); + + it('returns 400 for invalid type', async () => { + const app = createApp(mockAI('x')); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'unknown', input: 'some content' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('Invalid type'); + }); + + it('returns 503 when AI provider fails', async () => { + const app = createApp(failingAI()); + const res = await request(app) + .post('/playground/preview') + .send({ type: 'issue', input: 'some content' }); + expect(res.status).toBe(503); + expect(res.body.error).toContain('AI provider unavailable'); + expect(res.body.error).not.toContain('API key'); + }); +}); diff --git a/tests/responder.test.ts b/tests/responder.test.ts index 29045ed..cbe4170 100644 --- a/tests/responder.test.ts +++ b/tests/responder.test.ts @@ -41,6 +41,7 @@ function createConfig(overrides?: Partial): RepoKeep }, prSummariser: { enabled: false, minDiffLines: 50, generateReleaseNotes: false }, codeReview: { enabled: false, focus: [], maxContextFiles: 5, minDiffLines: 10 }, + attribution: { enabled: true }, port: 3001, }; } @@ -115,6 +116,70 @@ describe('handleIssueOpened', () => { expect(commentCall[1]).not.toContain('Thanks for the detailed bug report'); }); + it('includes attribution footer on AI-generated comments', async () => { + const ai = createMockAI('bug', 'We are looking into this crash.'); + const github = createMockGithub(); + const config = createConfig(); + + const detailedBody = 'The application crashes when I try to login. I am using Chrome on Windows 10. ' + + 'The console shows a TypeError: Cannot read property of undefined. Stack trace is below.'; + + await handleIssueOpened( + { issue: { number: 10, title: 'Login crash', body: detailedBody } }, + ai, + github, + config, + ); + + const commentCall = (github.addComment as ReturnType).mock.calls[0]; + expect(commentCall[1]).toContain('Powered by [RepoKeeper]'); + }); + + it('omits attribution footer when attribution is disabled', async () => { + const ai = createMockAI('bug', 'We are looking into this crash.'); + const github = createMockGithub(); + const config = createConfig(); + config.attribution = { enabled: false }; + + const detailedBody = 'The application crashes when I try to login. I am using Chrome on Windows 10. ' + + 'The console shows a TypeError: Cannot read property of undefined. Stack trace is below.'; + + await handleIssueOpened( + { issue: { number: 11, title: 'Login crash', body: detailedBody } }, + ai, + github, + config, + ); + + const commentCall = (github.addComment as ReturnType).mock.calls[0]; + expect(commentCall[1]).not.toContain('Powered by [RepoKeeper]'); + }); + + it('does NOT include attribution footer on duplicate detection comment', async () => { + const ai: AIProvider = { + complete: async (prompt: string) => { + if (prompt.includes('duplicate issue detector')) return { text: '0.85', usage }; + return { text: 'comment', usage }; + }, + }; + const github = createMockGithub(); + (github.listOpenIssues as ReturnType).mockResolvedValue([ + { number: 1, title: 'app crashes on start', body: 'the app crashes when I start it' }, + { number: 20, title: 'app wont start up', body: 'tried installing but the app refuses to start' }, + ]); + const config = createConfig(); + + await handleIssueOpened( + { issue: { number: 20, title: 'app wont start up', body: 'tried installing but the app refuses to start' } }, + ai, + github, + config, + ); + + const commentCall = (github.addComment as ReturnType).mock.calls[0]; + expect(commentCall[1]).not.toContain('Powered by [RepoKeeper]'); + }); + it('flags duplicates with possible-duplicate label instead of closing', async () => { const ai: AIProvider = { complete: async (prompt: string) => { diff --git a/tests/summariser.test.ts b/tests/summariser.test.ts index 7a7a832..734ad8f 100644 --- a/tests/summariser.test.ts +++ b/tests/summariser.test.ts @@ -26,6 +26,7 @@ const baseConfig: RepoKeeperConfig = { triage: { enabled: true, duplicateThreshold: 0.85, minimumBodyLength: 100 }, prSummariser: { enabled: true, minDiffLines: 5, generateReleaseNotes: true }, codeReview: { enabled: true, focus: ['security', 'performance', 'test-coverage', 'breaking-changes'], maxContextFiles: 5, minDiffLines: 10 }, + attribution: { enabled: true }, port: 3001, }; @@ -42,6 +43,31 @@ describe('handlePullRequest', () => { expect(ai.complete).toHaveBeenCalled(); }); + it('includes attribution footer on summary comment', async () => { + const ai = mockAI('This PR adds a new feature.'); + const github = mockGitHub(); + const payload = { pull_request: { number: 10, title: 'Add feature', body: 'Description' } }; + + await handlePullRequest(payload, ai, github as never, baseConfig); + + const commentCall = github.addComment.mock.calls[0]; + expect(commentCall[1]).toContain('Powered by [RepoKeeper]'); + // Must NOT have the old hardcoded footer + expect(commentCall[1]).not.toContain('Generated by [RepoKeeper]'); + }); + + it('omits attribution footer when disabled', async () => { + const ai = mockAI('This PR adds a new feature.'); + const github = mockGitHub(); + const config = { ...baseConfig, attribution: { enabled: false } }; + const payload = { pull_request: { number: 11, title: 'Add feature', body: 'Description' } }; + + await handlePullRequest(payload, ai, github as never, config); + + const commentCall = github.addComment.mock.calls[0]; + expect(commentCall[1]).not.toContain('Powered by [RepoKeeper]'); + }); + it('skips summary when below minDiffLines', async () => { const ai = mockAI('Summary'); const github = mockGitHub(); @@ -72,6 +98,18 @@ describe('handlePullRequestMerged', () => { expect(github.getPRFiles).toHaveBeenCalledWith(3); }); + it('includes attribution footer on release notes', async () => { + const ai = mockAI('## v1.0\n- Added new feature'); + const github = mockGitHub(); + const payload = { pull_request: { number: 30, title: 'Add feature', body: 'New feature', merged: true } }; + + await handlePullRequestMerged(payload, ai, github as never, baseConfig); + + const commentCall = github.addComment.mock.calls[0]; + expect(commentCall[1]).toContain('Powered by [RepoKeeper]'); + expect(commentCall[1]).not.toContain('Generated by [RepoKeeper]'); + }); + it('skips release notes when disabled', async () => { const ai = mockAI('Notes'); const github = mockGitHub();